3D Retro Max is a viewport-first Win32 modeler with authentic OpenGL 1.1 rendering, direct mesh editing, a 33-operator stack, terrain and floor-plan tools, animation, and a cinematic preview pipeline. The current packaged executable is approximately 800 KB. https://cyfrowynomada.com/products/3d-retro-max
  • Pascal 88.3%
  • Roff 7.3%
  • Liquid 4.2%
  • PowerShell 0.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Krzysztof Krystian Jankowski 9399029743 refactor(modifiers): hoist row builders into TModifierSettingsForm; rewrite 16 simple settings forms (-1,557 LOC)
Hoist the proven AddFloat/AddInteger/AddBoolean/AddEnum + Tag-dispatch
pattern from TModelingModifierSettingsForm into the TModifierSettingsForm
base: shared dispatchers guard IsUpdating, parse (uRMSText.TryParseFloat /
virtual ParseIntText), and forward (Tag, value) to protected virtual
ApplyFloat/ApplyInteger/ApplyBoolean/ApplyEnum overrides. AddBoolean Tag 0
is the reserved Enabled row; ADecimals<0 selects FormatFloat('0.##');
ALiveChange=True wires OnChange for the array counts' keystroke-live
semantics; Array2D/ArrayCircular override ParseIntText to keep their 2/8
empty-field defaults. Modeling form consumes the base builders (its
private copies deleted). Pure .pas rewrite (forms are code-built, no lfm).

Preserved exactly: M8a ParamCmdRunner capture-on-activate/commit-on-
deactivate, M33 public idempotent CommitParamEdit + HandleFormClose
contract, live-apply semantics, all 5 range guards (none added/removed),
per-field decimals, enum item orders, all 33 RegisterFormFactory sites.

Gates: Linux LCL app links; full batch suite 537/0 with checks ON.
Reviewer: SHIP, zero P0/P1 (Tag uniqueness, VMT signature match, enum and
parse parity, conditional-logic parity, registration census all verified).
Net: 3,745 -> 2,188 LOC across the 17 form units + base.
2026-10-01 11:24:13 +02:00
benchmarks perf(eval): geometric mesh accumulation, PrepareFrame hoist, drag-frame UI churn guard (backlog e67cce1c / P2) 2026-10-01 04:19:50 +02:00
builds chore: stop tracking live autosave scene (P0-10 repo hygiene; rewritten by every wine test run) 2026-09-30 22:52:25 +02:00
docs docs: truth pass — claims verified against current code (backlog P2) 2026-10-01 03:39:23 +02:00
Documentation cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
Scenes cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
shopify docs: truth pass — claims verified against current code (backlog P2) 2026-10-01 03:39:23 +02:00
tests test(modifiers): double-commit idempotency regression for settings-form close contract (M33 reviewer P2) 2026-10-01 10:58:00 +02:00
textures cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
tools cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
.gitignore fix(tests): suite gate now green under Range/Overflow checks — full FPCUnit suite runs on Linux (534/0) 2026-10-01 10:38:25 +02:00
3DRetroMax.lpi cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
3DRetroMax.lpr cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
about.jpg cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
about.rc cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
about.res cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
AGENTS.md fix(tests): suite gate now green under Range/Overflow checks — full FPCUnit suite runs on Linux (534/0) 2026-10-01 10:38:25 +02:00
BUILDING.md cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
icon.ico cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
logo.png cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
main.ico cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
main.manifest cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
main.rc cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
README.md feat(recovery): autosave recovery — config-dir autosave, startup prompt (backlog 066b72f7 / P0-4) 2026-10-01 00:26:04 +02:00
uAbout.lfm cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uAbout.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uAnimatedUVSettingsForm.pas refactor(modifiers): hoist row builders into TModifierSettingsForm; rewrite 16 simple settings forms (-1,557 LOC) 2026-10-01 11:24:13 +02:00
uAnimationClip.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uAnimationCommands.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uAnimationDocument.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uAnimationRecorder.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uAnimationTrack.pas fix(anim): shortest-arc interpolation for rotation-axis tracks (backlog pin / P2) 2026-10-01 03:22:07 +02:00
uAnimationTypes.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uArray2DSettingsForm.pas refactor(modifiers): hoist row builders into TModifierSettingsForm; rewrite 16 simple settings forms (-1,557 LOC) 2026-10-01 11:24:13 +02:00
uArrayCircularSettingsForm.pas refactor(modifiers): hoist row builders into TModifierSettingsForm; rewrite 16 simple settings forms (-1,557 LOC) 2026-10-01 11:24:13 +02:00
uBendSettingsForm.pas refactor(modifiers): hoist row builders into TModifierSettingsForm; rewrite 16 simple settings forms (-1,557 LOC) 2026-10-01 11:24:13 +02:00
uCameraWindow.pas fix(win): unbounded secondary-form leaks — caFree + deferred-release guarded nils (backlog 53d63bd0 / P1) 2026-10-01 02:14:40 +02:00
uCinematic.pas fix(cinematic): guarded viewport export — I/O error no longer crashes (backlog pin / P2) 2026-10-01 03:23:35 +02:00
uCinematicAtmosphere.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uCinematicEnvironment.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uCommandHistory.pas feat(undo): transform + property-panel undo, Undo/Redo menu binding (backlog 09ca4dec part 2) 2026-09-30 23:34:11 +02:00
uContactLighting.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uDocumentIds.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uEnvironmentWindow.pas fix(win): unbounded secondary-form leaks — caFree + deferred-release guarded nils (backlog 53d63bd0 / P1) 2026-10-01 02:14:40 +02:00
uFloorPlan.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uFloorPlanCommands.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uFloorPlanDocument.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uFloorPlanMesh.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uFloorPlanWindow.pas fix(win): unbounded secondary-form leaks — caFree + deferred-release guarded nils (backlog 53d63bd0 / P1) 2026-10-01 02:14:40 +02:00
uHeightmap.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uHierarchyCommands.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uHierarchyDragDrop.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uInflateSettingsForm.pas refactor(modifiers): hoist row builders into TModifierSettingsForm; rewrite 16 simple settings forms (-1,557 LOC) 2026-10-01 11:24:13 +02:00
uJobs.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uMainForm.lfm cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uMainForm.pas fix(build): visibility-section error breaking ALL LCL compiles of uMainForm (found by first Linux build) 2026-10-01 09:46:22 +02:00
uMesh.pas perf(eval): geometric mesh accumulation, PrepareFrame hoist, drag-frame UI churn guard (backlog e67cce1c / P2) 2026-10-01 04:19:50 +02:00
uMeshAppend.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uModelingModifierSettingsForm.pas refactor(modifiers): hoist row builders into TModifierSettingsForm; rewrite 16 simple settings forms (-1,557 LOC) 2026-10-01 11:24:13 +02:00
uModifierAdvanced.pas perf(eval): geometric mesh accumulation, PrepareFrame hoist, drag-frame UI churn guard (backlog e67cce1c / P2) 2026-10-01 04:19:50 +02:00
uModifierAnimatedUV.pas fix(commands): redo of modifier add/duplicate keeps the modifier id stable (backlog pin / P2) 2026-10-01 03:32:45 +02:00
uModifierArray2D.pas perf(eval): geometric mesh accumulation, PrepareFrame hoist, drag-frame UI churn guard (backlog e67cce1c / P2) 2026-10-01 04:19:50 +02:00
uModifierArrayCircular.pas fix(commands): redo of modifier add/duplicate keeps the modifier id stable (backlog pin / P2) 2026-10-01 03:32:45 +02:00
uModifierBase.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uModifierBend.pas fix(commands): redo of modifier add/duplicate keeps the modifier id stable (backlog pin / P2) 2026-10-01 03:32:45 +02:00
uModifierCommands.pas fix(commands): redo of modifier add/duplicate keeps the modifier id stable (backlog pin / P2) 2026-10-01 03:32:45 +02:00
uModifierEditorRegistry.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uModifierEvaluator.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uModifierFormPlugins.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uModifierMeshUtils.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uModifierModeling.pas perf(eval): geometric mesh accumulation, PrepareFrame hoist, drag-frame UI churn guard (backlog e67cce1c / P2) 2026-10-01 04:19:50 +02:00
uModifierPush.pas fix(commands): redo of modifier add/duplicate keeps the modifier id stable (backlog pin / P2) 2026-10-01 03:32:45 +02:00
uModifierRegistry.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uModifierReverseNormals.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uModifierRipple.pas fix(commands): redo of modifier add/duplicate keeps the modifier id stable (backlog pin / P2) 2026-10-01 03:32:45 +02:00
uModifiers.pas fix(commands): redo of modifier add/duplicate keeps the modifier id stable (backlog pin / P2) 2026-10-01 03:32:45 +02:00
uModifierSerialization.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uModifierSettingsBase.pas refactor(modifiers): hoist row builders into TModifierSettingsForm; rewrite 16 simple settings forms (-1,557 LOC) 2026-10-01 11:24:13 +02:00
uModifierSkew.pas fix(commands): redo of modifier add/duplicate keeps the modifier id stable (backlog pin / P2) 2026-10-01 03:32:45 +02:00
uModifierSqueeze.pas fix(commands): redo of modifier add/duplicate keeps the modifier id stable (backlog pin / P2) 2026-10-01 03:32:45 +02:00
uModifierStack.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uModifierStretch.pas fix(commands): redo of modifier add/duplicate keeps the modifier id stable (backlog pin / P2) 2026-10-01 03:32:45 +02:00
uModifierTopologyUtils.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uModifierUpdateUVs.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uModifierWave.pas fix(commands): redo of modifier add/duplicate keeps the modifier id stable (backlog pin / P2) 2026-10-01 03:32:45 +02:00
uModifierWindowManager.pas fix(modifiers): settings-form X-close now commits pending edits (backlog 6da75ef7 / P2) 2026-10-01 04:28:32 +02:00
uNoise.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uNoiseSettingsForm.pas refactor(modifiers): hoist row builders into TModifierSettingsForm; rewrite 16 simple settings forms (-1,557 LOC) 2026-10-01 11:24:13 +02:00
uPerspectiveWarp.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uProjectDocument.pas feat(ux): unsaved-changes prompt on every document-destroying path (backlog 092f6467 / P1) 2026-10-01 02:35:14 +02:00
uProjectTime.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uPropertyPath.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uPropertyTypes.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uPushSettingsForm.pas refactor(modifiers): hoist row builders into TModifierSettingsForm; rewrite 16 simple settings forms (-1,557 LOC) 2026-10-01 11:24:13 +02:00
uReverseNormalsSettingsForm.pas refactor(modifiers): hoist row builders into TModifierSettingsForm; rewrite 16 simple settings forms (-1,557 LOC) 2026-10-01 11:24:13 +02:00
uRippleSettingsForm.pas refactor(modifiers): hoist row builders into TModifierSettingsForm; rewrite 16 simple settings forms (-1,557 LOC) 2026-10-01 11:24:13 +02:00
uRMSMath.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uRMSText.pas fix(text): magnitude pre-check for TryParseFloat — Val RTE 205 crash on huge exponents (completes f32a33d) 2026-10-01 01:38:31 +02:00
uScene.pas perf(eval): geometric mesh accumulation, PrepareFrame hoist, drag-frame UI churn guard (backlog e67cce1c / P2) 2026-10-01 04:19:50 +02:00
uSceneBounds.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uSceneEvaluation.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uSceneNode.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uSceneProperties.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uSkewSettingsForm.pas refactor(modifiers): hoist row builders into TModifierSettingsForm; rewrite 16 simple settings forms (-1,557 LOC) 2026-10-01 11:24:13 +02:00
uSqueezeSettingsForm.pas refactor(modifiers): hoist row builders into TModifierSettingsForm; rewrite 16 simple settings forms (-1,557 LOC) 2026-10-01 11:24:13 +02:00
uStretchSettingsForm.pas refactor(modifiers): hoist row builders into TModifierSettingsForm; rewrite 16 simple settings forms (-1,557 LOC) 2026-10-01 11:24:13 +02:00
uTaperSettingsForm.pas refactor(modifiers): hoist row builders into TModifierSettingsForm; rewrite 16 simple settings forms (-1,557 LOC) 2026-10-01 11:24:13 +02:00
uTerrainMesh.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uTerrainOps.pas perf(terrain): hydraulic erosion offloaded to the job pool — no more UI freeze (backlog 572118f1 / P1) 2026-10-01 02:54:50 +02:00
uTerrainWindow.pas perf(terrain): hydraulic erosion offloaded to the job pool — no more UI freeze (backlog 572118f1 / P1) 2026-10-01 02:54:50 +02:00
uTextureRipperAssetService.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uTextureRipperController.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uTextureRipperForm.pas fix(win): unbounded secondary-form leaks — caFree + deferred-release guarded nils (backlog 53d63bd0 / P1) 2026-10-01 02:14:40 +02:00
uTextureRipperImage.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uTextureRipperModel.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uTextures.pas fix(forms): locale-independent parsing across all 17 settings forms (backlog 0ef44562 / P1) 2026-10-01 01:36:03 +02:00
uTexturesWindow.pas fix(win): unbounded secondary-form leaks — caFree + deferred-release guarded nils (backlog 53d63bd0 / P1) 2026-10-01 02:14:40 +02:00
uTriangleBVH.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uTwistSettingsForm.pas refactor(modifiers): hoist row builders into TModifierSettingsForm; rewrite 16 simple settings forms (-1,557 LOC) 2026-10-01 11:24:13 +02:00
uUpdateUVsSettingsForm.pas refactor(modifiers): hoist row builders into TModifierSettingsForm; rewrite 16 simple settings forms (-1,557 LOC) 2026-10-01 11:24:13 +02:00
uVersion.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uVertexPaint.pas fix(vertexpaint): locale-invariant SavePalette write (backlog P3) 2026-10-01 03:40:54 +02:00
uVertexPaintCommands.pas cleanup, lazarus wins 2026-09-30 20:25:00 +02:00
uWaveSettingsForm.pas refactor(modifiers): hoist row builders into TModifierSettingsForm; rewrite 16 simple settings forms (-1,557 LOC) 2026-10-01 11:24:13 +02:00

3D Retro Max

3D Retro Max is a compact, viewport-first 3D editor for retro-inspired modeling, scene blocking, and low-overhead experimentation. It is a focused Win32 companion tool, not a replacement for a full DCC suite.

Current Version: 0.2.x

The current release line combines a classic modeling workspace with direct mesh editing and practical scene-building tools:

  • Four-view workspace: Perspective, Top, Front, and Left.
  • Object selection, transforms, axis locking, snapping, and numeric editing.
  • Direct vertex, edge, and face editing with UV and color operations.
  • Scene hierarchy with groups, duplication, visibility, reparenting, and undo/redo.
  • Built-in primitives including cubes, spheres, cylinders, cones, toruses, planes, terrain, and skyboxes.
  • Vertex painting with gradients, flood fill, palettes, and HSV/RGB/hex color controls.
  • Texture manager supporting JPG, JPEG, PNG, and BMP assets.
  • Perspective Texture Ripper for creating textures from images.
  • Live stack of 33 mesh modifiers for deformation, topology, UVs, arrays, animation, and mesh quality.
  • Procedural terrain with heightmap painting, erosion, shaping, and live mesh rebuilds.
  • Floor Plan Builder for generating floors, walls, slabs, and roofs.
  • Keyframe animation timeline with clips, interpolation, looping, and animated modifiers.
  • Cinematic camera and environment preview with sky, fog, sun, moon, lighting, lens, and post-style controls.
  • Human-readable .3drm project files with relative texture paths, plus a periodic autosave to your user config directory that is offered for recovery at startup.

0.2.0: Performance Track

Version 0.2.0 is the major performance release focused on multicore CPU work, faster ambient-occlusion baking, and more efficient viewport rendering:

  • Persistent worker pool using every detected logical processor.
  • Asynchronous contact-lighting snapshots with cancellation and safe publication.
  • Deterministic SAH triangle BVH for accelerated AO and shadow rays.
  • Indexed OpenGL 1.1 mesh submission, cached topology, and frustum culling.
  • Demand-driven viewport redraw, adaptive grids, and bounds-assisted picking.
  • Read-only cinematic tint and visibility overrides that do not mutate the scene.

The repeatable contact-lighting benchmark measured a 6.61x median speedup (4,486.7 ms serial versus 679.3 ms with 24 workers) on the reference fixture and development machine. See the benchmark guide for the workload, commands, validation, hardware, and interpretation, and see the 0.2.0 release notes for complete details.

Technical Notes

  • Portable Windows 32-bit application targeting i386 Win32.
  • Free Pascal and Lazarus LCL application.
  • OpenGL 1.1 fixed-function rendering with indexed client arrays and immediate-mode overlays.
  • Small executable designed around a compact, understandable workflow.

Scope

3D Retro Max favors visible controls, direct viewport interaction, readable projects, and a small footprint over the breadth of a general-purpose 3D pipeline. It is intended for retro-inspired assets, quick modeling, and scene experimentation.