nil
passed into go.delete()
function (by AGulev)BREAKING CHANGE: (#10454) ‘Throw a Lua error if nil
passed into go.delete()
function’ by AGulev
⚠️ Passing nil
to go.delete()
results in a Lua error, as this aligns with expected behavior and helps catch logical issues in the code.
NEW: (#10430) ‘Faster LU archive creation + Added option for compression level. ‘ by AGulev
A new option was added to the LiveUpdate settings: ZIP archive compression level, with levels ranging from 0 to 9.
The default level is 1 (the same as before the changes).
This option is useful in cases where compression is not needed at all—e.g., when Poki repacks the archive and applies their own compression. In such cases, using level 0 will significantly speed up archive creation and the bundling process.
Additionally, the archive writer itself was improved, making archive creation at least twice as fast (regardless of whether compression is used or not).
On a test suite with 172,296 files, which were used for benchmarking on a Mac M1 Pro Max:
NEW: (#10442) ‘Added dynamic profiling scope for extensions’ by britzl Added per profiling scopes per extension update.
Example using profiler.dump_frame() shows the Extension
scope and WebView
, LiveUpdate
and Profiler
extensions:
INFO:PROFILER: Profiler threads:
INFO:PROFILER: Thread 'sound': 0.000001
INFO:PROFILER: 'UpdateInternal': time: 0.001 ms self: 0.001 ms count: 1
INFO:PROFILER: Thread 'Main': 0.006706
INFO:PROFILER: 'Step': time: 6.706 ms self: 0.007 ms count: 1
INFO:PROFILER: 'Frame': time: 6.699 ms self: 0.328 ms count: 1
INFO:PROFILER: 'Sim': time: 0.563 ms self: 0.050 ms count: 1
INFO:PROFILER: 'Resource': time: 0.001 ms self: 0.001 ms count: 1
INFO:PROFILER: 'UpdateFactory': time: 0.000 ms self: 0.000 ms count: 1
INFO:PROFILER: 'JobThreadUpdate': time: 0.000 ms self: 0.000 ms count: 1
INFO:PROFILER: 'Hid': time: 0.207 ms self: 0.207 ms count: 1
INFO:PROFILER: 'JobThreadUpdate': time: 0.000 ms self: 0.000 ms count: 1
INFO:PROFILER: 'Extension': time: 0.082 ms self: 0.003 ms count: 1
INFO:PROFILER: 'WebView': time: 0.000 ms self: 0.000 ms count: 1
INFO:PROFILER: 'LiveUpdate': time: 0.001 ms self: 0.000 ms count: 1
INFO:PROFILER: 'LiveUpdate': time: 0.001 ms self: 0.001 ms count: 1
INFO:PROFILER: 'JobThreadUpdate': time: 0.000 ms self: 0.000 ms count: 1
INFO:PROFILER: 'Profiler': time: 0.078 ms self: 0.078 ms count: 1
INFO:PROFILER: 'Sound': time: 0.000 ms self: 0.000 ms count: 1
NEW: (#10464) ‘Resume HTML5 audio on “mouse down” and “touch start” events’ by aglitchman AudioContext now resumes on events ‘mouse down’ and ‘touch start’. Previously it was resuming on ‘mouse up’ and ‘touch end’ event and users hear the first sound with delay, i.e. only when they take their finger off the screen or mouse.
NEW: (#9946) ‘Added API to get AABB for models.’ by ekharkunov Added new API to get AABB information from models:
model.get_aabb()
model.get_mesh_aabb()
AABB information return in form of table with two fields min
and max
. Both of them has type vector3
.
Functions take 1 argument: url of the model component.model.get_aabb()
returns AABB information for the whole model in local coordinate space.
model.get_mesh_aabb()
function returns a dictionary of AABB information for all meshes in the following form:
<hashed_mesh_id> = <aabb_information>
Usage example:
model.get_aabb()
model.get_aabb("#model") -> { min = vmath.vector3(-2.5, -3.0, 0), max = vmath.vector3(1.5, 5.5, 0) }
model.get_mesh_aabb()
model.get_mesh_aabb("#model") -> { hash("Sword") = { min = vmath.vector3(-0.5, -0.5, 0), max = vmath.vector3(0.5, 0.5, 0) }, hash("Shield") = { min = vmath.vector3(-0.5, -0.5, -0.5), max = vmath.vector3(0.5, 0.5, 0.5) } }
NEW: (#10554) ‘Added missing API docs to dmHashTable’ by britzl
Added missing API documentation for dmHashTable
constructor, Clear
, Capacity
, Swap
, Empty
, Put
, Erase
and Iterate
.
NEW: (#10555) ‘Added missing Gamepad API docs to dmHID’ by britzl
Added API documentation for GetGamepadPacket
, GetGamepadButton
and GetGamepadHat
.
NEW: (#10576) ‘Add a fallback if globalThis is missing’ by britzl
The global object (ie globalThis
) is not set in old browsers and code in dmLoader.js etc rely on it being present. This change makes sure the Window
object is set as globalThis
according to the specification.
FIX: (#10307) ‘Added support for .opus sound format’ by thengel01 We’ve added support for the .opus audio format.
It is a very effective compression, and is suitable for both music and sound effects.
As we are very conservative of the engine build size, we chose to add this support as an opt-in.
In order to add support for .opus files at runtime, you need to create an App Manifest and chose Include Sound Decoder Opus
.
Similarly, it is now also possible to exclude the other decoders (.wav and .ogg) allowing you to slim down the engine size even further.
FIX: (#10243) ‘Sound system mixer rework (down sampling enablement and general optimizations)’ by thengel01 We’ve changed our sound resampler to support any sample rate. The resampler now also supports SIMD code (SSE2 and wasm simd128) for better performance. It is currently enabled on platforms that support it , i.e. Windows, Linux, HTML5 and macOS (x64)
The change also reduces memory footprint than before.
FIX: (#10394) ‘Fontc now uses the ttf font input to determine if it’s monospaced’ by JCash Previously, it was determined based on the output, but if the output was a single glyph, it was always determined as monospaced.
FIX: (#10544) ‘Make sure the engine picks the best GPU’ by AGulev
GLFW for Windows is now built with GLFW_USE_HYBRID_HPG
enabled to export the NvOptimusEnablement and AmdPowerXpressRequestHighPerformance symbols, which force the use of the high-performance GPU on Nvidia Optimus and AMD PowerXpress systems.
FIX: (#10462) ‘Use unique identifiers for factory-spawned game objects’ by AGulev All objects spawned with factories now have unique identifiers, which helps to avoid hidden issues
FIX: (#10496) ‘Log error when vertex declaration doesn’t match the vertex data in Vulkan’ by JCash
FIX: (#10541) ‘Use raw input for gamepads even if no gamepad is specified in the gamepad mappings’ by AGulev Games which use only raw gamepad data will now receive input events even if the gamepad bindings file is empty.
FIX: (#10563) ‘Faster way to unpack tools in Bob’ by AGulev This change speeds up unpacking of external tools and makes their use thread safe when using more than one thread.
FIX: (#10558) ‘Cleanup the input action table’ by britzl If a mouse is connected the input action table always contains mouse position data even for input actions which are not related to the mouse. This change cleans up the input action table so that only values relevant to the input action is included:
text
pressed
, released
, repeated
and value
pressed
, released
, repeated
, value
, x
, y
, dx
, dy
, screen_x
, screen_y,
screen_dx and
screen_dy`x
, y
, dx
, dy
, screen_x
, screen_y,
screen_dx,
screen_dy` and accelerometer data if on mobilepressed
, released
, repeated
, value
, x
, y
, dx
, dy
, screen_x
, screen_y,
screen_dx,
screen_dy and
touch`pressed
, released
, repeated
, value
, gamepad
NEW: (#10378) ‘Auto-insert closing parens in the code editor’ by vlaaad
NEW: (#10380) ‘Add build server username/password prefs fields’ by vlaaad This changeset also adds a new prefs schema type in editor scripts: password, e.g.
function M.get_prefs_schema()
return {["my-extension.third-party-api-key"] = editor.prefs.schema.password()}
end
Password schema behaves as a string schema, but the value is encrypted in the prefs file.
NEW: (#10433) ‘Introduce global console filtering toggle ‘ by sprocketc A global filter toggle button was introduced to the console tab.
NEW: (#10490) ‘Do not autocomplete Lua code in comments’ by AGulev The code editor will no longer try to auto-complete Lua code in comments.
NEW: (#10494) ‘Add Project and Debug locations for editor script commands’ by vlaaad Now this editor script will work:
local M = {}
function M.get_commands()
return {
{
label = "Project command",
locations = {"Project"},
run = function()
print("Run project command")
end
},
{
label = "Debug command",
locations = {"Debug"},
run = function()
print("Run debug command")
end
}
}
end
return M
NEW: (#10505) ‘Option to hide the Changed File panel’ by AGulev
New option View -> Toggle Changed Files Pane
that hides the Changed Files
panel.
NEW: (#10512) ‘Add editor shortcut keymap configuration’ by vlaaad
We added the Keymap tab to the Preferences dialog — now it’s possible to configure editor command shortcuts from within the editor:
Assigning shortcuts to commands defined in editor scripts is now also possible. If a command defines an id, it will appear in the Keymap configuration table. Example editor script:
local M = {}
function M.get_commands()
return {
editor.command({
label = "Print Git Status",
locations = {"Project"},
id = "vcs.print-git-status",
run = function(opts)
editor.execute("git", "status", {reload_resources=false})
end
})
}
end
return M
Now you can assign a shortcut:
NEW: (#10537) ‘Make it clear that some resources cannot be edited’ by AGulev
The editor now displays a message indicating that changes to files from libraries cannot be saved.
NEW: (#10560) ‘Add LSP rename support’ by vlaaad
Now you can rename symbols in the code editor:
NEW: (#10570) ‘Transform top selected nodes only’ by sprocketc Selected children of already selected parents should not be transformed.
FIX: (#10580) ‘Fixed models not rendering in the editor in some situations’ by matgis
FIX: (#10556) ‘Fix label drag issues’ by sprocketc Handle various label drag issues.
FIX: (#10495) ‘Increased text contrast in diff view’ by britzl Increased text contrast on green background when showing change diffs.
Old:
New:
FIX: (#10422) ‘Consume the mouse event when clicking outside of the color popup’ by sprocketc Clicking outside of a color picker popup should not propagate.
FIX: (#10373) ‘Introduce code zoom on scroll preference’ by sprocketc
FIX: (#10363) ‘Fix menu bar visibility on toolbar refresh’ by sprocketc This fixes an occasional menu bar visibility issue, triggered by a toolbar refresh.
FIX: (#10469) ‘Hide toolbars of inactive tabs’ by sprocketc This should hide all toolbars of inactive tabs.
FIX: (#10476) ‘Fix state when closing the inactive tab on split configurations’ by sprocketc
FIX: (#10492) ‘Make it clear when a collision object shape is unnamed’ by AGulev
Make sure it’s clear from the outline when physics shapes are unnamed (names are only needed for runtime operations):
FIX: (#10491) ‘Fixed the issue where horizontal scrolling in the text editor doesn’t account for changes in code font size’ by AGulev
FIX: (#10488) ‘Fix the scale tool for rotated objects in the editor’ by AGulev The scale tool in the scene editor will now work regardless of how the object was initially rotated. Previously an object rotated exactly 90 degrees along any axis would not be possible to rotate using the scale tool.
FIX: (#10533) ‘Fixed the issue where transformation gizmos for models disappeared when “Component Guides” was turned off’ by AGulev
FIX: (#10561) ‘Fix initial document-width calculation for tab-indented code files’ by matgis Fixed an issue where you could not scroll the code editor far enough horizontally to view the whole document in code files indented using tabs.
FIX: (#10581) ‘Hide reset button if some of the props are not overridable’ by sprocketc Check if all props of on a multi-selection are overridable in order to display the reset button.
FIX: (#10461) ‘Create GUI dependencies on drop ‘ by sprocketc Allow dropping assets to GUI scenes to create dependencies.
FIX: (#10584) ‘Correctly apply model material overrides in editor scene view’ by matgis Fixed an issue where model material overrides were not being correctly applied in when viewed in the editor Scene View.