Skip to main content

Brakeza3D 0.26.10 released!

· 5 min read
Eduardo
Lead Developer @ Brakeza3D

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 / Mesh3DAnimation created 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 CameraBlock uniform 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 Sound3D sources
  • 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() and Brakeza: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:

FeatureDetail
Fonts per widget and per elementAny .ttf / .otf; nested widgets inherit the parent's font
Word-wrapped textwrap, w, maxLines and lineSpacing on text elements
9-slice backgroundsbgSlice: frames whose corners keep their size when the panel is resized
Scrollable listsNew scroll element type
Pagers on toparrayPagerTop places a long list's pager above it
Resolution-aware textsetUIDesignResolution(w, h) and per-widget refHeight scale text with the window
New Lua helpersgetWidgetSize, 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 submesh
  • TextWriter: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 its cli_params (name, type, default)
  • --exit-after N — safety watchdog for headless runs
  • Brakeza:getCliParam(name) reads a parameter with its declared type
  • Brakeza:requestExit(code) closes the app with a process exit code

Scripting API Additions​

APIDescription
Brakeza:getDeltaTimeMS()Frame time in milliseconds (getDeltaTimeMicro() now really returns microseconds)
Brakeza:getImage3DAnimationByName()Typed access to animated billboards
BillboardAnimation:setTowardsCamera / setSize / setRenderFBFlat 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_SCALEParticle 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 in assets/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 ❤️