Repository navigation
Releases: FlyingFathead/c64-3d-toolkit
Release list
v0.8.2: Renderer contests and V5 candidates
EasyFlash is the default again for new HORS-V4 builds. GMod3 remains available explicitly, and GMod4 remains on the roadmap.
- Renderer contests: compare fixed-picture pipelines, rank average displayed FPS, show tail latency and capacity limits, and produce winner-labelled CRTs.
- V5-c1 and V5-c2: c1 preserves the previous V5; opt-in c2 selects run/shared colour transport alongside V5 clearing. HORS-V4 stays the default.
- Full HORS-family comparison: V1 through V5 on 16 public inputs, including Stanford Dragon and SAKU logo-only variants. 190 passes, two explained capacity N/As, zero failures.
- Preserved output policy: existing cartridges, V4, colour conversion and default colour-overlap handling remain intact.
C2 improves both SAKU logo cases over c1 and ties it on the other fourteen public inputs. V2 still narrowly leads solid SAKU; the measurements do not establish a universal winner. PAL VICE only.
Release notes · Performance chart · Contest guide
The source ZIP preserves the historical examples. The public HORS-family carts ZIP contains the fresh comparison builds; no private benchmark assets are included.
v0.8.1: Camera crossings, Blender colours and Demo Cart v3.1
Authored Blender scenes can now pass through the camera without crashing conversion. Geometry clips at the near plane and viewport, fully invisible samples remain in the timeline, and objects can reappear without losing frames.
- Blender colours:
--blender-color-space linear|srgb, an INI default and an interactive chooser.--configure-blender-color-space srgbsaves the setting directly. Standard linear interpretation remains the default; the palette and explicit material indices are unchanged. - Demo Cart v3.1: all 58 selectable entries and 6,474 pictures, improved help and menu return, SPACE/Enter launch, next/previous navigation, and stars disabled at startup/reset.
- Setup and CLI: dependency installation/repair, actionable errors, version/author banner, grouped help and
--help-all. - Diagnostics: one clipping summary,
--ignore-warnings, an original camera-crossing example, updated documentation and numbered checkpoint archives.
Stale root monitor logs are copied into ignored logs/ with unique timestamps and verified before removal. VICE logging destinations and tracked-log release cleanup are corrected.
318 tests passed; three optional historical tests skipped. Native PAL VICE checks passed for the camera example on GMod3, EasyFlash and resident PRG output. All 71 original cartridge binaries are preserved. Existing interactive A/B evidence records a median 0.24% average-FPS reduction for the v3.1 input fixes; no general speedup is claimed. Physical hardware, NTSC and Windows execution were not validated during this update.
The source ZIP includes the toolkit and examples. The standalone Demo Cart v3.1 CRT is attached separately for immediate use.
v0.8.0: GMod3 cartridge support added, switch to HORS-V4
v0.8.0: GMod3 cartridge support added, switch to HORS-V4
HORS-V4 (hors-v4, also hors-renderer-v4 and hors-render-v4) is the default conversion
renderer and uses GMod3 by default. It keeps the V3 picture core while adding
separate GMod3 processing, image packing, ROM access, paging and collection code.
Explicit older renderers retain their EasyFlash defaults. Existing EasyFlash
backend modules, assembly and released CRTs are preserved byte-for-byte.
What fits
Demo Cart v3.0: GMod3 All-in-One contains
all distinct released picture sequences: 58 entries, 6,474 pictures, six Dragon
variants, eight SAKU presentations and every one of Marbles' 640 pictures.
Equivalent source cartridges share an entry; differing sample counts remain.
There are exactly two new demo CRTs in examples/gmod3_cart_demos/:
| Edition | Entries | Capacity | Used | Free |
|---|---|---|---|---|
| Interactive | 58 | 16,384 KiB | 13,448 KiB | 2,936 KiB |
| Automatic benchmark | 65 | 16,384 KiB | 13,416 KiB | 2,968 KiB |
The SPACE menu and each build report show cartridge type and allocated/free
KiB, including bank padding. Stars start off. RUN/STOP (Esc in VICE) or F1 returns to the menu, N/P selects
entries and C cycles Dragon shades. Shared SAKU controls cover colours,
direction, speed, HUD, help, star density/profile and exhibition. The benchmark
edition has no runtime input polling and advances after displaying every picture.
Original custom cartridge title/ending executables are not embedded; Marbles
uses the unified controls and loops its full picture sequence.
Measured improvement
The new label in the performance tables is
hors-v4-gmod3. In 69 matched automatic workloads, it has 65 higher
averages, four ties and zero lower averages than hors-v3 on EasyFlash.
The increase ranges from 0 to 0.396819 FPS. Mean active rendering cycles
also never increase. The four SAKU crawl variants tie; solid crawl reaches the PAL display limit.
This is a modest improvement, not a universal extra FPS.
Both backends receive identical encoded pictures, colours, sample order and
HUD settings, with stars and authored pacing disabled. Each test checks two
picture loops and then measures actual display flips over 4,800 PAL refreshes
(95.761 seconds), excluding warm-up. Marbles is compared in five equal
128-picture segments; its uninterrupted paged playback is verified separately.
The 192-picture metallic Pretzel uses its released indexed4 policy on both
backends to fit EasyFlash's preserved ROML allocator.
High, average and low FPS remain listed. Only winning averages are bold;
ties are marked at the displayed precision. Sande's models have separate
tables. The generator and a separate cell-by-cell winner audit validate the
current page. Historical comparison protocols and measured cartridge versions
remain identified rather than being relabelled as HORS-V4 results.
Verification
Release audit and original-file preservation
checks the final image hashes against the measured cartridges.
The 283-test Python suite completed with
280 passes and three optional checks skipped.
- All 58 final interactive entries: complete picture loops, colours and all
three buffers, then individually measured display FPS. - All 65 automatic entries: final-picture drain, correct handoff, full wrap,
soft and hard reset. - SAKU: all 240 mode pictures, 48 colour combinations, HUD/speed keys, help
pause/restore, light/full stars and exhibition; collection navigation and
centered capacity text. - Marbles: all five pages forward and reverse, full wrap and standalone paced
640-picture scene playback. - Default CLI: object, painted SVG and authored scene builds; standalone SPACE
wait, help return and capacity layout. Short V4 GMod3/EasyFlash labels pass
cold-boot UI and picture checks; the EasyFlash authored-scene fallback also
passes. Short-selector evidence and commands. - Image validation: type 62, 64-byte v1.0 header, EXROM/GAME 0/1, normal 8 KiB
startup, CBM80 vectors, complete bank sequence and raw-image round trip. - Bank diagnostics: every bank at 2/4/8/16 MiB, high-bit boundaries, mapping,
IRQ/NMI and reset. Absolute/indexed bank stores cost 4/5 CPU cycles; the
GMod3 helper pair costs 40 cycles versus 60 for the matched EasyFlash helper.
Evidence: matched comparisons,
interactive entries,
sequence transitions,
features,
paging,
bank diagnostics.
These are PAL VICE 3.10 measurements. Physical GMod3 hardware and NTSC remain
untested; no audio engine or flash-programming support is claimed. The supplied
EN25QH128A(2T) PDF describes the SPI flash chip, not the CRT header or a C64
bank-switch latency. See GMod3 documentation and primary sources.
Install and select hardware
Apply the incremental ZIP over the supplied 0.7.9 toolkit. From its parent:
# Run from the directory containing c64-3d-toolkit/
unzip -o c64-3d-toolkit-v0.8.0-incremental.zip
cd c64-3d-toolkit
python c643d.py --version
python c643d.py run-cart examples/gmod3_cart_demos/demo-cart-v3.0-gmod3-all-in-one.crtThe archive includes the c64-3d-toolkit/ prefix. It contains additions and
changed files, not another copy of the original assets or toolchain. Keep the
existing examples tree: the collection rebuild reads those source CRTs/oracles.
# New default: HORS-V4 / GMod3.
python c643d.py build --shape torus --surface-fill metallic --interactive-cart
# HORS-V4 with EasyFlash.
python c643d.py build --renderer hors-v4-ef --shape torus --surface-fill metallic
# Preserved HORS-V3 / EasyFlash.
python c643d.py build --renderer hors-v3 --shape torus --surface-fill metallic
# Explicit capacity and hardware.
python c643d.py build --cart-type gmod3 --gmod3-size-mib 16 --shape cubeUniversal preference example (config/c643d.ini or --config PATH):
[cartridge_defaults]
cart_type = gmod3Values are auto, easyflash, gmod3. CLI hardware choices (--cart-type or a hors-v4-ef / hors-v4-gmod3 suffix) win, then config,
then renderer default. auto preserves per-renderer defaults. The historical
cart-demos command keeps its EasyFlash comparison path. See
configuration and supported source limits.
Rebuild and check
python -m unittest discover -s tests
python examples/gmod3_cart_demos/build.py --tass 64tass --cartconv cartconv
python tools/compare_gmod3_catalog.py --tass 64tass --cartconv cartconv --vice x64sc --vice-data /path/to/vice/data
python tools/report_gmod3_performance.py
python tools/report_gmod3_performance.py --check
python tools/verify_gmod3_release.pyThe comparison command always rebuilds and measures; old JSON files are not
accepted as a cache for changed code. The report command checks all 69 cases
and independently checks winning cells. See each verify_gmod3_*.py --help
for complete per-entry, feature, sequence, startup and paging checks. Historical
compare_renderers.py --check fingerprints belong to their original release;
they are not rewritten to claim a fresh run of older renderer matrices.
Publish from your checkout
After applying the update, inspect and commit the release files, then tag and
create the full source archive from that commit:
git diff --stat
git add VERSION CHANGELOG.md README.md config/c643d.ini.example config/gmod3.ini.example c64/gmod3 tools tests docs examples/README.md examples/gmod3_cart_demos
git commit -m "Release 0.8.0: GMod3 cartridge support added, switch to HORS-V4"
git tag -a v0.8.0 -m "c64-3d-toolkit 0.8.0"
git push origin HEAD
git push origin v0.8.0
git archive --format=zip --prefix=c64-3d-toolkit/ -o ../c64-3d-toolkit-v0.8.0.zip v0.8.0
gh release create v0.8.0 ../c64-3d-toolkit-v0.8.0.zip --title "v0.8.0: GMod3 cartridge support added, switch to HORS-V4" --notes-file docs/RELEASE_0.8.0.mdThe delivered incremental ZIP has not committed, pushed or tagged your repository.
v0.7.9: The Golden Dragon & SAKU 2026
HORS-V3 defaults, the Golden Dragon, and SAKU 2026.
- SVG paint, gradients and expanded colour controls.
- Interactive exhibition mode, paged help, HUD and starfield controls.
- Full-width 320×192 Blender export and optional artwork flips.
- Editable Blender calibration scenes, previews and a Blender FAQ.
- Updated cartridge examples and validation evidence.
- Preserved README showreel, excluded from benchmark input fingerprints.
Release notes
Final additions and validation
Showreel check correction
The attached full ZIP extracts into c64-3d-toolkit/.
v0.7.8: The Stanford Dragon Has Arrived!
v0.7.8: The Stanford Dragon Has Arrived!
The Stanford Dragon lands on the Commodore 64 in five HORS-V3 demo cartridges: wireframe, metallic (grey), red, green and blue. The official Stanford res4 mesh retains all 5,205 vertices, 15,796 edges and 11,102 triangles, with 128 viewing orientations per cart.
New in HORS-V3: red, green and blue shading ramps for generated surface textures, alongside the original metallic (grey). Choose the look from the CLI with --surface-palette grey|red|green|blue. --surface-fill grey is an alias for --surface-fill metallic.
Watch the showcase GIF: one complete turn each of wireframe, metallic, red, green and blue, in that order. Individual GIFs, prebuilt carts, source geometry, rebuild commands and performance results are in the Stanford Dragon example. Playback follows measured PAL VICE display timing.
CLI
python c643d.py build --renderer hors-renderer-v3 \
--obj examples/stanford_dragon/stanford_dragon.obj \
--name "STANFORD DRAGON" --obj-up y --spin-axis y --frames 128 \
--surface-fill metallic --surface-palette redUse green or blue for the other colour ramps. The default is grey; metallic and gray also alias the grey palette. Coloured shading uses native C64 colours and respects the two-colours-per-8×8-cell hires limit. The original black/white dither mode requires the grey palette. Imported image textures and MTL face colours retain their previous behaviour.
HORS-V3 performs projection, visibility and lighting on the host and streams bitmap/colour drawing data to the C64. HORS-V2 remains the toolkit default; older explicit renderers remain available.
Measured Dragon performance
PAL VICE 3.10, stock C64 timing, 128 orientations per cart. Average FPS counts actual display-buffer flips over 1,504 PAL refreshes after warmup.
| Look | Average displayed FPS | Frame stream | CRT file |
|---|---|---|---|
| Wireframe | 20.00 | 233,306 bytes | 303,760 bytes |
| Metallic (grey) | 15.13 | 279,935 bytes | 361,216 bytes |
| Red | 15.10 | 277,791 bytes | 353,008 bytes |
| Green | 15.13 | 279,215 bytes | 361,216 bytes |
| Blue | 15.13 | 280,945 bytes | 361,216 bytes |
The combined GIF shows all five complete rotations in 40.34 seconds. All 1,295 completed-picture checks passed; every orientation was also verified in the actual display buffers. Detailed timings, RAM use and evidence.
The release unit suite passed: 239 tests, 3 skipped. Existing release validation passed 25 cartridges and 10,751 picture checks. The full historical renderer comparison and all 11 existing HORS-V3 workloads were rerun. Existing HORS-V3 cartridge binaries remained byte-for-byte identical to v0.7.7.
Release integration
- Lead the main README with the Dragon showcase, retain the previous Pretzel release with its metallic GIF, and move older announcements to release history.
- Integrate all five Dragon builds, independent picture checks, display measurements, GIF captures and a combined showcase into the release workflow.
- Add Dragon performance to the generated main comparison and its source/evidence checks.
- Rebuild current release cartridges and refresh the existing renderer comparison for 0.7.8.
- Give incremental packages a distinct filename, preserving the full ZIP when a baseline is supplied.
- Save required HORS-V3 test transcripts as tracked
.txtfiles and derive the evidence path fromVERSION. - Add Stanford University Computer Graphics Laboratory and Thomas "skoe" Giesel / EasyFlash / EasyAPI to the main README credits.
Model provenance and Stanford's usage terms are included with the example. PAL VICE validation is recorded in release evidence; physical C64 hardware and NTSC are not measured.
Install and check
Extract the incremental ZIP from the parent of the existing checkout. It contains a c64-3d-toolkit/ top-level directory. Then run from the checkout:
python examples/stanford_dragon/verify.py --check
python tools/run_hors_v3_perfs.py --check
python tools/compare_renderers.py --checkv0.7.7: Pretzel Logic - The Great Texture Update
Pretzel Logic - The Great Texture Update
- Add opt-in HORS-V3 solid surfaces, metallic shading and MTL image textures.
- Keep HORS-V2 wireframe as the default and preserve earlier renderers.
- Add optional compact colour dictionaries for smaller frame streams.
- Include direct and compact interactive metallic Pretzel cartridges.
- Add background cycling, adjustable speed, border controls and reset flash while preserving nonblack shading.
- Update performance charts, examples, README animation and credits.
Measured PAL VICE performance: metallic direct 14.70 FPS; compact 12.46 FPS. Compact reduces the metallic frame stream by 7.3%. Interactive idle: 14.30 and 12.20 FPS respectively.
Validation: 233 unit tests run, 3 skipped; all 26 canonical jobs passed with 22,901 completed-picture checks. All 11 HORS-V3/reference cartridges were rebuilt and measured.
v0.7.6: Sande's Models and Interactive HORS-V2
Sande's Models and interactive cartridges
- Add Sande's Pretzel and TAC-2 joystick, including renamed OBJ/MTL sources and reproducible builds.
- Keep black-and-white defaults and provide separate material-colour variants. Included cartridges use HORS-V2.
- Add
--interactive-cart: cursor keys and either joystick port select rotation direction. - Add the INTERACTIVE overlay, palette cycling and speed controls, reset flash, background-following borders, black-border lock and Ctrl+F7 custom border colours.
- Extend performance comparisons with Sande's bw and colour workloads, historical rendering methods, and interactive cycling costs.
Validation: 216 unit tests run, three skipped; all 26 canonical comparison jobs passed with 22,901 completed-picture checks. Default palette cycling costs about 2% versus interactive idle; fastest cycling costs 24–30%.
v0.7.5: optional legacy cartridge generation
- Add explicit
--legacy-cartcompatibility output for objects, scenes, demo menus, HiFi, Demo Cart 2, colour tests and cartridge smoke tests. Standard generation remains the default; no automatic fallback occurs. - Restore the preserved pre-0.7.4 boot programs and original scene ROMH packing together. Legacy mode omits EAPI/EF-Name and does not relocate the scene's 1 KiB into bank 2 ROML.
- Warn that the selected method was discontinued since 0.7.4 and may fall outside recommended EasyFlash layout conventions. Retain physical capacity, packet and reset-vector checks.
- Label automatically named compatibility outputs with
-legacyand recordcart_write_methodin manifests. Keep these outputs out of the current release index. - Correct the default object/scene bootstraps to initialize the CPU port latch
$01before direction register$00, matching the EasyFlash guide. Historical boot files remain unchanged. - Verify exact legacy reproduction against the downloaded v0.7.3 release: all 20 control CRTs have equal before/after SHA-256 and zero differing bytes, including headers, with no masking or binary patching. Controls use the published identities, including 0.7.2 for inherited Marbles/HiFi; actual release builds use 0.7.5.
- Rebuild current examples and refresh release validation. See 0.7.5 release notes.
v0.7.4: cartridge loading and EasyFlash metadata
-
Route every cartridge
--runthrough one VICE launcher: PAL/windowed/non-Warp defaults, explicit user overrides, default-cartridge detachment, CRT write-back disabled and automatic settings saving disabled. Addrun-cartfor existing CRTs and--vice-clean-settingsfor temporary factory defaults. -
Validate CRT header/mapper/reset mode, CHIP lengths/banks/duplicates and reset target directly before launching; verify actual EasyAPI and PETSCII metadata bytes after building.
-
Embed the original 768-byte AM/M29F040 V1.4 EasyAPI with source, redistribution notice, pinned provenance and payload checksum. Add the separate 16-character PETSCII EasyFlash menu name. Use object names and the public HORS V2 identity in CRT container titles.
-
Introduce shared loader templates with early CIA interrupt/timer shutdown, VIC IRQ acknowledgement and assembly bounds checks. Preserve the frozen historical loader/renderer source files for regression comparisons.
-
Move the scene bytes displaced by bank 0 ROMH metadata into the previously unused ROML bank 2 tail. Restore the exact bytes to RAM before entering the renderer; reject overlaps with reset vectors and unexpected occupied relocation space.
-
Linux VICE 3.10 validation covers startup, Warp transitions with soft resets, all menu styles and Marbles' complete ending. The reported Windows GUI
$F800JAM is not yet reproduced or confirmed fixed. See cartridge loading. -
Rebuild the current standalone, scene, menu, HiFi and colour-test cartridges with the new loader and 0.7.4 identity. Preserve older versioned cartridges as historical references.
-
Refresh the complete renderer comparison and release validation evidence. See 0.7.4 release notes.
v0.7.3
- Windows setup r25 asks before a new VICE installation; declining offers an existing path or manual installation later and explains the effect on running/tests and cartridge builds. Clarify the native Python build command and direct use of prebuilt cartridges.
- Add independent foreground, background and border selection to object and authored-scene builds, including resident PRGs and streamed cartridges. Keep
--colorcompatible and add--foreground-color,--background-colorand--border-colorwith documented aliases. - Accept native colour names, decimal/hex/binary palette indices, RGB hex and
rgb(...); map RGB inputs to the fixed C64 palette on the host. Apply the same parsing to SVG foreground selection, Blenderc643d_colorproperties and the autotuner's--color-index. - Preserve the selected background in initial screen RAM, per-frame source-colour spans and recycled buffers. Restore selected VIC registers after an authored intro. Monochrome inversion changes screen colours without changing geometry.
- Add optional foreground/background/border defaults in
config/c643d.ini. - Add
color-combo-test: four preserved classic animations, automatic ten-second PAL playback per entry, immediate repeat, F3 foreground cycling and F4 background cycling. Only this tester couples the border to the background. SPACE skips; F1 returns to its menu. - Add F3/F4 monochrome foreground/background, F7 independent border and F8 preset reset during playback in Demo Cart 1 (FPS/RAM) and Demo Cart 2.0. Preserve the menu's F4 HiFi shortcut and F5 exhibition mode. Multicolour entries retain their source palette and support border cycling/reset.
- Reuse the existing IRQ keyboard scan with equal idle CPU cost; no drawing-loop polling or per-frame colour conversion is added. Controls occupy an unused vector-dispatch page in the direct-only v2 integration.
--no-color-controlsproduces a build without these controls. - Include prebuilt test/demo cartridges, reproducible builders, pixel/border/timing/keyboard verifiers and the colour guide. Other 0.7.2 example cartridges retain their bytes and build identities.
- Finalize after user acceptance. PAL VICE regression matches all 93 old/new timing windows exactly; idle keyboard polling remains 82 cycles. All 26 canonical renderer comparison jobs pass. See release notes and validation evidence.