| CRM64Pro GDK v0.18.0 A free cross-platform game development kit built on top of SDL 3.0

Loading...
Searching...
No Matches
Annex II: Complete Changelog
# 📝 CRM64Pro GDK – Changelog
Copyright (C) 2013–2026
Developed by Roberto Prieto – MegaStorm Systems
https://www.megastormsystems.com
Full development history of CRM64Pro from 2013–2026.
This document lists all notable changes, features, fixes, migrations, and module updates.
---
## 🚀 2026-06-16 – v0.18.0 – Support video playback, new CDCv2 and general improvements
### Added
- Video:
- Added the new Video module with FFmpeg-backed playback, CDC storage/loading, frame extraction, export support and synchronized audio streaming through AudioTrack.
- Supports H.264 video through FFmpeg demuxing, either as raw H.264 elementary streams or inside MP4, MOV, M4V, and AVI containers, with decoded YUV420P/YUVJ420P/NV12 video frames.
- EditorC64:
- Added Scene import tooling for creating maps/layers from Tiled TMX maps, images, supported video formats, static GIFs, and animated GIFs.
- Added frame-sequence-to-animated-tilemap conversion for supported video formats and animated GIFs, with tile deduplication, animated tile generation, and atlas/animation statistics.
### Changed
- Homogenized engine file operations around SDL3 filesystem/IO APIs, reducing platform-specific C runtime file handling and improving portability across desktop and mobile targets.
- Standardized public return contracts: handle-returning methods return ids > 0, status methods return 0 or a negative error code, and bool methods return true/false success states.
- Documented the main-thread public API convention, modules must be called from the main thread unless explicitly documented as thread-safe.
- Enforced exception-free allocation for `CMemAllocator` classes by deleting plain `new/new[]`; engine objects must use `new(std::nothrow)` and check for `nullptr`.
- Refined public return-contract policy: operations that touch SDL, allocation, resource ownership, audio devices, or screen creation now preserve diagnostic error codes
through Sint32 status returns, while simple setters and predicates remain bool or void.
- Archive:
- Replaced the CDC archive backend with the new CDCv2 format, adding support for >4GB files, stronger validation, lightweight confidentiality / non-authenticated encrypted storage for indexes and blocks, streaming reads and writes for raw blocks, safer defragmentation, and automatic CDCv1 upgrade support in EditorC64.
- Audio:
- Improved AudioTrack playback internals with proper ownership of overlapping mixer tracks, safer CDC/file validation, direct PCM video streaming
support, and more reliable live control updates for pitch, panning, position, tag, pause, resume, and cleanup.
- Updated dependencies:
- libpng 1.6.58 (Apr 2026)
- SDL3_mixer 3.2.0 (Mar 2026)
- dr_flac 0.13.6 (Jan 2026)
- libxmp 4.7.0 (Mar 2026)
- SDL 3.5.0 (May 2026)
- SDL3_image 3.5.0 (Jun 2026)
- ffmpeg 8.1.1 (May 2026)
### Fixed
- Tool:
- `fileOpenDialog` and `fileSaveDialog` methods now use SDL3 functions and support Windows, Linux, macOS and Android.
### Breaking Changes
- Standardized `setScroll()` and `setLayerPosition()` to return 0 on success or a negative error code on failure, changed/moved state is now reported through optional bool* output parameters.
- Renamed AudioTrack and Video playback position APIs to `seek()` and `getPlaybackPosition()`, and renamed AudioTrack 3D audio APIs to `setSpatialPosition()` and `setSpatialDistance()`.
- Renamed resource manager `exist()` methods to `exists()` across XML, AudioTrack, Image, Cursor, Tile, Sprite, Font, Video and Particle managers.
- Added `ePlaybackStatus` and changed `Video::status()` and `AudioTrack::status()` to use `PS_STOPPED`, `PS_PLAYING`, `PS_PAUSED` and `PS_FINISHED` playback states instead of `eGeneralStatus` values.
- Resource names are now validated explicitly and are no longer silently truncated when longer than the CDC/name limit.
- Replaced generic platform/environment macros with `CRM64PRO_PLATFORM_*` and `CRM64PRO_ENV_64BIT`, and removed 32-bit target support.
- Renamed macro `CRM64PRO_STATIC` to `CRM64PRO_LINK_STATIC`.
- Changed several public API methods from bool to Sint32: `Screen::show()`, `Screen::setIcon()`, `Screen::setDriver()`, `Screen::setMode()`, `Screen::setSize()`, `Image::assignSurface()`,
`AudioTrack::play()`, and `AudioTrack::fadeIn()`, callers must check result == 0 for success or result < 0 for failure.
- Changed `SceneObject::setSize()` and `SceneLayerObject::setSpatialGridCellSize()` from void to bool so invalid or unapplied changes can be detected.
- Main:
- Changed Main module accessors from I*() names to camelCase names (for example `ITimer()` -> `timer()`, `ILogMgr()` -> `logMgr()`, `IImageMgr()` -> `imageMgr()`).
- Changed `Screen::setRenderCallback()` to use a `function<Sint32(Sint32)>` signature instead of the old function-pointer plus void* user-data signature, which was removed.
- Renamed `ePositionHelpers` to `ePositionHelper`.
- Renamed `CMem::setLogLevel()` to `CMem::setStatsLevel()` to clarify that it controls memory statistics gathering, not log output.
- Renamed audio frequency enum values to value-based names: `CAF_NORMAL` -> `CAF_22K`, `CAF_HIGH` -> `CAF_44K`, and `CAF_ULTRA` -> `CAF_48K`.
- Tool:
- Removed legacy `Tool::xxHash*` 32-bit helpers, use the `Tool::xxHash3*` 64-bit API instead.
- Renamed message box API enums for consistency: `eToolMBT/TMBT_*` became `eMsgBoxType/MBT_*`, and `eMsgBoxButton` values `TMBB_*` became `MBB_*`.
- Renamed `Tool::XOR()` to `Tool::xorBuffer()` to follow camelCase method naming and describe the buffer operation clearly.
- Audio:
- Renamed `ConfigMgr::audioStatus()` to `ConfigMgr::audioIsReady()`.
- Font:
- Renamed `Font::setCursor()` and `Font::getCursor()` to `setTextCursor()` and `getTextCursor()`.
- Cursor:
- Renamed `CursorMgr::getSelect()` to `CursorMgr::getSelectedCursor()` for clearer cursor-selection API naming.
- Sprite:
- Split animation APIs into state-based methods and explicit `*Index()` row methods, game code should use animation states, while EditorC64/tools must use index methods for ordered animation rows.
- Network:
- Updated NetTCP result handling: moved most NR_* values to a dedicated range, aliased `NR_BAD_PARAMETER` and `NR_OUT_OF_MEMORY` to matching `C64_ERR_*` codes,
and changed `getClientsInfo()` and `getPendingWrites()` to return `eNetResult` with output parameters.
- Renamed `NetTCP::queryKillServer()` and `NetTCP::queryKillClient()` to `requestServerClose()` and `requestClientClose()` to distinguish command requests from data queries.
- Changed `NetTCP::sendData()` `bIsQuery` parameter from Uint8 to bool.
- GUI:
- Converted `Widget::disable()`, `Widget::enable()`, `Widget::show()`, `Widget::hide()`, `Widget::setMargin()`, `Widget::getMargin()`,
`Widget::setOnAction()`, `Widget::setOnHoverEnter()`, `Widget::setOnHoverExit()`, `Widget::setOnPressed()`, `Widget::setOnFocusLost()`,
`Widget::setOnValueCommitted()`, `Widget::setOnSelectionChanged()`, `Widget::setAlphaMod()`,
`Widget::setOnValueChanged()`, `Widget::setOnToggled()`, `Widget::setTooltipBackgroundColor()`, `Widget::getTooltipBackgroundColor()`,
`Widget::setTooltipBorderColor()`, `Widget::getTooltipBorderColor()`, `WidgetLabel::getText()`, `WidgetButton::setText()`,
`WidgetButton::getText()`, `WidgetButton::setKey()`, `WidgetCheckBox::setText()`, `WidgetCheckBox::getText()`, `WidgetCheckBox::setKey()`,
`WidgetCheckBox::setGroup()`, `WidgetProgress::setMargin()`, `WidgetSlider::setMargin()`, `WidgetTextEdit::setMargin()`,
`WidgetTextEdit::setText()`, `WidgetTextEdit::getText()`, `WidgetTextEdit::getScroll()`, `WidgetTextEdit::getVisibleItems()`,
`WidgetList::setMargin()`, `WidgetList::getScroll()`, `WidgetList::getVisibleItems()`, `WidgetComboBox::setMargin()`,
`WidgetComboBox::getScroll()`, and `WidgetComboBox::getVisibleItems()` from Sint32 status returns to bool success/failure returns.
## 🚀 2026-05-08 – v0.17.0 – GUI refactored and improved
### Added
- GUI:
- Added `Widget::getID()`, `Widget::getName()`, `Widget::getType()` and `Panel::getWidgetIDs()` for widget inspection and panel widget enumeration.
- Added `Panel::createWidgetByType()` and `Panel::getWidgetByID()` for editors, importers, and runtime-driven widget workflows.
- Added `Panel::getWidgetInfoList()` for lightweight widget inspection without generic widget lookup.
- Added typed widget creation/getter pairs such as `createProgress()`, `getProgress()`, `createSlider()`, `getSlider()`,
`createTextEdit()`, `getTextEdit()`, `createList()` and `getList()`.
- Added direct widget callbacks `setOnAction()`, `setOnHoverEnter()`, `setOnHoverExit()`, `setOnPressed()` and `setOnFocusLost()` as
a modern event-style alternative to polling SDL widget events.
- Added semantic widget callbacks `setOnValueCommitted()`, `setOnSelectionChanged()`, `setOnValueChanged()` and `setOnToggled()`,
matching the richer `EC_WIDGET_*` event model.
- Added runtime GUI theming with built-in Default, Dark, and Flat themes plus custom theme creation through GUIMgr.
- Added `GUITheme` and `GUIThemeSkin` APIs for per-widget-type, per-state procedural styling.
- Added `GUIMgr` theme management methods: `createTheme()`, `getTheme()`, `setGlobalTheme()`, `getGlobalTheme()`, `closeTheme()`,
`getThemeDefault()`, `getThemeDark()`, and `getThemeFlat()`.
- Added panel-level theme override through `Panel::setTheme()` and `Panel::getTheme()`.
- `WidgetList` supports interactive multi-selection with Ctrl+Click toggle, Shift+Click range selection, multi-row rendering,
and selection APIs (`setMultiSelect()`, `clearSelection()`, `getSelectedCount()`, `getSelectedItems()`).
- Added panel flow layouts with `PL_HFLOW` and `PL_VFLOW`, plus `Panel::setLayout()`, spacing, padding, justify, align,
and invalidation APIs, allowing modeless/modal/ephemeral panels to auto-arrange child widgets horizontally or
vertically while preserving existing panel behavior.
- Added `Widget::clearBackground()` to clear per-state background image/sprite assignments and reset linked inherited background overrides.
- New `WidgetFrame` (`WT_FRAME`), a lightweight themed primitive for horizontal/vertical lines and outline/filled rectangles.
- New `WidgetNumberEdit` (`WT_NUMBEREDIT`), a numeric text-edit control with integer float input support and configurable min/max/step.
- New `WidgetComboBox`, a themed single-selection drop-down control with popup item list, hover/selection highlighting and autosort.
- `WidgetTextEdit` and `WidgetNumberEdit` support persistent keyboard focus, mouse selection, Ctrl+A/C/X/V/Z/Y, selection-aware editing, and undo/redo.
- Standardized numeric widget APIs around `setValue()`, `getValue()`, `setRange(min,max)` and `getRange(&min,&max)`.
- Standardized selection widget APIs around `setSelectedIndex()`, `getSelectedIndex()`, `setSelectedText()` and `getSelectedText()`.
- Tool:
- New `strToFloat()` and `floatToStr()` methods.
- Font:
- FontMgr now exposes built-in GUI fonts by name through `getBuiltin()`, supporting the embedded Arial/Courier New
black/white 10/12 font set with simple names such as Arial12Black and CourierNew10White.
### Changed
- GUI:
- Widget was reduced to a true common base API. Widget-specific methods were removed from Widget and must now be called on
the corresponding concrete widget classes (`WidgetButton`, `WidgetCheckBox`, `WidgetProgress`, `WidgetSlider`,
`WidgetTextEdit`, `WidgetNumberEdit`, `WidgetList`, `WidgetComboBox`, etc.).
- Internal refactor of the GUI subsystem: normalized widget feature flags, improved widget/panel inspection APIs, extracted update/render helpers,
reduced panel/widget coupling, and reorganized widget implementation units.
- Widget appearance now resolves through a theme cascade: widget explicit override -> panel theme -> global theme -> built-in Default.
- Disabled widgets now remain fully mutable from code, so setters and content-management APIs (`setText()`, `setValue()`,
`addItem()`, `setSelectedIndex()`, text/list editing, etc.) still work while disabled, while user interaction remains blocked.
- Expanded legacy `eEventCode` widget events from action/hover/lost-focus only to a richer model with `EC_WIDGET_SELECTIONCHANGED`,
`EC_WIDGET_VALUECHANGED`, `EC_WIDGET_TOGGLED` and `EC_WIDGET_VALUECOMMITTED` for cleaner widget-state handling.
- Programmatic widget setters now follow a silent-update policy. User interaction and explicit edit commits emit events/callbacks,
while setter callers should run any required application logic directly.
- CheckBox group handling now follows radio-button behavior with silent programmatic selection and event/callback notification only
for user-driven changes.
### Fixed
- GUI:
- TextEdit and NumberEdit now clamp their height so the current font and vertical margins always leave room for at least one visible text line.
- List selection now auto-scrolls the selected item into view using centered reveal when possible.
- TextEdit and NumberEdit value-commit callbacks now fire on Enter and focus-loss commits without treating Enter as focus loss.
- Tooltip and skin color editor fields now apply committed text values on Enter as well as focus loss.
- Grouped CheckBox changes now emit consistent `EC_WIDGET_TOGGLED` events for user-driven group selection changes.
- GFX:
- Fixed filled circle rendering to avoid repeated side overdraw while improving performance with midpoint scanline filling.
### Breaking Changes
- Font:
- Reworked bitmap glyph metrics to derive bounds from image separators, added configurable space width via `setSpaceWidth()` and `getSpaceWidth()`,
Font CDC binary compatibility is broken so existing Fonts must be re-imported and re-saved or opened with the EditorC64 that will auto-update them.
- GUI:
- `EC_WIDGET_*` events now pack widget IDs/values directly in `SDL_Event::user.data1/data2`; decode them with `reinterpret_cast<intptr_t>(...)` instead of dereferencing them as pointers.
- Replaced legacy `WIDGET_FEATURE_*` macros with `eWidgetFeature` enum. `Widget::setFeatures()` and `Widget::getFeatures()` now use `eWidgetFeature` with bitwise operator support.
- Removed `Widget::setState()`. Use `Widget::enable()`, `Widget::disable()` for interactivity and `Widget::show()`, `Widget::hide()` for visibility.
- `Widget::disable()` no longer removes the widget from rendering. Disabled widgets now remain visible with their deactivated skin; use hide() to make a widget invisible.
- Removed `Widget::activate()` and `Widget::deactivate()` after consolidating the public widget lifecycle API around `enable()`, `disable()`, `show()`, and `hide()`.
- Generic `Panel::createWidget()` and `Panel::getWidget()` were removed. Use typed creation/getters for normal code, or
`createWidgetByType()` and `getWidgetByID()` for dynamic editor/importer scenarios.
- Legacy widget class naming was modernized. `WidgetProgressBar`, `WidgetHSlider`, `WidgetVSlider`, `WidgetTextBox`, and
`WidgetListBox` were renamed to `WidgetProgress`, `WidgetSlider`, `WidgetTextEdit`, and `WidgetList`.
- Legacy widget type enum names were removed from active API usage. Use `WT_PROGRESS`, `WT_SLIDER`, `WT_TEXTEDIT`, and `WT_LIST`.
- `Widget::setState()` was removed. Widget lifecycle now uses `enable()`, `disable()`, `show()`, and `hide()`.
- `Widget::activate()` and `deactivate()` were removed from the public API after consolidating widget lifecycle semantics.
- `Widget::disable()` semantics changed. Disabled widgets remain visible with their deactivated skin; use hide() to remove a
widget from rendering.
- `Widget::status()` for widgets now reports only `GS_DISABLED`, `GS_HIDDEN`, or `GS_SHOWN`.
- Removed legacy `Widget::setFunction()` and its state-bound void* callback model in favor of typed std::function-based widget callbacks.
- Removed `GUIMgr::getFontWhiteAA()` and `GUIMgr::getFontBlack()`, callers must now use `IFontMgr().getBuiltin()`.
- Widget-specific GUI behaviors were removed from eWidgetFeature. TextEdit now uses direct `setMultiline()` and `setReadOnly()` APIs,
List now uses `setAutoSort()` and `setMultiSelect()`, and Console now uses explicit read-only methods instead of widget feature flags.
- Renamed background styling methods for clarity:
- `setBgColor()` and `getBgColor()` to `setBackgroundColor()` and `getBackgroundColor()`
- `setBgImage()` and `getBgImage()` to `setBackgroundImage()` and `getBackgroundImage()`
- `setBgSprite()` and `getBgSprite()` to `setBackgroundSprite()` and `getBackgroundSprite()`
- Replaced `Panel::type(...)` with explicit panel-type APIs: `setPanelType()` and `getPanelType()`.
- Removed `Widget::setText()` and `Widget::getText()` from the base `Widget` API. Text methods now live only on text-capable
widgets such as `WidgetLabel`, `WidgetButton`, `WidgetCheckBox`, `WidgetTextEdit`, and `WidgetNumberEdit`.
- Added explicit panel title APIs `Panel::setTitle()` and `Panel::getTitle()`. Panel title text should no longer be assigned through `baseWidget().setText()`.
- Renamed ambiguous widget-specific value/range APIs:
- `WidgetCheckBox`: `setValue()` and `getValue()` to `setChecked()` and `isChecked()`
- `WidgetList`: `setValue()`, `getValue()` and `getRange()` to `setSelectedIndex()`, `getSelectedIndex()` and `getItemCount()`
- `WidgetTextEdit`: ambiguous `getValue()` and `getRange()` to `getCursorLine()` and `getLineCount()`
- `WidgetNumberEdit`: `setNumber()`, `getNumber()`, `setMinMax()` and `getMinMax()` to `setValue()`, `getValue()`, `setRange(min,max)` and `getRange(&min,&max)`
- `WidgetProgress`: `setRange(max)` and `getRange()` to `setRange(min,max)` and `getRange(&min,&max)`
- `WidgetSlider`: `setRange(count)` and `getRange()` to `setRange(min,max)` and `getRange(&min,&max)`, with value clamping now based on the explicit inclusive range
- `WidgetList`: `getSelectedItem()` to `getSelectedText()`, and added `setSelectedText()` for symmetry with `WidgetComboBox`
- `WidgetComboBox`: `getSelectedItem()` to `getSelectedText()`, and added `setSelectedText()`
## 🚀 2026-03-25 – v0.16.0 – Network refactored and improved
### Added
- NetTCP:
- Added asynchronous outbound queueing for client and server traffic.
- Added configurable TX soft-brake / backpressure limits via `setTXSoftBrake()` / `getTXSoftBrake()`.
- Added richer `info()` diagnostics for RX/TX queues, buffered data, pending writes, throughput and errors.
- Added server pending-login handling to process new connections without blocking active clients.
- Added public `eNetResult` and `eNetTCPFeature` enums.
- Added challenge-response login with server nonce exchange.
- Added optional AES-CTR session payload encryption negotiated through `setFeatures()`.
- Added bounded string password support for NetTCP login/server creation.
- Added stricter per-message payload validation for login and control messages.
- Tool:
- New xxHash3() methods for XXH3 64-bit hashing.
### Changed
- NetTCP:
- Refactored socket ownership so actual I/O is performed only by the dedicated network thread.
- Converted outbound queues to ring buffers and updated the inbound receive queue to ring-buffer behavior.
- Improved server loop responsiveness under TX backlog by using shorter wait intervals when outbound data is pending.
- Improved `info()` output with cleaner RX/TX naming, feature reporting and clearer queue/buffer diagnostics.
- Upgraded packet integrity from folded 32-bit hashes to full 64-bit xxHash3 while keeping the DataNet wire header size unchanged.
- Tool:
- randSeedPCG() and randPCG() now support optional caller-managed state.
- Updated validation tests (BasicSystem, Config, ConfigSetup) with platform-aware native hardware renderers.
- Updated dependencies:
- SDL3_net 3.0.0 (Jan 2026)
### Fixed
- NetTCP:
- Fixed server login flow so slow connectors no longer stall active clients.
- Fixed login/session edge cases including leaked login payloads, failed `LOGIN_ACCEPTED` rollback, and mismatched negotiated feature reporting.
- Fixed multiple thread-safety issues by moving shared lifecycle/state flags to atomic usage where required.
- Fixed several queue, shutdown and diagnostic inconsistencies in client/server runtime paths.
- Fixed stale documentation/comments and protocol validation issues across the refactored network layer.
- Alpha transparency loss in software renderer during clipped scaling (SDL3 issue #15147).
- Fixed `ConfigMgr::setup()` video configuration saving so existing config.xml files now correctly update renderer and resolution values.
### Breaking Changes
- NetTCP:
- Public NetTCP receive messages were renamed from `NETMSG_*` to `NM_*`.
- Public NetTCP result/error codes now use the new `eNetResult` enum with `NR_*` values.
- Replaced `features()` with:
- `setFeatures()`
- `getFeatures()`
- `sendData()`, `queryKillServer()`, `queryKillClient()`, `queryClientsInfo()` and related NetTCP methods now return `eNetResult`.
- `createServer()` and `connectTo()` now use `const string& sPassword` instead of the old integer password.
- Packet integrity now uses a 64-bit hash field internally while preserving the existing 24-byte DataNet serialized header.
- IP fields were upgraded from IPv4-only Uint32 values to `NetTCP::NetIPAddress`, `ClientInfo::iIP` became `ClientInfo::ipAddress` and `NetTCP::getIP()` now returns `NetIPAddress`.
## 🚀 2026-02-28 – v0.15.0 – Scene with Object support
`TileEngine` has been completely renamed to `Scene` across the entire codebase to better reflect its role as a robust advanced 2D game world management system.
### Added
- Scene:
- Object Layer support:
- Introduced native TMX object layers with support for rectangles, points, polygons and polylines.
- Added runtime access to object data (position, size, properties, type, name).
- Object factory system for creating custom game objects from TMX data.
- Added TMX template (.tx) load/save support.
- Object rotation: shape, tile rotation + rotated AABB supported.
- High-precision timing integration:
- Scene logic now fully supports the new Main fixed-timestep system.
- Deterministic update behavior regardless of frame rate.
- Sub-pixel camera movement:
- Floating-point world coordinates for camera and layer scrolling.
- Smooth pixel-perfect rendering without jitter during slow movement.
- Support for user-defined layers via class inheritance, the new `addLayer()` injection method, and custom type IDs (`TELT_USER_START`).
- Added camera methods, multiple modes, and configurable parameters for per-layer behavior (follow, bounds/clamp, smoothing, and axis controls).
- Implemented a suite of tutorials covering various game genres (RTS, RPG, Scrolling) to fully validate the TileEngine system.
- Added native TE_Object trigger zones with cross-layer + type-hash filtering + delayed one-shot STAY/EXIT cooldown flow.
- Physics:
- Implemented new Physics interface with frame-accurate pixel-perfect collision detection.
- Sprite:
- Added support for new animation types: `ST_ONESHOT_REVERSE` and `ST_RANDOM`.
- CMem:
- Added `MSL_DEBUG` level for detailed leak detection with unique Allocation IDs, memory dump previews, and
debugger breakpoint support via `setBreakOnAlloc()`.
- Tool:
- New PCG32 PRNG methods: `randSeedPCG()`, `randPCG()` and `randRealPCG()`.
- Image:
- Added getWidth() and getHeight() methods to Image objects for easy access to dimensions.
- Added loadFromSurface() method to create an Image directly from an existing SDL_Surface.
- Expanded custom STL memory allocator support to include queue, stack, priority_queue, multimap, list, and shared_ptr/stringbuf aliases.
- Implemented engine-wide memory allocation protection for critical PIMPL/Manager failures and graceful returns for resource allocations.
### Changed
- Scene:
- Internal architecture refactor:
- Major refactor of Scene core to separate logic, rendering and timing concerns.
- Simplified layer update/render flow aligned with Main canonical game loop.
- Logic / render synchronization:
- Scene `update()` now runs strictly on the fixed timestep.
- Interpolation moved to render phase using engine-provided delta helpers.
- Scrolling and parallax math:
- All scrolling, parallax and auto-scroll calculations now use floating-point precision.
- Code cleanup & optimization:
- Reduced redundant state, improved cache locality and simplified internal containers.
- Timer:
- `benchInfoEx()` method in throughput mode now perform unit conversion to thousands and millions for better readability.
- Refactored microbenchmark system to centralize statistical logic and implement consistent, unit-aware formatting (K/M scales) across console logs and HTML reports.
- Main:
- Canonical game loop: Refactored `update()` to use a high-precision accumulator system with nanosecond resolution, ensuring zero-drift timing and
deterministic simulation steps.
- Introduced `getDeltaTime()` and `getLogicTime()` to provide unified, high-precision timing across all engine modules.
- Spiral of death prevention: Implemented safety clamping on delta time to ensure engine stability during significant lag spikes or window interruptions.
- Implemented engine-wide restricted prefix policy (# and @): enforced on create/setName and loadFromFile, while allowed on loadFromBuffer and CDC load.
### Fixed
- Implemented over 70 stability fixes including memory safety, robust I/O validation, and null-pointer guards across all core modules.
- Scene:
- TMX loading issues:
- Fixed incorrect handling of transparent / colorkey tilesets.
- Layer update/render edge cases:
- Fixed inconsistencies when enabling/disabling layers at runtime.
- Sprite:
- Fixed visual glitches caused by desynchronized timing.
- Interpolation now relies on Main timing helpers.
- Fixed an issue with `Sprite::status()` when using one-shot animations.
- Image:
- Fixed a memory leak in `ImageMgr::load()` (CDC path).
### Breaking Changes
- Macros to enum migration:
- Scene:
- Replaced `TE_LAYERFLAG_*` macros with `eSceneLayerFeature` and `SLF__*`.
- Replaced `TE_TILESETTYPE_*` macros with `eSceneTileSetType` and `STST_*`.
- Log: Replaced `LM_*` macros with `eLogMode`. Added bitwise operator support via a reusable template.
- Memory Manager: Replaced `CMEM_MOD_*` macros with `eMemoryModule` and `CMM_*`.
- Updated `alloc()`, `calloc()`, `realloc()`, and `alloc_aligned()` methods.
- Tool: Replaced `TMBB_*` macros with `eMsgBoxButton`.
- C64 System Status: Replaced `C64_STATUS_*` macros with `eGeneralStatus` and `GS_*`.
- Sprite Types: Replaced `SPR_TYPE_*` macros with `eSpriteType` `ST_*`.
- Custom events: Replaced the legacy `#define C64_EVENT` macro with `eEventType` with values `ET_C64` replacing old `C64_EVENT`.
- Audio:
- `eAudioFreq` renamed to `eConfigAudioFreq`. Internal values renamed from `AF_*` to `CAF_*`.
- `eAudioSample` renamed to `eConfigAudioSample`. Internal values renamed from `AS_*` to `CAS_*`.
- `eAudioMode` renamed to `eConfigAudioMode`. Internal values renamed from `AM_*` to `CAM_*`.
- XML:
- Removed parameter-based `getAttribute()` and `setAttribute()` overloads.
- Replaced with explicit typed methods: `getAttribute[String|Int|Uint|Float|Bool]` and `setAttribute[String|Int|Uint|Float|Bool]`.
- API method updates:
- `Tool::messageBox()`: Now returns `eMsgBoxButton` instead of `Sint32`.
Internal failures now log a warning and return TMBB_NONE instead of negative error codes.
- `status()` methods: Updated return type from `Sint32` to `eGeneralStatus` across all classes (Log, Screen, Sprite, Widget, CursorMgr).
- Refactored `renderEx()` methods:
- Standardized the extended rendering API across all high-level graphics objects (Sprite, Tile, Font)
to support asymmetric scaling (X/Y) and improve parameter consistency.
- `Sprite::renderEx()`changed from (float fScale, ...) to (float fScaleX, float fScaleY, ...).
- `Font::renderEx()` changed from (..., float fScale, ...) to (..., float fScaleX, float fScaleY, ...).
- `Tile::renderEx()` changed from (Sint32 iTile, double dAngle, ...) to (Sint32 iTile, float fScaleX, float fScaleY, double dAngle, ...).
....
## 🚀 2026-01-15 – v0.14.0 – Major update and pre-release v1.0.0 (II)
### Added
- CMem:
- Added post-mortem safety mechanism to allow global/static STL containers to exist without crashes at exit.
- Added context-aware reporting to `info()` to automatically distinguish between actual memory leaks and pending global object destruction.
- Log:
- Added ANSI color support for `LM_STDOUT` logging:
- Critical errors: bold red
- Errors: red
- Warnings: yellow
- Debug messages: cyan
- Homogenized logging output by adding indentation and prefix control APIs:
- `pushIndent()`, `popIndent()`, `resetIndent()`, `getIndent()`
- `setPrefix()`, `clearPrefix()`
- TileEngine:
- Added support for Tiled Collection of Images tilesets:
- The engine now correctly parses `<tile>` elements containing individual `<image>` sources, allowing a single TileSet to be composed of multiple standalone files.
- Refactored loading API:
- `load()` now only loads from CDC files.
- Added `load(Sint32 idCDC)` to load from an open CDC.
- Added `loadFromFile()` to load from external files.
- Config:
- Refactored loading API:
- `load()` now only loads from CDC files.
- Added `load(Sint32 idCDC)` to load from an open CDC.
- Added `loadFromFile()` to load from external files.
- Timer:
- Microbenchmark system improved with:
- New LATENCY / THROUGHPUT metric types with configurable units (ms, MB/s, ops/s, etc.).
- `benchStop()` now accepts an optional `workAmount` parameter for throughput calculations.
- New `benchInfoEx()` generating interactive HTML reports with Highcharts graphs and CSV export.
- Sprite:
- Added `renderEx()` with scaling, rotation, and sub-pixel precision.
- Decoupled sprite animation logic from rendering into a centralized update system.
### Changed
- CMem:
- Optimized statistics tracking using static arrays for O(1) performance and zero-allocation overhead.
- Refactored `destroy()` and `free()` logic to prevent deadlocks during reporting and ensure safe shutdown.
- Log:
- Consolidated `eLogMessageLevel` and the previous `eLogLevel` into a single standardized `eLogLevel` enum used for both initialization and message logging.
- Font:
- Added scaling support to `renderEx()`. Scaling is applied per-call and does not modify the font's internal state.
- TileEngine:
- Refactored the entire internal architecture.
- Updated copyright year to 2026.
- Updated dependencies:
- SDL 3.5.0 (Jan 2026)
- SDL3_mixer 3.1.0 (Jan 2026)
- dr_mp3 - v0.7.3 (Jan 2026)
### Fixed
- Improved iterator safety and robustness by replacing global iterators with local `auto` iterators.
- Fixed an issue with `messageBox()` alpha blending.
### Breaking Changes
#### Logging API
- Removed `eLogMessageLevel` enum.
- Renamed and remapped log levels to a standardized linear severity hierarchy (0–6):
- `LL_OFF`, `LL_CRITICAL`, `LL_ERROR`, `LL_WARNING`, `LL_INFO`, `LL_DEBUG`, `LL_TRACE`
- Deprecated and removed previous constants:
- `LL_HIGH`, `LL_NORMAL`, `LL_LOW` (initialization parameters)
- `LML_*` (message parameters)
#### TileEngine API
- Renamed `eTileEngineTilesetType` to `eTileEngineTileSetType`.
- Updated enum members to:
- `TETT_TILESET`
- `TETT_COLLECTION`
- Standardized nomenclature:
- **TileSet** refers to the engine logical container.
- **Tile** refers to the underlying CRM64Pro graphical resource.
- Renamed methods:
- `loadTileSet()`
- `setTileSetSource()`
- `getTileSetSource()`
- Renamed TMX import/export API:
- `exportTMX()` → `save()`
- `importTMX()` → `load()`
- Both methods now support CDC archives.
- Renamed `TE_LAYERFLAG_*` constants to `TE_LAYERFEATURE_*`.
- Replaced `allocateLayers()` with:
- `setLayerCount()`
- `getLayerCount()`
#### Microbenchmark API
- Refactored API flow:
- `benchCreate()` for creation
- `benchStart()` / `benchStop()` for measurements
- `benchInfo()` / `benchInfoEx()` for reporting
#### Resource Loading
- AudioTrack:
- `load()` from memory buffer renamed to `loadFromBuffer()`
- Image:
- `load()` from memory buffer renamed to `loadFromBuffer()`
#### Renamed Methods
- Tile:
- `getNumTiles()` → `getTileCount()`
- Archive:
- `getUsedBlocks()` → `getBlockCount()`
- `getMaxBlocks()` → `getBlockLimit()`
#### save() Enhancements
- Added optional `sResourceName` parameter to `save()` methods (`XML`, `AudioTrack`, `Image`, `Cursor`, `Font`, `Tile`, `Sprite`) to allow custom CDC naming without affecting internal state.
#### Feature Flag Standardization
- Replaced:
- `Widget::features()` → `setFeatures()` / `getFeatures()`
- `TileEngine::setLayerFlags()` / `getLayerFlags()` → `setLayerFeatures()` / `getLayerFeatures()`
#### Refactored APIs (Return type change)
Several methods were refactored to return `bool` instead of `Sint32`.
Previous behavior: `0` on success, `< 0` on failure
New behavior: `true` on success, `false` on failure
##### Affected Modules
- All Modules:
- `exist()`, `close()`
- Log Interface:
- `init()`, `msg()`
- Tool Interface:
- File & directory utilities:
- `dirExists()`, `dirCreate()`, `fileExists()`, `fileRemove()`, `fileCheckExtension()`
- `fileOpenDialog()`, `fileSaveDialog()`
- `fileGetAbsolutePath()`, `fileGetExePath()`, `fileGetName()`, `fileGetDir()`, `fileGetExtension()`
- String & conversion utilities:
- `strCompare()`, `strToLowerCase()`, `strToUpperCase()`, `strTovStr()`
- `intToStrDec()`, `intToStrHex()`, `szCopy()`
- Misc:
- `vStrToFile()`, `fileTovStr()`, `getDateStamp()`
- `decodeBase64()`, `decompressZlib()`
- `getKeyState()`
- XML Manager:
- Navigation:
- `nodeNext()`, `nodePrev()`, `nodeParent()`, `nodeChild()`, `nodeFirst()`
- Manipulation:
- `nodePointTo()`, `nodeStore()`, `nodeRestore()`, `nodeRemove()`, `nodeCreate()`, `nodeRename()`
- Attributes & content:
- `nodeGetName()`, `setAttribute()`, `getAttribute()`, `removeAttribute()`
- `setText()`, `getText()`, `removeText()`
- `setComment()`, `getComment()`
- AudioTrack Manager:
- Playback control:
- `play()`, `stop()`, `pause()`, `resume()`
- Parameters:
- `setPosition()`, `setPanning()`, `setPitch()`, `setLoopPoints()`, `setDistance()`
- Global control:
- `stopAll()`, `fadeOutAll()`, `pauseAll()`, `resumeAll()`
- `stopTag()`, `fadeOutTag()`, `pauseTag()`, `resumeTag()`
- Initialization:
- `audioInit()`, `setDriver()`, `setMode()`, `setSize()`
- `setPosition3D()`, `setTag()`
- Misc:
- `setKeepSourceData()`, `getKeepSourceData()`, `getInfo()`
- Image Manager:
- `isBMP()`, `isPNG()`, `assignSurface()`
- `saveToBMP()`, `saveToPNG()`
- `rebuild()`, `setBlendMode()`, `setAlphaMod()`, `setColorMod()`
- Screen:
- `setVSync()`, `setLogicalPresentation()`, `getLogicalPresentation()`
- `setClipRect()`, `getClipRect()`
- `setTitle()`, `setBorder()`, `setIcon()`
- `show()`, `hide()`, `clear()`
- `setRenderCallback()`
- `fadeToColor()`, `fadeToImage()`
- `getSnapshot()`
- Config:
- `audioStatus()`, `audioClose()`
- `audioSetDriver()`, `audioSetMasterGain()`, `audioSetTagGain()`
- Timer Interface:
- `init()`, `setRate()`
- `benchStart()`, `benchStop()`, `benchClose()`
- `benchStats()`, `benchInfo()`, `benchInfoEx()`
- Cursor Manager:
- `setPosition()`, `show()`, `hide()`
- `setHotSpot()`, `getHotSpot()`
- Tile Manager:
- `setOffset()`, `getOffset()`
- `setPosition()`
- Sprite Manager:
- Animation control:
- `pause()`, `resume()`, `setSpeed()`
- `selectAnim()`, `setAnimType()`, `setAnimState()`, `orderAnimState()`
- Animation parameters:
- `setAnimHotSpot()`, `setAnimRange()`, `setFrameTime()`
- Frame control:
- `selectFrame()`
- Positioning:
- `setOffset()`, `setPosition()`
- Getters:
- `getOffset()`, `getAnimType()`, `getAnimState()`
- `getAnimHotSpot()`, `getAnimRange()`, `getFrameTime()`
- Font Manager:
- `setCursor()`, `setKerning()`, `setPosition()`
- GFX Interface:
- Drawing primitives:
- `setSurfacePixel()`, `setPixel()`
- `lineH()`, `lineV()`, `line()`
- `rect()`, `rectFilled()`, `rectRound()`, `rectFilledRound()`
- `arc()`, `circle()`, `circleFilled()`
- `ellipse()`, `ellipseFilled()`
- `polygon()`, `polygonFilled()`
- Color space conversions:
- `RGBtoHSV()`, `HSVtoRGB()`
- `RGBtoYUV()`, `YUVtoRGB()`
- `RGBtoCMYK()`, `CMYKtoRGB()`
- `RGBtoYCC()`, `YCCtoRGB()`
- TileEngine:
- `TE_MapData`:
- `create()`, `free()`, `clone()`, `check()`
- `setCellWidth()`, `setCellHeight()`, `setValue()`
- `A2DtoCSV()`, `CSVtoA2D()`, `stringToA2D()`
- Layers & viewport:
- `freeLayer()`, `freeLevel()`
- `setViewport()`, `setBackgroundColor()`
- `setLayerAlphaMod()`, `setLayerParallaxRatio()`
- `setLayerAutoScroll()`, `setLayerMapData()`
- `setLayerOnUpdateEnd()`, `setLayerOnRenderEnd()`
- `getLayerName()`, `setLayerName()`, `setLayerGridColor()`
- TileSet handling:
- `unloadTileSet()`
- `getTileSetSource()`, `setTileSetSource()`
- Coordinate helpers:
- `screen2LayerCell()`, `screen2LayerAbsolute()`
- `screen2LayerCell()`, `screen2LayerAbsolute()`.
## 🚀 2025-12-20 – v0.13.0 – Major update and pre-release v1.0.0
### Added
- GUI: Introduced `Position` struct to handle widget coordinates, combining float precision offsets with `ePositionHelpers` anchors.
- GUI: Added specialized API for `WidgetTextBox` to handle text manipulation: `appendText()`, `appendLine()`, `insertLine()`, `removeLine()`, `setLine()`, and `getLine()`.
- GUI: Added specialized API for `WidgetListBox` to handle item management: `addItem()`, `insertItem()`, `removeItem()`, `selectItem()`, and `clearItems()`.
- Added `AudioTrack` module providing modern, unified audio playback features.
- Added Vulkan and GPU-accelerated renderer backends.
- Integrated `dr_mp3` 0.7.2 (Sept 2025) for MP3 playback.
- Integrated `libxmp` 4.6.3 (Nov 2025) for module/tracker playback.
- Windows deployment support using Inno Setup.
- Added CHANGELOG.md for tracking project changes (replacing History.txt).
- Added README.md for project overview and setup instructions.
### Changed
- Migrated all projects to Visual Studio 2026.
- Updated copyright year to 2025.
- Updated dependencies:
- xxHash 0.8.3 (Nov 2025)
- TinyXML2 11.0.0 (Nov 2025)
- zlib-ng 2.3.2 (Dec 2025)
- libpng 1.6.53 (Dec 2025)
- SDL 3.4.0 (Nov 2025)
- SDL3_mixer 3.1.0 (Nov 2025)
- dr_flac 0.13.2 (Sept 2025)
- Updated documentation to Doxygen 1.15.0.
- Moved Doxygen documentation into CRM64Pro header files for direct IDE integration.
- Unified formatting across all Doxygen documentation.
- `fileRemove()` now supports wildcard patterns.
- GUI: Updated `ePositionHelpers`: Deprecated "Decrement" flags (e.g., `PH_RIGHTD`) in favor of using standard flags with negative float offsets in the `Position` struct.
### Removed
- Removed `AudioSound` and `AudioMusic` modules (fully replaced by `AudioTrack`).
- Removed minimp3 (no longer supported under SDL3).
- Removed libmodplug (deprecated and unsupported under SDL3).
### Fixed
- Fixed multiple issues in `ConfigMgr::setup()` functionality.
- Fixed colorkey and palette handling issues when loading images.
- Fixed a memory leak when loading images from a CDC archive.
- Fixed issues with the Memory Manager on Linux and macOS when no custom memory manager is enabled.
- Fixed `ImageMgr::renderEx()` flip operations when rendering to an Image.
- Fixed `Screen::fadeToColor()` and `Screen::fadeToImage()` behavior.
### Breaking Changes
- Configuration: System updated to comply with SDL3 and SDL3_mixer API changes.
- Audio: Modernized audio system. `AudioMusic` and `AudioSound` classes have been removed; use the new `AudioTrack` module instead.
- API:
- `msg(...)` signature changed: `msg(eLogMessageLevel level, const char *fmt, ...)` (added `const`).
- All `render()` and `renderEx()` methods now use `SDL_FRect` instead of `SDL_Rect`, and `SDL_FPoint` instead of `SDL_Point`.
- `CursorMgr::setPosition()` and `getPosition()` now use `float` parameters.
- GFX module methods for drawing primitives now use `float` instead of `Sint32`.
- Sprite `setPosition()` and `getPosition()` methods now use `float` instead of `Sint32`.
## 🚀 2024-12-28 – v0.12.1 – Maintenance
- ABI is not compatible with the previous version due to migration to SDL 3.1.7.
- Updated dependencies:
- libpng 1.6.44 (Sept 2024)
- zlib-ng 2.2.2 (Dec 2024)
- TinyXML2 10.0.0 (Jul 2024)
- SDL3_mixer 3.0.0 (Dec 2024)
- SDL 3.1.7 (Dec 2024)
## 🚀 2024-05-15 – v0.12.0 – TileEngine III
Main
- Added `intro()` method for showing MegaStorm and CRM64Pro intro screens.
Audio Manager
- Added `load()` method for loading sound from a memory buffer.
Config Manager
- `fadeToImage()` and `fadeToColor()` now process events.
- Fixed bug #0029: `fadeToImage()` issues on Direct3D renderers.
Cursor Manager
- Added `status()` method to check whether the cursor is visible.
- Fixed issues caused by increased SDL3 system cursor types.
TileEngine
- Removed TEL native format; now only Tiled maps are supported (custom props for C64TE).
- Updated TileEngine integration with Tiled maps.
- Tiled Support: improved loader and exporter and added support for image layers.
Build systems
- Linux build available via installation script.
- macOS build available via DMG + PKG installers.
## 🚀 2024-02-22 – v0.11.0 – Maintenance
- ABI not compatible with previous version due to SDL3-related changes.
- Updated dependencies:
- libpng 1.6.42 (Jan 2024)
- zlib-ng 2.1.6 (Feb 2024)
- TinyXML2 10.0.0 (Dec 2023)
- xxHash 0.8.2 (Feb 2024)
- SDL3_mixer 3.0.0 (Feb 2024)
- SDL 3.0.0 (Feb 2024)
Other changes
- Visual Studio 2022 build no longer generates AVX instructions.
SDL3 Migration
- Updated codebase for SDL3 + SDL3_mixer API changes.
- Removed Config Manager methods for enabling/disabling 2D batching (always enabled now).
## 🚀 2023-09-19 – v0.10.0 – TileEngine II
TileEngine
- Improved Tiled importer and viewport handling.
- Added support for Tiled v1.10.
- Added support for:
- Tile special effects
- Animated tiles
- Tilesets now stored as external `.tsx`.
- Tileset creation preserves proportional tile size.
- Deduplication system now uses OpenMP for parallelism.
- Color values now stored as `#RGB(A)` hexadecimal.
Tile Manager
- Added `renderEx()` method.
Tool Interface
- Added `strHexToInt()` method.
## 🚀 2023-06-30 – v0.9.0 – Migration to SDL3
- Adopted semantic versioning.
- ABI is not compatible with previous version.
- Updated dependencies:
- libpng 1.6.40 (Jun 2023)
- zlib-ng 2.1.2 (Jun 2023)
Other improvements
- Cleaned Windows/Visual Studio 2022 projects.
- Fixed bug #0031: screen clipping restoration corruption.
SDL3 Migration
- Removed `Screen::eConfigScreenAspectRatio`, replaced with SDL_RendererLogicalPresentation.
- Renamed:
- `setLogicalSize()` → `setLogicalPresentation()`
- `getLogicalSize()` → `getLogicalPresentation()`
- Screen reworked for SDL3 fullscreen model.
- Updated ConfigMgr::Setup() for new SDL3 logical presentation options.
- Reworked CursorMgr for SDL3.
- Timer now returns 64-bit values.
- Audio:
- Added FLAC + MP3 support.
- Removed AIFF support.
- Enabled Direct3D12 renderer on Windows.
- Removed WinMM audio driver.
## 🚀 2023-06-13 – v0.981 – General Improvements
- Last version supporting SDL2.
- STL `std::map` is now supported by CMem.
Config Manager
- Fixed bug in `load()` method (mtfriendly loading).
- Fixed incorrect CPU name display.
- Fixed issues with sound/music volume settings.
- Fixed issues when generating screen snapshots (Direct3D11 issues remain).
GUI Manager
- Fixed bug #0015: panel removal issues when using images/sprites with parent–child relationships.
- Improved `ProgressBar` widget when using an image or sprite as background.
- Background image/sprite alpha is now inherited automatically.
- Fixed issues with `TextBox` widgets.
Memory Manager
- Fixed issues when the custom memory manager is not enabled.
Image Manager
- Added `exist()` method for checking if a given image is present.
Audio Manager
- Added `exist()` method for checking if a given music/sound is present.
Tool Interface
- Added `strTovStr()` and `strDecToInt()` methods.
## 🚀 2023-05-04 – v0.980 – Documentation
- Updated to Doxygen 1.9.6 and fixed several documentation issues.
- Added automatic deployment scripts.
Config Manager
- Added detailed documentation for the `setup()` method (layout customization).
## 🚀 2023-04-30 – v0.975 – Config Manager III
Config Manager
- Added `setup()` method for opening a configuration screen. A default layout is provided and can be customized.
- Updated `audioClose()` and calls to `audioInit()` so that reinitializing audio removes all previously loaded music resources.
- Fixed a bug in `setLogicalSize()`.
GUI Manager
- Fixed issues with panel size and position when using non-default screens.
Tool Interface
- Updated `messageBox()` method with a new optional parameter for selecting the screen to attach the dialog to.
XML Manager
- Added `loadFromBuffer()` method for loading XML files directly from memory buffers.
## 🚀 2023-04-01 – v0.973 – Maintenance
- All projects migrated to Visual Studio 2022.
- Windows build now uses Windows SDK 10.0.22621.
- Removed joystick, haptic, and sensor modules from SDL2.
- Disabled Direct3D12 renderer due to lower performance compared to Direct3D11.
- Updated dependencies:
- TinyXML2 9.0.0 (Jan 2023)
- libpng 1.6.39 (Nov 2022)
- SDL 2.26.4 (Mar 2023)
- SDL2_net 2.3.1 (Mar 2023)
TileEngine
- Fixed an issue when exporting a map loaded from a CDC file into Tiled format.
## 🚀 2022-02-12 – v0.972 – Memory Manager II
Memory Manager
- Fixed stats system (Bug #0030).
- Fixed histogram value issues.
- Added `setMsgOutput()` to expose user-controlled memory statistics output.
- Added `setModuleName()` to assign custom names to memory modules.
- Updated **ltalloc** configuration to reduce fragmentation (slightly higher memory usage).
SDL2 Memory Leak Fixes
- Freed local thread storage (220 bytes) at termination (Bug #0030).
- Applied SDL mouse-related memory-leak fix later included in SDL 2.0.22+.
## 🚀 2022-01-31 – v0.971 – Maintenance
- Updated dependencies:
- SDL 2.0.20 (Jan 2022)
- TinyXML2 9.0.0 (Feb 2022)
- SDL2_mixer 2.0.5 (Jan 2022)
- MikMod 3.3.12 (Jan 2022) with SSE2
- libogg 1.3.5 (Jun 2020)
- xxHash 0.8.1 (Jan 2022)
- ltalloc 2.0.2 (Apr 2019) with C64 customizations
## 🚀 2021-05-14 – v0.970 – Config Manager II
General
- Updated Linux build scripts.
- Updated to C++17.
- Replaced **zlib** with **zlib-ng**, improving compression/decompression speed and ratio.
- Added static structure-size checks at compile time.
- Displayed CPU name, core count, CPU features, and system memory.
- Fixed issue with `SDL_windows_main.c`.
- Fixed issue when merging all static libraries into **crm64pro.dll**.
Config Manager
- Initial version of `setup()` (not yet complete).
- Added enable/disable methods for 2D batching system (enabled by default).
Memory Manager
- Histogram & evolution CSV files now include a separator header (improves Excel display).
- Histogram now tags Direct_OS_Call entries.
GUI Manager
- Fixed WIDGETv1_IO_Block size issue (incompatible with previous saved widgets).
- Added checkbox groups: `setGroup()`, `getGroup()`, `getValueGroup()`.
## 🚀 2021-02-06 – v0.969 – Maintenance
- All projects migrated to Visual Studio 2019.
- Only 64-bit builds enabled by default (32-bit still possible).
- Updated dependencies:
- SDL 2.0.14 (Feb 2021)
- SDL2_mixer 2.0.5 (Feb 2021)
- MikMod 3.3.11 (Jun 2020) with SSE2
- libogg 1.3.4 (Aug 2019)
- libvorbis 1.3.7 (Jul 2020)
- SDL2_net 2.0.1 (Jan 2020)
- AES (Sept 2020)
- TinyXML2 8.0.0 (Oct 2020)
- libpng 1.6.37 (Apr 2019) with SSE2
## 🚀 2018-03-29 – v0.967 – Maintenance
- Updated dependencies:
- xxHash 0.6.4 (Feb 2018)
- AES (Feb 2018)
- TinyXML2 6.1.0 (Feb 2018)
- zlib 1.2.11 (Jan 2017)
- SDL 2.0.8 (Mar 2018)
- SDL2_mixer 2.0.3 (Mar 2018)
- libogg 1.3.3 (Nov 2017)
- MikMod 3.3.11 (Jun 2017) with SSE2 enabled
- SDL2_net 2.0.1 (Mar 2018)
- libpng 1.6.34 (Sept 2017) with SSE2 enabled
- Timer
- Increased the maximum Logic Frame Rate to **20,000**.
- Tool Interface
- Updated `randRealWELL()` to accept `pSeedState` and `pSeedTable`.
- Sprite Manager
- Improved `setAnimState()` low-level validations.
- Fixed `getAnimCurrent()` behavior.
- Added new `orderAnimState()` for sorting low-level animation states.
- Audio Backend
- Replaced XAudio2 backend with **WASAPI** on Windows systems.
## 🚀 2017-06-30 – v0.966 – Config Manager I
- All projects migrated to Visual Studio 2017.
- Config Manager
- Added `save()` and `load()` for storing and loading audio and screen configuration.
- Cursor Manager
- Fixed incorrect mouse coordinates on screens where logical and physical sizes differ.
## 🚀 2017-04-30 – v0.965 – Memory Manager
- Memory Manager
- Improved statistics system.
- Added CSV export for memory evolution and histograms.
- Integrated `ltalloc` as low-level allocator.
- Documentation improvements and general cleanup.
## 🚀 2017-03-29 – v0.96 – General Improvements
- Updated dependencies:
- TinyXML2 4.0.1 (migrated from TinyXML)
- xxHash 0.6.2
- libpng 1.6.29 RC
- SDL_mixer 2.0.1 (Jan 2017)
- MikMod 3.3.10 (Aug 2016) with SSE2 enabled
- Memory Manager
- Added CMem (C64 Memory Manager) to all interfaces.
- Hooked CMem into all external libraries.
- STL containers under CRM64Pro namespace now use CMem.
- Added a basic statistics system (to be expanded later).
- Currently still uses default memory allocator.
- Position Helpers
- Unified position helpers for Cursors, Sprites, Fonts, and GUI Widgets.
- Timer
- Added `getHiResTime()` and microbenchmark utilities.
- Config Manager
- Added `getSnapshot()` method to save screen snapshots to PNG.
- `setRenderCallback()` now accepts a pointer to the associated object.
- Network Manager
- `setCoreServerCallback()` now accepts a third parameter (relevant object pointer).
- Moved `ClientInfo` struct into the `NetTCP` class.
## 🚀 2017-02-28 – v0.95 – TileEngine
- ABI changes applied across all objects: removed the "Obj" suffix for simplicity.
- TileEngine
- Migrated and improved from MSTE.
- Fully integrated inside the C64 core.
- Added support for Tiled v1.0 (orthogonal maps).
- GUI
- Added widget feature flag for disabling background rendering.
- Fixed issues when loading `WT_TEXTBOX` and `WT_LISTBOX`.
- Sprite Manager
- `status()` now returns `C64_STATUS_END` when a one-shot animation finishes.
- Config Manager
- Fixed a bug in `getClipRect()`.
- Tile Manager
- Fixed an issue in `render()`.
- Tool Interface
- Added `decodeBase64()` and `decompressZlib()` utilities.
## 🚀 2016-12-30 – v0.946 – Maintenance
- Updated dependencies:
- libpng 1.6.27
- SDL 2.0.5 (Dec 2016)
## 🚀 2016-07-30 – v0.945 – EditorC64
- EditorC64 updated to version 0.85.
- Audio Manager
- Fixed an issue in `AudioInfo` methods.
## 🚀 2016-06-30 – v0.94 – EditorC64
- EditorC64 updated to version 0.8.
- GUI
- Added `getScroll()` and `getVisibleItems()` for ListBox widgets.
- Improved drag-and-drop system.
- Added new panel type `PT_EPHEMERAL` with configurable TTL.
- Added built-in fonts: white and black.
- Added built-in icons: info, warning, error.
- Tool Interface
- `messageBox()` now uses the CRM64Pro GUI system.
- Audio Manager
- Fixed multiple issues in Music and Sound managers.
- Updated dependencies:
- MikMod 3.3.8 (Nov 2015)
## 🚀 2016-05-31 – v0.936 – EditorC64
- EditorC64 updated to version 0.5.
- Managers
- Improved `setName()` and `assignImage()` methods.
- GUI
- Added widget feature flag for reporting lost-focus events.
- Added `WT_TEXTBOX` flag for read-only mode.
- Fixed issues in TextBox and ListBox widgets.
- Tool Interface
- Added `fileGetAbsolutePath()` and `fileGetExePath()` utilities.
## 🚀 2016-04-30 – v0.93 – EditorC64
- EditorC64 updated to version 0.3, the first working version of the new resource manager.
- Managers
- Managers that save objects to CDC files now also include a `remove()` method.
- Unified error codes across modules.
- GUI
- Reworked event-handling logic and fixed all known issues.
- Added widget feature flag for mouse-over event reporting.
- Updated `WT_LISTBOX`: add/select items, guarantees unique entries.
- Fixed issues with TextBox widgets on `PT_MODAL` panels.
- Minimum widget size set to 8×8; default set to 15×15.
- Tool Interface
- Added `fileOpenDialog()`, `fileSaveDialog()`, and `messageBox()` using native dialogs (Windows, Linux, macOS).
## 🚀 2016-03-29 – v0.91 – General Improvements
- Updated dependencies:
- xxHash 0.5.1
- SDL 2.0.4 (Mar 2016)
- Archive CDC v1.1
- Improved `blockAdd()` to properly detect identical or replaceable data blocks.
- Added `blockUndelete()` for soft-deleted blocks.
- Number of data blocks is now configurable; `defrag()` can resize the structure.
- Config Manager
- Added support for XAudio2 2.7 on Windows.
- Major improvements to screen management:
- Runtime changes to VSync, resolution, mode, and GPU driver.
- Methods for switching between windowed, fullscreen, and fullscreen-window modes.
- Added toggle for window border visibility.
- Added logical-size handling supporting letterbox and overscan.
- Fixed known bugs #0016 and #0018.
- Codebase
- Static code analysis performed.
## 🚀 2016-03-19 – v0.90 – GUI Improvements
- GUI
- Added `Panel::save()` to store a panel and all widgets.
- Added `GUI::load()` for loading saved panels.
- Default debug console enabled in debug builds.
- Rendering
- Direct3D11 backend now uses triple buffering.
- Documentation
- Updated using Doxygen 1.8.11 and fixed several issues.
## 🚀 2016-02-29 – v0.898 – GUI Improvements
- Updated dependencies:
- SDL 2.0.4 (Dec 2015)
- libpng 1.6.20
- GUI
- Added a console object with commands `con`, `dw`, and `help`.
- Tool Interface
- Added `vStrToFile()` and `fileTovStr()` utilities.
- Rendering
- Added support for Direct3D11 (Windows 8+).
## 🚀 2015-11-30 – v0.896 – General Improvements
- Unified error codes across modules.
- Fixed an issue when loading unsupported object versions across all modules.
## 🚀 2015-10-31 – v0.895 – General Improvements
- SDK signed using MegaStorm Systems CA.
- All projects migrated to Visual Studio 2015 with unified settings.
- Updated dependencies:
- SDL 2.0.4 (Aug 2015)
- libpng 1.6.18
- SDL_net 2.0 (Jun 2015)
- SDL_mixer 2.0 (Aug 2015)
- MikMod 3.3.7 (Aug 2014)
- libvorbis 1.3.5
- AES (Sept 2015)
## 🚀 2015-07-21 – v0.89 – GUI Improvements
- GUI Manager:
- Added autofocus support.
- Added fading effects for GUI objects.
- Panels can now be modal or modeless.
- GUI objects now support multiscreen configurations.
- Added DebugWindow widget.
## 🚀 2015-06-29 – v0.888 – GUI Improvements
- GUI:
- Fixed a bug in the event filtering system when using mouse wheel.
- Improved TextBox widget: better scrolling and mouse click handling.
- Added ListBox widget.
- Font Manager:
- Added `getCharacterByPixel()` method.
## 🚀 2015-05-31 – v0.886 – GUI Improvements
- GUI:
- Updated mouse click logic: only left-click triggers actions; right-click is reserved.
- Improved drag & drop behavior.
- Fixed minor issues in mouse click detection logic.
- Added HSlider and VSlider widgets.
- Image Manager:
- Fixed an issue when loading images with alpha transparency.
## 🚀 2015-03-29 – v0.884 – GUI Improvements
- Updated dependencies:
- SDL 2.0.4 (Mar 2015)
- libpng 1.6.16
- GUI:
- Fixed a bug in the event filtering system.
## 🚀 2014-09-27 – v0.883 – Android Support
- Updated dependency:
- SDL 2.0.4 (Sept 2014)
- Android support added:
- First working Android implementation (some tasks pending).
- GUI:
- Added TextBox and ProgressBar widgets.
## 🚀 2014-08-31 – v0.88 – Linux Support
- Cross-Platform:
- Unified Makefiles and Visual Studio 2010 configuration settings.
- Ensured SDL 2.0.3 or newer is available.
- Linux 64-bit:
- Added complete Linux support.
- Makefile supports build / install / uninstall.
- Provided script to build all external libraries.
- Added validation tests.
- File handling now accepts both '/' and '\' separators.
- Fixed bug #0011.
## 🚀 2014-08-22 – v0.87 – GUI Improvements
- GUI:
- Added Button and CheckBox widgets.
- Border width now renders correctly.
- State-associated functions are executed when present.
- Action events use C64_EVENT_WIDGET (data1 = ID, data2 = value).
- Keyboard shortcuts now activate widget actions.
- Improved deactivate-state behavior.
- Improved general event handling.
- Image backgrounds supported:
- normal (used for normal, hover, deactivate)
- pressed (used for pressed and action)
- Sprite backgrounds supported (most efficient method).
- Tool:
- Added `intToStrDec()` and `intToStrHex()` utilities.
## 🚀 2014-07-31 – v0.85 – GUI Foundation
- GUI:
- Added GUI Manager.
- Added Panel object.
- Added Label and Image widgets.
- Image Manager:
- Added `load()` method for loading images from memory.
- Font Manager:
- Fixed issues in `render()` and `renderEx()`.
- Config Manager:
- Added `setClipRect()` and `getClipRect()`.
- Managers:
- Unified `status()` methods across modules.
- Updated internal signatures to 8-bit indices (24 bits reserved for objects).
## 🚀 2014-07-07 – v0.81 – Audio Tuning & General Improvements
- Updated dependencies:
- libpng 1.6.12
- MikMod 3.3.6 (replacing libmodplug)
- SDL_mixer 2.0 (Jun 2014)
- SDL 2.0.4 (Jul 2014)
- Image Manager:
- Fixed bugs #0000 and #0001.
- Audio Manager:
- Fixed bugs #0006, #0007, #0008.
- Updated `info()` methods.
- Improved audio type detection for load/save.
- Added sound effects: panning, position, distance.
- Known bug #0009: WAV/OGG playback at 48 kHz produces glitches as music (OK as sound).
- Config Manager:
- Added `audioMixingChannels()` for controlling number of mixing channels.
- Added `audioHook()` callback.
## 🚀 2014-06-30 – v0.80 – Audio Module
- Updated dependencies:
- SDL_mixer 2.0 (Jun 2014)
- Audio Manager
- Implemented core audio system: Sound, Music, and validation tests
- Known bug #0006: OGG playback not supported at 48 kHz
- Known bug #0007: Module playback not supported at 32 bits
- Known bug #0008: libmodplug does not function in DLL mode
- Config Manager
- Added basic audio support
- info() now displays audio and system information
- Tool Interface
- Added new file/directory utilities
- Added strCompare(), strToLowerCase(), and strToUpperCase()
- Managers
- Normalized create() methods across all managers
## 🚀 2014-05-29 – v0.76 – Network Tuning
- NetTCP Interface
- Fixed known bug #0004
- Fixed known bug #0005
- Improved security with xxHash + sequencer
- Added documentation and diagrams
- Tool Interface
- Added xxHash functions
## 🚀 2014-05-15 – v0.75 – Network Module
- Updated dependencies:
- SDL_net 2.0 (Feb 2014)
- NetTCP Interface
- Robust and stable server architecture (supports up to 8 clients)
- High-performance client architecture
- Based on CRM32Pro INetwork but significantly improved
- Validation tests including torture tests
- Tool Interface
- Replaced Mersenne Twister with MWC and WELL512 RNGs
- Added XOR() method
- Runtime
- Added runtime struct-size checks in debug and release modes
- Memory
- Uses void* for memory buffers
## 🚀 2014-04-30 – v0.70 – Sprite Module
- Sprite Manager
- First fully working prototype
- Added validation tests
- Font Manager
- Position-setting logic moved to dedicated method (consistent with Tile and Sprite)
- Known bug #0002: disabling colorkey on stand-alone fonts renders garbage
## 🚀 2014-03-29 – v0.65 – GFX Module & General Improvements
- Image Manager
- render() and renderEx() can now render to screen or to another image
- Added findTex() for rendering into textures
- Added applyFilter() with effects: noise, blur, negative, grayscale, black & white, wiggle, pixelate
- Added rebuild() for regenerating textures
- Defines replaced by enums (GDK coding standard v1.2)
- Config Manager
- Added getSnapshot() for saving PNG screenshots
- Added fadeToColor() and fadeToImage()
- GFX Interface
- First working prototype
- Includes validation tests
- Uses ImageManager::findTex() for texture rendering
## 🚀 2014-03-20 – v0.60 – Tile & Font Modules
- Updated dependencies:
- SDL 2.0.2
- libpng 1.6.9
- AES (Feb 2014)
- Image Manager
- Added documentation diagrams
- Improved documentation
- Known bug #0000: SDL bug #2424; RLE disabled
- Known bug #0001: Direct3D target textures not working
- Tile Manager
- First working prototype
- Added documentation diagrams
- Added validation tests
- Font Manager
- First working prototype
- Added documentation diagrams
- Added validation tests
- Config Manager
- Added render callback system
- Main Interface
- Added preliminary keyboard input handling
- update() implements fixed virtual logic frame rate with interpolation
- Added basic and advanced rendering methods
## 🚀 2014-02-22 – v0.55 – Image & Cursor Modules
- Updated dependencies:
- SDL 2.0.2 (build 8147)
- Image Manager
- Redesigned for better functionality
- Added validation tests
- Cursor Manager
- Fully adapted to new Image Manager
- Codebase
- Integrated _C64RET() macro across all modules
- Documentation
- Added global GDK architecture diagram
- Added Main Interface diagram
## 🚀 2014-01-31 – v0.54 – Class Hierarchy Improvements
- Updated dependencies:
- SDL 2.0.1 (build 8054)
- Architecture
- Reworked entire class hierarchy
- API rewritten to follow new structure
- Clear distinction between Interface modules and Manager/Object modules
- Internal replacement of map with unordered_map in all modules
- Documentation
- General documentation improvements
## 🚀 2013-09-15 – v0.53 – Image & Cursor Modules
- Image Manager
- Completed module (texture management pending)
- Cursor Manager
- Completed module
- Resource Handling
- Image and Cursor managers reuse already-opened resources
## 🚀 2013-08-31 – v0.50 – Image & Cursor Modules (Development Stage)
- Updated dependencies:
- SDL 2.0 (build 7635)
- libpng 1.5.17
- Image Manager
- Module in active development
- Cursor Manager
- Module in active development
- Managers
- Improved info() reporting
- Shutdown warns if resources remain open
- Config Manager
- Allows creating multiple screens with the same name
- Rewritten internal structure to use map
- XML Manager
- Can open the same file multiple times
- Log Manager
- Only one Logger per unique name
- Archive Manager
- Reuses resources if the same file is loaded again
- Codebase
- Applied GDK coding standard v1.2
## 🚀 2013-08-03 – v0.41 – 64-bit Support
- Architecture
- GDK now built in 64-bit mode by default
- External libraries ported to both 32-bit and 64-bit
- All modules tested under both architectures
- Stability
- Fixed multiple DLL-related issues across modules
## 🚀 2013-07-31 – v0.40 – Archive, Tool & XML Modules
- Updated dependencies:
- zlib 1.2.8
- TinyXML 2.6.2
- Archive Module
- Implemented using new CDC file format
- Tool Module
- Added true RNG
- Added CRC32 functions
- Added filesystem utilities (exists, extension checks, etc.)
- Added rounding utilities
- Added string-zero functions
- XML Module
- Fully implemented XML Manager
- Validation
- Added first validation tests
- Codebase
- Improved main library header
## 🚀 2013-04-30 – v0.30 – Config Module
- Config Manager
- Fully implemented
- Documentation
- All modules documented and tested
- All known bugs fixed
## 🚀 2013-04-19 – v0.20 – Timer Module
- Timer Module
- Completed module
- Added fixed-time and variable-time support
- Codebase
- Created and applied first GDK coding standard
## 🚀 2013-04-11 – v0.10 – API Definition
- Architecture
- Designed main API components
- Logging
- Initial LogSystem module implemented
## 🚀 2013-04-01 – v0.01 – First Prototype
- Updated dependencies:
- SDL 2.0
- First prototype of CRM64Pro GDK