Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
31eac96
[Patch] Request world sensing authorization before starting ARKit ses…
untoldengine Mar 18, 2026
86686be
Improved game demo
untoldengine Mar 18, 2026
0099534
[Patch] fix camera orbit function
untoldengine Mar 19, 2026
ff3856b
[Patch] Fixed issues with texture streaming and batch system
untoldengine Mar 19, 2026
1a0638e
[Patch] Added stream texture debugger
untoldengine Mar 19, 2026
123f5ac
[Patch] Implemented progressive asset loader
untoldengine Mar 19, 2026
0a55e12
[CI] Fixed formatting issues
untoldengine Mar 19, 2026
e52dc7a
[Docs] Added system architecture docs
untoldengine Mar 19, 2026
a36344e
[Patch] Modified the min and max for texture streaming
untoldengine Mar 19, 2026
45ba06c
[Patch] Fixed issue with progressive loading in XR
untoldengine Mar 19, 2026
85428b7
[Docs] Update progressive asset loading docs
untoldengine Mar 19, 2026
2e5e01e
[Patch] First implementation of out-of-core
untoldengine Mar 20, 2026
0f0ebd3
[Patch] Improve out-of-core loading and eviction logic
untoldengine Mar 20, 2026
5ef25bb
[Docs] Updated documentation
untoldengine Mar 20, 2026
3496d13
[Patch] Improved performance of OOC
untoldengine Mar 21, 2026
321d1cb
[Test] Fixed OOC tests
untoldengine Mar 21, 2026
bcb4c73
[Patch]Stabilize asset streaming
untoldengine Mar 21, 2026
07455b7
[Patch]Release MDLAsset CPU residency, add disk-backed cold re-streaming
untoldengine Mar 21, 2026
9517e64
[Patch] Refine admission gate: add soft zone and fallback mesh on reject
untoldengine Mar 21, 2026
db87e46
[Patch] Fix wrong initial textures by correcting TextureLoader cache key
untoldengine Mar 21, 2026
65abf1d
[Patch] Fix wrong batch textures by using object-identity.
untoldengine Mar 22, 2026
b8d7b66
[Patch] Complete three-tier texture streaming and add scene profiles
untoldengine Mar 22, 2026
7c13abb
[Test] Fixed rendering and core tests
untoldengine Mar 22, 2026
180b650
[Patch] fixed lod system to work with OOC
untoldengine Mar 22, 2026
e225123
[Docs] Updated Out of core docs
untoldengine Mar 22, 2026
43a7f59
[Patch] Formatted files
untoldengine Mar 22, 2026
41c96df
[Patch] Improved OOC performance
untoldengine Mar 23, 2026
58961cf
[Patch] Added profiling documentation
untoldengine Mar 23, 2026
0c3e5cf
[Patch] Fixed Out-of-Core texture crash
untoldengine Mar 24, 2026
12b60d2
[Patch] Added g-buffer debugger
untoldengine Mar 24, 2026
a25fa66
Made game demo more readable
untoldengine Mar 24, 2026
d79627e
[CI] formatted files
untoldengine Mar 24, 2026
828cac7
[Patch] Fixed camera position for OOC system for XR
untoldengine Mar 24, 2026
fdf9d61
[Patch] Fixed memory budget manager for XR
untoldengine Mar 24, 2026
659c795
[Patch] Fixed closest point used for OOC
untoldengine Mar 24, 2026
f553243
[Release] Prepare release 0.11.3
untoldengine Mar 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
32 changes: 32 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,36 @@
# Changelog
## v0.11.3 - 2026-03-24
### 🐞 Fixes
- [Patch] Request world sensing authorization before starting ARKit session (31eac96…)
- [Patch] fix camera orbit function (0099534…)
- [Patch] Fixed issues with texture streaming and batch system (ff3856b…)
- [Patch] Added stream texture debugger (1a0638e…)
- [Patch] Implemented progressive asset loader (123f5ac…)
- [Patch] Modified the min and max for texture streaming (a36344e…)
- [Patch] Fixed issue with progressive loading in XR (45ba06c…)
- [Patch] First implementation of out-of-core (2e5e01e…)
- [Patch] Improve out-of-core loading and eviction logic (0f0ebd3…)
- [Patch] Improved performance of OOC (3496d13…)
- [Patch]Stabilize asset streaming (bcb4c73…)
- [Patch]Release MDLAsset CPU residency, add disk-backed cold re-streaming (07455b7…)
- [Patch] Refine admission gate: add soft zone and fallback mesh on reject (9517e64…)
- [Patch] Fix wrong initial textures by correcting TextureLoader cache key (db87e46…)
- [Patch] Fix wrong batch textures by using object-identity. (65abf1d…)
- [Patch] Complete three-tier texture streaming and add scene profiles (b8d7b66…)
- [Patch] fixed lod system to work with OOC (180b650…)
- [Patch] Formatted files (43a7f59…)
- [Patch] Improved OOC performance (41c96df…)
- [Patch] Added profiling documentation (58961cf…)
- [Patch] Fixed Out-of-Core texture crash (0c3e5cf…)
- [Patch] Added g-buffer debugger (12b60d2…)
- [Patch] Fixed camera position for OOC system for XR (828cac7…)
- [Patch] Fixed memory budget manager for XR (fdf9d61…)
- [Patch] Fixed closest point used for OOC (659c795…)
### 📚 Docs
- [Docs] Added system architecture docs (e52dc7a…)
- [Docs] Update progressive asset loading docs (85428b7…)
- [Docs] Updated documentation (5ef25bb…)
- [Docs] Updated Out of core docs (e225123…)
## v0.11.2 - 2026-03-18
### 🐞 Fixes
- [Patch] fixed texture streaming (f676f75…)
Expand Down
159 changes: 92 additions & 67 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,24 @@

Untold Engine is an **open-source 3D engine written in Swift and powered by Metal**, designed for Apple platforms including **macOS, iOS, and visionOS**.

The project focuses on building a clean and approachable architecture with modern rendering, an ECS-based gameplay model, and an extensible asset pipeline.
The project focuses on building a **clean, system-driven architecture** with modern rendering, an ECS-based gameplay model, and an extensible asset pipeline.

The engine is under active development and continues to evolve as new systems and workflows are added.

---

## 🎯 Who is this for?

Untold Engine is designed for developers who:

- Want **full control over rendering and systems**
- Prefer working directly with **Swift + Metal**
- Are building **XR, 3D, or visualization applications**
- Need to handle **large scenes, streaming data, or custom pipelines**

This is not a drag-and-drop editor-first engine — it is a **code-driven engine for developers who want to understand and shape the system**.


Creator & Lead Developer:
http://www.haroldserrano.com

Expand All @@ -42,7 +56,7 @@ http://www.haroldserrano.com

The fastest way to experience Untold Engine is to run the demo project.

Clone the repository and run the demo:
Clone the repository, run the engine and load a USDZ file:

```bash
git clone https://github.com/untoldengine/UntoldEngine.git
Expand All @@ -60,11 +74,29 @@ No additional setup is required.

---

# Demo
## 🧱 Core Direction

Untold Engine is being developed with the following goals:

- **Large Scene Rendering**
Striving to support LOD, geometry streaming, batching, and memory-aware systems for large datasets

- **XR / visionOS Support**
Expanding support for spatial input, AR workflows, and Vision Pro experiences

- **Metal-First Architecture**
Keeping the rendering layer close to Metal to maintain performance and control

---

## 🖼 Example Use Cases

Click the image below to watch the engine in action.
Untold Engine aims to support applications such as:

[![Watch the video](docs/images/enginethumbnail.jpg)](https://vimeo.com/1116239409?share=copy#t=0)
- XR applications (Vision Pro, ARKit-based apps)
- Large-scale scene visualization (cities, archviz, datasets)
- Custom rendering pipelines and experiments
- Simulation tools and interactive 3D systems

---

Expand All @@ -86,72 +118,46 @@ Click the image below to watch the engine in action.

---

# Project Ecosystem

The Untold Engine project includes several related components.

## Untold Engine Studio

Standalone application that includes:

- Visual editor
- Full engine integration
- Asset management tools

Download:

https://github.com/untoldengine/UntoldEditor/releases

Ideal for developers who want to **create games using the editor**.

---

## Untold Engine (this repository)

Contains the **core engine systems**:

- Rendering
- ECS architecture
- Physics and animation
- Scene graph
- Input systems

This repository is primarily for:

- Engine contributors
- Developers studying the engine architecture
- Users running demo projects

---

## Untold Editor

The visual editor used for managing assets, scenes, and workflows.

Repository:

https://github.com/untoldengine/UntoldEditor

---

# Documentation

For guides and API documentation visit:

https://untoldengine.github.io/UntoldEngine

You will find:

- Tutorials for using the engine
- Architecture documentation
- Setup instructions
- Guides for common tasks
# Engine Architecture:

- [Rendering System](docs/Architecture/renderingSystem.md)
- [XR Rendering System](docs/Architecture/xrRenderingSystem.md)
- [Static Batching System](docs/Architecture/batchingSystem.md)
- [Geometry Streaming System](docs/Architecture/geometryStreamingSystem.md)
- [LOD System](docs/Architecture/lodSystem.md)
- [Progressive Asset Loader](docs/Architecture/progressiveAssetLoader.md)
- [Streaming Cache Lifecycle](docs/Architecture/streamingCacheLifecycle.md)
- [Texture Streaming System](docs/Architecture/textureStreamingSystem.md)
- [Out of Core](docs/Architecture/outOfCore.md)

# Engine API

- [Registration System](docs/API/UsingRegistrationSystem.md)
- [Scenegraph](docs/API/UsingScenegraph.md)
- [Transform System](docs/API/UsingTransformSystem.md)
- [Camera System](docs/API/UsingCameraSystem.md)
- [Rendering System](docs/API/UsingRenderingSystem.md)
- [Lighting System](docs/API/UsingLightingSystem.md)
- [Materials](docs/API/UsingMaterials.md)
- [Input System](docs/API/UsingInputSystem.md)
- [Physics System](docs/API/UsingPhysicsSystem.md)
- [Steering System](docs/API/UsingSteeringSystem.md)
- [Animation System](docs/API/UsingAnimationSystem.md)
- [Async Loading](docs/API/UsingAsyncLoading.md)
- [LOD System](docs/API/UsingLODSystem.md)
- [Static Batching System](docs/API/UsingStaticBatchingSystem.md)
- [Geometry Streaming System](docs/API/UsingGeometryStreamingSystem.md)
- [LOD-Batching-Streaming](docs/API/UsingLOD-Batching-Streaming.md)
- [Spatial Input](docs/API/UsingSpatialInput.md)
- [Gaussian System](docs/API/UsingGaussianSystem.md)
- [Spatical Debugger](docs/API/SpatialDebugger.md)
- [Profiler](/docs/API/UsingProfiler.md)

---

# Command Line Tool (Optional)
# Set Up an Xcode Project with Untold Engine

If you prefer working from the terminal, you can use the project creation CLI.
You can easily create an xcode project using the Untold Engine as dependency

Install it from the repository:

Expand All @@ -169,6 +175,22 @@ cd MyGame
untoldengine-create create MyGame
```

The CLI supports multiple platforms:

```bash
# macOS (default)
untoldengine-create create MyGame --platform macos

# iOS
untoldengine-create create MyGame --platform ios

# iOS with ARKit
untoldengine-create create MyGame --platform iosar

# visionOS (Apple Vision Pro)
untoldengine-create create MyGame --platform visionos
```

Features:

- Create macOS, iOS, and visionOS projects
Expand Down Expand Up @@ -212,6 +234,9 @@ Before submitting a pull request please read:

- CONTRIBUTING.md
- CONTRIBUTOR_LICENSE_AGREEMENT.md
- [Contributing Guidelines](docs/Contributor/ContributionGuidelines.md)
- [Formatting](docs/Contributor/Formatting.md)
- [Versioning](docs/Contributor/versioning.md)

All contributions are licensed under **MPL-2.0**.

Expand Down
5 changes: 5 additions & 0 deletions Sources/CShaderTypes/ShaderTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,11 @@ typedef enum{
prePassPassthroughBufferIndex
}PrePassBufferIndices;

typedef enum{
debugPassModeIndex,
debugPassFrustumPlanesIndex
}DebugPassBufferIndices;

typedef enum{
prePassFinalTextureIndex,
prePassEnvTextureIndex,
Expand Down
101 changes: 101 additions & 0 deletions Sources/DemoGame/AppDelegate.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
//
// AppDelegate.swift
//

#if os(macOS)
import AppKit
import SwiftUI
import UntoldEngine

@MainActor
final class AppDelegate: NSObject, NSApplicationDelegate {
private enum Constants {
static let appVersion = "0.11.2"
static let windowSize = NSSize(width: 1920, height: 1080)
}

var window: NSWindow!
var renderer: UntoldRenderer!
var gameScene: GameScene!
var demoState = DemoState()

func applicationDidFinishLaunching(_: Notification) {
print("Launching Untold Engine v\(Constants.appVersion)")

setupWindow()
setupRendererAndScene()
wireDemoStateCallbacks()
presentHUD()
}

func applicationShouldTerminateAfterLastWindowClosed(_: NSApplication) -> Bool {
true
}

private func setupWindow() {
window = NSWindow(
contentRect: NSRect(origin: .zero, size: Constants.windowSize),
styleMask: [.titled, .closable, .resizable],
backing: .buffered,
defer: false
)
window.title = "Untold Engine v\(Constants.appVersion)"
window.center()
}

private func setupRendererAndScene() {
guard let renderer = UntoldRenderer.create() else {
print("Failed to initialize the renderer.")
return
}
self.renderer = renderer

gameScene = GameScene()
renderer.setupCallbacks(
gameUpdate: { [weak self] deltaTime in self?.gameScene.update(deltaTime: deltaTime) },
handleInput: { [weak self] in self?.gameScene.handleInput() }
)
}

private func wireDemoStateCallbacks() {
demoState.onLoadFile = { [weak self] path, completion in
self?.gameScene.loadFile(path: path, completion: completion)
}
demoState.onBatchingChanged = { [weak self] enabled in
self?.gameScene.setBatching(enabled)
}
demoState.onStreamingChanged = { [weak self] enabled, radius, unloadRadius in
self?.gameScene.setStreaming(
enabled,
streamingRadius: Float(radius),
unloadRadius: Float(unloadRadius)
)
}
demoState.onLodDebugChanged = { [weak self] enabled in
self?.gameScene.setLodDebug(enabled)
}
demoState.onTextureStreamingTierDebugChanged = { [weak self] enabled in
self?.gameScene.setStreamingTierDebug(enabled)
}
demoState.onRenderDebugViewChanged = { [weak self] mode in
self?.gameScene.setRenderDebugView(mode)
}
demoState.onSpatialDebugChanged = { [weak self] enabled, occupiedOnly, colorMode in
self?.gameScene.setSpatialDebug(
enabled: enabled,
occupiedOnly: occupiedOnly,
colorMode: colorMode
)
}
}

private func presentHUD() {
guard let renderer else { return }
let hostingView = NSHostingView(rootView: DemoHUD(renderer: renderer, state: demoState))
window.contentView = hostingView
window.makeKeyAndOrderFront(nil)
NSApp.setActivationPolicy(.regular)
NSApp.activate(ignoringOtherApps: true)
}
}
#endif
Loading
Loading