Defold 1.6.4 Beta

Defold 1.6.4 Beta

The latest beta is now released, and we invite those interested in beta testing the new features in the editor and engine to join now.
The beta period will be 2 weeks and the next planned stable release is two weeks from now.

We hope this new workflow will highlight any issues earlier, and also get valuable feedback from our users. And please comment if you come up with ideas on improving on this new workflow.

Please report any engine issues in this thread or in issues using Help → Report Issue

Thx for helping out!

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 http://d.defold.com/beta/

Set your build server to https://build-stage.defold.com

Summary

  • NEW: (#8364) Updated to Xcode 15.1, iOS 17.2 and macOS 14.2
  • NEW: (#8353) Added options to control how json data is encoded and decoded
  • NEW: (#8352) Generate a node id when cloning a gui node
  • NEW: (#8336) Added engine loader fallback when WebAssembly streaming fails
  • NEW: (#8255) Custom vertex format support for Models
  • NEW: (#8296) Remove glfw from the engine builds
  • NEW: (#8300) Dynamic resizing of collision shapes
  • NEW: (#8330) Load images in runtime as buffers
  • NEW: (#8419) Add new default filtering keyword for material samplers (Engine support)
  • NEW: (#8421) Remove material count limit for models
  • NEW: (#8428) Added options in sound.stop(url, [options]) where it’s possible to specify what exactly voice should be stopped
  • NEW: (#8416) New API functions: sys.load_buffer and sys.load_buffer_async
  • NEW: (#8429) Added physics.set_listener(fn) to set a function as the physics world listener
  • NEW: (#8258) Added sprite multitexture support
  • NEW: (#8456) New function physics.update_mass(url, mass)
  • NEW: (#8318) Select the default build server based on channel
  • NEW: (#8375) Slightly improve editor memory usage for large projects
  • NEW: (#8434) Add editor.create_directory() and code completion to editor scripts
  • NEW: (#8439) Add physics.JOINT_TYPE_WHEEL for 2d physics
  • FIX: (#8310) Update node transform if adjust mode changed using gui.set_adjust_mode()
  • FIX: (#8338) Fix for outputting the correct skinned tangents
  • FIX: (#8344) Buffered render buffers support
  • FIX: (#8357) Add missing functions to null physics libraries
  • FIX: (#8358) Set data correctly when recreating dynamic texture in gui
  • FIX: (#8293) Compute shader support, part deux
  • FIX: (#8367) Fix ogg-validate invocation for sounds from mounted extensions
  • FIX: (#8369) Add hot reload functionality for label component.
  • FIX: (#8450) If the hash string is unknown, show its value instead.
  • FIX: (#8452) Remove redunant malloc in font_map
  • FIX: (#8461) Fixed how mass is calculated for physics collision objects with more than one shape.
  • FIX: (#8418) Don’t request LSP completions for dependencies

Engine

NEW: (#8364) Updated to Xcode 15.1, iOS 17.2 and macOS 14.2

NEW: (#8353) Added options to control how json data is encoded and decoded
It is now possible to configure the behaviour when encoding and decoding JSON data.

When encoding to JSON it is possible to control wether an empty Lua table should encode as a JSON object or array. The default behaviour when encoding an empty Lua table is to encode to a JSON object.

When decoding from JSON it is now possible to control wether a JSON null value should decode to json-null or nil. The default behaviour when decoding a JSON null value is to decode to nil.

local t = {}
json.encode(t, { encode_empty_table_as_object = true }) -- {}
json.encode(t, { encode_empty_table_as_object = false }) -- []
json.encode(t) -- {}


local s = "[ 1, 2, null, 3 ]"
json.decode(s, { decode_null_as_userdata = true}) -- { 1, 2, json.null, 4 }
json.decode(s, { decode_null_as_userdata = false}) -- { 1, 2, nil, 4 }
json.decode(s) -- { 1, 2, nil, 4 }

NEW: (#8352) Generate a node id when cloning a gui node
Cloned gui nodes are now automatically assigned a node id instead of an empty hash.

NEW: (#8336) Added engine loader fallback when WebAssembly streaming fails
The engine loader will now use XMLHttpRequest as a fallback when WebAssembly compilation and instantiation from a streamed source fails.

NEW: (#8255) Custom vertex format support for Models
We have added initial support for custom vertex formats for models.

NEW: (#8296) Remove glfw from the engine builds
GLFW is no longer being built as part of our main engine build. Instead, the current GLFW version (modified 2.7) is now begin built and distributed as an external package. We have also removed GLFW from our SDK, which means that some extensions might potentially break. This is considered a bugfix instead of a breaking change, since the headers should never have been part of the SDK from the first place.

This is the second part of our ongoing task (#7970) of migrating the current GLFW version to the latest stable official release, as well as separating all non-desktop platforms our of the GLFW infrastructure.

NEW: (#8300) Dynamic resizing of collision shapes
Added script functions to get and set collision shape sizes in runtime. The new functions are:

physics.get_shape(url, shape_name)
physics.set_shape(url, shape_name, table)

For example, to update the box shape my_box for a collision object located at /go#collisionobject:

local box = physics.get_shape("/go#collisionobject", "my_box")
box.dimensions = box.dimensions + vmath.vector3(5,10,15)
physics.set_shape("/go#collisionobject", "my_box", box)

NEW: (#8330) Load images in runtime as buffers
The image script module now has a new function to return a buffer object. The new function is called image.load_buffer and can be used to dynamically create texture resources in runtime:

local img = image.load_buffer(compressed_data)
-- img.buffer now contains an actual buffer object that can be passed into resource.create_texture
local tparams = {
	width  = img.width,
	height = img.height,
	type   = resource.TEXTURE_TYPE_2D,
	format = resource.TEXTURE_FORMAT_RGBA
}
local my_texture_id = resource.create_texture("/my_custom_texture.texturec", tparams, img.buffer)

NEW: (#8419) Add new default filtering keyword for material samplers (Engine support)
This PR adds new filtering keyword for material samplers called:

FILTER_MODE_MIN_DEFAULT
FILTER_MODE_MAG_DEFAULT

When using these settings on a sampler in the material, the engine will pick the global min and mag settings that is specified in the game.project -> graphics setting. This can be useful for having a global base filtering method, while still being able to specialise settings per sampler if needed.

NEW: (#8421) Remove material count limit for models
We have removed the limit for how many materials a model component can reference.

NEW: (#8428) Added options in sound.stop(url, [options]) where it’s possible to specify what exactly voice should be stopped
Now it’s possible to stop one particular voice of the sound component:

     sound.stop("#sound")
     local id = sound.play("#sound")
     sound.stop("#sound", {play_id = id}) -- stop only one voice

NEW: (#8416) New API functions: sys.load_buffer and sys.load_buffer_async
Two new script functions has been added:

function async_callback(self, request_id, status, buf)
    -- do something with data here
end

local buf = sys.load_buffer(path)
local request_id = sys.load_buffer_async(path, callback)

These functions can be used to read data into a buffer object from either via the resource system, or direct file locations if the resource could not be found on any of the mounted resource locations. Meaning, the path supplied is not necessary a custom resource location, it can be any file on disk.

NEW: (#8429) Added physics.set_listener(fn) to set a function as the physics world listener
Now, it is possible to set a function that will receive all physics interaction events in one place. If a function is set, physics messages will no longer be sent.

physics.set_listener(function(self, event, data)
  if event == hash("contact_point_event") then
    pprint(data)
    -- {
    -- 	applied_impulse = 310.00769042969,
    -- 	distance = 0.0714111328125,
    -- 	a = {
    -- 		position = vmath.vector3(446, 371, 0),
    -- 		relative_velocity = vmath.vector3(1.1722083854693e-06, -20.667181015015, -0),
    -- 		mass = 0,
    -- 		group = hash: [default],
    -- 		id = hash: [/flat],
    -- 		normal = vmath.vector3(-0, -1, -0)
    -- 	},
    -- 	b = {
    -- 		position = vmath.vector3(185, 657.92858886719, 0),
    -- 		relative_velocity = vmath.vector3(-1.1722083854693e-06, 20.667181015015, 0),
    -- 		mass = 10,
    -- 		group = hash: [default],
    -- 		id = hash: [/go2],
    -- 		normal = vmath.vector3(0, 1, 0)
    -- 	}
    -- }
  elseif event == hash("collision_event") then
    pprint(data)
    -- {
    -- 	a = {
    -- 			group = hash: [default],
    -- 			position = vmath.vector3(183, 666, 0),
    -- 			id = hash: [/go1]
    -- 		},
    -- 	b = {
    -- 			group = hash: [default],
    -- 			position = vmath.vector3(185, 704.05865478516, 0),
    -- 			id = hash: [/go2]
    -- 		}
    -- }
  elseif event ==  hash("trigger_event") then
    pprint(data)
    -- {
    -- 	enter = true,
    -- 	b = {
    -- 		group = hash: [default],
    -- 		id = hash: [/go2]
    -- 	},
    -- 	a = {
    -- 		group = hash: [default],
    -- 		id = hash: [/go1]
    -- 	}
    -- },
  elseif event ==  hash("ray_cast_response") then
    pprint(data)
    --{
    -- 	group = hash: [default],
    -- 	request_id = 0,
    -- 	position = vmath.vector3(249.92222595215, 249.92222595215, 0),
    -- 	fraction = 0.68759721517563,
    -- 	normal = vmath.vector3(0, 1, 0),
    -- 	id = hash: [/go]
    -- }
  elseif event ==  hash("ray_cast_missed") then
    pprint(data)
    -- {
    --  request_id = 0
    --},
  end
end)

NEW: (#8456) New function physics.update_mass(url, mass)
Added new function physics.update_mass(url, mass) which updates the mass of a dynamic 2D collision object in the physics world.

The function recalculates the density of each shape based on the total area of all shapes and the specified mass, then updates the mass of the body accordingly.

NEW: (#8258) Added sprite multitexture support
With the latest version, we now have support for multiple atlases in the sprite component.

To use it, you need a material and shader that has multiple samplers available.
The sprite will then display property fields where you can select an atlas for each sampler.

The animations shown are selected from the first sampler’s atlas.
The sprite will use this animation’s fps setting and frame names.

You will also need to match animations between atlases. If the default animation is “jump”, then it will automatically choose the “jump” animation from the other atlases as well.
It is also required that frames within the animations matches.
In a scenario where A.atlas has animation jump:

jump
    frame1.png
    frame2.png

Then B.atlas needs this animation as well:

jump
    frame_normal_1.png
    frame_normal_1.png

In this case, the frame names don’t match, and you’ll need to use the rename_patterns field to alter the frame names.
It is a comma separated list of patterns:

rename_patterns: _normal_=

In this example, it replaces the string “normal” with the string “”, resulting in the final animation/frame names for B.atlas:

jump
    frame1.png
    frame1.png

Note: A more in depth documentation is being worked on.

NEW: (#8439) Add physics.JOINT_TYPE_WHEEL for 2d physics
Added physics.JOINT_TYPE_WHEEL for 2d physics

FIX: (#8310) Update node transform if adjust mode changed using gui.set_adjust_mode()
Fix bug when adjust mode applied to a node only after window resize.

FIX: (#8338) Fix for outputting the correct skinned tangents
Due to a typo, the skinned tangents weren’t calculated correctly.

FIX: (#8344) Buffered render buffers support
Fixed an issue for certain graphics adapter where vertex and index buffers are overwritten during the same frame.

FIX: (#8357) Add missing functions to null physics libraries

FIX: (#8358) Set data correctly when recreating dynamic texture in gui
Bugfix for when recreating a deleted texture within the same frame in GUI:

gui.new_texture(tex_id, img.width, img.height, img.type, img.buffer)
gui.delete_texture(tex_id)
gui.new_texture(tex_id, img.width, img.height, img.type, img.buffer)
gui.set_texture(node, tex_id)

FIX: (#8293) Compute shader support, part deux
This is the second part of the compute shader support, this PR includes engine resources for the compute program and shaders needed to build the compute program. At this point we cannot still reference the compute programs anywhere in the engine (which is the next step - to formalize a user-facing API around this work).

FIX: (#8367) Fix ogg-validate invocation for sounds from mounted extensions
Copy ogg resource to temp file to deal with resources from mount points (e.g. extensions).
Ogg validation runs on temp ogg file now.
Temp files created into Bob root folder which removed at the end of the build.

FIX: (#8369) Add hot reload functionality for label component.
Add hot reload functionality for label component.
Reread properties from reloaded label resource and mark component to be rehashed.

FIX: (#8450) If the hash string is unknown, show its value instead.
Instead of showing just <unknown> when the corresponding string value is unknown, print its numeric value. For example:

<unknown:2256903789829718645>

FIX: (#8452) Remove redunant malloc in font_map

FIX: (#8461) Fixed how mass is calculated for physics collision objects with more than one shape.
Fixed a bug where the mass specified in the Collision Object component was applied to each shape, resulting in the object’s total mass becoming Collision Object mass x Shapes count.

With this fix, the mass will remain as specified in the Collision Object, and the density will be recalculated depending on it to be equal for each shape.

Editor

NEW: (#8318) Select the default build server based on channel
If the “Build Server” preference was never modified or is set to an empty string, the editor will pick either https://build-stage.defold.com or https://build.defold.com depending on the editor channel.

NEW: (#8375) Slightly improve editor memory usage for large projects
Slightly improve editor memory usage in projects with a large number of node endpoints. This typically corresponds to the number of files in the project, but varies significantly by file type.

Improves #8261

NEW: (#8434) Add editor.create_directory() and code completion to editor scripts
This changeset adds a new function to editor scripts that allows the user to create a new directory. The function expects a resource path, i.e. a /-prefixed path from the root of the project, for example:

editor.create_directory("/assets/generated")
local file = io.open("assets/generated/build.json")
file:write(...)
file:flush()
file:close()

Additionally, the editor now provides code completions for functions in the editor module.

FIX: (#8418) Don’t request LSP completions for dependencies

25 Likes

Please pay extra attention if you use 2D physics (Box2D built into Defold) and you have collision objects with more than one shape. We had an old bug which has been fixed in this version. It’s possible that you’ll have to change the mass for your collision objects to keep behavior close to the old implementation, but only if they have more than one shape.

5 Likes

I’ve been looking forward to this feature! To get the desired scale right now I have to divide by the physics scale and a factor 2.

--this is what's set in game.project
local physics_scale = 0.01 

--sets the collision object's visible dimension to: (20, 20, 20)
box.dimensions = vmath.vector3(20, 20, 20) / (2 * physics_scale) 

Is dividing by 2 maybe necessary as box2d deals with half width and height?

Some very welcome additions this round, thank you!

I recall seeing several posts on the forums noting that the majority of physics engines don’t support something like this, and that if you need to change an game object’s collision properties, you should create multiple different collision objects. What was the catalyst for this feature to be added? Was the underlying Box2D engine modified to support it, or was it entirely a Defold limitation?

This is a fantastic change. Oftentimes I have hundreds or thousands of collide-able game objects that are dynamically spawned without a script to improve performance. Unfortunately, I still had to create separate script files for them because although I didn’t need to implement an update() function, I still needed to implement an on_message() function to handle collision messages. Now I will be able to do that without creating those additional script files.

(Technically, collision messages could be handled without a separate script, but if you have multiple different types of collide-able enemies but only a single collision mask shared between them, then it’s not so easy to differentiate which type of enemy you’re colliding with, hence having a separate on_message() function per enemy type.)

2 Likes

For those that wish to start testing with multi texturing, here is a very small example.
Our main focus for this first MVP was using animations with corresponding names like so:
diffuse.atlas:

hero_run:
    run1.png
    run2.png
   ...

normal.atlas:

hero_run:
    run_normal_1.png
    run_normal_2.png
   ...

Here you have to use the “rename patterns” to rename the normal images accordingly.
I don’t have a good example project of this yet.

Screenshot 2024-01-29 at 18.01.07 + Screenshot 2024-01-29 at 18.01.16 =

Update: I also added an embryo for a normal map example. Currently, the shader isn’t setup to do actual normal mapping, but it should still serve as an example:

Here is the download link:
SpriteMultiTextureNormal.zip (311.6 KB)

7 Likes

Oh wow, I totally missed this! This is huge, well done guys. Makes my next game idea much more viable… :eyes:

4 Likes

We’ve received more requests for advanced features in the physics engine and come to the conclusion that 1) we need to move the physics engines to extensions (one for 2d and one for 3d) and 2) we can’t fixate on having a 1:1 mapping between 2d and 3d physics (especially since we will move physics to extensions this year)

7 Likes

Great news, just checked it out on macOS - works as expected! :+1:

1 Like

I think it’s about a misunderstanding of terminology.

The first issue here is that developers were asking for scaling, and the problem of scaling isn’t that simple.
The most basic no-go case is scaling a circle, like so:

local scale = vmath.vector3(2, 3, 0);

This is still impossible to do, because physics can’t work with ellipse.
However, having this new feature makes these limitations clearer than simply scaling.

The second issue is that there is no such concept as scale for a physics shape in Box2D, for example. The only thing you can do is to remove one shape and create another one with the needed parameters. That’s what this new function does.

The third issue concerns applying transforms from the game world to the physics world for Dynamic objects. We partially solved this by adding Allow Dynamic Transforms. However, it’s important to understand that there is a special type of objects that exist, which users can change dynamically: Kinematic objects. Doing such things with dynamic objects may disrupt the physics simulation in strange ways.
For example, consider this case like the freshest one: Defold Physics Hinge Bug? - #9 by super_kimono
This happens because of bidirectional communication between the game world and the physics world for the exact same object (first, you apply an object’s transform to a physics collision object and then read values from the physics world for the same object transform)

So, in conclusion, there is no controversy between what we said before and the fact that we added this feature (and also Allow Dynamic Transforms feature a long time ago).

6 Likes

This is amazing. Thanks so much for this feature.

4 Likes

This point was missed in release notes, I’ve just added it.

7 Likes

Getting crash errors when building this project from editor> GitHub - defold/sample-normal-maps-2d

  • Defold 1.6.4 beta
  • editor SHA1 86d2d3d6cb9b963e623967d7bd67b3385183b5b5
  • engine SHA1 86d2d3d6cb9b963e623967d7bd67b3385183b5b5
  • Windows 10

When building to html5, project builds with no errors.

LOG:
editor2.2024-01-30.txt (1.5 MB)

1 Like

Hmm, very strange. The error seems related to Add new default filtering keyword for material samplers (Engine support) by Jhonnyg · Pull Request #8419 · defold/defold · GitHub.

2024-01-30 14:14:35.955 43153 [clojure-agent-send-off-pool-0] WARN  editor.defold-project - {:line 92, :msg "Unable to load resource '/assets/sprite_normal.material'"}
com.google.protobuf.TextFormat$ParseException: 70:15: Enum type "dmRenderDDF.MaterialDesc.FilterModeMin" has no value named "FILTER_MODE_MIN_DEFAULT".
	at com.google.protobuf.TextFormat$Tokenizer.parseExceptionPreviousToken(TextFormat.java:1363)
	at com.google.protobuf.TextFormat$Parser.consumeFieldValue(TextFormat.java:2175)
	at com.google.protobuf.TextFormat$Parser.consumeFieldValues(TextFormat.java:2015)
	at com.google.protobuf.TextFormat$Parser.mergeField(TextFormat.java:1961)
	at com.google.protobuf.TextFormat$Parser.consumeFieldValue(TextFormat.java:2086)
	at com.google.protobuf.TextFormat$Parser.consumeFieldValues(TextFormat.java:2015)
	at com.google.protobuf.TextFormat$Parser.mergeField(TextFormat.java:1949)
	at com.google.protobuf.TextFormat$Parser.mergeField(TextFormat.java:1818)
	at com.google.protobuf.TextFormat$Parser.merge(TextFormat.java:1804)
	at com.google.protobuf.TextFormat$Parser.merge(TextFormat.java:1715)
	at com.google.protobuf.TextFormat$Parser.merge(TextFormat.java:1687)
	at com.google.protobuf.TextFormat.merge(TextFormat.java:1480)

Could you please clear the build folder and try again?

I cleared the build folder and tried to build, again got the same crash results.

text from console:

INFO:CRASH: Successfully wrote Crashdump to file: C:\Users\\AppData\Roaming\Defold/_crash
ERROR:CRASH: CALL STACK:

ERROR:CRASH:  0 0x7FF6B7D85EC0 dmCrash::GenerateCallstack D:\a\defold\defold\engine\crash\src\backtrace_win32.cpp:144

ERROR:CRASH:  1 0x7FF6B7E7CC1C _seh_filter_exe minkernel\crts\ucrt\src\appcrt\misc\exception_filter.cpp:219

ERROR:CRASH:  2 0x7FF6B7EC17D4 `__scrt_common_main_seh'::`1'::filt$0 D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:304

ERROR:CRASH:  3 0x7FF6B7DFDE5C __C_specific_handler D:\a\_work\1\s\src\vctools\crt\vcruntime\src\eh\riscchandler.cpp:389

ERROR:CRASH:  4 0x7FF945DD2290 __chkstk <unknown>:0

ERROR:CRASH:  5 0x7FF945D81030 RtlRaiseException <unknown>:0

ERROR:CRASH:  6 0x7FF945DD0E90 KiUserExceptionDispatcher <unknown>:0

ERROR:CRASH:  7 0x7FF6B7AB9EF0 dmGameSystem::ResolveUVDataFromQuads D:\a\defold\defold\engine\gamesys\src\gamesys\components\comp_sprite.cpp:998

ERROR:CRASH:  8 0x7FF6B7AB5110 dmGameSystem::CreateVertexData D:\a\defold\defold\engine\gamesys\src\gamesys\components\comp_sprite.cpp:1232

ERROR:CRASH:  9 0x7FF6B7AB8C70 dmGameSystem::RenderBatch D:\a\defold\defold\engine\gamesys\src\gamesys\components\comp_sprite.cpp:1321

ERROR:CRASH: 10 0x7FF6B7AB93A0 dmGameSystem::RenderListDispatch D:\a\defold\defold\engine\gamesys\src\gamesys\components\comp_sprite.cpp:1732

ERROR:CRASH: 11 0x7FF6B7B8F680 dmRender::DrawRenderList D:\a\defold\defold\engine\render\src\render\render.cpp:782

ERROR:CRASH: 12 0x7FF6B7BACCD0 dmRender::ParseCommands D:\a\defold\defold\engine\render\src\render\render_command.cpp:175

ERROR:CRASH: 13 0x7FF6B7B9B670 dmRender::UpdateRenderScriptInstance D:\a\defold\defold\engine\render\src\render\render_script.cpp:3509

ERROR:CRASH: 14 0x7FF6B79DC670 dmEngine::StepFrame D:\a\defold\defold\engine\engine\src\engine.cpp:1648

ERROR:CRASH: 15 0x7FF6B79DD3C0 dmEngineUpdate D:\a\defold\defold\engine\engine\src\engine.cpp:2150

ERROR:CRASH: 16 0x7FF6B79DD5F0 dmEngine::RunLoop D:\a\defold\defold\engine\engine\src\engine_loop.cpp:83

ERROR:CRASH: 17 0x7FF6B79D5A60 engine_main D:\a\defold\defold\engine\engine\src\engine_main.cpp:148

ERROR:CRASH: 18 0x7FF6B7DF2254 __scrt_common_main_seh D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288

ERROR:CRASH: 19 0x7FF945897330 BaseThreadInitThunk <unknown>:0

ERROR:CRASH: 20 0x7FF945D82690 RtlUserThreadStart <unknown>:0

ERROR:CRASH: 

INFO:CRASH: Successfully wrote Crashdump to file: C:\Users\\AppData\Roaming\Defold/_crash
ERROR:CRASH: CALL STACK:

ERROR:CRASH:  0 0x7FF6B7AB9EF0 dmGameSystem::ResolveUVDataFromQuads D:\a\defold\defold\engine\gamesys\src\gamesys\components\comp_sprite.cpp:998

ERROR:CRASH:  1 0x7FF6B7AB5110 dmGameSystem::CreateVertexData D:\a\defold\defold\engine\gamesys\src\gamesys\components\comp_sprite.cpp:1232

ERROR:CRASH:  2 0x7FF6B7AB8C70 dmGameSystem::RenderBatch D:\a\defold\defold\engine\gamesys\src\gamesys\components\comp_sprite.cpp:1321

ERROR:CRASH:  3 0x7FF6B7AB93A0 dmGameSystem::RenderListDispatch D:\a\defold\defold\engine\gamesys\src\gamesys\components\comp_sprite.cpp:1732

ERROR:CRASH:  4 0x7FF6B7B8F680 dmRender::DrawRenderList D:\a\defold\defold\engine\render\src\render\render.cpp:782

ERROR:CRASH:  5 0x7FF6B7BACCD0 dmRender::ParseCommands D:\a\defold\defold\engine\render\src\render\render_command.cpp:175

ERROR:CRASH:  6 0x7FF6B7B9B670 dmRender::UpdateRenderScriptInstance D:\a\defold\defold\engine\render\src\render\render_script.cpp:3509

ERROR:CRASH:  7 0x7FF6B79DC670 dmEngine::StepFrame D:\a\defold\defold\engine\engine\src\engine.cpp:1648

ERROR:CRASH:  8 0x7FF6B79DD3C0 dmEngineUpdate D:\a\defold\defold\engine\engine\src\engine.cpp:2150

ERROR:CRASH:  9 0x7FF6B79DD5F0 dmEngine::RunLoop D:\a\defold\defold\engine\engine\src\engine_loop.cpp:83

ERROR:CRASH: 10 0x7FF6B79D5A60 engine_main D:\a\defold\defold\engine\engine\src\engine_main.cpp:148

ERROR:CRASH: 11 0x7FF6B7DF2254 __scrt_common_main_seh D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288

ERROR:CRASH: 12 0x7FF945897330 BaseThreadInitThunk <unknown>:0

ERROR:CRASH: 13 0x7FF945D82690 RtlUserThreadStart <unknown>:0

ERROR:CRASH: 

INFO:CRASH: Successfully wrote MiniDump to file: C:\Users\\AppData\Roaming\Defold/_crash.dmp

I’m able to reproduce this too. We fixed one issue related to this, but apparently the update didn’t fix it completely. Odd. @JCash this one is for you.

2 Likes

Would you be avle to share a repro case project?

Sure , I was testing the new normals multi-texture project found here - GitHub - defold/sample-normal-maps-2d

2 Likes

Thanks, I’ve updated that example with a fix.
The problem was that the “Rename patterns” for the normal map atlas wasn’t set, so none of those frames could be found. Remember, the names must match.

I’m also fixing the crash, which shouldn’t occur of course.

UPDATE: The fix is not published in the beta as well.

2 Likes