VisuTwin Canvas
C++ 3D Engine — Metal Backend
Loading...
Searching...
No Matches
VisuTwin Canvas

C++ 3D engine targeting Apple Metal on macOS/iOS.

VisuTwin Canvas is a C++23 port of the PlayCanvas engine, re-architected for native Metal rendering. It provides a forward PBR renderer, ECS framework, asset pipeline, and composable shader system.

Namespace

All engine types live under visutwin::canvas.

Architecture

Engine::render()
-> ForwardRenderer::buildFrameGraph()
-> FrameGraph::compile()
-> FrameGraph::render()

Render Passes

Pass Purpose
RenderPassForward Main PBR geometry (multi-light, multi-layer)
RenderPassShadowDirectional Directional shadow cascades
RenderPassShadowLocalClustered Local light shadows (clustered)
RenderPassShadowLocalNonClustered Local light shadows (non-clustered)
RenderPassUpdateClustered CPU-side clustered lighting grid
RenderPassPostprocessing Orchestrates DOF, SSAO, TAA, compose
RenderPassCookieRenderer Light cookie projection

Compute / Post-Processing Passes

TAA, SSAO, depth-aware blur, circle of confusion, DOF blur, compose (tonemapping + bloom + vignette), GPU instance culling, LIC (flow visualization), marching cubes, particle compute.

Modules

See the Modules page for a categorized overview:

  • Core — Math, shapes, events, utilities
  • Platform — Graphics abstraction and Metal backend
  • Scene — Scene graph, renderer, materials, lighting, shaders
  • Framework — ECS, assets, parsers, gizmos

Material System

  • Material — Base class: glTF PBR metallic-roughness
  • StandardMaterial — Full PBR (clearcoat, anisotropy, sheen, iridescence, transmission)
  • ShaderMaterial — Custom Metal shaders with user entry points

ECS

GraphNode -> Entity -> Components via ComponentSystem<T> registry.

11 component types: Camera, Render, Light, Script, Animation, Screen, Element, Button, Collision, RigidBody, GSplat.

Building

cmake --preset default
cmake --build build

Requires C++23, CMake 3.28+, vcpkg manifest mode. See the repository README for details.

Building the Documentation

./tools/build-docs.sh
open docs/api/html/index.html