Defold 1.12.3 BETA

Defold 1.12.3 Beta

Disclaimer

This is a BETA release, and it might have issues that could potentially be disruptive for you and your teams workflow. Use with caution. Use of source control for your projects is strongly recommended.

Access to the beta

Download the editor or bob.jar from GitHub: Release v1.12.3 - beta · defold/defold · GitHub

Summary

  • NEW: (#11987) Expose engine time to shaders (by Jhonnyg)
  • NEW: (#11947) Add QuatFromAngle, QuatToEuler and EulerToQuat to dmSDK (by britzl)
  • NEW: (#11956) Use list of animation frames instead of start and end frame when working with atlases (by britzl)
  • NEW: (#7045) New semantic type for texture transforms (by Jhonnyg)
  • NEW: (#9918) Added experimental support for minification of internal resource paths to save memory (by JCash)
  • NEW: (#11902) Add editor.properties(node) editor script API for runtime introspection (by vlaaad)
  • NEW: (#11964) Add OpenAPI spec to editor HTTP server (by vlaaad)
  • NEW: (#11969) Add "text" property to textual resources in editor scripts (by vlaaad)
  • NEW: (#7737) Use filterable select box in input_binding’s key selector (by vlaaad)
  • NEW: (#5370) Add parent property to editor script outline nodes (by vlaaad)
  • NEW: (#8642) Add “Duplicate Selection” code action (by vlaaad)
  • NEW: (#11927) Support world and normal semantic types for sprites (by Jhonnyg)
  • FIX: (#11930) Fix strange sprite behavior when change atlas in runtime (by ekharkunov)
  • FIX: (#11328) Reduce number of dispatches needed for GUI text nodes (by Jhonnyg)
  • FIX: (#9722) Incorrect attribute values for instancing (by Jhonnyg)
  • FIX: (#11953) Fix gui.set_screen_position() when Adjust Reference is Disabled (by AGulev)
  • FIX: (#12009) Make sure shader.exclude_gles_sm100 is taken into account in AndroidManifest.xml (by AGulev)
  • FIX: (#12034) Added dmGraphics::VulkanGetImage and dmGraphics::VulkanGetImageView to dmsdk (by JCash)
  • FIX: (#12029) Update winsdk version. Cleanup old stuff a bit (by ekharkunov)
  • FIX: (#12017) Fixed issue where the HTML5 bundle always displayed the DOMToGLFWKeyCode... message in the console (by AGulev)
  • FIX: (#12022) Fix for incorrect particlefx scale (by Jhonnyg)
  • FIX: (#8163) Cache texture sampler state for OpenGL (by Jhonnyg)
  • FIX: (#11926) Produce better local space vertices for sprites and particles (by Jhonnyg)
  • FIX: (#11919) Fix for positions in local coordinate space for particles (by Jhonnyg)
  • FIX: (#11907) Fix floating point type mismatch for atlas images (by JosephFerano)
  • FIX: (#11886,#6260) Show function list in the right sidebar (by vlaaad)
  • FIX: (#8537) Prevent the editor from crashing when loading a malformed collection (by vlaaad)
  • FIX: (#11977) Avoid surprisingly expensive file system access during project read (by matgis)
  • FIX: (#11923) Use stat64 on windows (by Jhonnyg)
  • FIX: (#11976) Fix broken handling of shader compiler warnings in the editor (by matgis)
  • FIX: (#11985) Eliminate unnecessary code editor redraws (by matgis)
  • FIX: (extender#385) Up Android min sdk version to 21 (Android 5.0) (by ekharkunov)

Engine

NEW: (#11987) ‘Expose engine time to shaders’ by Jhonnyg
There is now a new constant type added CONSTANT_TYPE_TIME that can be used by shaders to automatically recieve time data from the engine:

uniform my_uniforms
{
    vec4 my_time; // Set to constant type "Time" in the material editor!
};

The current data is exposed:
my_time.x : time since engine start
my_time.y : delta time from last frame (same as being passed into script updates)

This change means that you don’t need to keep track of these values manually for certain effects like scrolling textures or other shader based animations!

NEW: (#11947) ‘Add QuatFromAngle, QuatToEuler and EulerToQuat to dmSDK’ by britzl
This change adds dmVmath::QuatFromAngle(), dmVmath::QuatToEuler() and dmVmath::EulerToQuat() to the public dmSDK.

NEW: (#11956) ‘Use list of animation frames instead of start and end frame when working with atlases’ by britzl
This change adds frames as a valid key in the animations table received from resource.get_atlas() or sent to resource.set_atlas() / resource.create_atlas(). Each entry in the frames table maps between an animation frame and the location of the frame in the geometries list.

:warning: The fields frame_start and frame_end have been removed from resource.get_atlas() but are still accepted when calling resource.set_atlas() / resource.create_atlas().

local data = resource.get_atlas(...)
pprint(data)
{
  animations = {
    width = 16,
    flip_vertical = false,
    id = "Walk",
    frames = {
      1 = 10,
      2 = 1,
      3 = 4,
      4 = 8,
      5 = 9,
      6 = 2,
      7 = 3,
      8 = 5,
      9 = 6,
      10 = 7
    },
    flip_horizontal = false,
    height = 16,
    fps = 30,
    playback = 4
  },
  geometries = {
    {
      uvs = {
        ...
      },
      pivot_x = 0.5,
      pivot_y = 0.5,
      height = 16,
      vertices = {
        ...
      },
      indices = {
        ...
      },
      rotated = false,
      width = 16
    }
  },
  {
    ...
  }
}

NEW: (#7045) ‘New semantic type for texture transforms’ by Jhonnyg
We have added a new semantic type texture transform for custom vertex formats that can be used to implement scrolling textures for sprites and particlefx components:

Recording 2026-02-23 135632

NEW: (#9918) 'Added experimental support for minification of internal resource paths to save memory ’ by JCash
This change helps projects with lots of resources as it likely will mean they have nested resources in many folders.
It will convert internal paths from the form /very/long/path/to/my/resource.type into /0123/4567/890a/bcde.type, so the savings will vary between projects.

Note: Currently, this option is experimental.

To use this feature, pass --experimental-path-minification to bob.jar when bundling.

FIX: (#11930) ‘Fix strange sprite behavior when change atlas in runtime’ by ekharkunov
Fix sprite strange behavior when sprite atlas was changed in runtime.

FIX: (#11328) ‘Reduce number of dispatches needed for GUI text nodes’ by Jhonnyg
Text nodes in the GUI component requires less dispatch calls now.

FIX: (#9722) ‘Incorrect attribute values for instancing’ by Jhonnyg
Using materials with custom vertex formats for models together with overriding materials in a render script can now render correctly.

FIX: (#11953) ‘Fix gui.set_screen_position() when Adjust Reference is Disabled’ by AGulev
Fixed an issue where gui.set_screen_position() did not work correctly for root nodes when Adjust Reference was set to Disabled in a GUI component.

FIX: (#12009) ‘Make sure shader.exclude_gles_sm100 is taken into account in AndroidManifest.xml by AGulev
The shader.exclude_gles_sm100 checkbox in game.project disables generation of OpenGL ES 2.0 compatible shaders, which makes this API unsupported. This setting should also be reflected in AndroidManifest.xml, so Google Play knows that such devices are not supported.

:warning: If you are using a custom AndroidManifest.xml file, make sure to update it.
Replace

    <uses-feature android:required="true" android:glEsVersion="0x00020000" />

with

    {{#shader.exclude_gles_sm100}}
    <uses-feature android:required="true" android:glEsVersion="0x00030000" />
    {{/shader.exclude_gles_sm100}}
    {{^shader.exclude_gles_sm100}}
    <uses-feature android:required="true" android:glEsVersion="0x00020000" />
    {{/shader.exclude_gles_sm100}}

FIX: (#12034) ‘Added dmGraphics::VulkanGetImage and dmGraphics::VulkanGetImageView to dmsdk’ by JCash
This allows the developer to get a native VkImage and VkImageView from a dmGraphics::HTexture.
It helps when interacting with other 3rd party libraries.

FIX: (#12029) ‘Update winsdk version. Cleanup old stuff a bit’ by ekharkunov
Updated WinSDK to version 10.0.26100.0 and build tools to version 14.44.35207
Related Add robustness test for windows libraries · Issue #813 · defold/extender · GitHub

FIX: (#12017) ‘Fixed issue where the HTML5 bundle always displayed the DOMToGLFWKeyCode... message in the console’ by AGulev
Fixed an issue where every keyboard key press produced a console log in HTML5 bundles, even in release builds.

FIX: (#12022) ‘Fix for incorrect particlefx scale’ by Jhonnyg
Fixes a regression that was introduced from recent changes in how particle systems factor in scale into local positions.

FIX: (#8163) ‘Cache texture sampler state for OpenGL’ by Jhonnyg
We currently set the texture sampler state every time we bind a texture as well as when dmGraphic::SetTextureParams is called when textures are bound in the renderer. This has now been changed so that we cache the sampler settings and only apply these when the sampler state has changed.

In this sample scene the number OpenGL calls is almost half and the fps diff is ~370 vs 340.

Left: Caching of OpenGL texture state (not applying filter if we don’t have to)
Right: Current dev

texturesamplestate

FIX: (#11926) ‘Produce better local space vertices for sprites and particles’ by Jhonnyg
Currently when writing custom vertex positions in the “local” coordinate space for sprites and particles, the size of the sprite/particle is applied to both the position and the world transform. This means that you cannot render the primitive correctly when applying the world transform to the local position in a shader for example:

// 1. the position attribute is in local space (i.e pixel local coordinate space)
gl_Position = view_proj * mtx_world * vec4(position.xyz, 1.0);
// 2. the position attribute is in world space
gl_Position = view_proj * vec4(position.xyz, 1.0);

These two statements should produce identical results, but doesn’t since the size is applied to the world transform for both sprites and particles. This has now been fixed, which means that we can use custom vertex formats to properly do billboarding properly.

FIX: (#11919) ‘Fix for positions in local coordinate space for particles’ by Jhonnyg
The transform was previously applied to the local space positions, which caused the particle system to produce rotated vertices in to the vertex buffer.

Editor

NEW: (#11902) ‘Add editor.properties(node) editor script API for runtime introspection’ by vlaaad
Now you can use editor.properties() fn in editor scripts to look up existing properties on a node, which makes them much more discoverable, especially for agentic workflows that interact with the running editor.

Usage example

pprint(editor.properties("/")) 
-- {
--   "children",
--   "path"
-- }

pprint(editor.properties("/game.project"))
-- {
--   "android.app_icon_144x144",
--   "android.app_icon_192x192",
--   "android.app_icon_36x36",
--   "android.app_icon_48x48",
--   ...many more
-- }

Agentic workflow example

Minimal /eval endpoint implementation (eval.editor_script):
local M = {}

function M.get_http_server_routes()
    return {
        http.server.route("/eval", "POST", "string", function(request)
            local success, result = pcall(function()
                return assert(load(request.body))()
            end)
            return http.server.json_response({
                success = success,
                result = result
            })
        end)
    }
end

return M
Using eval programmatically
curl "http://127.0.0.1:$(cat .internal/editor.port)/eval" -d 'return editor.properties("/")' | jq            
{
  "success": true,
  "result": [
    "children",
    "path"
  ]
}
Using eval in your favorite coding assistant

Once your agent knows about /eval endpoint and .internal/editor.port:

› Use /eval endpoint to show me all properties with values of /main/player.script
• Working...
• Properties with values for `/main/player.script`:

  - `path`: /main/player.script
  - `text`:
    ```
    go.property("hp", 100)
    go.property("speed", 3.5)
    ```
  - `__speed`: 3.5
  - `__hp`: 100

NEW: (#11964) ‘Add OpenAPI spec to editor HTTP server’ by vlaaad
We added an OpenAPI spec to the editor’s built-in HTTP server. This makes it more discoverable for AI agents, now they only need to know that the port is in .internal/editor.port, and they can learn the rest themselves.

Example using your favorite coding agent:

> given a local server in .internal/editor.port, what can you do with the server? 
• I found a live Defold Editor HTTP server. Next I’ll inspect its OpenAPI spec to list exactly
  what operations are available...
• With the server on port in `.internal/editor.port` file, I can control/read parts
  of your Defold editor via HTTP:

  Read editor console output
  `GET /console`

  Execute built-in editor commands
  `POST /command/{command}`
  Examples: build, rebuild, build-html5, hot-reload, debugger commands, fetch-libraries, 
  pane toggles, open docs/issues/profiler pages.

  Read/write editor preferences
  `GET /prefs/{path} and POST /prefs/{path}`
  Examples of paths: `code/font`, `code/font/size`.

NEW: (#11969) ‘Add "text" property to textual resources in editor scripts’ by vlaaad
We added "text" properties to textual resources besides code resources, e.g.:

print(editor.get("/builtins/render/default.render", "text"))
-- script: "/builtins/render/default.render_script"

NEW: (#7737) ‘Use filterable select box in input_binding’s key selector’ by vlaaad
It’s now possible to type to filter the input_binding’s key selectbox:
Screenshot 2026-03-05 at 15 49 32

NEW: (#5370) ‘Add parent property to editor script outline nodes’ by vlaaad
Editor scripts can now access outline parents using editor.can_get(node, "parent") and editor.get(node, "parent") in commands that query outline selection.

NEW: (#8642) ‘Add “Duplicate Selection” code action’ by vlaaad
The text editor now supports a Duplicate Selection code action (⌘⇧D on macOS, Ctrl Shift D on Windows and Linux):

NEW: (#11927) ‘Support world and normal semantic types for sprites’ by Jhonnyg
Sprites that use a material with vertex attributes specified as world or normal matrix semantic types previously produced only an identity matrix. This has now been fixed.

FIX: (#11907) ‘Fix floating point type mismatch for atlas images’ by JosephFerano
Fix issue when creating new animations while reusing existing atlas images where the image would get temporarily duplicated into the atlas until a restart.

FIX: (#11886,#6260) ‘Show function list in the right sidebar’ by vlaaad
We now show the function list in the right sidebar:
Screenshot 2026-02-20 at 08 37 39

FIX: (#8537) ‘Prevent the editor from crashing when loading a malformed collection’ by vlaaad

FIX: (#11977) ‘Avoid surprisingly expensive file system access during project read’ by matgis
Avoid calling Path.toRealPath on stateless resources when reading project data. This method appears to be surprisingly slow on certain file systems. We now only call this method for symlinks to stateless resources, where the existence of the file is important to determine at read-time.

This change resulted in a 24% project load time improvement in the large project we were testing in, but it will vary depending on the project.

FIX: (#11923) ‘Use stat64 on windows’ by Jhonnyg
We now use the 64-bit version of stat in the engine on windows. This means that we can load resources larger than 2gb.

FIX: (#11976) ‘Fix broken handling of shader compiler warnings in the editor’ by matgis
Fix unhelpful error during editor builds when the GLSL shader compiler emits warnings.

FIX: (#11985) ‘Eliminate unnecessary code editor redraws’ by matgis

  • Fixed an issue where the code editor would redraw unnecessarily when moving the mouse cursor across the view.
  • Fixed an issue where the blinking cursor could cause the code editor height to oscillate by half a pixel when placed on the first row of a file.

Other

FIX: (extender#385) ‘Up Android min sdk version to 21 (Android 5.0)’ by ekharkunov
:warning: The minimum supported Android API version has been increased from 19 (Android 4.4) to 21 (Android 5.0).
If you are using a custom AndroidManifest.xml file, make sure to replace

android:name=“android.support.multidex.MultiDexApplication”

with

android:name=“android.app.Application”

19 Likes

Thank you for the update, it is great as always!
I like this new addition, it will make coding more organized. Clicking on the functioon takes you to the line it is defined I assume?

Also this: ‘Use filterable select box in input_binding’s key selector’ by vlaaad
is really nice. It was a pain to scroll and find a key for a letter :slight_smile:

I was hoping to see the light and/or 3d model as collision shape but I guess they will be added in the 1.12.4

5 Likes

What? are you saying there is a plan to set a mesh as collision shape?? In 2D too? :heart_eyes::heart_eyes:

I have created a Space Blob mesh but I have to use many collision sphere to shape it:

4 Likes

Yes! On the a look ahead for 2026, they said: On the boundary between 3D and physics, we want to make collision authoring more flexible by allowing any model to be used as a collision shape, removing common pipeline friction when bringing complex geometry into Defold.

6 Likes

Thank you for this version; it has significantly enhanced my coding experience

3 Likes

Yes! This will save me a lot time on my current project, as I want to do almost all graphics, effects and animations with small textures and shader code!
Thank you

5 Likes

Hi, there’s no information about the format in atlas.animations changing in 1.12.3. Specifically, there is now no anim.frame_start, but there is anim.frames. It would be great to get some guidance on how this works now and what the final format is.

2 Likes

Apparently, the drawing order in the profiler is wrong… The text is under the background now and is practically invisible.

The release notes have been updated to include this fix as well. Thank you for the heads up.