Combobulate 0.8.2
See the version list below for details.
dotnet add package Combobulate --version 0.8.2
NuGet\Install-Package Combobulate -Version 0.8.2
<PackageReference Include="Combobulate" Version="0.8.2" />
<PackageVersion Include="Combobulate" Version="0.8.2" />
<PackageReference Include="Combobulate" />
paket add Combobulate --version 0.8.2
#r "nuget: Combobulate, 0.8.2"
#:package Combobulate@0.8.2
#addin nuget:?package=Combobulate&version=0.8.2
#tool nuget:?package=Combobulate&version=0.8.2
Combobulate
A XAML controls library for UWP and WinUI 3 / Windows App SDK that renders
3D .obj files made of triangles and quads using the Windows Composition
visual layer — no D3D, no SwapChainPanel, no shaders.
combobulate (humorous) — to compose (oneself); to compose, organize, design, or arrange; to reverse the effect of discombobulation. (Wiktionary)
Each face becomes a SpriteVisual placed in 3D by a perspective
TransformMatrix. Quad faces use the full sprite rectangle; triangle
faces add a triangular CompositionGeometricClip (one shared unit-triangle
path geometry, per-face scale) plus a 3-point affine brush transform that
maps brush UVs exactly. Back-face culling and a polygon sort keep the draw
order right without a depth buffer, and a fully analytical baked aspect
graph renderer can sustain GPU-driven animation with zero CPU work
per frame.
Packages
Combobulate— the XAML control library for UWP and WinUI 3 / Windows App SDK.Combobulate.SystemComp— a XAML-free flavor of the renderer bound to the systemWindows.UI.Compositionsurface with no Windows App SDK dependency. Use it to host a live 3D model on a rawDesktopWindowTarget(e.g. a per-pixel alphaWS_EX_NOREDIRECTION_BITMAPwindow) from a plain .NET 5+ desktop process. It exposes the sameCombobulateAPI under a distinct assembly name (Combobulate.SystemComp), so an app can reference it alongside the lifted WinAppSdk build. It depends onarcadiog.CompositionExpressions.SystemComp(the system-composition flavor of the expression DSL) and unlocks theBakedAspectGraphrendering mode in the XAML-free build.
Targets
- UWP —
uap10.0.19041 - WinUI 3 / Windows App SDK —
net10.0-windows10.0.19041.0(lifted composition) - System composition (
Combobulate.SystemComp) —net10.0-windows10.0.19041.0bound to the systemWindows.UI.Composition, no Windows App SDK
Repo Layout
src/
Combobulate/ UWP class library (canonical source)
Combobulate.WinAppSdk/ WinUI 3 head — links sources from Combobulate
Combobulate.SystemComp/ XAML-free head (system composition, COMBOBULATE_NO_XAML)
Combobulate.Sample.Uwp/ UWP sample app
Combobulate.Sample.WinUI3/ WinUI 3 sample app
samples/
book.obj Example quad-based model
Getting Started
Add the
CombobulateNuGet package to your UWP or WinUI 3 app.Place a
Combobulatecontrol in your XAML:<Page xmlns:c="using:Combobulate"> <c:Combobulate x:Name="Viewer" Source="ms-appx:///Assets/book.obj" ModelScale="200" RotationX="-30" RotationY="40" RotationZ="0" /> </Page>Sourceaccepts anms-appx:///URI, an absolute file path, or anObjCachekey — geometry, materials (via siblingmtllib), and texture surfaces are all loaded and cached process-wide.Or parse an
.objyourself and assign the resulting model directly:using Combobulate.Parsing; var text = await FileIO.ReadTextAsync( await StorageFile.GetFileFromPathAsync(@"C:\path\to\book.obj")); var result = ObjParser.Parse(text); Viewer.Model = result.Model; // partial model on parse error foreach (var err in result.Errors) // optional: inspect parse diagnostics System.Diagnostics.Debug.WriteLine(err);
That's it — the control rebuilds its visual tree whenever any of its inputs change.
Highlights
- Materials. Auto-loaded from
mtllibor supplied viaObjMaterialPack, with live texture updates fromSoftwareBitmapor streams. - Three sort algorithms.
Bsp(default, exact, O(n)),Newell(split-on-cycle, deformable-friendly), andTopological(legacy, fast). - Composition-driven rotation.
SetExternalRotation(ExpressionAnimation)binds rotation directly to the compositor; pair withEnableAutoRefreshto keep cull and sort in lock-step with the compositor clock. - Baked aspect graph. Pre-computes every painter-order breakpoint
along an animation axis and emits one
ContainerVisualper cell, each gated by an opacity expression on a live scalar. Smooth GPU spin without per-frame CPU cost. See docs/rendering-pipeline.md.
For everything beyond "drop a control, point Source at a file" see the
usage guide and the
rendering pipeline doc.
Supported .obj subset
v x y z [w]— vertex positionsvt u v [w]— texture coordinatesvn x y z— vertex normals (parsed; not used for shading today)f a b c— triangle faces;a/ta/nastyle references acceptedf a b c d— quad faces;a/ta/nastyle references acceptedusemtl <name>,mtllib <file>— material binding and library loado,g,s— preserved;l,p,vp, curves/surfaces are ignored
Both triangles and quads are first-class faces. Triangles render via a
SpriteVisual + shared triangle CompositionGeometricClip + exact 3-point
affine brush transform; quads render directly as parallelogram sprites as
before. A geometry-build preprocess fuses coplanar adjacent triangle pairs
back into single quads where it is safe to do so (same material, matching
UVs at the shared edge, convex result), so triangulated-quad meshes hit the
1-sprite-per-quad fast path with no overdraw.
Wind each face so that (V1 - V0) × (V_last - V0) points outward — that's
the direction the renderer treats as front-facing for back-face culling
(V_last is V2 for triangles, V3 for quads). Faces with fewer than 3
or more than 4 vertices are reported as parse errors and skipped.
See samples/book.obj for a worked example.
Control properties at a glance
| Property | Type | Default | Notes |
|---|---|---|---|
Source |
string? |
null |
Path, ms-appx:/// URI, or ObjCache key |
Model |
ObjModel? |
null |
Direct model assignment |
Materials |
ObjMaterialPack? |
null |
Overrides any auto-loaded mtllib |
MaterialMode |
MaterialMode |
Auto |
Auto / UseDiffuse / UseFallback |
ModelScale |
double |
100 |
Pixels per model unit |
EnablePerspective |
bool |
true |
Apply perspective M34 to the root |
PerspectiveDistance |
double |
0 |
Focal distance in px (0 = host width) |
RotationX/Y/Z |
double |
0 |
Euler angles in degrees |
SortAlgorithm |
SortAlgorithm |
Bsp |
Bsp / Newell / Topological |
CullMarginDegrees |
double |
0 |
Widen back-face cull cone for GPU lag |
RenderingMode |
RenderingMode |
SpritePainter |
SpritePainter / BakedAspectGraph |
Full descriptions and examples are in the usage guide.
Releasing
Push a tag of the form vX.Y.Z to trigger the GitHub Actions workflow that
builds both targets, packs Combobulate.nuspec, publishes to NuGet.org, and
creates a GitHub Release.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0-windows10.0.19041 is compatible. |
| Universal Windows Platform | uap10.0.19041 is compatible. |
-
net10.0-windows10.0.19041
- arcadiog.CompositionExpressions (>= 0.2.0)
- Microsoft.Graphics.Win2D (>= 1.3.2)
- Microsoft.WindowsAppSDK (>= 1.8.260317003)
-
UAP 10.0.19041
- arcadiog.CompositionExpressions (>= 0.1.5)
- Win2D.uwp (>= 1.28.3)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.8.4 | 73 | 7/22/2026 |
| 0.8.3 | 84 | 7/19/2026 |
| 0.8.2 | 106 | 7/15/2026 |
| 0.8.1 | 93 | 7/13/2026 |
| 0.8.0 | 101 | 7/10/2026 |
| 0.7.2 | 102 | 7/8/2026 |
| 0.7.1 | 98 | 7/7/2026 |
| 0.7.0 | 103 | 7/7/2026 |
| 0.6.4 | 126 | 5/18/2026 |
| 0.6.3 | 111 | 5/12/2026 |
| 0.6.2 | 99 | 5/5/2026 |
| 0.5.2 | 115 | 4/21/2026 |
| 0.5.1 | 115 | 4/21/2026 |
| 0.5.0 | 103 | 4/20/2026 |
| 0.4.1 | 109 | 4/20/2026 |
| 0.3.0 | 111 | 4/20/2026 |
| 0.2.0 | 110 | 4/19/2026 |