Defold 1.12.3 has been released!

Defold 1.12.3

NOTE: From this release on, we’ve moved away from having the editor deployed under editor-alpha channel, and instead use the stable channel. You don’t need to do anything special, other than update the editor as usual, and it will udpate itself to the stable channel.

:warning: Important note about changes to resource.get_atlas() and resource.set_atlas()

If you manipulate or query an atlas at runtime using resource.get_atlas(), resource.set_atlas() or resource.create_atlas() it is important that you pay extra attention to the change made to the atlas animation data. Previous versions of Defold returned a frame_start and frame_end per animation in the animations list. The frame_start and frame_end values were very unreliable and only worked correctly in the case when the order of images in the geometries list exactly matched the sequence of animation frames from frame_start to frame_end. In cases when animations aren’t sequentially ordered the frame_start and frame_end simply can’t be used to represent the animation frames.

The use of frame_start and frame_end was an oversight in the initial design of the API. In this version of Defold we’ve decided to deprecated the frame_start and frame_end fields in favour of a list of animation frames containing indices to the geometries of the animation. If you have code which works with single frame animations it is still easy to get the get “image” used by the animation by getting the first value from the frames list:

-- defold 1.12.2 and older:
local geometry_index = anim.frame_start

-- defold 1.12.3
local geometry_index = anim.frames[1]

More information in the pull request:

Defold 1.12.3

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: (#12048) Fix model_animation_done callback (by AGulev)
  • 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: (#12052) Cache the viewport rectangle to avoid potential performance issues on the HTML5 platform (by AGulev)
  • FIX: (#12070) Added support to choose Vulkan api version from game.project (by JCash)
  • 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) Editor fix: Allow shaders to compile with page count > 8 (by JosephFerano)
  • 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: (#12048) ‘Fix model_animation_done callback’ by AGulev

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.

FIX: (#12052) ‘Cache the viewport rectangle to avoid potential performance issues on the HTML5 platform’ by AGulev
Cache the viewport rectangle to avoid unnecessary OpenGL calls. In some cases, it may be the cause of performance issues.

FIX: (#12070) 'Added support to choose Vulkan api version from game.project ’ by JCash
This feature allows you to configure a specific Vulkan api version.
Game.project now has two settings:

  • graphics.vulkan_version_major (default =1)
  • graphics.vulkan_version_minor (default = 0)

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) ‘Editor fix: Allow shaders to compile with page count > 8’ by JosephFerano
Allow the compilation of shaders when a paged material exceeds the maximum allowed pages currently set to 8 when “Exclude GLES 2.0” is not checked in game.project > Shader setting.

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”

24 Likes

Having an issue with font anti aliasing after upgrading. Even when switched off, fonts are still anti aliased.

1 Like

I’m always looking forward to a Defold update. Especially the tile animation update…I think this is one I asked for a while back. Haven’t test yet, but pretty sure this is one I wanted.

Also not sure I understand what the agentic enhancement does. Is this if you want to use AI as part of your game?

Which one are you referring to?

I guess this anthropic workflow. Not really a fix directly, but not sure what this is telling me:

Agentic workflow example

Minimal /eval endpoint implementation (eval.editor_script)

I am making heavy use of editor scripts in my metroidvania toolkit, so was curious what this does. I have had no issues using claude code and chatgpt codex via VS Code.

————————-
Here’s what Claude said:

  1. Editor Script Enhancements — Directly Relevant

Since your toolkit heavily relies on editor scripts (hooks/editor_script.lua, hooks/editor_core.lua, hooks/editor_generators.lua) for importing Tiled exports and generating collections/gameobjects, these are significant:

  • editor.properties(node) — Runtime property introspection. You could use this to programmatically discover and validate properties on generated game objects, making your editor scripts smarter (e.g., verifying that Tiled-exported objects have all required properties after generation).

  • "text" property access — You can now read textual resources beyond code files. This could simplify how your editor scripts read/parse the exported .lua files from Tiled.

  • parent property on outline nodes — Useful for traversing collection hierarchies in your editor scripts, e.g., verifying parent-child relationships in generated room collections.

  • /eval endpoint + OpenAPI spec — This is the agentic workflow feature. It means external tools (or AI) could interact with the Defold editor programmatically. Could be interesting for automating testing of your toolkit.

2 Likes

This is not directly tied to Claude and Anthropic but rather improvements to Defold for anyone using “AI agents” to automate parts of or entire development workflows.

This ties into the same thing. An Open API spec is a standard for describing APIs. In this case the way you interact with the Defold editor “from the outside”, for instance via VS Code or when you want an AI agent to consume the API and use it to automate workflows in the editor.

2 Likes

Thank you for this feature, it makes the coding a lot nicer :slight_smile: Will GUI scripts also have this feature in the future?

1 Like

Hey guys, check this please:

2 Likes

Thanks. I’ll take a look.

1 Like

I just realized that it works for GUI scripts too. But, the script that is already open and has the focus when project loaded does not show the structure till you close and reopen it

1 Like