Brakeza3D 0.26.10 released!
Brakeza3D 0.26.10 is here! This release is all about performance and polish: a reworked renderer with instancing and shared GPU geometry, emissive materials, a brand-new audio backend, faster async loading, a much more capable UI system, path costs for pathfinding, and command-line parameters for automated runs.
Download for Linux and Windows:
✨ What's New
Rendering Performance Overhaul
The deferred renderer has been profiled and optimized end to end. Scenes with many copies of the same model are now dramatically cheaper.
- Shared GPU geometry — every
Mesh3D/Mesh3DAnimationcreated from the same model file shares its vertex buffers, with deduplicated index buffers - Instancing — an opaque render queue groups objects by model and draws them instanced in the G-Buffer, shadow and picking passes. Animated models too: bones are skinned in the vertex shader from a bone-matrix texture buffer
- Shadow caster culling — each light only renders the casters inside its own frustum
- State caches — FBO/program bind cache and a shared GL render-state cache remove redundant state
changes; projection and view travel in a single
CameraBlockuniform buffer
Emissive Materials
Mesh3D objects can now glow with their own color, ignoring scene lighting: screens, neon signs,
lamps, magic effects. Emission is off by default and adds no cost to scenes that do not use it.
local sign = Brakeza:getObjectByName("neon_sign")
sign:setEmissionEnabled(true)
sign:setEmissionIntensity(0.8) -- 0 = lit normally, 1 = full self-illumination
Available in the object inspector, saved in scene files and fully scriptable.
New Audio Backend: miniaudio
SDL2_mixer has been replaced by miniaudio, bundled as a single header — one dependency less to install on Linux.
- Same Lua API as before (
playSound, channels,Sound3D, ambience volume...) - WAV, MP3 and FLAC support, also for positional
Sound3Dsources - New
setChannelPitch(channel, pitch)for engine RPM, Doppler and similar effects
Faster Async Loading
- Per-file load locks in the resource caches: the same file is never loaded twice in parallel
- The compute thread pool is sized from the CPU core count
- Deferrable jobs: work that has to wait no longer blocks a worker thread
- Animated billboards get their own texture cache
Brakeza:getPendingJobsCount()andBrakeza:cancelPendingJobs()to drive loading screens and clean restarts;Components:Render():PreloadImage2D(path)warms up images before they are shown
UI System Upgrades
The widget system takes a big step forward:
| Feature | Detail |
|---|---|
| Fonts per widget and per element | Any .ttf / .otf; nested widgets inherit the parent's font |
| Word-wrapped text | wrap, w, maxLines and lineSpacing on text elements |
| 9-slice backgrounds | bgSlice: frames whose corners keep their size when the panel is resized |
| Scrollable lists | New scroll element type |
| Pagers on top | arrayPagerTop places a long list's pager above it |
| Resolution-aware text | setUIDesignResolution(w, h) and per-widget refHeight scale text with the window |
| New Lua helpers | getWidgetSize, invalidateWidget, invalidateAllWidgets, isUIScrollHovered |
The UI Manager editor window gained the matching controls (font pickers, grouped sections...).
Related rendering helpers:
drawFillSubmesh(obj, submesh, r, g, b, a)— translucent highlight over a single submeshTextWriter:measureTextWidthAtlas(text, scale)— measure batched atlas text to center or align it; atlas text now honors its tint color and blends correctly
Pathfinding — Path Costs
Grid3D cells can now have a traversal cost. A* prefers cheaper cells, so units can favour
sidewalks over roads or avoid dangerous areas without blocking them:
local grid = mesh:getGrid3D()
grid:fillCostFromImage("../assets/nav/roads.png", 128, 4.0) -- roads cost 4
grid:setCellsCost({ 10, 12, 11, 12 }, 10.0) -- a temporary danger zone
print(grid:getCellCost(10, 12))
Grid world coordinates are now derived from the grid bounds.
Command-Line Parameters & Automation
Projects can declare their own parameters and receive them from the command line — ideal for test scenarios, CI and benchmarks:
> brakeza3d.exe -p MyGame.json --set level=forest --set godMode=true --exit-after 300
--set key=value— passed to the project, declared in itscli_params(name, type, default)--exit-after N— safety watchdog for headless runsBrakeza:getCliParam(name)reads a parameter with its declared typeBrakeza:requestExit(code)closes the app with a process exit code
Scripting API Additions
| API | Description |
|---|---|
Brakeza:getDeltaTimeMS() | Frame time in milliseconds (getDeltaTimeMicro() now really returns microseconds) |
Brakeza:getImage3DAnimationByName() | Typed access to animated billboards |
BillboardAnimation:setTowardsCamera / setSize / setRenderFB | Flat ground sprites, runtime resizing, render layer |
Mesh3D:getModelFile() / getDiffuseTextureFile(i) | Inspect the model and per-submesh textures |
Input:isMouseInWindow() | Know when the cursor leaves the window |
ParticlesContext.PARTICLE_SIZE_SCALE | Particle size multiplier |
Profiler — Render Detail
The Profiler adds exact per-frame draw call and triangle counters, CPU and real GPU time per render pass (GPU queries are optional, zero overhead when off), rolling history with median/P95/P99, and CSV export to compare a scene before and after an optimization.
Editor & Platform
- Scene badge in the project panel
- Windows: the application icon is embedded in the executable (taskbar icon from the first frame)
- New minimal UITest demo scene (
UIWidgetsDemo.lua) showing a plain widget, a nested widget and an array with the sample widgets inassets/ui/
Bug Fixes
- Texture unit helpers only handled units 0–5 (higher units were bound onto the previous one)
- UI widget editor now saves
arrayPrefix - Black scene after a window resize (VAO name reuse in ground decals)
- VRAM leak when destroying custom code shaders
- Outline fill pass inheriting instancing flags
- Editor grid disappearing
- Two use-after-free crashes
- Camera up vector computed from its own rotation
Documentation
- UI Widgets — new dedicated page: JSON format, element types, buttons, nested widgets, lists and pagination, scroll areas, 9-slice backgrounds, text scaling and the UI Manager editor
- 3D Objects — Mesh3D model/texture methods, emission, shared geometry and instancing, animated billboards
- Grid3D — movement costs
- Scripting introduction — command-line parameters (
--set,cli_params,--exit-after),requestExit, async loading helpers - Sound — miniaudio backend, supported formats,
setChannelPitch - Text System — custom fonts with the glyph atlas, batched text and
measureTextWidthAtlas - Editor — Profiler counters, GPU timing and CSV export
- Download and Install — build from source updated: new Windows libraries package for 0.26.10 (no SDL2_mixer, exact MinGW build it needs) and the FFmpeg development packages on Linux
Thanks for testing Brakeza3D and sharing feedback ❤️
