-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
501 lines (442 loc) · 34.8 KB
/
Copy pathindex.html
File metadata and controls
501 lines (442 loc) · 34.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CNA - C++ Reimplementation of the XNA 4.0 API</title>
<meta name="description" content="Documentation for CNA 0.1.0-alpha.1, the first tagged pre-release: a C++23 XNA 4.0 reimplementation with independent platform and audio layers and 50 graphics renderer identities.">
<meta property="og:type" content="website">
<meta property="og:site_name" content="CNA">
<meta property="og:url" content="https://libcna.com/">
<link rel="canonical" href="https://libcna.com/">
<meta property="og:title" content="CNA - C++ Reimplementation of the XNA 4.0 API">
<meta property="og:description" content="Documentation for CNA 0.1.0-alpha.1, the first tagged pre-release: a C++23 XNA 4.0 reimplementation with independent platform and audio layers and 50 graphics renderer identities.">
<link rel="stylesheet" href="css/style.css">
<link rel="icon" href="favicon.svg" type="image/svg+xml">
<!-- Analytics: Replace the block below with your preferred privacy-respecting analytics provider -->
<!-- Example: Plausible (https://plausible.io), Fathom, or GoatCounter -->
<!-- <script defer data-domain="libcna.com" src="https://plausible.io/js/plausible.js"></script> -->
<link rel="stylesheet" href="css/prism-tomorrow.min.css">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "WebSite",
"name": "CNA – C++23 XNA 4.0 Reimplementation",
"url": "https://libcna.com/",
"potentialAction": {
"@type": "SearchAction",
"target": "https://libcna.com/search.html?q={search_term_string}",
"query-input": "required name=search_term_string"
}
},
{
"@type": "SoftwareApplication",
"name": "CNA",
"description": "CNA 0.1.0-alpha.1 is the first tagged pre-release of a C++23 reimplementation of Microsoft XNA 4.0, with independent platform, audio and graphics selection axes and 50 public renderer identities.",
"applicationCategory": "DeveloperApplication",
"operatingSystem": "Linux, Windows, macOS, iOS, Android, WebAssembly",
"license": "https://opensource.org/licenses/MS-PL",
"url": "https://github.com/openeggbert/cna",
"programmingLanguage": "C++"
}
]
}
</script>
<script>(function(){try{var t=localStorage.getItem("cna-theme");if(t==="light"||t==="dark")document.documentElement.setAttribute("data-theme",t);}catch(e){}})();</script>
</head>
<body>
<a class="skip-link" href="#main-content">Skip to content</a>
<nav class="nav">
<div class="nav-container">
<a href="index.html" class="nav-brand">CNA</a>
<button class="nav-toggle" aria-label="Toggle navigation" aria-expanded="false">
<span></span><span></span><span></span>
</button>
<div class="nav-menu">
<a href="index.html" class="nav-link">Home</a>
<a href="about.html" class="nav-link">About</a>
<a href="features.html" class="nav-link">Features</a>
<a href="architecture.html" class="nav-link">Architecture</a>
<a href="documentation.html" class="nav-link">Documentation</a>
<a href="tutorials.html" class="nav-link">Tutorials</a>
<a href="demos.html" class="nav-link">Demos</a>
<a href="showcase.html" class="nav-link">Showcase</a>
<a href="videos.html" class="nav-link">Videos</a>
<a href="roadmap.html" class="nav-link">Roadmap</a>
<a href="contact.html" class="nav-link">Contact</a>
<a href="search.html" class="nav-link">Search</a>
<a href="https://github.com/openeggbert/cna" class="nav-link nav-link--github" target="_blank" rel="noopener">GitHub</a>
<a href="https://discord.gg/vrnc4n6DaE" class="nav-link nav-link--discord" target="_blank" rel="noopener">Discord</a>
</div>
<button class="theme-toggle" type="button" aria-label="Switch to light theme" title="Switch to light theme">
<svg class="theme-icon-light" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M12 17a5 5 0 1 1 0-10 5 5 0 0 1 0 10zm0-2a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM11 1h2v3h-2V1zm0 19h2v3h-2v-3zM3.5 4.9l1.4-1.4 2.1 2.1-1.4 1.4L3.5 4.9zm13.5 13.5l1.4-1.4 2.1 2.1-1.4 1.4-2.1-2.1zM19.1 3.5l1.4 1.4-2.1 2.1-1.4-1.4 2.1-2.1zM5.6 17l1.4 1.4-2.1 2.1-1.4-1.4L5.6 17zM23 11v2h-3v-2h3zM4 11v2H1v-2h3z"/></svg>
<svg class="theme-icon-dark" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M12.3 22a10 10 0 0 1-1.6-19.9c.6-.1 1 .5.8 1a7.9 7.9 0 0 0 9.7 10.6c.5-.2 1 .3.9.8A10 10 0 0 1 12.3 22z"/></svg>
</button>
</div>
</nav>
<main id="main-content">
<!-- Hero -->
<section class="hero">
<div class="hero-badge">0.1.0-alpha.1 · First tagged pre-release · 20 August 2026</div>
<h1>CNA</h1>
<a href="https://github.com/openeggbert/cna" class="github-ribbon" target="_blank" rel="noopener" style="display:inline-flex;align-items:center;gap:0.4rem;background:#24292e;color:#fff;padding:6px 14px;border-radius:20px;font-size:0.85rem;text-decoration:none;margin-bottom:1rem;">
<svg height="16" viewBox="0 0 16 16" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/></svg>
View on GitHub
</a>
<p class="hero-subtitle">A modern C++23 reimplementation of Microsoft XNA 4.0 with independent platform, audio and graphics layers.</p>
<div class="hero-cta">
<a href="documentation.html" class="btn btn-primary">📄 View Documentation</a>
<a href="docs/releases.html" class="btn btn-outline">Release notes</a>
<a href="https://github.com/openeggbert/cna" class="btn btn-secondary" target="_blank" rel="noopener">🔗 View GitHub Repository</a>
<a href="demos.html" class="btn btn-outline">► Try Web Builds</a>
</div>
<p class="hero-meta">Ms-PL · C++23 · pre-1.0 API · tag <code>v0.1.0-alpha.1</code></p>
</section>
<!-- Quick stats -->
<section class="section section--alt" style="padding:1rem 0;">
<div class="container">
<div style="display:flex;flex-wrap:wrap;gap:2rem;justify-content:center;text-align:center;">
<div><div style="font-size:2rem;font-weight:700;color:var(--primary);">0.1.0</div><div style="font-size:0.85rem;color:var(--text-muted);">alpha.1 release</div></div>
<div><div style="font-size:2rem;font-weight:700;color:var(--primary);">50</div><div style="font-size:0.85rem;color:var(--text-muted);">Renderer identities</div></div>
<div><div style="font-size:2rem;font-weight:700;color:var(--primary);">46</div><div style="font-size:0.85rem;color:var(--text-muted);">Implementation families</div></div>
<div><div style="font-size:2rem;font-weight:700;color:var(--primary);">4</div><div style="font-size:0.85rem;color:var(--text-muted);">Platform implementations</div></div>
<div title="SDL3, SDL2 and Null device selections; only SDL3 enables the alpha.1 XNA playback/mixer path"><div style="font-size:2rem;font-weight:700;color:var(--primary);">3</div><div style="font-size:0.85rem;color:var(--text-muted);">Audio platform choices</div></div>
<div title="Across 568 CNA-owned C++ test sources (539 contain macros); vendored third_party sources excluded"><div style="font-size:2rem;font-weight:700;color:var(--primary);">8,263</div><div style="font-size:0.85rem;color:var(--text-muted);">Static test definitions</div></div>
<div><div style="font-size:2rem;font-weight:700;color:var(--primary);">63 / 86</div><div style="font-size:0.85rem;color:var(--text-muted);">XNA samples ported</div></div>
<div title="Workflow files, not passing lanes; the intended full-suite job and two Input rows have a stale EASYGL configuration"><div style="font-size:2rem;font-weight:700;color:var(--primary);">21</div><div style="font-size:0.85rem;color:var(--text-muted);">CI workflow files</div></div>
</div>
</div>
</section>
<!-- Status notice -->
<section class="section section--alt">
<div class="container">
<div class="callout callout--warn">
<span class="callout-icon">⚠</span>
<p><strong>First tagged release.</strong> This site documents the immutable <code>v0.1.0-alpha.1</code> tag, whose C++ product version string is <code>0.1.0-alpha.1</code>. It is an alpha release: public APIs may change before 1.0. The tag includes a read-side XNB loader, runtime glTF loading, XNA/FNA compiled Effect Framework bytecode on qualified renderers and an opt-in multi-renderer build mode. Its experimental C ABI 0.7.0 source surface is present but its final library target is compile-blocked by a missing NanoVG identity mapping. See <a href="docs/releases.html">Releases & versioning</a> for the exact boundary.</p>
</div>
<div class="callout callout--info">
<span class="callout-icon">📝</span>
<p><strong>Read capabilities narrowly.</strong> The 50 public renderer identities share 46 implementation families and are not equally complete. A normal build contains one renderer; <code>CNA_GRAPHICS_RENDERERS</code> can opt into several compatible families and <code>GraphicsRendererSelection</code> chooses one before the first device. Platform host integration (<code>CNA_PLATFORM</code>), audio I/O (<code>CNA_AUDIO_PLATFORM</code>), graphics rendering and the target operating system are separate axes. Compiled effects are not universal: FNA3D supports them, while EasyGL, SDL_GPU and Vulkan require explicit build options; other renderers report the capability unavailable.</p>
</div>
</div>
</section>
<!-- Feature overview -->
<section class="section">
<div class="container">
<span class="section-label">What is CNA?</span>
<h2 class="section-title">XNA 4.0 for the modern C++ era</h2>
<p class="section-desc">CNA brings the XNA programming model to native C++ without a managed runtime, while keeping host integration, audio and graphics independently selectable.</p>
<div class="cards">
<div class="card">
<span class="card-icon">⚙</span>
<h3>XNA-Compatible API</h3>
<p>Public API follows XNA namespaces and patterns - <code>Microsoft::Xna::Framework</code> - so XNA knowledge transfers directly to CNA.</p>
</div>
<div class="card">
<span class="card-icon">🔗</span>
<h3>Independent platform layer</h3>
<p><code>CNA_PLATFORM</code> selects SDL3, real SDL2, Headless or POSIX Terminal host integration. <code>CNA_AUDIO_PLATFORM</code> independently accepts SDL3, SDL2 or Null device integration. At alpha.1 only SDL3 enables <code>SOUND_ENABLED</code> and the SDL3_mixer-backed XNA playback/decoding path; SDL2 and Null are lower-level device/configuration surfaces, not equivalent game-audio mixers.</p>
</div>
<div class="card">
<span class="card-icon">🌐</span>
<h3>Pluggable Renderers</h3>
<p><strong>50 public renderer identities</strong> are implemented by 46 families. Single-renderer builds remain the compact default; compatible sets can be linked with <code>CNA_GRAPHICS_RENDERERS</code> and selected before device creation. The inventory spans mainstream GPU APIs, browser DOM/Canvas renderers, vector and historical DirectX paths, middleware and GPU-free CPU implementations.</p>
</div>
<div class="card">
<span class="card-icon">🏅</span>
<h3>Native C++23</h3>
<p>Full control over memory, lifetimes, and rendering. No garbage collector, no managed runtime - pure native performance.</p>
</div>
<div class="card">
<span class="card-icon">🖥</span>
<h3>Cross-Platform</h3>
<p>Linux is the primary development host; Windows has portable and Windows-only renderer paths; Emscripten has WebGL, Canvas, DOM, SVG and PixiJS identities; macOS has native Metal CI. Android has NDK/source integration without an automatic gate. iOS is experimental and narrowly scoped to <code>SDL_RENDERER</code>: CI final-links a device app and launches a simulator smoke frame, but does not establish physical-device or pixel correctness.</p>
</div>
<div class="card">
<span class="card-icon">📦</span>
<h3>Real <code>.xnb</code> Content Pipeline</h3>
<p>A real read-side XNB loader is wired into <code>ContentManager</code>, including a built-in <code>EffectReader</code>, LZX decompression and shared-resource resolution. Built-in readers must be registered explicitly at startup. CNA reads content produced elsewhere; it does not include an XNB authoring pipeline.</p>
</div>
<div class="card">
<span class="card-icon">✨</span>
<h3>PBR & Skeletal Animation</h3>
<p>Beyond the six XNA stock effects, CNA ships non-XNA (<code>CNAEXT</code>) extensions: <code>PbrEffect</code> and <code>SkinnedPbrEffect</code> for physically based rendering, <code>SkinnedModelEXT</code> with <code>AnimationPlayer</code> and animation clips for skeletal animation, and <code>MorphTargetEXT</code> blend shapes. An offline glTF 2.0 converter is CNA's actual content path for models.</p>
</div>
<div class="card">
<span class="card-icon">🔧</span>
<h3>Built on sharp-runtime</h3>
<p>CNA rests on <a href="https://github.com/openeggbert/sharp-runtime" target="_blank" rel="noopener">sharp-runtime</a>, a C++23 implementation of a practical .NET BCL subset covering <code>System::Collections</code>, <code>IO</code>, <code>Text</code> (including JSON and regular expressions), <code>Net</code>, <code>Threading</code>, <code>Xml</code>, <code>Globalization</code> and <code>Numerics</code>. It is a required sibling checkout with its own independently moving test and release history.</p>
</div>
<div class="card">
<span class="card-icon">🎮</span>
<h3>Verified Against Real XNA</h3>
<p>A <strong>39-scene oracle corpus</strong> is rendered by a real C#/XNA reference renderer and diffed pixel-exactly against CNA's DIRECTX9 output at zero tolerance, alongside differential testing against a running FNA build. 63 of the 86 official XNA 4.0 samples build on <a href="https://github.com/openeggbert/cna-samples" target="_blank" rel="noopener">cna-samples</a>, and <a href="https://github.com/openeggbert/cna-craft" target="_blank" rel="noopener">CNA Craft</a> plus the browser demos exercise the API under real game-code conditions.</p>
</div>
</div>
</div>
</section>
<!-- Why CNA? -->
<section class="section section--alt">
<div class="container">
<span class="section-label">Motivation</span>
<h2 class="section-title">Why CNA?</h2>
<p class="section-desc">CNA fills a specific gap: there is no other mature native C++ reimplementation of the XNA 4.0 API.</p>
<div class="cards cards--2">
<div class="card">
<h3>No managed runtime</h3>
<p>C++ avoids GC pauses, managed heap overhead, and JIT warmup. Useful for performance-critical or embedded scenarios where .NET is unavailable.</p>
</div>
<div class="card">
<h3>Familiar API</h3>
<p>The XNA programming model is genuinely good design. CNA preserves it in C++ — if you know XNA or MonoGame, you'll be productive in minutes.</p>
</div>
<div class="card">
<h3>Pluggable renderers</h3>
<p>Swap between OpenGL ES, Vulkan, SDL_Renderer, SDL_GPU, bgfx, Metal, FNA3D, native Direct3D 1–12, DirectDraw-shaped FreeDirect, browser Canvas/SVG/DOM, experimental WebGPU, or the GPU-free Software, PortableGL and Headless renderers at build time — without changing a line of game code.</p>
</div>
</div>
</div>
</section>
<!-- Code example -->
<section class="section section--alt">
<div class="container">
<span class="section-label">Code Example</span>
<h2 class="section-title">Familiar XNA-style game loop</h2>
<p class="section-desc">If you know XNA or MonoGame, CNA will feel immediately recognisable - just in native C++.</p>
<pre><code>#include "Microsoft/Xna/Framework/Game.hpp"
#include "Microsoft/Xna/Framework/Graphics/GraphicsDeviceManager.hpp"
#include "Microsoft/Xna/Framework/Graphics/SpriteBatch.hpp"
using namespace Microsoft::Xna::Framework;
using namespace Microsoft::Xna::Framework::Graphics;
class MyGame final : public Game {
public:
MyGame() : graphics_(this) {}
protected:
void LoadContent() override {
spriteBatch_ = std::make_unique<SpriteBatch>(getGraphicsDeviceProperty());
logo_ = std::make_unique<Texture2D>("assets/logo.png", getGraphicsDeviceProperty());
}
void Draw(const GameTime& gameTime) override {
getGraphicsDeviceProperty().Clear(CornflowerBlue);
spriteBatch_->Begin();
spriteBatch_->Draw(*logo_, 100.0f, 80.0f);
spriteBatch_->End();
getGraphicsDeviceProperty().Present();
}
private:
GraphicsDeviceManager graphics_;
std::unique_ptr<SpriteBatch> spriteBatch_;
std::unique_ptr<Texture2D> logo_;
};
int main() { MyGame game; game.Run(); }</code></pre>
<a href="docs/getting-started.html" class="btn btn-primary btn-sm">Get Started →</a>
</div>
</section>
<!-- Quickstart -->
<section class="section">
<div class="container">
<span class="section-label">Quickstart</span>
<h2 class="section-title">Get running in 5 minutes</h2>
<pre><code># 1. Clone CNA and its sibling repositories (these are NOT submodules)
git clone https://github.com/openeggbert/cna.git
git clone https://github.com/openeggbert/sharp-runtime.git
git clone https://github.com/openeggbert/easy-gl.git
git clone https://github.com/openeggbert/meta-gl.git
cd cna
git submodule update --init # non-recursive is correct, and much faster
# 2. System packages (FFmpeg is required on Linux/macOS, not optional)
sudo apt install cmake g++ ninja-build pkg-config \
libavcodec-dev libavformat-dev libavutil-dev libswresample-dev
# 3. Build (OPENGLES3 is the Linux default — needs OpenGL ES 3.0)
cmake -S . -B build -DCNA_GRAPHICS_RENDERER=OPENGLES3
cmake --build build --target CnaTests
# 4. Run the tests
ctest --test-dir build --output-on-failure</code></pre>
<a href="docs/getting-started.html" class="btn btn-primary btn-sm">Full Getting Started Guide →</a>
<a href="docs/building.html" class="btn btn-secondary btn-sm" style="margin-left:0.5rem;">All Build Options →</a>
</div>
</section>
<!-- Related projects -->
<section class="section">
<div class="container">
<span class="section-label">See Also</span>
<h2 class="section-title">Related projects & references</h2>
<p class="section-desc">CNA sits in a larger public ecosystem: required runtime layers, renderer libraries, starter projects, ports, tools, games and primary XNA references. The links below were checked against the public <a href="https://github.com/openeggbert" target="_blank" rel="noopener">openeggbert GitHub account</a> on 20 August 2026.</p>
<div class="callout callout--note" style="margin-bottom:2rem;">
<span class="callout-icon">🔗</span>
<p><strong>Release boundary:</strong> this site documents CNA <code>0.1.0-alpha.1</code>. Companion repositories have their own branches and release cadence; a link here means “related and public”, not that its current default branch is guaranteed to build against this exact CNA tag. Required sibling checkouts for a chosen CNA configuration are identified separately in the <a href="docs/building.html">build guide</a>.</p>
</div>
<div class="callout callout--info" style="margin-bottom:2rem;">
<span class="callout-icon">📝</span>
<p><strong>CNA is partially based on FNA (C#).</strong> Portions of CNA's API design and implementation are derived from <a href="https://github.com/FNA-XNA/FNA" target="_blank" rel="noopener">FNA</a> - a managed C# reimplementation of XNA 4.0 by Ethan Lee, licensed under the Ms-PL. CNA translates these portions into native C++23. See <a href="about.html#fna">About</a> and the tag's <a href="https://github.com/openeggbert/cna/blob/v0.1.0-alpha.1/THIRD_PARTY_NOTICES.md" target="_blank" rel="noopener">THIRD_PARTY_NOTICES.md</a> for full attribution.</p>
</div>
<div class="cards cards--2">
<div class="card">
<h3>Microsoft XNA 4.0 Documentation</h3>
<p>The original XNA Game Studio 4.0 API documentation on Microsoft Learn - the reference CNA aims to be compatible with.</p>
<a href="https://learn.microsoft.com/en-us/previous-versions/windows/xna/bb200104(v=xnagamestudio.41)" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">Microsoft Learn ↗</a>
</div>
<div class="card">
<h3>FNA</h3>
<p>FNA is a reimplementation of the Microsoft XNA Game Studio 4.0.4 libraries, targeting C#/.NET. CNA shares the Ms-PL licence and portions derived from FNA.</p>
<a href="https://fna-xna.github.io/docs/" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">FNA Docs ↗</a>
</div>
<div class="card">
<h3>MonoGame</h3>
<p>MonoGame is a cross-platform successor to XNA for C#. Its documentation is a valuable reference for understanding the XNA API surface.</p>
<a href="https://docs.monogame.net/articles/index.html" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">MonoGame Docs ↗</a>
</div>
<div class="card">
<h3>sharp-runtime</h3>
<p>The C++23 implementation of the practical <code>System.*</code> surface used throughout CNA: value types, strings, collections, IO, text, threading, XML, JSON and more. Every alpha.1 build requires this sibling checkout.</p>
<a href="https://github.com/openeggbert/sharp-runtime" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">sharp-runtime on GitHub ↗</a>
</div>
<div class="card">
<h3>easy-gl & meta-gl</h3>
<p><code>meta-gl</code> supplies type-safe OpenGL/OpenGL ES loading and calls; <code>easy-gl</code> adds the toolkit-independent object layer used by CNA's five EasyGL renderer identities. Clone both beside CNA when building those identities.</p>
<a href="https://github.com/openeggbert/easy-gl" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">easy-gl ↗</a>
<a href="https://github.com/openeggbert/meta-gl" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">meta-gl ↗</a>
</div>
<div class="card">
<h3>free-direct & free-api</h3>
<p>Portable, game-driven compatibility layers for a narrow DirectX 3/DirectDraw and WinAPI-era surface. CNA's cross-platform <code>FREEDIRECT</code> renderer fronts <code>free-direct</code>, which in turn uses <code>free-api</code>.</p>
<a href="https://github.com/openeggbert/free-direct" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">free-direct ↗</a>
<a href="https://github.com/openeggbert/free-api" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">free-api ↗</a>
</div>
<div class="card">
<h3>FreeDirect game consumers</h3>
<p><strong>Planet Blupi</strong> is the portable original-source game that exercises <code>free-direct</code> and <code>free-api</code> on Linux and the web. <strong>Free Eggbert</strong> is a work-in-progress reconstruction of Speedy Eggbert 2. They are indirect CNA references: CNA's <code>FREEDIRECT</code> renderer shares the same compatibility-layer behavior they stress.</p>
<a href="https://github.com/openeggbert/planetblupi" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">planetblupi ↗</a>
<a href="https://github.com/openeggbert/free-eggbert" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">free-eggbert ↗</a>
</div>
<div class="card">
<h3>Easy3D</h3>
<p>A deliberately small companion library for CNA projects that need practical cameras, billboard/cube batching, texture atlases and debug drawing without hiding CNA behind a separate engine abstraction.</p>
<a href="https://github.com/openeggbert/easy-3d" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">easy-3d on GitHub ↗</a>
</div>
<div class="card">
<h3>CNA glTF Viewer</h3>
<p>A focused desktop viewer for <code>.gltf</code> and <code>.glb</code> assets. It exercises both CNA's direct runtime glTF path and the <code>cna_tool_gltf_to_cnj</code> conversion path, including materials, skins and animation playback.</p>
<a href="https://github.com/openeggbert/cna-gltf-viewer" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">cna-gltf-viewer on GitHub ↗</a>
</div>
<div class="card">
<h3>CNA.NET</h3>
<p>The public C#/.NET binding project layers an XNA-compatible managed facade and an idiomatic CNA API over CNA's experimental native C ABI. The exact CNA alpha.1 C library cannot be built without correcting its missing NanoVG C identity, and the binding evolves independently, so check both sides before pairing releases.</p>
<a href="https://github.com/openeggbert/cna-cs" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">cna-cs on GitHub ↗</a>
</div>
<div class="card">
<h3>Galaxy Eggbert</h3>
<p>A playable 3D game and editor built directly on CNA with Easy3D helpers. It provides a substantial real-game consumer for terrain, models, UI, audio, persistence and authoring workflows beyond isolated samples.</p>
<a href="https://github.com/openeggbert/galaxy-eggbert" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">galaxy-eggbert on GitHub ↗</a>
</div>
<div class="card">
<h3>Mobile Eggbert</h3>
<p>A C++ migration of the 2013 Windows Phone XNA game through MonoGame to CNA. It consumes CNA directly and exercises a complete game across native desktop, MinGW/Wine, Android and Emscripten paths rather than an isolated framework sample.</p>
<a href="https://github.com/openeggbert/mobile-eggbert" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">mobile-eggbert on GitHub ↗</a>
</div>
<div class="card">
<h3>MeshCraft</h3>
<p>A C++23 scene editor and conversion toolchain for editable MC3 scenes and glTF/GLB output. Its graphical editor has a CNA rendering path, while its command-line converters can run without CNA.</p>
<a href="https://github.com/openeggbert/mesh-craft" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">mesh-craft on GitHub ↗</a>
</div>
<div class="card">
<h3>CNA Editor</h3>
<p>An archived tooling experiment built on CNA's public API: scene/entity editing, asset import, 2D and wireframe 3D viewports, gizmos, a plugin surface and a separate live player process. It is useful design evidence, not part of CNA or a maintained alpha.1 toolchain.</p>
<a href="https://github.com/openeggbert/cna-editor" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">cna-editor on GitHub ↗</a>
</div>
<div class="card">
<h3>cna-samples</h3>
<p><strong>63 of 86 in-scope official XNA Game Studio 4.0 samples are ported and build.</strong> That repository has not changed since the preceding site audit. Build status is not a universal runtime claim: shader-heavy samples still depend on alpha.1's selected renderer, compiled-effect option and input format.</p>
<a href="https://github.com/openeggbert/cna-samples" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">cna-samples on GitHub ↗</a>
</div>
<div class="card">
<h3>cna-extended</h3>
<p>A C++23 port of <strong>MonoGame.Extended</strong>, and the largest project in the ecosystem at ~65,000 lines. All 18 upstream subsystems are implemented, none of them skeletons — tilemaps (Tiled TMX, LDtk and Ogmo), particles, ECS, screens, tweening, collisions, bitmap fonts, input listeners, animations and more. It adds a non-upstream <code>World3DEXT</code> layer: an ECS-based 3D renderer with frustum culling, skinned models, octree and spatial-hash broadphases, a 3D particle system and voxel tilemaps. 2,363 tests pass. Note its default build is headers-only — pass <code>-DCNA_EXTENDED_LINK_CNA=ON</code> to actually link.</p>
<a href="https://github.com/openeggbert/cna-extended" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">cna-extended on GitHub ↗</a>
</div>
<div class="card">
<h3>cna-craft</h3>
<p>A working port of Michael Fogleman's <strong>Craft</strong> — a creative-mode voxel sandbox with real multiplayer, not a Minecraft clone. 16³ chunks streamed by column, simplex terrain, 56 block types, a 27-neighbourhood ambient-occlusion meshing pass, an authoritative server speaking Craft's own ASCII wire protocol, and SQLite persistence of player edits. The cleanest codebase of the set: zero TODOs and zero stubs across 10,000 lines. Native builds work; the Emscripten build currently black-screens.</p>
<a href="https://github.com/openeggbert/cna-craft" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">cna-craft on GitHub ↗</a>
</div>
<div class="card">
<h3>cna-examples</h3>
<p>A single browsable catalogue app that teaches CNA's own APIs, one demo screen at a time — <em>Home → Area → Category → Demo</em>, navigable at runtime with no rebuild. 60 demos are registered so far, covering Input (50) and Audio (10). Devices, Net, Media and both Graphics areas appear in the menu but are still empty, and there are no tests yet.</p>
<a href="https://github.com/openeggbert/cna-examples" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">cna-examples on GitHub ↗</a>
</div>
<div class="card">
<h3>cna-template</h3>
<p>The starting point for a new CNA game. The C++ is deliberately tiny — 140 lines that load a texture and move it with the arrow keys — because the build wiring is the actual product: 9 CMake presets, a complete Android gradle project, MinGW-w64 cross-compilation, Emscripten asset preloading, Windows DLL deployment, a <code>dependencies.lock</code> pinning exact CNA and sharp-runtime commits, and CI across Linux, Windows, web and Android.</p>
<a href="https://github.com/openeggbert/cna-template" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">cna-template on GitHub ↗</a>
</div>
<div class="card">
<h3>xna4-spec</h3>
<p>A machine-readable XML catalogue of the XNA 4.0 API surface, scraped from Microsoft's original documentation and validated against a hand-written schema. It is useful as a checklist of namespaces, types and members, but its one-line summaries do not define runtime semantics or conformance. CNA does not consume it at build time.</p>
<a href="https://github.com/openeggbert/xna4-spec" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">xna4-spec on GitHub ↗</a>
</div>
<div class="card">
<h3>OpenEggbert ecosystem map</h3>
<p>The public umbrella repository explains how CNA, sharp-runtime, rendering layers, tools and preservation projects fit together. Use it to discover adjacent work; its moving project summaries are not the source of truth for this immutable alpha.1 documentation snapshot.</p>
<a href="https://github.com/openeggbert/openeggbert" target="_blank" rel="noopener" class="btn btn-secondary btn-sm mt-2">openeggbert on GitHub ↗</a>
</div>
</div>
</div>
</section>
</main>
<footer>
<div class="footer-inner">
<div class="footer-top">
<div class="footer-brand">
<div class="footer-brand-name">CNA</div>
<p>Documentation snapshot for CNA 0.1.0-alpha.1, the first tagged pre-release. CNA exposes 50 renderer identities across 46 implementation families; APIs may change before 1.0.</p>
</div>
<div class="footer-col">
<h4>Project</h4>
<ul>
<li><a href="about.html">About</a></li>
<li><a href="features.html">Features</a></li>
<li><a href="architecture.html">Architecture</a></li>
<li><a href="roadmap.html">Roadmap</a></li>
</ul>
</div>
<div class="footer-col">
<h4>Docs</h4>
<ul>
<li><a href="docs/getting-started.html">Getting Started</a></li>
<li><a href="docs/building.html">Building</a></li>
<li><a href="docs/platforms.html">Platforms</a></li>
<li><a href="docs/rendering-backends.html">Renderers</a></li>
<li><a href="docs/faq.html">FAQ</a></li>
</ul>
</div>
<div class="footer-col">
<h4>Community</h4>
<ul>
<li><a href="https://github.com/openeggbert/cna" target="_blank" rel="noopener">GitHub</a></li>
<li><a href="https://discord.gg/vrnc4n6DaE" target="_blank" rel="noopener">Discord</a></li>
<li><a href="demos.html">Demos</a></li>
<li><a href="videos.html">Videos</a></li>
<li><a href="contact.html">Contact</a></li>
</ul>
</div>
</div>
<div class="footer-bottom">
<p>CNA is not affiliated with or endorsed by Microsoft Corporation. XNA is a trademark of Microsoft. Licensed under the Microsoft Public License (Ms-PL).</p>
<div class="footer-links">
<a href="https://github.com/openeggbert/cna/blob/master/LICENSE" target="_blank" rel="noopener">License</a>
<a href="contact.html">Contact</a>
</div>
</div>
</div>
</footer>
<script src="js/main.js"></script>
<script src="js/prism/prism.min.js" defer></script>
<script src="js/prism/prism-cpp.min.js" defer></script>
<script src="js/prism/prism-glsl.min.js" defer></script>
<script src="js/prism/prism-json.min.js" defer></script>
<script src="js/prism/prism-bash.min.js" defer></script>
<script src="js/prism/prism-cmake.min.js" defer></script>
</body>
</html>