summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--SConstruct17
-rw-r--r--doc/classes/EditorSettings.xml2
-rw-r--r--doc/classes/PhysicsServer3D.xml17
-rw-r--r--doc/classes/ProjectSettings.xml2
-rw-r--r--drivers/d3d12/rendering_device_driver_d3d12.cpp922
-rw-r--r--drivers/d3d12/rendering_device_driver_d3d12.h31
-rw-r--r--drivers/gles3/shaders/particles.glsl14
-rw-r--r--drivers/vulkan/rendering_device_driver_vulkan.cpp121
-rw-r--r--drivers/vulkan/rendering_device_driver_vulkan.h1
-rw-r--r--editor/animation_bezier_editor.cpp2
-rw-r--r--editor/animation_track_editor.cpp12
-rw-r--r--editor/code_editor.cpp2
-rw-r--r--editor/connections_dialog.cpp10
-rw-r--r--editor/debugger/debug_adapter/debug_adapter_server.cpp8
-rw-r--r--editor/debugger/debug_adapter/debug_adapter_server.h1
-rw-r--r--editor/debugger/editor_debugger_node.cpp8
-rw-r--r--editor/debugger/editor_debugger_tree.cpp2
-rw-r--r--editor/debugger/script_editor_debugger.cpp8
-rw-r--r--editor/dependency_editor.cpp2
-rw-r--r--editor/editor_audio_buses.cpp10
-rw-r--r--editor/editor_dock_manager.cpp2
-rw-r--r--editor/editor_feature_profile.cpp2
-rw-r--r--editor/editor_help.cpp4
-rw-r--r--editor/editor_inspector.cpp16
-rw-r--r--editor/editor_node.cpp28
-rw-r--r--editor/editor_properties.cpp8
-rw-r--r--editor/editor_properties_array_dict.cpp8
-rw-r--r--editor/editor_resource_picker.cpp4
-rw-r--r--editor/editor_run_native.cpp2
-rw-r--r--editor/editor_settings.cpp2
-rw-r--r--editor/editor_settings_dialog.cpp2
-rw-r--r--editor/export/export_template_manager.cpp2
-rw-r--r--editor/export/project_export.cpp2
-rw-r--r--editor/fbx_importer_manager.cpp4
-rw-r--r--editor/filesystem_dock.cpp12
-rw-r--r--editor/groups_editor.cpp2
-rw-r--r--editor/gui/editor_bottom_panel.cpp6
-rw-r--r--editor/gui/editor_file_dialog.cpp2
-rw-r--r--editor/gui/editor_object_selector.cpp2
-rw-r--r--editor/gui/editor_run_bar.cpp16
-rw-r--r--editor/gui/editor_scene_tabs.cpp4
-rw-r--r--editor/gui/editor_spin_slider.cpp2
-rw-r--r--editor/gui/editor_toaster.cpp8
-rw-r--r--editor/gui/editor_zoom_widget.cpp2
-rw-r--r--editor/import/3d/scene_import_settings.cpp4
-rw-r--r--editor/import/dynamic_font_import_settings.cpp4
-rw-r--r--editor/import_dock.cpp4
-rw-r--r--editor/inspector_dock.cpp8
-rw-r--r--editor/plugins/animation_blend_space_1d_editor.cpp6
-rw-r--r--editor/plugins/animation_blend_space_2d_editor.cpp6
-rw-r--r--editor/plugins/animation_blend_tree_editor_plugin.cpp6
-rw-r--r--editor/plugins/animation_library_editor.cpp2
-rw-r--r--editor/plugins/animation_player_editor_plugin.cpp12
-rw-r--r--editor/plugins/animation_state_machine_editor.cpp14
-rw-r--r--editor/plugins/asset_library_editor_plugin.cpp18
-rw-r--r--editor/plugins/bit_map_editor_plugin.cpp2
-rw-r--r--editor/plugins/canvas_item_editor_plugin.cpp22
-rw-r--r--editor/plugins/control_editor_plugin.cpp2
-rw-r--r--editor/plugins/cpu_particles_2d_editor_plugin.cpp2
-rw-r--r--editor/plugins/cpu_particles_3d_editor_plugin.cpp2
-rw-r--r--editor/plugins/curve_editor_plugin.cpp4
-rw-r--r--editor/plugins/debugger_editor_plugin.cpp2
-rw-r--r--editor/plugins/font_config_plugin.cpp8
-rw-r--r--editor/plugins/gpu_particles_2d_editor_plugin.cpp2
-rw-r--r--editor/plugins/gpu_particles_3d_editor_plugin.cpp2
-rw-r--r--editor/plugins/mesh_instance_3d_editor_plugin.cpp2
-rw-r--r--editor/plugins/mesh_library_editor_plugin.cpp2
-rw-r--r--editor/plugins/multimesh_editor_plugin.cpp2
-rw-r--r--editor/plugins/node_3d_editor_plugin.cpp26
-rw-r--r--editor/plugins/parallax_background_editor_plugin.cpp2
-rw-r--r--editor/plugins/path_2d_editor_plugin.cpp2
-rw-r--r--editor/plugins/path_3d_editor_plugin.cpp2
-rw-r--r--editor/plugins/polygon_2d_editor_plugin.cpp6
-rw-r--r--editor/plugins/script_editor_plugin.cpp22
-rw-r--r--editor/plugins/script_text_editor.cpp18
-rw-r--r--editor/plugins/shader_editor_plugin.cpp4
-rw-r--r--editor/plugins/skeleton_2d_editor_plugin.cpp2
-rw-r--r--editor/plugins/skeleton_3d_editor_plugin.cpp2
-rw-r--r--editor/plugins/sprite_2d_editor_plugin.cpp2
-rw-r--r--editor/plugins/sprite_frames_editor_plugin.cpp2
-rw-r--r--editor/plugins/text_editor.cpp12
-rw-r--r--editor/plugins/text_shader_editor.cpp12
-rw-r--r--editor/plugins/texture_region_editor_plugin.cpp4
-rw-r--r--editor/plugins/theme_editor_plugin.cpp2
-rw-r--r--editor/plugins/tiles/tile_data_editors.cpp2
-rw-r--r--editor/plugins/tiles/tile_map_layer_editor.cpp4
-rw-r--r--editor/plugins/tiles/tile_proxies_manager_dialog.cpp2
-rw-r--r--editor/plugins/tiles/tile_set_atlas_source_editor.cpp10
-rw-r--r--editor/plugins/tiles/tile_set_editor.cpp8
-rw-r--r--editor/plugins/version_control_editor_plugin.cpp6
-rw-r--r--editor/plugins/visual_shader_editor_plugin.cpp18
-rw-r--r--editor/progress_dialog.cpp2
-rw-r--r--editor/project_manager.cpp10
-rw-r--r--editor/project_manager/quick_settings_dialog.cpp2
-rw-r--r--editor/project_settings_editor.cpp2
-rw-r--r--editor/renames_map_3_to_4.cpp2
-rw-r--r--editor/scene_tree_dock.cpp12
-rw-r--r--editor/themes/editor_theme_manager.cpp102
-rw-r--r--editor/window_wrapper.cpp4
-rw-r--r--main/main.cpp19
-rw-r--r--modules/fbx/doc_classes/EditorSceneFormatImporterFBX2GLTF.xml2
-rw-r--r--modules/fbx/editor/editor_scene_importer_fbx2gltf.cpp2
-rw-r--r--modules/gdscript/gdscript_analyzer.cpp53
-rw-r--r--modules/gdscript/language_server/gdscript_text_document.cpp2
-rw-r--r--modules/gdscript/tests/scripts/runtime/features/metatypes.gd12
-rw-r--r--modules/gdscript/tests/scripts/runtime/features/metatypes.out5
-rw-r--r--modules/gridmap/editor/grid_map_editor_plugin.cpp2
-rw-r--r--modules/multiplayer/editor/replication_editor.cpp2
-rw-r--r--modules/openxr/editor/openxr_action_map_editor.cpp4
-rw-r--r--modules/openxr/editor/openxr_action_set_editor.cpp2
-rw-r--r--modules/openxr/editor/openxr_interaction_profile_editor.cpp4
-rw-r--r--modules/openxr/editor/openxr_select_action_dialog.cpp2
-rw-r--r--modules/openxr/editor/openxr_select_interaction_profile_dialog.cpp2
-rw-r--r--platform/android/detect.py2
-rw-r--r--platform/ios/detect.py2
-rw-r--r--platform/windows/display_server_windows.cpp118
-rw-r--r--platform/windows/display_server_windows.h16
-rw-r--r--scene/3d/physics/collision_object_3d.cpp3
-rw-r--r--scene/gui/color_picker.cpp6
-rw-r--r--scene/gui/dialogs.cpp2
-rw-r--r--scene/gui/graph_edit.cpp4
-rw-r--r--scene/gui/line_edit.cpp6
-rw-r--r--scene/gui/popup.cpp2
-rw-r--r--scene/gui/popup_menu.cpp4
-rw-r--r--scene/gui/rich_text_label.cpp5
-rw-r--r--scene/gui/scroll_container.cpp30
-rw-r--r--scene/gui/text_edit.cpp16
-rw-r--r--scene/gui/tree.cpp2
-rw-r--r--scene/resources/particle_process_material.cpp549
-rw-r--r--scene/scene_string_names.cpp3
-rw-r--r--scene/scene_string_names.h3
-rw-r--r--scene/theme/default_theme.cpp62
-rw-r--r--servers/physics_server_3d.cpp2
-rw-r--r--servers/rendering/renderer_rd/shaders/particles.glsl12
-rw-r--r--servers/rendering/renderer_rd/storage_rd/material_storage.cpp30
-rw-r--r--servers/rendering/renderer_rd/storage_rd/material_storage.h4
-rw-r--r--servers/rendering/rendering_device.cpp354
-rw-r--r--servers/rendering/rendering_device.h39
-rw-r--r--servers/rendering/rendering_device_driver.cpp2
-rw-r--r--servers/rendering/rendering_device_driver.h26
-rw-r--r--servers/rendering/rendering_device_graph.cpp141
-rw-r--r--servers/rendering/rendering_device_graph.h26
-rw-r--r--servers/rendering/shader_language.cpp22
-rw-r--r--servers/rendering/shader_language.h2
-rw-r--r--thirdparty/thorvg/inc/config.h2
-rw-r--r--thirdparty/thorvg/inc/thorvg.h32
-rw-r--r--thirdparty/thorvg/src/common/tvgMath.h21
-rw-r--r--thirdparty/thorvg/src/loaders/svg/tvgSvgLoader.cpp10
-rw-r--r--thirdparty/thorvg/src/loaders/svg/tvgXmlParser.h6
-rw-r--r--thirdparty/thorvg/src/renderer/sw_engine/tvgSwFill.cpp4
-rw-r--r--thirdparty/thorvg/src/renderer/sw_engine/tvgSwRaster.cpp2
-rw-r--r--thirdparty/thorvg/src/renderer/sw_engine/tvgSwRenderer.cpp10
-rw-r--r--thirdparty/thorvg/src/renderer/sw_engine/tvgSwRenderer.h1
-rw-r--r--thirdparty/thorvg/src/renderer/sw_engine/tvgSwShape.cpp4
-rw-r--r--thirdparty/thorvg/src/renderer/tvgCanvas.cpp6
-rw-r--r--thirdparty/thorvg/src/renderer/tvgCanvas.h48
-rw-r--r--thirdparty/thorvg/src/renderer/tvgGlCanvas.cpp2
-rw-r--r--thirdparty/thorvg/src/renderer/tvgPicture.cpp7
-rw-r--r--thirdparty/thorvg/src/renderer/tvgRender.cpp32
-rw-r--r--thirdparty/thorvg/src/renderer/tvgRender.h32
-rw-r--r--thirdparty/thorvg/src/renderer/tvgShape.h4
-rw-r--r--thirdparty/thorvg/src/renderer/tvgSwCanvas.cpp2
-rw-r--r--thirdparty/thorvg/src/renderer/tvgWgCanvas.cpp2
-rwxr-xr-xthirdparty/thorvg/update-thorvg.sh2
164 files changed, 2292 insertions, 1323 deletions
diff --git a/SConstruct b/SConstruct
index 117528de37..9cc1408b53 100644
--- a/SConstruct
+++ b/SConstruct
@@ -374,6 +374,14 @@ if env["platform"] in platform_opts:
for opt in platform_opts[env["platform"]]:
opts.Add(opt)
+# Platform-specific flags.
+# These can sometimes override default options, so they need to be processed
+# as early as possible to ensure that we're using the correct values.
+flag_list = platform_flags[env["platform"]]
+for key, value in flag_list.items():
+ if key not in ARGUMENTS or ARGUMENTS[key] == "auto": # Allow command line to override platform flags
+ env[key] = value
+
# Update the environment to take platform-specific options into account.
opts.Update(env, {**ARGUMENTS, **env.Dictionary()})
@@ -568,17 +576,8 @@ if env["build_profile"] != "":
print_error('Failed to open feature build profile: "{}"'.format(env["build_profile"]))
Exit(255)
-# Platform specific flags.
-# These can sometimes override default options.
-flag_list = platform_flags[env["platform"]]
-for key, value in flag_list.items():
- if key not in ARGUMENTS or ARGUMENTS[key] == "auto": # Allow command line to override platform flags
- env[key] = value
-
# 'dev_mode' and 'production' are aliases to set default options if they haven't been
# set manually by the user.
-# These need to be checked *after* platform specific flags so that different
-# default values can be set (e.g. to keep LTO off for `production` on some platforms).
if env["dev_mode"]:
env["verbose"] = methods.get_cmdline_bool("verbose", True)
env["warnings"] = ARGUMENTS.get("warnings", "extra")
diff --git a/doc/classes/EditorSettings.xml b/doc/classes/EditorSettings.xml
index e0a14e990b..90b8d07592 100644
--- a/doc/classes/EditorSettings.xml
+++ b/doc/classes/EditorSettings.xml
@@ -577,7 +577,7 @@
The maximum idle uptime (in seconds) of the Blender process.
This prevents Godot from having to create a new process for each import within the given seconds.
</member>
- <member name="filesystem/import/fbx2gltf/fbx2gltf_path" type="String" setter="" getter="">
+ <member name="filesystem/import/fbx/fbx2gltf_path" type="String" setter="" getter="">
The path to the FBX2glTF executable used for converting Autodesk FBX 3D scene files [code].fbx[/code] to glTF 2.0 format during import.
To enable this feature for your specific project, use [member ProjectSettings.filesystem/import/fbx2gltf/enabled].
</member>
diff --git a/doc/classes/PhysicsServer3D.xml b/doc/classes/PhysicsServer3D.xml
index e835724e36..a7b55387a4 100644
--- a/doc/classes/PhysicsServer3D.xml
+++ b/doc/classes/PhysicsServer3D.xml
@@ -990,6 +990,14 @@
Returns the shape data.
</description>
</method>
+ <method name="shape_get_margin" qualifiers="const">
+ <return type="float" />
+ <param index="0" name="shape" type="RID" />
+ <description>
+ Returns the collision margin for the shape.
+ [b]Note:[/b] This is not used in Godot Physics, so will always return [code]0[/code].
+ </description>
+ </method>
<method name="shape_get_type" qualifiers="const">
<return type="int" enum="PhysicsServer3D.ShapeType" />
<param index="0" name="shape" type="RID" />
@@ -1005,6 +1013,15 @@
Sets the shape data that defines its shape and size. The data to be passed depends on the kind of shape created [method shape_get_type].
</description>
</method>
+ <method name="shape_set_margin">
+ <return type="void" />
+ <param index="0" name="shape" type="RID" />
+ <param index="1" name="margin" type="float" />
+ <description>
+ Sets the collision margin for the shape.
+ [b]Note:[/b] This is not used in Godot Physics.
+ </description>
+ </method>
<method name="slider_joint_get_param" qualifiers="const">
<return type="float" />
<param index="0" name="joint" type="RID" />
diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml
index 32e71ce030..c8a11427b9 100644
--- a/doc/classes/ProjectSettings.xml
+++ b/doc/classes/ProjectSettings.xml
@@ -1003,7 +1003,7 @@
</member>
<member name="filesystem/import/fbx2gltf/enabled" type="bool" setter="" getter="" default="true">
If [code]true[/code], Autodesk FBX 3D scene files with the [code].fbx[/code] extension will be imported by converting them to glTF 2.0.
- This requires configuring a path to an FBX2glTF executable in the editor settings at [member EditorSettings.filesystem/import/fbx2gltf/fbx2gltf_path].
+ This requires configuring a path to an FBX2glTF executable in the editor settings at [member EditorSettings.filesystem/import/fbx/fbx2gltf_path].
</member>
<member name="filesystem/import/fbx2gltf/enabled.android" type="bool" setter="" getter="" default="false">
Override for [member filesystem/import/fbx2gltf/enabled] on Android where FBX2glTF can't easily be accessed from Godot.
diff --git a/drivers/d3d12/rendering_device_driver_d3d12.cpp b/drivers/d3d12/rendering_device_driver_d3d12.cpp
index b042d41524..fb278a4d56 100644
--- a/drivers/d3d12/rendering_device_driver_d3d12.cpp
+++ b/drivers/d3d12/rendering_device_driver_d3d12.cpp
@@ -538,15 +538,6 @@ void RenderingDeviceDriverD3D12::_resource_transition_batch(ResourceInfo *p_reso
#endif
ResourceInfo::States *res_states = p_resource->states_ptr;
-
- if (p_new_state == D3D12_RESOURCE_STATE_UNORDERED_ACCESS) {
- if (unlikely(!res_states->xfamily_fallback.subresources_dirty.is_empty())) {
- uint32_t subres_qword = p_subresource / 64;
- uint64_t subres_mask = (uint64_t(1) << (p_subresource % 64));
- res_states->xfamily_fallback.subresources_dirty[subres_qword] |= subres_mask;
- }
- }
-
D3D12_RESOURCE_STATES *curr_state = &res_states->subresource_states[p_subresource];
// Transitions can be considered redundant if the current state has all the bits of the new state.
@@ -869,7 +860,7 @@ RDD::BufferID RenderingDeviceDriverD3D12::buffer_create(uint64_t p_size, BitFiel
// but also if you give a rounded size at that point because it will extend beyond the
// memory of the resource. Therefore, it seems the only way is to create it with a
// rounded size.
- CD3DX12_RESOURCE_DESC resource_desc = CD3DX12_RESOURCE_DESC::Buffer(STEPIFY(p_size, D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT));
+ CD3DX12_RESOURCE_DESC1 resource_desc = CD3DX12_RESOURCE_DESC1::Buffer(STEPIFY(p_size, D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT));
if (p_usage.has_flag(RDD::BUFFER_USAGE_STORAGE_BIT)) {
resource_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
} else {
@@ -878,7 +869,6 @@ RDD::BufferID RenderingDeviceDriverD3D12::buffer_create(uint64_t p_size, BitFiel
D3D12MA::ALLOCATION_DESC allocation_desc = {};
allocation_desc.HeapType = D3D12_HEAP_TYPE_DEFAULT;
- D3D12_RESOURCE_STATES initial_state = D3D12_RESOURCE_STATE_COPY_DEST;
switch (p_allocation_type) {
case MEMORY_ALLOCATION_TYPE_CPU: {
bool is_src = p_usage.has_flag(BUFFER_USAGE_TRANSFER_FROM_BIT);
@@ -886,7 +876,6 @@ RDD::BufferID RenderingDeviceDriverD3D12::buffer_create(uint64_t p_size, BitFiel
if (is_src && !is_dst) {
// Looks like a staging buffer: CPU maps, writes sequentially, then GPU copies to VRAM.
allocation_desc.HeapType = D3D12_HEAP_TYPE_UPLOAD;
- initial_state = D3D12_RESOURCE_STATE_GENERIC_READ;
}
if (is_dst && !is_src) {
// Looks like a readback buffer: GPU copies from VRAM, then CPU maps and reads.
@@ -904,13 +893,27 @@ RDD::BufferID RenderingDeviceDriverD3D12::buffer_create(uint64_t p_size, BitFiel
ComPtr<ID3D12Resource> buffer;
ComPtr<D3D12MA::Allocation> allocation;
- HRESULT res = allocator->CreateResource(
- &allocation_desc,
- &resource_desc,
- initial_state,
- nullptr,
- allocation.GetAddressOf(),
- IID_PPV_ARGS(buffer.GetAddressOf()));
+ HRESULT res;
+ if (barrier_capabilities.enhanced_barriers_supported) {
+ res = allocator->CreateResource3(
+ &allocation_desc,
+ &resource_desc,
+ D3D12_BARRIER_LAYOUT_UNDEFINED,
+ nullptr,
+ 0,
+ nullptr,
+ allocation.GetAddressOf(),
+ IID_PPV_ARGS(buffer.GetAddressOf()));
+ } else {
+ res = allocator->CreateResource(
+ &allocation_desc,
+ reinterpret_cast<const D3D12_RESOURCE_DESC *>(&resource_desc),
+ D3D12_RESOURCE_STATE_COMMON,
+ nullptr,
+ allocation.GetAddressOf(),
+ IID_PPV_ARGS(buffer.GetAddressOf()));
+ }
+
ERR_FAIL_COND_V_MSG(!SUCCEEDED(res), BufferID(), "Can't create buffer of size: " + itos(p_size) + ", error " + vformat("0x%08ux", (uint64_t)res) + ".");
// Bookkeep.
@@ -919,11 +922,10 @@ RDD::BufferID RenderingDeviceDriverD3D12::buffer_create(uint64_t p_size, BitFiel
buf_info->resource = buffer.Get();
buf_info->owner_info.resource = buffer;
buf_info->owner_info.allocation = allocation;
- buf_info->owner_info.states.subresource_states.push_back(initial_state);
+ buf_info->owner_info.states.subresource_states.push_back(D3D12_RESOURCE_STATE_COMMON);
buf_info->states_ptr = &buf_info->owner_info.states;
buf_info->size = p_size;
buf_info->flags.usable_as_uav = (resource_desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
- buf_info->flags.is_for_upload = allocation_desc.HeapType == D3D12_HEAP_TYPE_UPLOAD;
return BufferID(buf_info);
}
@@ -1052,8 +1054,7 @@ UINT RenderingDeviceDriverD3D12::_compute_plane_slice(DataFormat p_format, BitFi
if (p_aspect_bits.has_flag(TEXTURE_ASPECT_DEPTH_BIT)) {
DEV_ASSERT(aspect == TEXTURE_ASPECT_MAX);
aspect = TEXTURE_ASPECT_DEPTH;
- }
- if (p_aspect_bits.has_flag(TEXTURE_ASPECT_STENCIL_BIT)) {
+ } else if (p_aspect_bits.has_flag(TEXTURE_ASPECT_STENCIL_BIT)) {
DEV_ASSERT(aspect == TEXTURE_ASPECT_MAX);
aspect = TEXTURE_ASPECT_STENCIL;
}
@@ -1080,6 +1081,10 @@ UINT RenderingDeviceDriverD3D12::_compute_plane_slice(DataFormat p_format, Textu
}
}
+UINT RenderingDeviceDriverD3D12::_compute_subresource_from_layers(TextureInfo *p_texture, const TextureSubresourceLayers &p_layers, uint32_t p_layer_offset) {
+ return D3D12CalcSubresource(p_layers.mipmap, p_layers.base_layer + p_layer_offset, _compute_plane_slice(p_texture->format, p_layers.aspect), p_texture->desc.MipLevels, p_texture->desc.ArraySize());
+}
+
void RenderingDeviceDriverD3D12::_discard_texture_subresources(const TextureInfo *p_tex_info, const CommandBufferInfo *p_cmd_buf_info) {
uint32_t planes = 1;
if ((p_tex_info->desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL)) {
@@ -1117,6 +1122,64 @@ void RenderingDeviceDriverD3D12::_discard_texture_subresources(const TextureInfo
}
}
+bool RenderingDeviceDriverD3D12::_unordered_access_supported_by_format(DataFormat p_format) {
+ switch (p_format) {
+ case DATA_FORMAT_R4G4_UNORM_PACK8:
+ case DATA_FORMAT_R4G4B4A4_UNORM_PACK16:
+ case DATA_FORMAT_B4G4R4A4_UNORM_PACK16:
+ case DATA_FORMAT_R5G6B5_UNORM_PACK16:
+ case DATA_FORMAT_B5G6R5_UNORM_PACK16:
+ case DATA_FORMAT_R5G5B5A1_UNORM_PACK16:
+ case DATA_FORMAT_B5G5R5A1_UNORM_PACK16:
+ case DATA_FORMAT_A1R5G5B5_UNORM_PACK16:
+ case DATA_FORMAT_A8B8G8R8_UNORM_PACK32:
+ case DATA_FORMAT_A8B8G8R8_SNORM_PACK32:
+ case DATA_FORMAT_A8B8G8R8_USCALED_PACK32:
+ case DATA_FORMAT_A8B8G8R8_SSCALED_PACK32:
+ case DATA_FORMAT_A8B8G8R8_UINT_PACK32:
+ case DATA_FORMAT_A8B8G8R8_SINT_PACK32:
+ case DATA_FORMAT_A8B8G8R8_SRGB_PACK32:
+ case DATA_FORMAT_A2R10G10B10_UNORM_PACK32:
+ case DATA_FORMAT_A2R10G10B10_SNORM_PACK32:
+ case DATA_FORMAT_A2R10G10B10_USCALED_PACK32:
+ case DATA_FORMAT_A2R10G10B10_SSCALED_PACK32:
+ case DATA_FORMAT_A2R10G10B10_UINT_PACK32:
+ case DATA_FORMAT_A2R10G10B10_SINT_PACK32:
+ case DATA_FORMAT_A2B10G10R10_UNORM_PACK32:
+ case DATA_FORMAT_A2B10G10R10_SNORM_PACK32:
+ case DATA_FORMAT_A2B10G10R10_USCALED_PACK32:
+ case DATA_FORMAT_A2B10G10R10_SSCALED_PACK32:
+ case DATA_FORMAT_A2B10G10R10_UINT_PACK32:
+ case DATA_FORMAT_A2B10G10R10_SINT_PACK32:
+ case DATA_FORMAT_B10G11R11_UFLOAT_PACK32:
+ case DATA_FORMAT_E5B9G9R9_UFLOAT_PACK32:
+ case DATA_FORMAT_X8_D24_UNORM_PACK32:
+ case DATA_FORMAT_R10X6_UNORM_PACK16:
+ case DATA_FORMAT_R10X6G10X6_UNORM_2PACK16:
+ case DATA_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16:
+ case DATA_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16:
+ case DATA_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16:
+ case DATA_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16:
+ case DATA_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
+ case DATA_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16:
+ case DATA_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16:
+ case DATA_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16:
+ case DATA_FORMAT_R12X4_UNORM_PACK16:
+ case DATA_FORMAT_R12X4G12X4_UNORM_2PACK16:
+ case DATA_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16:
+ case DATA_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16:
+ case DATA_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16:
+ case DATA_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16:
+ case DATA_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16:
+ case DATA_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16:
+ case DATA_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16:
+ case DATA_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16:
+ return false;
+ default:
+ return true;
+ }
+}
+
RDD::TextureID RenderingDeviceDriverD3D12::texture_create(const TextureFormat &p_format, const TextureView &p_view) {
// Using D3D12_RESOURCE_DESC1. Thanks to the layout, it's sliceable down to D3D12_RESOURCE_DESC if needed.
CD3DX12_RESOURCE_DESC1 resource_desc = {};
@@ -1137,12 +1200,10 @@ RDD::TextureID RenderingDeviceDriverD3D12::texture_create(const TextureFormat &p
resource_desc.Format = RD_TO_D3D12_FORMAT[p_format.format].family;
// If views of different families are wanted, special setup is needed for proper sharing among them.
- // Two options here:
- // 1. If the driver reports relaxed casting is, leverage its new extended resource creation API (via D3D12MA).
- // 2. Otherwise, fall back to an approach based on having multiple versions of the resource and copying as needed. [[CROSS_FAMILY_FALLBACK]]
+ // If the driver reports relaxed casting is, leverage its new extended resource creation API (via D3D12MA).
if (p_format.shareable_formats.size() && format_capabilities.relaxed_casting_supported) {
relaxed_casting_available = true;
- relaxed_casting_formats = ALLOCA_ARRAY(DXGI_FORMAT, p_format.shareable_formats.size());
+ relaxed_casting_formats = ALLOCA_ARRAY(DXGI_FORMAT, p_format.shareable_formats.size() + 1);
relaxed_casting_formats[0] = RD_TO_D3D12_FORMAT[p_format.format].general_format;
relaxed_casting_format_count++;
}
@@ -1156,9 +1217,9 @@ RDD::TextureID RenderingDeviceDriverD3D12::texture_create(const TextureFormat &p
if (RD_TO_D3D12_FORMAT[curr_format].family != RD_TO_D3D12_FORMAT[p_format.format].family) {
cross_family_sharing = true;
- if (!relaxed_casting_available) {
- break;
- }
+ }
+
+ if (relaxed_casting_available) {
relaxed_casting_formats[relaxed_casting_format_count] = RD_TO_D3D12_FORMAT[curr_format].general_format;
relaxed_casting_format_count++;
}
@@ -1185,7 +1246,7 @@ RDD::TextureID RenderingDeviceDriverD3D12::texture_create(const TextureFormat &p
if ((p_format.usage_bits & TEXTURE_USAGE_COLOR_ATTACHMENT_BIT)) {
resource_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
} else {
- if ((p_format.usage_bits & TEXTURE_USAGE_CAN_COPY_TO_BIT)) {
+ if ((p_format.usage_bits & TEXTURE_USAGE_CAN_COPY_TO_BIT) && _unordered_access_supported_by_format(p_format.format)) {
resource_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS; // For clearing via UAV.
}
}
@@ -1242,17 +1303,19 @@ RDD::TextureID RenderingDeviceDriverD3D12::texture_create(const TextureFormat &p
D3D12_CLEAR_VALUE *clear_value_ptr = (resource_desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET) ? &clear_value : nullptr;
{
HRESULT res = E_FAIL;
- if (cross_family_sharing && relaxed_casting_available) {
+ if (barrier_capabilities.enhanced_barriers_supported || (cross_family_sharing && relaxed_casting_available)) {
+ // Create with undefined layout if enhanced barriers are supported. Leave as common otherwise for interop with legacy barriers.
+ D3D12_BARRIER_LAYOUT initial_layout = barrier_capabilities.enhanced_barriers_supported ? D3D12_BARRIER_LAYOUT_UNDEFINED : D3D12_BARRIER_LAYOUT_COMMON;
res = allocator->CreateResource3(
&allocation_desc,
&resource_desc,
- D3D12_BARRIER_LAYOUT_COMMON, // Needed for barrier interop.
+ initial_layout,
clear_value_ptr,
relaxed_casting_format_count,
relaxed_casting_formats,
allocation.GetAddressOf(),
IID_PPV_ARGS(main_texture.GetAddressOf()));
- initial_state = D3D12_RESOURCE_STATE_COMMON; // Needed for barrier interop.
+ initial_state = D3D12_RESOURCE_STATE_COMMON;
} else {
res = allocator->CreateResource(
&allocation_desc,
@@ -1353,7 +1416,10 @@ RDD::TextureID RenderingDeviceDriverD3D12::texture_create(const TextureFormat &p
tex_info->mipmaps = resource_desc.MipLevels;
tex_info->view_descs.srv = srv_desc;
tex_info->view_descs.uav = uav_desc;
- if ((p_format.usage_bits & (TEXTURE_USAGE_STORAGE_BIT | TEXTURE_USAGE_COLOR_ATTACHMENT_BIT))) {
+
+ if (!barrier_capabilities.enhanced_barriers_supported && (p_format.usage_bits & (TEXTURE_USAGE_STORAGE_BIT | TEXTURE_USAGE_COLOR_ATTACHMENT_BIT))) {
+ // Fallback to clear resources when they're first used in a uniform set. Not necessary if enhanced barriers
+ // are supported, as the discard flag will be used instead when transitioning from an undefined layout.
textures_pending_clear.add(&tex_info->pending_clear);
}
@@ -1380,45 +1446,8 @@ RDD::TextureID RenderingDeviceDriverD3D12::_texture_create_shared_from_slice(Tex
ComPtr<ID3D12Resource> new_texture;
ComPtr<D3D12MA::Allocation> new_allocation;
- ID3D12Resource *resource = nullptr;
+ ID3D12Resource *resource = owner_tex_info->resource;
CD3DX12_RESOURCE_DESC new_tex_resource_desc = owner_tex_info->desc;
- bool cross_family = RD_TO_D3D12_FORMAT[p_view.format].family != RD_TO_D3D12_FORMAT[owner_tex_info->format].family;
- if (cross_family && !format_capabilities.relaxed_casting_supported) {
- // [[CROSS_FAMILY_FALLBACK]].
- // We have to create a new texture of the alternative format.
-
- D3D12MA::ALLOCATION_DESC allocation_desc = {};
- allocation_desc.HeapType = D3D12_HEAP_TYPE_DEFAULT;
- allocation_desc.ExtraHeapFlags = D3D12_HEAP_FLAG_ALLOW_ONLY_NON_RT_DS_TEXTURES;
-
- if (p_slice_type != -1) {
-#ifdef DEV_ENABLED
- // Actual slicing is not contemplated. If ever needed, let's at least realize.
- if (p_slice_type != -1) {
- uint32_t new_texture_subresorce_count = owner_tex_info->mipmaps * owner_tex_info->layers;
- uint32_t slice_subresorce_count = p_mipmaps * p_layers;
- DEV_ASSERT(new_texture_subresorce_count == slice_subresorce_count);
- }
-#endif
- new_tex_resource_desc.DepthOrArraySize = p_layers;
- new_tex_resource_desc.MipLevels = p_mipmaps;
- }
- new_tex_resource_desc.Format = RD_TO_D3D12_FORMAT[p_view.format].family;
- new_tex_resource_desc.Flags = D3D12_RESOURCE_FLAG_NONE; // Alternative formats can only be used as SRVs.
-
- HRESULT res = allocator->CreateResource(
- &allocation_desc,
- &new_tex_resource_desc,
- D3D12_RESOURCE_STATE_COPY_DEST,
- nullptr,
- new_allocation.GetAddressOf(),
- IID_PPV_ARGS(new_texture.GetAddressOf()));
- ERR_FAIL_COND_V_MSG(!SUCCEEDED(res), TextureID(), vformat("D3D12MA::CreateResource failed with error 0x%08ux.", (uint64_t)res));
-
- resource = new_texture.Get();
- } else {
- resource = owner_tex_info->resource;
- }
// Describe views.
@@ -1528,58 +1557,7 @@ RDD::TextureID RenderingDeviceDriverD3D12::_texture_create_shared_from_slice(Tex
TextureInfo *tex_info = VersatileResource::allocate<TextureInfo>(resources_allocator);
tex_info->resource = resource;
- if (new_texture.Get()) {
- // [[CROSS_FAMILY_FALLBACK]].
-
- DEV_ASSERT(cross_family && !format_capabilities.relaxed_casting_supported);
-
- uint32_t new_texture_subresorce_count = owner_tex_info->mipmaps * owner_tex_info->layers;
-#ifdef DEV_ENABLED
- // Actual slicing is not contemplated. If ever needed, let's at least realize.
- if (p_slice_type != -1) {
- uint32_t slice_subresorce_count = p_mipmaps * p_layers;
- DEV_ASSERT(new_texture_subresorce_count == slice_subresorce_count);
- }
-#endif
-
- tex_info->owner_info.resource = new_texture;
- tex_info->owner_info.allocation = new_allocation;
- tex_info->owner_info.states.subresource_states.resize(new_texture_subresorce_count);
- for (uint32_t i = 0; i < tex_info->owner_info.states.subresource_states.size(); i++) {
- tex_info->owner_info.states.subresource_states[i] = D3D12_RESOURCE_STATE_COPY_DEST;
- }
- tex_info->states_ptr = &tex_info->owner_info.states;
-
- ResourceInfo::States::CrossFamillyFallback &xfamily = owner_tex_info->owner_info.states.xfamily_fallback;
- if (xfamily.subresources_dirty.is_empty()) {
- uint32_t items_required = STEPIFY(new_texture_subresorce_count, sizeof(uint64_t)) / sizeof(uint64_t);
- xfamily.subresources_dirty.resize(items_required);
- memset(xfamily.subresources_dirty.ptr(), 255, sizeof(uint64_t) * xfamily.subresources_dirty.size());
-
- // Create buffer for non-direct copy if it's a format not supporting reinterpret-copy.
- DEV_ASSERT(!xfamily.interim_buffer.Get());
- if (owner_tex_info->format == DATA_FORMAT_R16_UINT && p_view.format == DATA_FORMAT_R4G4B4A4_UNORM_PACK16) {
- uint32_t row_pitch = STEPIFY(owner_tex_info->desc.Width * sizeof(uint16_t), D3D12_TEXTURE_DATA_PITCH_ALIGNMENT);
- uint32_t buffer_size = sizeof(uint16_t) * row_pitch * owner_tex_info->desc.Height * owner_tex_info->desc.Depth();
- CD3DX12_RESOURCE_DESC resource_desc = CD3DX12_RESOURCE_DESC::Buffer(STEPIFY(buffer_size, D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT));
- resource_desc.Flags |= D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE;
-
- D3D12MA::ALLOCATION_DESC allocation_desc = {};
- allocation_desc.HeapType = D3D12_HEAP_TYPE_DEFAULT;
-
- HRESULT res = allocator->CreateResource(
- &allocation_desc,
- &resource_desc,
- D3D12_RESOURCE_STATE_COPY_SOURCE, // Makes the code that makes the copy easier.
- nullptr,
- xfamily.interim_buffer_alloc.GetAddressOf(),
- IID_PPV_ARGS(xfamily.interim_buffer.GetAddressOf()));
- ERR_FAIL_COND_V_MSG(!SUCCEEDED(res), TextureID(), "D3D12MA::CreateResource failed with error " + vformat("0x%08ux", (uint64_t)res) + ".");
- }
- }
- } else {
- tex_info->states_ptr = owner_tex_info->states_ptr;
- }
+ tex_info->states_ptr = owner_tex_info->states_ptr;
tex_info->format = p_view.format;
tex_info->desc = new_tex_resource_desc;
if (p_slice_type == -1) {
@@ -1710,6 +1688,28 @@ BitField<RDD::TextureUsageBits> RenderingDeviceDriverD3D12::texture_get_usages_s
return supported;
}
+bool RenderingDeviceDriverD3D12::texture_can_make_shared_with_format(TextureID p_texture, DataFormat p_format, bool &r_raw_reinterpretation) {
+ r_raw_reinterpretation = false;
+
+ if (format_capabilities.relaxed_casting_supported) {
+ // Relaxed casting is supported, there should be no need to check for format family compatibility.
+ return true;
+ } else {
+ TextureInfo *tex_info = (TextureInfo *)p_texture.id;
+ if (tex_info->format == DATA_FORMAT_R16_UINT && p_format == DATA_FORMAT_R4G4B4A4_UNORM_PACK16) {
+ // Specific cases that require buffer reinterpretation.
+ r_raw_reinterpretation = true;
+ return false;
+ } else if (RD_TO_D3D12_FORMAT[tex_info->format].family != RD_TO_D3D12_FORMAT[p_format].family) {
+ // Format family is different but copying resources directly is possible.
+ return false;
+ } else {
+ // Format family is the same and the view can just cast the format.
+ return true;
+ }
+ }
+}
+
/*****************/
/**** SAMPLER ****/
/*****************/
@@ -1842,20 +1842,328 @@ void RenderingDeviceDriverD3D12::vertex_format_free(VertexFormatID p_vertex_form
/**** BARRIERS ****/
/******************/
-void RenderingDeviceDriverD3D12::command_pipeline_barrier(
- CommandBufferID p_cmd_buffer,
- BitField<RDD::PipelineStageBits> p_src_stages,
- BitField<RDD::PipelineStageBits> p_dst_stages,
+static D3D12_BARRIER_ACCESS _rd_texture_layout_access_mask(RDD::TextureLayout p_texture_layout) {
+ switch (p_texture_layout) {
+ case RDD::TEXTURE_LAYOUT_STORAGE_OPTIMAL:
+ return D3D12_BARRIER_ACCESS_UNORDERED_ACCESS;
+ case RDD::TEXTURE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
+ return D3D12_BARRIER_ACCESS_RENDER_TARGET;
+ case RDD::TEXTURE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
+ return D3D12_BARRIER_ACCESS_DEPTH_STENCIL_READ | D3D12_BARRIER_ACCESS_DEPTH_STENCIL_WRITE;
+ case RDD::TEXTURE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
+ return D3D12_BARRIER_ACCESS_DEPTH_STENCIL_READ;
+ case RDD::TEXTURE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
+ return D3D12_BARRIER_ACCESS_SHADER_RESOURCE;
+ case RDD::TEXTURE_LAYOUT_COPY_SRC_OPTIMAL:
+ return D3D12_BARRIER_ACCESS_COPY_SOURCE;
+ case RDD::TEXTURE_LAYOUT_COPY_DST_OPTIMAL:
+ return D3D12_BARRIER_ACCESS_COPY_DEST;
+ case RDD::TEXTURE_LAYOUT_RESOLVE_SRC_OPTIMAL:
+ return D3D12_BARRIER_ACCESS_RESOLVE_SOURCE;
+ case RDD::TEXTURE_LAYOUT_RESOLVE_DST_OPTIMAL:
+ return D3D12_BARRIER_ACCESS_RESOLVE_DEST;
+ case RDD::TEXTURE_LAYOUT_VRS_ATTACHMENT_OPTIMAL:
+ return D3D12_BARRIER_ACCESS_SHADING_RATE_SOURCE;
+ default:
+ return D3D12_BARRIER_ACCESS_NO_ACCESS;
+ }
+}
+
+static void _rd_access_to_d3d12_and_mask(BitField<RDD::BarrierAccessBits> p_access, RDD::TextureLayout p_texture_layout, D3D12_BARRIER_ACCESS &r_access, D3D12_BARRIER_SYNC &r_sync_mask) {
+ r_access = D3D12_BARRIER_ACCESS_COMMON;
+ r_sync_mask = D3D12_BARRIER_SYNC_NONE;
+
+ if (p_access.has_flag(RDD::BARRIER_ACCESS_INDIRECT_COMMAND_READ_BIT)) {
+ r_access |= D3D12_BARRIER_ACCESS_INDIRECT_ARGUMENT;
+ r_sync_mask |= D3D12_BARRIER_SYNC_EXECUTE_INDIRECT;
+ }
+
+ if (p_access.has_flag(RDD::BARRIER_ACCESS_INDEX_READ_BIT)) {
+ r_access |= D3D12_BARRIER_ACCESS_INDEX_BUFFER;
+ r_sync_mask |= D3D12_BARRIER_SYNC_INDEX_INPUT | D3D12_BARRIER_SYNC_DRAW;
+ }
+
+ if (p_access.has_flag(RDD::BARRIER_ACCESS_VERTEX_ATTRIBUTE_READ_BIT)) {
+ r_access |= D3D12_BARRIER_ACCESS_VERTEX_BUFFER;
+ r_sync_mask |= D3D12_BARRIER_SYNC_VERTEX_SHADING | D3D12_BARRIER_SYNC_DRAW | D3D12_BARRIER_SYNC_ALL_SHADING;
+ }
+
+ if (p_access.has_flag(RDD::BARRIER_ACCESS_UNIFORM_READ_BIT)) {
+ r_access |= D3D12_BARRIER_ACCESS_CONSTANT_BUFFER;
+ r_sync_mask |= D3D12_BARRIER_SYNC_VERTEX_SHADING | D3D12_BARRIER_SYNC_PIXEL_SHADING | D3D12_BARRIER_SYNC_COMPUTE_SHADING |
+ D3D12_BARRIER_SYNC_DRAW | D3D12_BARRIER_SYNC_ALL_SHADING;
+ }
+
+ if (p_access.has_flag(RDD::BARRIER_ACCESS_INPUT_ATTACHMENT_READ_BIT)) {
+ r_access |= D3D12_BARRIER_ACCESS_RENDER_TARGET;
+ r_sync_mask |= D3D12_BARRIER_SYNC_DRAW | D3D12_BARRIER_SYNC_RENDER_TARGET;
+ }
+
+ if (p_access.has_flag(RDD::BARRIER_ACCESS_COPY_READ_BIT)) {
+ r_access |= D3D12_BARRIER_ACCESS_COPY_SOURCE;
+ r_sync_mask |= D3D12_BARRIER_SYNC_COPY;
+ }
+
+ if (p_access.has_flag(RDD::BARRIER_ACCESS_COPY_WRITE_BIT)) {
+ r_access |= D3D12_BARRIER_ACCESS_COPY_DEST;
+ r_sync_mask |= D3D12_BARRIER_SYNC_COPY;
+ }
+
+ if (p_access.has_flag(RDD::BARRIER_ACCESS_RESOLVE_READ_BIT)) {
+ r_access |= D3D12_BARRIER_ACCESS_RESOLVE_SOURCE;
+ r_sync_mask |= D3D12_BARRIER_SYNC_RESOLVE;
+ }
+
+ if (p_access.has_flag(RDD::BARRIER_ACCESS_RESOLVE_WRITE_BIT)) {
+ r_access |= D3D12_BARRIER_ACCESS_RESOLVE_DEST;
+ r_sync_mask |= D3D12_BARRIER_SYNC_RESOLVE;
+ }
+
+ if (p_access.has_flag(RDD::BARRIER_ACCESS_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT)) {
+ r_access |= D3D12_BARRIER_ACCESS_SHADING_RATE_SOURCE;
+ r_sync_mask |= D3D12_BARRIER_SYNC_PIXEL_SHADING | D3D12_BARRIER_SYNC_ALL_SHADING;
+ }
+
+ const D3D12_BARRIER_SYNC unordered_access_mask = D3D12_BARRIER_SYNC_VERTEX_SHADING | D3D12_BARRIER_SYNC_PIXEL_SHADING | D3D12_BARRIER_SYNC_COMPUTE_SHADING |
+ D3D12_BARRIER_SYNC_VERTEX_SHADING | D3D12_BARRIER_SYNC_DRAW | D3D12_BARRIER_SYNC_ALL_SHADING | D3D12_BARRIER_SYNC_CLEAR_UNORDERED_ACCESS_VIEW;
+
+ if (p_access.has_flag(RDD::BARRIER_ACCESS_STORAGE_CLEAR_BIT)) {
+ r_access |= D3D12_BARRIER_ACCESS_UNORDERED_ACCESS;
+ r_sync_mask |= unordered_access_mask;
+ }
+
+ // These access bits only have compatibility with certain layouts unlike in Vulkan where they imply specific operations in the same layout.
+ if (p_access.has_flag(RDD::BARRIER_ACCESS_SHADER_WRITE_BIT)) {
+ r_access |= D3D12_BARRIER_ACCESS_UNORDERED_ACCESS;
+ r_sync_mask |= unordered_access_mask;
+ } else if (p_access.has_flag(RDD::BARRIER_ACCESS_SHADER_READ_BIT)) {
+ if (p_texture_layout == RDD::TEXTURE_LAYOUT_STORAGE_OPTIMAL) {
+ // Unordered access must be enforced if the texture is using the storage layout.
+ r_access |= D3D12_BARRIER_ACCESS_UNORDERED_ACCESS;
+ r_sync_mask |= unordered_access_mask;
+ } else {
+ r_access |= D3D12_BARRIER_ACCESS_SHADER_RESOURCE;
+ r_sync_mask |= D3D12_BARRIER_SYNC_VERTEX_SHADING | D3D12_BARRIER_SYNC_PIXEL_SHADING | D3D12_BARRIER_SYNC_COMPUTE_SHADING | D3D12_BARRIER_SYNC_DRAW | D3D12_BARRIER_SYNC_ALL_SHADING;
+ }
+ }
+
+ if (p_access.has_flag(RDD::BARRIER_ACCESS_COLOR_ATTACHMENT_WRITE_BIT) || p_access.has_flag(RDD::BARRIER_ACCESS_COLOR_ATTACHMENT_READ_BIT)) {
+ r_access |= D3D12_BARRIER_ACCESS_RENDER_TARGET;
+ r_sync_mask |= D3D12_BARRIER_SYNC_DRAW | D3D12_BARRIER_SYNC_RENDER_TARGET;
+ }
+
+ if (p_access.has_flag(RDD::BARRIER_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT)) {
+ r_access |= D3D12_BARRIER_ACCESS_DEPTH_STENCIL_WRITE;
+ r_sync_mask |= D3D12_BARRIER_SYNC_DRAW | D3D12_BARRIER_SYNC_DEPTH_STENCIL;
+ } else if (p_access.has_flag(RDD::BARRIER_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT)) {
+ r_access |= D3D12_BARRIER_ACCESS_DEPTH_STENCIL_READ;
+ r_sync_mask |= D3D12_BARRIER_SYNC_DRAW | D3D12_BARRIER_SYNC_DEPTH_STENCIL;
+ }
+}
+
+static void _rd_stages_to_d3d12(BitField<RDD::PipelineStageBits> p_stages, D3D12_BARRIER_SYNC &r_sync) {
+ if (p_stages.has_flag(RDD::PIPELINE_STAGE_ALL_COMMANDS_BIT)) {
+ r_sync = D3D12_BARRIER_SYNC_ALL;
+ } else {
+ if (p_stages.has_flag(RDD::PIPELINE_STAGE_DRAW_INDIRECT_BIT)) {
+ r_sync |= D3D12_BARRIER_SYNC_EXECUTE_INDIRECT;
+ }
+
+ if (p_stages.has_flag(RDD::PIPELINE_STAGE_VERTEX_INPUT_BIT)) {
+ r_sync |= D3D12_BARRIER_SYNC_INDEX_INPUT;
+ }
+
+ if (p_stages.has_flag(RDD::PIPELINE_STAGE_VERTEX_SHADER_BIT)) {
+ r_sync |= D3D12_BARRIER_SYNC_VERTEX_SHADING;
+ }
+
+ if (p_stages.has_flag(RDD::PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT) || p_stages.has_flag(RDD::PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT) || p_stages.has_flag(RDD::PIPELINE_STAGE_GEOMETRY_SHADER_BIT)) {
+ // There's no granularity for tessellation or geometry stages. The specification defines it as part of vertex shading.
+ r_sync |= D3D12_BARRIER_SYNC_VERTEX_SHADING;
+ }
+
+ if (p_stages.has_flag(RDD::PIPELINE_STAGE_FRAGMENT_SHADER_BIT)) {
+ r_sync |= D3D12_BARRIER_SYNC_PIXEL_SHADING;
+ }
+
+ if (p_stages.has_flag(RDD::PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT) || p_stages.has_flag(RDD::PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT)) {
+ // Covers both read and write operations for depth stencil.
+ r_sync |= D3D12_BARRIER_SYNC_DEPTH_STENCIL;
+ }
+
+ if (p_stages.has_flag(RDD::PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT)) {
+ r_sync |= D3D12_BARRIER_SYNC_RENDER_TARGET;
+ }
+
+ if (p_stages.has_flag(RDD::PIPELINE_STAGE_COMPUTE_SHADER_BIT)) {
+ r_sync |= D3D12_BARRIER_SYNC_COMPUTE_SHADING;
+ }
+
+ if (p_stages.has_flag(RDD::PIPELINE_STAGE_COPY_BIT)) {
+ r_sync |= D3D12_BARRIER_SYNC_COPY;
+ }
+
+ if (p_stages.has_flag(RDD::PIPELINE_STAGE_RESOLVE_BIT)) {
+ r_sync |= D3D12_BARRIER_SYNC_RESOLVE;
+ }
+
+ if (p_stages.has_flag(RDD::PIPELINE_STAGE_CLEAR_STORAGE_BIT)) {
+ r_sync |= D3D12_BARRIER_SYNC_CLEAR_UNORDERED_ACCESS_VIEW;
+ }
+
+ if (p_stages.has_flag(RDD::PIPELINE_STAGE_ALL_GRAPHICS_BIT)) {
+ r_sync |= D3D12_BARRIER_SYNC_DRAW;
+ }
+ }
+}
+
+static void _rd_stages_and_access_to_d3d12(BitField<RDD::PipelineStageBits> p_stages, RDD::TextureLayout p_texture_layout, BitField<RDD::BarrierAccessBits> p_access, D3D12_BARRIER_SYNC &r_sync, D3D12_BARRIER_ACCESS &r_access) {
+ D3D12_BARRIER_SYNC sync_mask;
+ r_sync = D3D12_BARRIER_SYNC_NONE;
+
+ if (p_texture_layout == RDD::TEXTURE_LAYOUT_UNDEFINED) {
+ // Undefined texture layouts are a special case where no access bits or synchronization scopes are allowed.
+ r_access = D3D12_BARRIER_ACCESS_NO_ACCESS;
+ return;
+ }
+
+ // Convert access bits to the D3D12 barrier access bits.
+ _rd_access_to_d3d12_and_mask(p_access, p_texture_layout, r_access, sync_mask);
+
+ if (p_texture_layout != RDD::TEXTURE_LAYOUT_MAX) {
+ // Only allow the access bits compatible with the texture layout.
+ r_access &= _rd_texture_layout_access_mask(p_texture_layout);
+ }
+
+ // Convert stage bits to the D3D12 synchronization scope bits.
+ _rd_stages_to_d3d12(p_stages, r_sync);
+
+ // Only enable synchronization stages compatible with the access bits that were used.
+ r_sync &= sync_mask;
+
+ if (r_sync == D3D12_BARRIER_SYNC_NONE) {
+ if (p_access.is_empty()) {
+ // No valid synchronization scope was defined and no access in particular is required.
+ r_access = D3D12_BARRIER_ACCESS_NO_ACCESS;
+ } else {
+ // Access is required but the synchronization scope wasn't compatible. We fall back to the global synchronization scope and access.
+ r_sync = D3D12_BARRIER_SYNC_ALL;
+ r_access = D3D12_BARRIER_ACCESS_COMMON;
+ }
+ }
+}
+
+static D3D12_BARRIER_LAYOUT _rd_texture_layout_to_d3d12_barrier_layout(RDD::TextureLayout p_texture_layout) {
+ switch (p_texture_layout) {
+ case RDD::TEXTURE_LAYOUT_UNDEFINED:
+ return D3D12_BARRIER_LAYOUT_UNDEFINED;
+ case RDD::TEXTURE_LAYOUT_STORAGE_OPTIMAL:
+ return D3D12_BARRIER_LAYOUT_UNORDERED_ACCESS;
+ case RDD::TEXTURE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
+ return D3D12_BARRIER_LAYOUT_RENDER_TARGET;
+ case RDD::TEXTURE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
+ return D3D12_BARRIER_LAYOUT_DEPTH_STENCIL_WRITE;
+ case RDD::TEXTURE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
+ return D3D12_BARRIER_LAYOUT_DEPTH_STENCIL_READ;
+ case RDD::TEXTURE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
+ return D3D12_BARRIER_LAYOUT_SHADER_RESOURCE;
+ case RDD::TEXTURE_LAYOUT_COPY_SRC_OPTIMAL:
+ return D3D12_BARRIER_LAYOUT_COPY_SOURCE;
+ case RDD::TEXTURE_LAYOUT_COPY_DST_OPTIMAL:
+ return D3D12_BARRIER_LAYOUT_COPY_DEST;
+ case RDD::TEXTURE_LAYOUT_RESOLVE_SRC_OPTIMAL:
+ return D3D12_BARRIER_LAYOUT_RESOLVE_SOURCE;
+ case RDD::TEXTURE_LAYOUT_RESOLVE_DST_OPTIMAL:
+ return D3D12_BARRIER_LAYOUT_RESOLVE_DEST;
+ case RDD::TEXTURE_LAYOUT_VRS_ATTACHMENT_OPTIMAL:
+ return D3D12_BARRIER_LAYOUT_SHADING_RATE_SOURCE;
+ default:
+ DEV_ASSERT(false && "Unknown texture layout.");
+ return D3D12_BARRIER_LAYOUT_UNDEFINED;
+ }
+}
+
+void RenderingDeviceDriverD3D12::command_pipeline_barrier(CommandBufferID p_cmd_buffer,
+ BitField<PipelineStageBits> p_src_stages,
+ BitField<PipelineStageBits> p_dst_stages,
VectorView<RDD::MemoryBarrier> p_memory_barriers,
VectorView<RDD::BufferBarrier> p_buffer_barriers,
VectorView<RDD::TextureBarrier> p_texture_barriers) {
- if (p_src_stages.has_flag(PIPELINE_STAGE_ALL_COMMANDS_BIT) && p_dst_stages.has_flag(PIPELINE_STAGE_ALL_COMMANDS_BIT)) {
- // Looks like the intent is a full barrier.
- // In the resource barriers world, we can force a full barrier by discarding some resource, as per
- // https://microsoft.github.io/DirectX-Specs/d3d/D3D12EnhancedBarriers.html#synchronous-copy-discard-and-resolve.
- const CommandBufferInfo *cmd_buf_info = (const CommandBufferInfo *)p_cmd_buffer.id;
- cmd_buf_info->cmd_list->DiscardResource(frames[frame_idx].aux_resource->GetResource(), nullptr);
+ if (!barrier_capabilities.enhanced_barriers_supported) {
+ // Enhanced barriers are a requirement for this function.
+ return;
+ }
+
+ if (p_memory_barriers.size() == 0 && p_buffer_barriers.size() == 0 && p_texture_barriers.size() == 0) {
+ // At least one barrier must be present in the arguments.
+ return;
}
+
+ // The command list must support the required interface.
+ const CommandBufferInfo *cmd_buf_info = (const CommandBufferInfo *)(p_cmd_buffer.id);
+ ID3D12GraphicsCommandList7 *cmd_list_7 = nullptr;
+ HRESULT res = cmd_buf_info->cmd_list->QueryInterface(IID_PPV_ARGS(&cmd_list_7));
+ ERR_FAIL_COND(FAILED(res));
+
+ // Convert the RDD barriers to D3D12 enhanced barriers.
+ thread_local LocalVector<D3D12_GLOBAL_BARRIER> global_barriers;
+ thread_local LocalVector<D3D12_BUFFER_BARRIER> buffer_barriers;
+ thread_local LocalVector<D3D12_TEXTURE_BARRIER> texture_barriers;
+ global_barriers.clear();
+ buffer_barriers.clear();
+ texture_barriers.clear();
+
+ D3D12_GLOBAL_BARRIER global_barrier = {};
+ for (uint32_t i = 0; i < p_memory_barriers.size(); i++) {
+ const MemoryBarrier &memory_barrier = p_memory_barriers[i];
+ _rd_stages_and_access_to_d3d12(p_src_stages, RDD::TEXTURE_LAYOUT_MAX, memory_barrier.src_access, global_barrier.SyncBefore, global_barrier.AccessBefore);
+ _rd_stages_and_access_to_d3d12(p_dst_stages, RDD::TEXTURE_LAYOUT_MAX, memory_barrier.dst_access, global_barrier.SyncAfter, global_barrier.AccessAfter);
+ global_barriers.push_back(global_barrier);
+ }
+
+ D3D12_BUFFER_BARRIER buffer_barrier_d3d12 = {};
+ buffer_barrier_d3d12.Offset = 0;
+ buffer_barrier_d3d12.Size = UINT64_MAX; // The specification says this must be the size of the buffer barrier.
+ for (uint32_t i = 0; i < p_buffer_barriers.size(); i++) {
+ const BufferBarrier &buffer_barrier_rd = p_buffer_barriers[i];
+ const BufferInfo *buffer_info = (const BufferInfo *)(buffer_barrier_rd.buffer.id);
+ _rd_stages_and_access_to_d3d12(p_src_stages, RDD::TEXTURE_LAYOUT_MAX, buffer_barrier_rd.src_access, buffer_barrier_d3d12.SyncBefore, buffer_barrier_d3d12.AccessBefore);
+ _rd_stages_and_access_to_d3d12(p_dst_stages, RDD::TEXTURE_LAYOUT_MAX, buffer_barrier_rd.dst_access, buffer_barrier_d3d12.SyncAfter, buffer_barrier_d3d12.AccessAfter);
+ buffer_barrier_d3d12.pResource = buffer_info->resource;
+ buffer_barriers.push_back(buffer_barrier_d3d12);
+ }
+
+ D3D12_TEXTURE_BARRIER texture_barrier_d3d12 = {};
+ for (uint32_t i = 0; i < p_texture_barriers.size(); i++) {
+ const TextureBarrier &texture_barrier_rd = p_texture_barriers[i];
+ const TextureInfo *texture_info = (const TextureInfo *)(texture_barrier_rd.texture.id);
+ _rd_stages_and_access_to_d3d12(p_src_stages, texture_barrier_rd.prev_layout, texture_barrier_rd.src_access, texture_barrier_d3d12.SyncBefore, texture_barrier_d3d12.AccessBefore);
+ _rd_stages_and_access_to_d3d12(p_dst_stages, texture_barrier_rd.next_layout, texture_barrier_rd.dst_access, texture_barrier_d3d12.SyncAfter, texture_barrier_d3d12.AccessAfter);
+ texture_barrier_d3d12.LayoutBefore = _rd_texture_layout_to_d3d12_barrier_layout(texture_barrier_rd.prev_layout);
+ texture_barrier_d3d12.LayoutAfter = _rd_texture_layout_to_d3d12_barrier_layout(texture_barrier_rd.next_layout);
+ texture_barrier_d3d12.pResource = texture_info->resource;
+ texture_barrier_d3d12.Subresources.IndexOrFirstMipLevel = texture_barrier_rd.subresources.base_mipmap;
+ texture_barrier_d3d12.Subresources.NumMipLevels = texture_barrier_rd.subresources.mipmap_count;
+ texture_barrier_d3d12.Subresources.FirstArraySlice = texture_barrier_rd.subresources.base_layer;
+ texture_barrier_d3d12.Subresources.NumArraySlices = texture_barrier_rd.subresources.layer_count;
+ texture_barrier_d3d12.Subresources.FirstPlane = _compute_plane_slice(texture_info->format, texture_barrier_rd.subresources.aspect);
+ texture_barrier_d3d12.Subresources.NumPlanes = format_get_plane_count(texture_info->format);
+ texture_barrier_d3d12.Flags = (texture_barrier_rd.prev_layout == RDD::TEXTURE_LAYOUT_UNDEFINED) ? D3D12_TEXTURE_BARRIER_FLAG_DISCARD : D3D12_TEXTURE_BARRIER_FLAG_NONE;
+ texture_barriers.push_back(texture_barrier_d3d12);
+ }
+
+ // Define the barrier groups and execute.
+ D3D12_BARRIER_GROUP barrier_groups[3] = {};
+ barrier_groups[0].Type = D3D12_BARRIER_TYPE_GLOBAL;
+ barrier_groups[1].Type = D3D12_BARRIER_TYPE_BUFFER;
+ barrier_groups[2].Type = D3D12_BARRIER_TYPE_TEXTURE;
+ barrier_groups[0].NumBarriers = global_barriers.size();
+ barrier_groups[1].NumBarriers = buffer_barriers.size();
+ barrier_groups[2].NumBarriers = texture_barriers.size();
+ barrier_groups[0].pGlobalBarriers = global_barriers.ptr();
+ barrier_groups[1].pBufferBarriers = buffer_barriers.ptr();
+ barrier_groups[2].pTextureBarriers = texture_barriers.ptr();
+ cmd_list_7->Barrier(ARRAY_SIZE(barrier_groups), barrier_groups);
}
/****************/
@@ -3476,6 +3784,8 @@ RDD::ShaderID RenderingDeviceDriverD3D12::shader_create_from_bytecode(const Vect
zstd_size = STEPIFY(zstd_size, 4);
read_offset += zstd_size;
ERR_FAIL_COND_V(read_offset > binsize, ShaderID());
+
+ r_shader_desc.stages.push_back(ShaderStage(stage));
}
const uint8_t *root_sig_data_ptr = binptr + read_offset;
@@ -3807,6 +4117,10 @@ void RenderingDeviceDriverD3D12::uniform_set_free(UniformSetID p_uniform_set) {
// ----- COMMANDS -----
void RenderingDeviceDriverD3D12::command_uniform_set_prepare_for_use(CommandBufferID p_cmd_buffer, UniformSetID p_uniform_set, ShaderID p_shader, uint32_t p_set_index) {
+ if (barrier_capabilities.enhanced_barriers_supported) {
+ return;
+ }
+
// Perform pending blackouts.
{
SelfList<TextureInfo> *E = textures_pending_clear.first();
@@ -3814,7 +4128,7 @@ void RenderingDeviceDriverD3D12::command_uniform_set_prepare_for_use(CommandBuff
TextureSubresourceRange subresources;
subresources.layer_count = E->self()->layers;
subresources.mipmap_count = E->self()->mipmaps;
- command_clear_color_texture(p_cmd_buffer, TextureID(E->self()), TEXTURE_LAYOUT_GENERAL, Color(), subresources);
+ command_clear_color_texture(p_cmd_buffer, TextureID(E->self()), TEXTURE_LAYOUT_UNDEFINED, Color(), subresources);
SelfList<TextureInfo> *next = E->next();
E->remove_from_list();
@@ -3947,34 +4261,6 @@ void RenderingDeviceDriverD3D12::command_uniform_set_prepare_for_use(CommandBuff
for (uint32_t i = 0; i < tex_info->layers; i++) {
for (uint32_t j = 0; j < tex_info->mipmaps; j++) {
uint32_t subresource = D3D12CalcSubresource(tex_info->base_mip + j, tex_info->base_layer + i, 0, tex_info->desc.MipLevels, tex_info->desc.ArraySize());
-
- if ((wanted_state & D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE)) {
- // [[CROSS_FAMILY_FALLBACK]].
- if (tex_info->owner_info.resource && tex_info->main_texture && tex_info->main_texture != tex_info) {
- uint32_t subres_qword = subresource / 64;
- uint64_t subres_mask = (uint64_t(1) << (subresource % 64));
- if ((tex_info->main_texture->states_ptr->xfamily_fallback.subresources_dirty[subres_qword] & subres_mask)) {
- // Prepare for copying the write-to texture to this one, if out-of-date.
- _resource_transition_batch(tex_info->main_texture, subresource, planes, D3D12_RESOURCE_STATE_COPY_SOURCE);
- _resource_transition_batch(tex_info, subresource, planes, D3D12_RESOURCE_STATE_COPY_DEST);
-
- CommandBufferInfo::FamilyFallbackCopy ffc;
- ffc.texture = tex_info;
- ffc.subresource = subresource;
- ffc.mipmap = j;
- ffc.dst_wanted_state = wanted_state;
-
- CommandBufferInfo *cmd_buf_info = (CommandBufferInfo *)p_cmd_buffer.id;
- cmd_buf_info->family_fallback_copies.resize(cmd_buf_info->family_fallback_copies.size() + 1);
- cmd_buf_info->family_fallback_copies[cmd_buf_info->family_fallback_copy_count] = ffc;
- cmd_buf_info->family_fallback_copy_count++;
-
- tex_info->main_texture->states_ptr->xfamily_fallback.subresources_dirty[subres_qword] &= ~subres_mask;
- }
- continue;
- }
- }
-
_resource_transition_batch(tex_info, subresource, planes, wanted_state);
}
}
@@ -3986,55 +4272,6 @@ void RenderingDeviceDriverD3D12::command_uniform_set_prepare_for_use(CommandBuff
if (p_set_index == shader_info_in->sets.size() - 1) {
CommandBufferInfo *cmd_buf_info = (CommandBufferInfo *)p_cmd_buffer.id;
_resource_transitions_flush(cmd_buf_info->cmd_list.Get());
-
- // [[CROSS_FAMILY_FALLBACK]].
- for (uint32_t i = 0; i < cmd_buf_info->family_fallback_copy_count; i++) {
- const CommandBufferInfo::FamilyFallbackCopy &ffc = cmd_buf_info->family_fallback_copies[i];
-
- D3D12_TEXTURE_COPY_LOCATION dst_tex = {};
- dst_tex.pResource = ffc.texture->resource;
- dst_tex.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
- dst_tex.SubresourceIndex = ffc.subresource;
-
- D3D12_TEXTURE_COPY_LOCATION src_tex = {};
- src_tex.pResource = ffc.texture->main_texture->resource;
- src_tex.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
- src_tex.SubresourceIndex = ffc.subresource;
-
- const ResourceInfo::States::CrossFamillyFallback &xfamily = ffc.texture->main_texture->owner_info.states.xfamily_fallback;
- if (xfamily.interim_buffer.Get()) {
- // Must copy via a buffer due to reinterpret-copy known not to be available for these data types.
- D3D12_TEXTURE_COPY_LOCATION buf_loc = {};
- buf_loc.pResource = xfamily.interim_buffer.Get();
- buf_loc.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
- buf_loc.PlacedFootprint.Offset = 0;
- buf_loc.PlacedFootprint.Footprint.Format = ffc.texture->main_texture->desc.Format;
- buf_loc.PlacedFootprint.Footprint.Width = MAX(1u, ffc.texture->main_texture->desc.Width >> ffc.mipmap);
- buf_loc.PlacedFootprint.Footprint.Height = MAX(1u, ffc.texture->main_texture->desc.Height >> ffc.mipmap);
- buf_loc.PlacedFootprint.Footprint.Depth = MAX(1u, (uint32_t)ffc.texture->main_texture->desc.Depth() >> ffc.mipmap);
- buf_loc.PlacedFootprint.Footprint.RowPitch = STEPIFY(buf_loc.PlacedFootprint.Footprint.Width * sizeof(uint16_t), D3D12_TEXTURE_DATA_PITCH_ALIGNMENT);
-
- D3D12_RESOURCE_BARRIER barrier = CD3DX12_RESOURCE_BARRIER::Transition(xfamily.interim_buffer.Get(), D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_COPY_DEST);
- cmd_buf_info->cmd_list->ResourceBarrier(1, &barrier);
-
- cmd_buf_info->cmd_list->CopyTextureRegion(&buf_loc, 0, 0, 0, &src_tex, nullptr);
-
- barrier = CD3DX12_RESOURCE_BARRIER::Transition(xfamily.interim_buffer.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_COPY_SOURCE);
- cmd_buf_info->cmd_list->ResourceBarrier(1, &barrier);
-
- buf_loc.PlacedFootprint.Footprint.Format = ffc.texture->desc.Format;
- cmd_buf_info->cmd_list->CopyTextureRegion(&dst_tex, 0, 0, 0, &buf_loc, nullptr);
- } else {
- // Direct copy is possible.
- cmd_buf_info->cmd_list->CopyTextureRegion(&dst_tex, 0, 0, 0, &src_tex, nullptr);
- }
-
- // Set the specific SRV state we wanted from the beginning to the alternative version of the texture.
- _resource_transition_batch(ffc.texture, ffc.subresource, 1, ffc.dst_wanted_state);
- }
- cmd_buf_info->family_fallback_copy_count = 0;
-
- _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
}
}
@@ -4311,8 +4548,10 @@ void RenderingDeviceDriverD3D12::command_clear_buffer(CommandBufferID p_cmd_buff
}
}
- _resource_transition_batch(buf_info, 0, 1, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
- _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ if (!barrier_capabilities.enhanced_barriers_supported) {
+ _resource_transition_batch(buf_info, 0, 1, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
+ _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ }
D3D12_UNORDERED_ACCESS_VIEW_DESC uav_desc = {};
uav_desc.Format = DXGI_FORMAT_R32_TYPELESS;
@@ -4352,9 +4591,11 @@ void RenderingDeviceDriverD3D12::command_copy_buffer(CommandBufferID p_cmd_buffe
BufferInfo *src_buf_info = (BufferInfo *)p_src_buffer.id;
BufferInfo *buf_loc_info = (BufferInfo *)p_buf_locfer.id;
- _resource_transition_batch(src_buf_info, 0, 1, D3D12_RESOURCE_STATE_COPY_SOURCE);
- _resource_transition_batch(buf_loc_info, 0, 1, D3D12_RESOURCE_STATE_COPY_DEST);
- _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ if (!barrier_capabilities.enhanced_barriers_supported) {
+ _resource_transition_batch(src_buf_info, 0, 1, D3D12_RESOURCE_STATE_COPY_SOURCE);
+ _resource_transition_batch(buf_loc_info, 0, 1, D3D12_RESOURCE_STATE_COPY_DEST);
+ _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ }
for (uint32_t i = 0; i < p_regions.size(); i++) {
cmd_buf_info->cmd_list->CopyBufferRegion(buf_loc_info->resource, p_regions[i].dst_offset, src_buf_info->resource, p_regions[i].src_offset, p_regions[i].size);
@@ -4366,43 +4607,37 @@ void RenderingDeviceDriverD3D12::command_copy_texture(CommandBufferID p_cmd_buff
TextureInfo *src_tex_info = (TextureInfo *)p_src_texture.id;
TextureInfo *dst_tex_info = (TextureInfo *)p_dst_texture.id;
- for (uint32_t i = 0; i < p_regions.size(); i++) {
- UINT src_subresource = D3D12CalcSubresource(
- p_regions[i].src_subresources.mipmap,
- p_regions[i].src_subresources.base_layer,
- _compute_plane_slice(src_tex_info->format, p_regions[i].src_subresources.aspect),
- src_tex_info->desc.MipLevels,
- src_tex_info->desc.ArraySize());
- _resource_transition_batch(src_tex_info, src_subresource, 1, D3D12_RESOURCE_STATE_COPY_SOURCE);
-
- UINT dst_subresource = D3D12CalcSubresource(
- p_regions[i].dst_subresources.mipmap,
- p_regions[i].dst_subresources.base_layer,
- _compute_plane_slice(dst_tex_info->format, p_regions[i].dst_subresources.aspect),
- dst_tex_info->desc.MipLevels,
- dst_tex_info->desc.ArraySize());
- _resource_transition_batch(dst_tex_info, dst_subresource, 1, D3D12_RESOURCE_STATE_COPY_DEST);
+ if (!barrier_capabilities.enhanced_barriers_supported) {
+ // Batch all barrier transitions for the textures before performing the copies.
+ for (uint32_t i = 0; i < p_regions.size(); i++) {
+ uint32_t layer_count = MIN(p_regions[i].src_subresources.layer_count, p_regions[i].dst_subresources.layer_count);
+ for (uint32_t j = 0; j < layer_count; j++) {
+ UINT src_subresource = _compute_subresource_from_layers(src_tex_info, p_regions[i].src_subresources, j);
+ UINT dst_subresource = _compute_subresource_from_layers(dst_tex_info, p_regions[i].dst_subresources, j);
+ _resource_transition_batch(src_tex_info, src_subresource, 1, D3D12_RESOURCE_STATE_COPY_SOURCE);
+ _resource_transition_batch(dst_tex_info, dst_subresource, 1, D3D12_RESOURCE_STATE_COPY_DEST);
+ }
+ }
_resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ }
- CD3DX12_TEXTURE_COPY_LOCATION src_location(src_tex_info->resource, src_subresource);
- CD3DX12_TEXTURE_COPY_LOCATION dst_location(dst_tex_info->resource, dst_subresource);
-
- CD3DX12_BOX src_box(
- p_regions[i].src_offset.x,
- p_regions[i].src_offset.y,
- p_regions[i].src_offset.z,
- p_regions[i].src_offset.x + p_regions[i].size.x,
- p_regions[i].src_offset.y + p_regions[i].size.y,
- p_regions[i].src_offset.z + p_regions[i].size.z);
-
- cmd_buf_info->cmd_list->CopyTextureRegion(
- &dst_location,
- p_regions[i].dst_offset.x,
- p_regions[i].dst_offset.y,
- p_regions[i].dst_offset.z,
- &src_location,
- &src_box);
+ CD3DX12_BOX src_box;
+ for (uint32_t i = 0; i < p_regions.size(); i++) {
+ uint32_t layer_count = MIN(p_regions[i].src_subresources.layer_count, p_regions[i].dst_subresources.layer_count);
+ for (uint32_t j = 0; j < layer_count; j++) {
+ UINT src_subresource = _compute_subresource_from_layers(src_tex_info, p_regions[i].src_subresources, j);
+ UINT dst_subresource = _compute_subresource_from_layers(dst_tex_info, p_regions[i].dst_subresources, j);
+ CD3DX12_TEXTURE_COPY_LOCATION src_location(src_tex_info->resource, src_subresource);
+ CD3DX12_TEXTURE_COPY_LOCATION dst_location(dst_tex_info->resource, dst_subresource);
+ src_box.left = p_regions[i].src_offset.x;
+ src_box.top = p_regions[i].src_offset.y;
+ src_box.front = p_regions[i].src_offset.z;
+ src_box.right = p_regions[i].src_offset.x + p_regions[i].size.x;
+ src_box.bottom = p_regions[i].src_offset.y + p_regions[i].size.y;
+ src_box.back = p_regions[i].src_offset.z + p_regions[i].size.z;
+ cmd_buf_info->cmd_list->CopyTextureRegion(&dst_location, p_regions[i].dst_offset.x, p_regions[i].dst_offset.y, p_regions[i].dst_offset.z, &src_location, &src_box);
+ }
}
}
@@ -4412,12 +4647,12 @@ void RenderingDeviceDriverD3D12::command_resolve_texture(CommandBufferID p_cmd_b
TextureInfo *dst_tex_info = (TextureInfo *)p_dst_texture.id;
UINT src_subresource = D3D12CalcSubresource(p_src_mipmap, p_src_layer, 0, src_tex_info->desc.MipLevels, src_tex_info->desc.ArraySize());
- _resource_transition_batch(src_tex_info, src_subresource, 1, D3D12_RESOURCE_STATE_RESOLVE_SOURCE);
-
UINT dst_subresource = D3D12CalcSubresource(p_dst_mipmap, p_dst_layer, 0, dst_tex_info->desc.MipLevels, dst_tex_info->desc.ArraySize());
- _resource_transition_batch(dst_tex_info, dst_subresource, 1, D3D12_RESOURCE_STATE_RESOLVE_DEST);
-
- _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ if (!barrier_capabilities.enhanced_barriers_supported) {
+ _resource_transition_batch(src_tex_info, src_subresource, 1, D3D12_RESOURCE_STATE_RESOLVE_SOURCE);
+ _resource_transition_batch(dst_tex_info, dst_subresource, 1, D3D12_RESOURCE_STATE_RESOLVE_DEST);
+ _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ }
cmd_buf_info->cmd_list->ResolveSubresource(dst_tex_info->resource, dst_subresource, src_tex_info->resource, src_subresource, RD_TO_D3D12_FORMAT[src_tex_info->format].general_format);
}
@@ -4458,7 +4693,9 @@ void RenderingDeviceDriverD3D12::command_clear_color_texture(CommandBufferID p_c
}
}
- _transition_subresources(D3D12_RESOURCE_STATE_RENDER_TARGET);
+ if (!barrier_capabilities.enhanced_barriers_supported) {
+ _transition_subresources(D3D12_RESOURCE_STATE_RENDER_TARGET);
+ }
for (uint32_t i = 0; i < p_subresources.mipmap_count; i++) {
D3D12_RENDER_TARGET_VIEW_DESC rtv_desc = _make_rtv_for_texture(tex_info, p_subresources.base_mipmap + i, p_subresources.base_layer, p_subresources.layer_count, false);
@@ -4476,7 +4713,7 @@ void RenderingDeviceDriverD3D12::command_clear_color_texture(CommandBufferID p_c
frames[frame_idx].desc_heap_walkers.rtv.advance();
}
- } else {
+ } else if (tex_info->desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS) {
// Clear via UAV.
_command_check_descriptor_sets(p_cmd_buffer);
@@ -4501,7 +4738,9 @@ void RenderingDeviceDriverD3D12::command_clear_color_texture(CommandBufferID p_c
}
}
- _transition_subresources(D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
+ if (!barrier_capabilities.enhanced_barriers_supported) {
+ _transition_subresources(D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
+ }
for (uint32_t i = 0; i < p_subresources.mipmap_count; i++) {
D3D12_UNORDERED_ACCESS_VIEW_DESC uav_desc = _make_ranged_uav_for_texture(tex_info, p_subresources.base_mipmap + i, p_subresources.base_layer, p_subresources.layer_count, false);
@@ -4522,6 +4761,7 @@ void RenderingDeviceDriverD3D12::command_clear_color_texture(CommandBufferID p_c
(UINT)p_color.get_b8(),
(UINT)p_color.get_a8(),
};
+
cmd_buf_info->cmd_list->ClearUnorderedAccessViewUint(
frames[frame_idx].desc_heap_walkers.resources.get_curr_gpu_handle(),
frames[frame_idx].desc_heap_walkers.aux.get_curr_cpu_handle(),
@@ -4533,6 +4773,8 @@ void RenderingDeviceDriverD3D12::command_clear_color_texture(CommandBufferID p_c
frames[frame_idx].desc_heap_walkers.resources.advance();
frames[frame_idx].desc_heap_walkers.aux.advance();
}
+ } else {
+ ERR_FAIL_MSG("Cannot clear texture because its format does not support UAV writes. You'll need to update its contents through another method.");
}
}
@@ -4540,8 +4782,7 @@ void RenderingDeviceDriverD3D12::command_copy_buffer_to_texture(CommandBufferID
const CommandBufferInfo *cmd_buf_info = (const CommandBufferInfo *)p_cmd_buffer.id;
BufferInfo *buf_info = (BufferInfo *)p_src_buffer.id;
TextureInfo *tex_info = (TextureInfo *)p_dst_texture.id;
-
- if (buf_info->flags.is_for_upload) {
+ if (!barrier_capabilities.enhanced_barriers_supported) {
_resource_transition_batch(buf_info, 0, 1, D3D12_RESOURCE_STATE_COPY_SOURCE);
}
@@ -4569,19 +4810,21 @@ void RenderingDeviceDriverD3D12::command_copy_buffer_to_texture(CommandBufferID
STEPIFY(p_regions[i].texture_region_size.y, block_h),
p_regions[i].texture_region_size.z);
- for (uint32_t j = 0; j < p_regions[i].texture_subresources.layer_count; j++) {
- UINT dst_subresource = D3D12CalcSubresource(
- p_regions[i].texture_subresources.mipmap,
- p_regions[i].texture_subresources.base_layer + j,
- _compute_plane_slice(tex_info->format, p_regions[i].texture_subresources.aspect),
- tex_info->desc.MipLevels,
- tex_info->desc.ArraySize());
- CD3DX12_TEXTURE_COPY_LOCATION copy_dst(tex_info->resource, dst_subresource);
+ if (!barrier_capabilities.enhanced_barriers_supported) {
+ for (uint32_t j = 0; j < p_regions[i].texture_subresources.layer_count; j++) {
+ UINT dst_subresource = D3D12CalcSubresource(
+ p_regions[i].texture_subresources.mipmap,
+ p_regions[i].texture_subresources.base_layer + j,
+ _compute_plane_slice(tex_info->format, p_regions[i].texture_subresources.aspect),
+ tex_info->desc.MipLevels,
+ tex_info->desc.ArraySize());
+ CD3DX12_TEXTURE_COPY_LOCATION copy_dst(tex_info->resource, dst_subresource);
- _resource_transition_batch(tex_info, dst_subresource, 1, D3D12_RESOURCE_STATE_COPY_DEST);
- }
+ _resource_transition_batch(tex_info, dst_subresource, 1, D3D12_RESOURCE_STATE_COPY_DEST);
+ }
- _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ }
for (uint32_t j = 0; j < p_regions[i].texture_subresources.layer_count; j++) {
UINT dst_subresource = D3D12CalcSubresource(
@@ -4608,24 +4851,28 @@ void RenderingDeviceDriverD3D12::command_copy_texture_to_buffer(CommandBufferID
TextureInfo *tex_info = (TextureInfo *)p_src_texture.id;
BufferInfo *buf_info = (BufferInfo *)p_buf_locfer.id;
- _resource_transition_batch(buf_info, 0, 1, D3D12_RESOURCE_STATE_COPY_DEST);
+ if (!barrier_capabilities.enhanced_barriers_supported) {
+ _resource_transition_batch(buf_info, 0, 1, D3D12_RESOURCE_STATE_COPY_DEST);
+ }
uint32_t block_w = 0, block_h = 0;
get_compressed_image_format_block_dimensions(tex_info->format, block_w, block_h);
for (uint32_t i = 0; i < p_regions.size(); i++) {
- for (uint32_t j = 0; j < p_regions[i].texture_subresources.layer_count; j++) {
- UINT src_subresource = D3D12CalcSubresource(
- p_regions[i].texture_subresources.mipmap,
- p_regions[i].texture_subresources.base_layer + j,
- _compute_plane_slice(tex_info->format, p_regions[i].texture_subresources.aspect),
- tex_info->desc.MipLevels,
- tex_info->desc.ArraySize());
+ if (!barrier_capabilities.enhanced_barriers_supported) {
+ for (uint32_t j = 0; j < p_regions[i].texture_subresources.layer_count; j++) {
+ UINT src_subresource = D3D12CalcSubresource(
+ p_regions[i].texture_subresources.mipmap,
+ p_regions[i].texture_subresources.base_layer + j,
+ _compute_plane_slice(tex_info->format, p_regions[i].texture_subresources.aspect),
+ tex_info->desc.MipLevels,
+ tex_info->desc.ArraySize());
- _resource_transition_batch(tex_info, src_subresource, 1, D3D12_RESOURCE_STATE_COPY_SOURCE);
- }
+ _resource_transition_batch(tex_info, src_subresource, 1, D3D12_RESOURCE_STATE_COPY_SOURCE);
+ }
- _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ }
for (uint32_t j = 0; j < p_regions[i].texture_subresources.layer_count; j++) {
UINT src_subresource = D3D12CalcSubresource(
@@ -4775,22 +5022,25 @@ void RenderingDeviceDriverD3D12::command_begin_render_pass(CommandBufferID p_cmd
}
};
- for (uint32_t i = 0; i < fb_info->attachments.size(); i++) {
- TextureInfo *tex_info = (TextureInfo *)fb_info->attachments[i].id;
- if ((tex_info->desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET)) {
- _transition_subresources(tex_info, D3D12_RESOURCE_STATE_RENDER_TARGET);
- } else if ((tex_info->desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL)) {
- _transition_subresources(tex_info, D3D12_RESOURCE_STATE_DEPTH_WRITE);
- } else {
- DEV_ASSERT(false);
+ if (fb_info->is_screen || !barrier_capabilities.enhanced_barriers_supported) {
+ // Screen framebuffers must perform this transition even if enhanced barriers are supported.
+ for (uint32_t i = 0; i < fb_info->attachments.size(); i++) {
+ TextureInfo *tex_info = (TextureInfo *)fb_info->attachments[i].id;
+ if ((tex_info->desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET)) {
+ _transition_subresources(tex_info, D3D12_RESOURCE_STATE_RENDER_TARGET);
+ } else if ((tex_info->desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL)) {
+ _transition_subresources(tex_info, D3D12_RESOURCE_STATE_DEPTH_WRITE);
+ } else {
+ DEV_ASSERT(false);
+ }
+ }
+ if (fb_info->vrs_attachment) {
+ TextureInfo *tex_info = (TextureInfo *)fb_info->vrs_attachment.id;
+ _transition_subresources(tex_info, D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE);
}
- }
- if (fb_info->vrs_attachment) {
- TextureInfo *tex_info = (TextureInfo *)fb_info->vrs_attachment.id;
- _transition_subresources(tex_info, D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE);
- }
- _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ }
cmd_buf_info->render_pass_state.region_rect = CD3DX12_RECT(
p_rect.position.x,
@@ -5152,8 +5402,11 @@ void RenderingDeviceDriverD3D12::command_render_draw_indexed_indirect(CommandBuf
CommandBufferInfo *cmd_buf_info = (CommandBufferInfo *)p_cmd_buffer.id;
_bind_vertex_buffers(cmd_buf_info);
BufferInfo *indirect_buf_info = (BufferInfo *)p_indirect_buffer.id;
- _resource_transition_batch(indirect_buf_info, 0, 1, D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT);
- _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ if (!barrier_capabilities.enhanced_barriers_supported) {
+ _resource_transition_batch(indirect_buf_info, 0, 1, D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT);
+ _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ }
+
cmd_buf_info->cmd_list->ExecuteIndirect(indirect_cmd_signatures.draw_indexed.Get(), p_draw_count, indirect_buf_info->resource, p_offset, nullptr, 0);
}
@@ -5162,9 +5415,12 @@ void RenderingDeviceDriverD3D12::command_render_draw_indexed_indirect_count(Comm
_bind_vertex_buffers(cmd_buf_info);
BufferInfo *indirect_buf_info = (BufferInfo *)p_indirect_buffer.id;
BufferInfo *count_buf_info = (BufferInfo *)p_count_buffer.id;
- _resource_transition_batch(indirect_buf_info, 0, 1, D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT);
- _resource_transition_batch(count_buf_info, 0, 1, D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT);
- _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ if (!barrier_capabilities.enhanced_barriers_supported) {
+ _resource_transition_batch(indirect_buf_info, 0, 1, D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT);
+ _resource_transition_batch(count_buf_info, 0, 1, D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT);
+ _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ }
+
cmd_buf_info->cmd_list->ExecuteIndirect(indirect_cmd_signatures.draw_indexed.Get(), p_max_draw_count, indirect_buf_info->resource, p_offset, count_buf_info->resource, p_count_buffer_offset);
}
@@ -5172,8 +5428,11 @@ void RenderingDeviceDriverD3D12::command_render_draw_indirect(CommandBufferID p_
CommandBufferInfo *cmd_buf_info = (CommandBufferInfo *)p_cmd_buffer.id;
_bind_vertex_buffers(cmd_buf_info);
BufferInfo *indirect_buf_info = (BufferInfo *)p_indirect_buffer.id;
- _resource_transition_batch(indirect_buf_info, 0, 1, D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT);
- _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ if (!barrier_capabilities.enhanced_barriers_supported) {
+ _resource_transition_batch(indirect_buf_info, 0, 1, D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT);
+ _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ }
+
cmd_buf_info->cmd_list->ExecuteIndirect(indirect_cmd_signatures.draw.Get(), p_draw_count, indirect_buf_info->resource, p_offset, nullptr, 0);
}
@@ -5182,9 +5441,12 @@ void RenderingDeviceDriverD3D12::command_render_draw_indirect_count(CommandBuffe
_bind_vertex_buffers(cmd_buf_info);
BufferInfo *indirect_buf_info = (BufferInfo *)p_indirect_buffer.id;
BufferInfo *count_buf_info = (BufferInfo *)p_count_buffer.id;
- _resource_transition_batch(indirect_buf_info, 0, 1, D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT);
- _resource_transition_batch(count_buf_info, 0, 1, D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT);
- _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ if (!barrier_capabilities.enhanced_barriers_supported) {
+ _resource_transition_batch(indirect_buf_info, 0, 1, D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT);
+ _resource_transition_batch(count_buf_info, 0, 1, D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT);
+ _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ }
+
cmd_buf_info->cmd_list->ExecuteIndirect(indirect_cmd_signatures.draw.Get(), p_max_draw_count, indirect_buf_info->resource, p_offset, count_buf_info->resource, p_count_buffer_offset);
}
@@ -5203,10 +5465,15 @@ void RenderingDeviceDriverD3D12::command_render_bind_vertex_buffers(CommandBuffe
cmd_buf_info->render_pass_state.vertex_buffer_views[i] = {};
cmd_buf_info->render_pass_state.vertex_buffer_views[i].BufferLocation = buffer_info->resource->GetGPUVirtualAddress() + p_offsets[i];
cmd_buf_info->render_pass_state.vertex_buffer_views[i].SizeInBytes = buffer_info->size - p_offsets[i];
+ if (!barrier_capabilities.enhanced_barriers_supported) {
+ _resource_transition_batch(buffer_info, 0, 1, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER);
+ }
+ }
- _resource_transition_batch(buffer_info, 0, 1, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER);
+ if (!barrier_capabilities.enhanced_barriers_supported) {
+ _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
}
- _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+
cmd_buf_info->render_pass_state.vertex_buffer_count = p_binding_count;
}
@@ -5219,8 +5486,10 @@ void RenderingDeviceDriverD3D12::command_render_bind_index_buffer(CommandBufferI
d3d12_ib_view.SizeInBytes = buffer_info->size - p_offset;
d3d12_ib_view.Format = p_format == INDEX_BUFFER_FORMAT_UINT16 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT;
- _resource_transition_batch(buffer_info, 0, 1, D3D12_RESOURCE_STATE_INDEX_BUFFER);
- _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ if (!barrier_capabilities.enhanced_barriers_supported) {
+ _resource_transition_batch(buffer_info, 0, 1, D3D12_RESOURCE_STATE_INDEX_BUFFER);
+ _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ }
cmd_buf_info->cmd_list->IASetIndexBuffer(&d3d12_ib_view);
}
@@ -5616,15 +5885,21 @@ void RenderingDeviceDriverD3D12::command_bind_compute_uniform_set(CommandBufferI
void RenderingDeviceDriverD3D12::command_compute_dispatch(CommandBufferID p_cmd_buffer, uint32_t p_x_groups, uint32_t p_y_groups, uint32_t p_z_groups) {
const CommandBufferInfo *cmd_buf_info = (const CommandBufferInfo *)p_cmd_buffer.id;
- _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ if (!barrier_capabilities.enhanced_barriers_supported) {
+ _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ }
+
cmd_buf_info->cmd_list->Dispatch(p_x_groups, p_y_groups, p_z_groups);
}
void RenderingDeviceDriverD3D12::command_compute_dispatch_indirect(CommandBufferID p_cmd_buffer, BufferID p_indirect_buffer, uint64_t p_offset) {
const CommandBufferInfo *cmd_buf_info = (const CommandBufferInfo *)p_cmd_buffer.id;
BufferInfo *indirect_buf_info = (BufferInfo *)p_indirect_buffer.id;
- _resource_transition_batch(indirect_buf_info, 0, 1, D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT);
- _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ if (!barrier_capabilities.enhanced_barriers_supported) {
+ _resource_transition_batch(indirect_buf_info, 0, 1, D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT);
+ _resource_transitions_flush(cmd_buf_info->cmd_list.Get());
+ }
+
cmd_buf_info->cmd_list->ExecuteIndirect(indirect_cmd_signatures.dispatch.Get(), 1, indirect_buf_info->resource, p_offset, nullptr, 0);
}
@@ -5939,11 +6214,7 @@ uint64_t RenderingDeviceDriverD3D12::limit_get(Limit p_limit) {
uint64_t RenderingDeviceDriverD3D12::api_trait_get(ApiTrait p_trait) {
switch (p_trait) {
case API_TRAIT_HONORS_PIPELINE_BARRIERS:
- // TODO:
- // 1. Map fine/Vulkan/enhanced barriers to legacy barriers as closely as possible
- // so there's still some advantage even without enhanced barriers available.
- // 2. Implement enhanced barriers and return true where available.
- return 0;
+ return barrier_capabilities.enhanced_barriers_supported;
case API_TRAIT_SHADER_CHANGE_INVALIDATION:
return (uint64_t)SHADER_CHANGE_INVALIDATION_ALL_OR_NONE_ACCORDING_TO_LAYOUT_HASH;
case API_TRAIT_TEXTURE_TRANSFER_ALIGNMENT:
@@ -5952,6 +6223,8 @@ uint64_t RenderingDeviceDriverD3D12::api_trait_get(ApiTrait p_trait) {
return D3D12_TEXTURE_DATA_PITCH_ALIGNMENT;
case API_TRAIT_SECONDARY_VIEWPORT_SCISSOR:
return false;
+ case API_TRAIT_CLEARS_WITH_COPY_ENGINE:
+ return false;
default:
return RenderingDeviceDriver::api_trait_get(p_trait);
}
@@ -6101,6 +6374,8 @@ Error RenderingDeviceDriverD3D12::_initialize_device() {
// These happen due to how D3D12MA manages buffers; seems benign.
D3D12_MESSAGE_ID_HEAP_ADDRESS_RANGE_HAS_NO_RESOURCE,
D3D12_MESSAGE_ID_HEAP_ADDRESS_RANGE_INTERSECTS_MULTIPLE_BUFFERS,
+ // Seemingly a false positive.
+ D3D12_MESSAGE_ID_DATA_STATIC_WHILE_SET_AT_EXECUTE_DESCRIPTOR_INVALID_DATA_CHANGE,
};
D3D12_INFO_QUEUE_FILTER filter = {};
@@ -6250,6 +6525,7 @@ Error RenderingDeviceDriverD3D12::_check_capabilities() {
res = device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS12, &options12, sizeof(options12));
if (SUCCEEDED(res)) {
format_capabilities.relaxed_casting_supported = options12.RelaxedFormatCastingSupported;
+ barrier_capabilities.enhanced_barriers_supported = options12.EnhancedBarriersSupported;
}
if (vrs_capabilities.draw_call_supported || vrs_capabilities.primitive_supported || vrs_capabilities.ss_image_supported) {
@@ -6282,7 +6558,7 @@ Error RenderingDeviceDriverD3D12::_check_capabilities() {
#if 0
print_verbose("- Relaxed casting supported");
#else
- // Certain configurations (Windows 11 with an updated Nvida driver) crash when using relaxed casting.
+ // Certain configurations (Windows 11 with an updated NVIDIA driver) crash when using relaxed casting.
// Therefore, we disable it temporarily until we can assure that it's reliable.
// There are fallbacks in place that work in every case, if less efficient.
format_capabilities.relaxed_casting_supported = false;
@@ -6382,10 +6658,6 @@ Error RenderingDeviceDriverD3D12::_initialize_frames(uint32_t p_frame_count) {
frames[i].desc_heap_walkers.samplers = frames[i].desc_heaps.samplers.make_walker();
frames[i].desc_heap_walkers.aux = frames[i].desc_heaps.aux.make_walker();
frames[i].desc_heap_walkers.rtv = frames[i].desc_heaps.rtv.make_walker();
-
- ID3D12Resource *resource = nullptr;
- HRESULT res = allocator->CreateResource(&allocation_desc, &resource_desc, D3D12_RESOURCE_STATE_COMMON, nullptr, &frames[frame_idx].aux_resource, IID_PPV_ARGS(&resource));
- ERR_FAIL_COND_V_MSG(!SUCCEEDED(res), ERR_CANT_CREATE, "D3D12MA::CreateResource failed with error " + vformat("0x%08ux", (uint64_t)res) + ".");
}
return OK;
diff --git a/drivers/d3d12/rendering_device_driver_d3d12.h b/drivers/d3d12/rendering_device_driver_d3d12.h
index 3a9677485e..1782819238 100644
--- a/drivers/d3d12/rendering_device_driver_d3d12.h
+++ b/drivers/d3d12/rendering_device_driver_d3d12.h
@@ -122,6 +122,10 @@ class RenderingDeviceDriverD3D12 : public RenderingDeviceDriver {
bool relaxed_casting_supported = false;
};
+ struct BarrierCapabilities {
+ bool enhanced_barriers_supported = false;
+ };
+
RenderingContextDriverD3D12 *context_driver = nullptr;
RenderingContextDriver::Device context_device;
ComPtr<IDXGIAdapter> adapter;
@@ -136,6 +140,7 @@ class RenderingDeviceDriverD3D12 : public RenderingDeviceDriver {
ShaderCapabilities shader_capabilities;
StorageBufferCapabilities storage_buffer_capabilities;
FormatCapabilities format_capabilities;
+ BarrierCapabilities barrier_capabilities;
String pipeline_cache_id;
class DescriptorsHeap {
@@ -218,11 +223,6 @@ private:
// As many subresources as mipmaps * layers; planes (for depth-stencil) are tracked together.
TightLocalVector<D3D12_RESOURCE_STATES> subresource_states; // Used only if not a view.
uint32_t last_batch_with_uav_barrier = 0;
- struct CrossFamillyFallback {
- TightLocalVector<uint64_t> subresources_dirty;
- ComPtr<ID3D12Resource> interim_buffer;
- ComPtr<D3D12MA::Allocation> interim_buffer_alloc;
- } xfamily_fallback; // [[CROSS_FAMILY_FALLBACK]].
};
ID3D12Resource *resource = nullptr; // Non-null even if not owned.
@@ -275,7 +275,6 @@ private:
uint64_t size = 0;
struct {
bool usable_as_uav : 1;
- bool is_for_upload : 1;
} flags = {};
};
@@ -317,10 +316,14 @@ private:
UINT _compute_component_mapping(const TextureView &p_view);
UINT _compute_plane_slice(DataFormat p_format, BitField<TextureAspectBits> p_aspect_bits);
UINT _compute_plane_slice(DataFormat p_format, TextureAspect p_aspect);
+ UINT _compute_subresource_from_layers(TextureInfo *p_texture, const TextureSubresourceLayers &p_layers, uint32_t p_layer_offset);
struct CommandBufferInfo;
void _discard_texture_subresources(const TextureInfo *p_tex_info, const CommandBufferInfo *p_cmd_buf_info);
+protected:
+ virtual bool _unordered_access_supported_by_format(DataFormat p_format);
+
public:
virtual TextureID texture_create(const TextureFormat &p_format, const TextureView &p_view) override final;
virtual TextureID texture_create_from_extension(uint64_t p_native_texture, TextureType p_type, DataFormat p_format, uint32_t p_array_layers, bool p_depth_stencil) override final;
@@ -332,6 +335,7 @@ public:
virtual uint8_t *texture_map(TextureID p_texture, const TextureSubresource &p_subresource) override final;
virtual void texture_unmap(TextureID p_texture) override final;
virtual BitField<TextureUsageBits> texture_get_usages_supported_by_format(DataFormat p_format, bool p_cpu_readable) override final;
+ virtual bool texture_can_make_shared_with_format(TextureID p_texture, DataFormat p_format, bool &r_raw_reinterpretation) override final;
private:
TextureID _texture_create_shared_from_slice(TextureID p_original_texture, const TextureView &p_view, TextureSliceType p_slice_type, uint32_t p_layer, uint32_t p_layers, uint32_t p_mipmap, uint32_t p_mipmaps);
@@ -367,8 +371,8 @@ public:
virtual void command_pipeline_barrier(
CommandBufferID p_cmd_buffer,
- BitField<RDD::PipelineStageBits> p_src_stages,
- BitField<RDD::PipelineStageBits> p_dst_stages,
+ BitField<PipelineStageBits> p_src_stages,
+ BitField<PipelineStageBits> p_dst_stages,
VectorView<RDD::MemoryBarrier> p_memory_barriers,
VectorView<RDD::BufferBarrier> p_buffer_barriers,
VectorView<RDD::TextureBarrier> p_texture_barriers) override final;
@@ -465,16 +469,6 @@ private:
RenderPassState render_pass_state;
bool descriptor_heaps_set = false;
-
- // [[CROSS_FAMILY_FALLBACK]].
- struct FamilyFallbackCopy {
- TextureInfo *texture = nullptr;
- uint32_t subresource = 0;
- uint32_t mipmap = 0;
- D3D12_RESOURCE_STATES dst_wanted_state = {};
- };
- LocalVector<FamilyFallbackCopy> family_fallback_copies;
- uint32_t family_fallback_copy_count = 0;
};
public:
@@ -961,7 +955,6 @@ private:
bool rtv = false;
} desc_heaps_exhausted_reported;
CD3DX12_CPU_DESCRIPTOR_HANDLE null_rtv_handle = {}; // For [[MANUAL_SUBPASSES]].
- ComPtr<D3D12MA::Allocation> aux_resource;
uint32_t segment_serial = 0;
#ifdef DEV_ENABLED
diff --git a/drivers/gles3/shaders/particles.glsl b/drivers/gles3/shaders/particles.glsl
index 096f0a57ae..2591937a1d 100644
--- a/drivers/gles3/shaders/particles.glsl
+++ b/drivers/gles3/shaders/particles.glsl
@@ -372,10 +372,10 @@ void main() {
float d = vec4_to_float(texture(height_field_texture, uv_pos)) * SDF_MAX_LENGTH;
+ // Allowing for a small epsilon to allow particle just touching colliders to count as collided
+ const float EPSILON = 0.001;
d -= sdf_particle_size;
-
- if (d < 0.0) {
- const float EPSILON = 0.001;
+ if (d < EPSILON) {
vec2 n = normalize(vec2(
vec4_to_float(texture(height_field_texture, uv_pos + vec2(EPSILON, 0.0))) - vec4_to_float(texture(height_field_texture, uv_pos - vec2(EPSILON, 0.0))),
vec4_to_float(texture(height_field_texture, uv_pos + vec2(0.0, EPSILON))) - vec4_to_float(texture(height_field_texture, uv_pos - vec2(0.0, EPSILON)))));
@@ -400,10 +400,12 @@ void main() {
vec3 rel_vec = xform[3].xyz - colliders[i].transform[3].xyz;
vec3 local_pos = rel_vec * mat3(colliders[i].transform);
+ // Allowing for a small epsilon to allow particle just touching colliders to count as collided
+ const float EPSILON = 0.001;
if (colliders[i].type == COLLIDER_TYPE_SPHERE) {
float d = length(rel_vec) - (particle_size + colliders[i].extents.x);
- if (d < 0.0) {
+ if (d < EPSILON) {
col = true;
depth = -d;
normal = normalize(rel_vec);
@@ -418,7 +420,7 @@ void main() {
vec3 closest = min(abs_pos, colliders[i].extents.xyz);
vec3 rel = abs_pos - closest;
depth = length(rel) - particle_size;
- if (depth < 0.0) {
+ if (depth < EPSILON) {
col = true;
normal = mat3(colliders[i].transform) * (normalize(rel) * sgn_pos);
depth = -depth;
@@ -453,7 +455,7 @@ void main() {
float y = 1.0 - texture(height_field_texture, uvw_pos.xz).r;
- if (y > uvw_pos.y) {
+ if (y + EPSILON > uvw_pos.y) {
//inside heightfield
vec3 pos1 = (vec3(uvw_pos.x, y, uvw_pos.z) * 2.0 - 1.0) * colliders[i].extents.xyz;
diff --git a/drivers/vulkan/rendering_device_driver_vulkan.cpp b/drivers/vulkan/rendering_device_driver_vulkan.cpp
index b03a8418ed..2a9e9ba264 100644
--- a/drivers/vulkan/rendering_device_driver_vulkan.cpp
+++ b/drivers/vulkan/rendering_device_driver_vulkan.cpp
@@ -264,6 +264,63 @@ static const VkFormat RD_TO_VK_FORMAT[RDD::DATA_FORMAT_MAX] = {
VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM,
};
+static VkImageLayout RD_TO_VK_LAYOUT[RDD::TEXTURE_LAYOUT_MAX] = {
+ VK_IMAGE_LAYOUT_UNDEFINED, // TEXTURE_LAYOUT_UNDEFINED
+ VK_IMAGE_LAYOUT_GENERAL, // TEXTURE_LAYOUT_STORAGE_OPTIMAL
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // TEXTURE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // TEXTURE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, // TEXTURE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, // TEXTURE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
+ VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // TEXTURE_LAYOUT_COPY_SRC_OPTIMAL
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // TEXTURE_LAYOUT_COPY_DST_OPTIMAL
+ VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // TEXTURE_LAYOUT_RESOLVE_SRC_OPTIMAL
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // TEXTURE_LAYOUT_RESOLVE_DST_OPTIMAL
+ VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR, // TEXTURE_LAYOUT_VRS_ATTACHMENT_OPTIMAL
+};
+
+static VkPipelineStageFlags _rd_to_vk_pipeline_stages(BitField<RDD::PipelineStageBits> p_stages) {
+ VkPipelineStageFlags vk_flags = 0;
+ if (p_stages.has_flag(RDD::PIPELINE_STAGE_COPY_BIT) || p_stages.has_flag(RDD::PIPELINE_STAGE_RESOLVE_BIT)) {
+ // Transfer has been split into copy and resolve bits. Clear them and merge them into one bit.
+ vk_flags |= VK_PIPELINE_STAGE_TRANSFER_BIT;
+ p_stages.clear_flag(RDD::PIPELINE_STAGE_COPY_BIT);
+ p_stages.clear_flag(RDD::PIPELINE_STAGE_RESOLVE_BIT);
+ }
+
+ if (p_stages.has_flag(RDD::PIPELINE_STAGE_CLEAR_STORAGE_BIT)) {
+ // Vulkan should never use this as API_TRAIT_CLEAR_RESOURCES_WITH_VIEWS is not specified.
+ // Therefore, storage is never cleared with an explicit command.
+ p_stages.clear_flag(RDD::PIPELINE_STAGE_CLEAR_STORAGE_BIT);
+ }
+
+ // The rest of the flags have compatible numeric values with Vulkan.
+ return VkPipelineStageFlags(p_stages) | vk_flags;
+}
+
+static VkAccessFlags _rd_to_vk_access_flags(BitField<RDD::BarrierAccessBits> p_access) {
+ VkAccessFlags vk_flags = 0;
+ if (p_access.has_flag(RDD::BARRIER_ACCESS_COPY_READ_BIT) || p_access.has_flag(RDD::BARRIER_ACCESS_RESOLVE_READ_BIT)) {
+ vk_flags |= VK_ACCESS_TRANSFER_READ_BIT;
+ p_access.clear_flag(RDD::BARRIER_ACCESS_COPY_READ_BIT);
+ p_access.clear_flag(RDD::BARRIER_ACCESS_RESOLVE_READ_BIT);
+ }
+
+ if (p_access.has_flag(RDD::BARRIER_ACCESS_COPY_WRITE_BIT) || p_access.has_flag(RDD::BARRIER_ACCESS_RESOLVE_WRITE_BIT)) {
+ vk_flags |= VK_ACCESS_TRANSFER_WRITE_BIT;
+ p_access.clear_flag(RDD::BARRIER_ACCESS_COPY_WRITE_BIT);
+ p_access.clear_flag(RDD::BARRIER_ACCESS_RESOLVE_WRITE_BIT);
+ }
+
+ if (p_access.has_flag(RDD::BARRIER_ACCESS_STORAGE_CLEAR_BIT)) {
+ // Vulkan should never use this as API_TRAIT_CLEAR_RESOURCES_WITH_VIEWS is not specified.
+ // Therefore, storage is never cleared with an explicit command.
+ p_access.clear_flag(RDD::BARRIER_ACCESS_STORAGE_CLEAR_BIT);
+ }
+
+ // The rest of the flags have compatible numeric values with Vulkan.
+ return VkAccessFlags(p_access) | vk_flags;
+}
+
// RDD::CompareOperator == VkCompareOp.
static_assert(ENUM_MEMBERS_EQUAL(RDD::COMPARE_OP_NEVER, VK_COMPARE_OP_NEVER));
static_assert(ENUM_MEMBERS_EQUAL(RDD::COMPARE_OP_LESS, VK_COMPARE_OP_LESS));
@@ -1334,18 +1391,6 @@ static_assert(ENUM_MEMBERS_EQUAL(RDD::TEXTURE_SWIZZLE_G, VK_COMPONENT_SWIZZLE_G)
static_assert(ENUM_MEMBERS_EQUAL(RDD::TEXTURE_SWIZZLE_B, VK_COMPONENT_SWIZZLE_B));
static_assert(ENUM_MEMBERS_EQUAL(RDD::TEXTURE_SWIZZLE_A, VK_COMPONENT_SWIZZLE_A));
-// RDD::TextureLayout == VkImageLayout.
-static_assert(ENUM_MEMBERS_EQUAL(RDD::TEXTURE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_UNDEFINED));
-static_assert(ENUM_MEMBERS_EQUAL(RDD::TEXTURE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL));
-static_assert(ENUM_MEMBERS_EQUAL(RDD::TEXTURE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL));
-static_assert(ENUM_MEMBERS_EQUAL(RDD::TEXTURE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL));
-static_assert(ENUM_MEMBERS_EQUAL(RDD::TEXTURE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL));
-static_assert(ENUM_MEMBERS_EQUAL(RDD::TEXTURE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL));
-static_assert(ENUM_MEMBERS_EQUAL(RDD::TEXTURE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL));
-static_assert(ENUM_MEMBERS_EQUAL(RDD::TEXTURE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL));
-static_assert(ENUM_MEMBERS_EQUAL(RDD::TEXTURE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_PREINITIALIZED));
-static_assert(ENUM_MEMBERS_EQUAL(RDD::TEXTURE_LAYOUT_VRS_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR));
-
// RDD::TextureAspectBits == VkImageAspectFlagBits.
static_assert(ENUM_MEMBERS_EQUAL(RDD::TEXTURE_ASPECT_COLOR_BIT, VK_IMAGE_ASPECT_COLOR_BIT));
static_assert(ENUM_MEMBERS_EQUAL(RDD::TEXTURE_ASPECT_DEPTH_BIT, VK_IMAGE_ASPECT_DEPTH_BIT));
@@ -1774,6 +1819,11 @@ BitField<RDD::TextureUsageBits> RenderingDeviceDriverVulkan::texture_get_usages_
return supported;
}
+bool RenderingDeviceDriverVulkan::texture_can_make_shared_with_format(TextureID p_texture, DataFormat p_format, bool &r_raw_reinterpretation) {
+ r_raw_reinterpretation = false;
+ return true;
+}
+
/*****************/
/**** SAMPLER ****/
/*****************/
@@ -1893,7 +1943,6 @@ static_assert(ENUM_MEMBERS_EQUAL(RDD::PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, V
static_assert(ENUM_MEMBERS_EQUAL(RDD::PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT));
static_assert(ENUM_MEMBERS_EQUAL(RDD::PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT));
static_assert(ENUM_MEMBERS_EQUAL(RDD::PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT));
-static_assert(ENUM_MEMBERS_EQUAL(RDD::PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT));
static_assert(ENUM_MEMBERS_EQUAL(RDD::PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT));
static_assert(ENUM_MEMBERS_EQUAL(RDD::PIPELINE_STAGE_ALL_GRAPHICS_BIT, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT));
static_assert(ENUM_MEMBERS_EQUAL(RDD::PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT));
@@ -1910,8 +1959,6 @@ static_assert(ENUM_MEMBERS_EQUAL(RDD::BARRIER_ACCESS_COLOR_ATTACHMENT_READ_BIT,
static_assert(ENUM_MEMBERS_EQUAL(RDD::BARRIER_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT));
static_assert(ENUM_MEMBERS_EQUAL(RDD::BARRIER_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT, VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT));
static_assert(ENUM_MEMBERS_EQUAL(RDD::BARRIER_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT));
-static_assert(ENUM_MEMBERS_EQUAL(RDD::BARRIER_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_TRANSFER_READ_BIT));
-static_assert(ENUM_MEMBERS_EQUAL(RDD::BARRIER_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT));
static_assert(ENUM_MEMBERS_EQUAL(RDD::BARRIER_ACCESS_HOST_READ_BIT, VK_ACCESS_HOST_READ_BIT));
static_assert(ENUM_MEMBERS_EQUAL(RDD::BARRIER_ACCESS_HOST_WRITE_BIT, VK_ACCESS_HOST_WRITE_BIT));
static_assert(ENUM_MEMBERS_EQUAL(RDD::BARRIER_ACCESS_MEMORY_READ_BIT, VK_ACCESS_MEMORY_READ_BIT));
@@ -1929,8 +1976,8 @@ void RenderingDeviceDriverVulkan::command_pipeline_barrier(
for (uint32_t i = 0; i < p_memory_barriers.size(); i++) {
vk_memory_barriers[i] = {};
vk_memory_barriers[i].sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
- vk_memory_barriers[i].srcAccessMask = (VkPipelineStageFlags)p_memory_barriers[i].src_access;
- vk_memory_barriers[i].dstAccessMask = (VkAccessFlags)p_memory_barriers[i].dst_access;
+ vk_memory_barriers[i].srcAccessMask = _rd_to_vk_access_flags(p_memory_barriers[i].src_access);
+ vk_memory_barriers[i].dstAccessMask = _rd_to_vk_access_flags(p_memory_barriers[i].dst_access);
}
VkBufferMemoryBarrier *vk_buffer_barriers = ALLOCA_ARRAY(VkBufferMemoryBarrier, p_buffer_barriers.size());
@@ -1939,8 +1986,8 @@ void RenderingDeviceDriverVulkan::command_pipeline_barrier(
vk_buffer_barriers[i].sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
vk_buffer_barriers[i].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
vk_buffer_barriers[i].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
- vk_buffer_barriers[i].srcAccessMask = (VkAccessFlags)p_buffer_barriers[i].src_access;
- vk_buffer_barriers[i].dstAccessMask = (VkAccessFlags)p_buffer_barriers[i].dst_access;
+ vk_buffer_barriers[i].srcAccessMask = _rd_to_vk_access_flags(p_buffer_barriers[i].src_access);
+ vk_buffer_barriers[i].dstAccessMask = _rd_to_vk_access_flags(p_buffer_barriers[i].dst_access);
vk_buffer_barriers[i].buffer = ((const BufferInfo *)p_buffer_barriers[i].buffer.id)->vk_buffer;
vk_buffer_barriers[i].offset = p_buffer_barriers[i].offset;
vk_buffer_barriers[i].size = p_buffer_barriers[i].size;
@@ -1951,10 +1998,10 @@ void RenderingDeviceDriverVulkan::command_pipeline_barrier(
const TextureInfo *tex_info = (const TextureInfo *)p_texture_barriers[i].texture.id;
vk_image_barriers[i] = {};
vk_image_barriers[i].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
- vk_image_barriers[i].srcAccessMask = (VkAccessFlags)p_texture_barriers[i].src_access;
- vk_image_barriers[i].dstAccessMask = (VkAccessFlags)p_texture_barriers[i].dst_access;
- vk_image_barriers[i].oldLayout = (VkImageLayout)p_texture_barriers[i].prev_layout;
- vk_image_barriers[i].newLayout = (VkImageLayout)p_texture_barriers[i].next_layout;
+ vk_image_barriers[i].srcAccessMask = _rd_to_vk_access_flags(p_texture_barriers[i].src_access);
+ vk_image_barriers[i].dstAccessMask = _rd_to_vk_access_flags(p_texture_barriers[i].dst_access);
+ vk_image_barriers[i].oldLayout = RD_TO_VK_LAYOUT[p_texture_barriers[i].prev_layout];
+ vk_image_barriers[i].newLayout = RD_TO_VK_LAYOUT[p_texture_barriers[i].next_layout];
vk_image_barriers[i].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
vk_image_barriers[i].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
vk_image_barriers[i].image = tex_info->vk_view_create_info.image;
@@ -1984,8 +2031,8 @@ void RenderingDeviceDriverVulkan::command_pipeline_barrier(
vkCmdPipelineBarrier(
(VkCommandBuffer)p_cmd_buffer.id,
- (VkPipelineStageFlags)p_src_stages,
- (VkPipelineStageFlags)p_dst_stages,
+ _rd_to_vk_pipeline_stages(p_src_stages),
+ _rd_to_vk_pipeline_stages(p_dst_stages),
0,
p_memory_barriers.size(), vk_memory_barriers,
p_buffer_barriers.size(), vk_buffer_barriers,
@@ -3727,7 +3774,7 @@ void RenderingDeviceDriverVulkan::command_copy_texture(CommandBufferID p_cmd_buf
const TextureInfo *src_tex_info = (const TextureInfo *)p_src_texture.id;
const TextureInfo *dst_tex_info = (const TextureInfo *)p_dst_texture.id;
- vkCmdCopyImage((VkCommandBuffer)p_cmd_buffer.id, src_tex_info->vk_view_create_info.image, (VkImageLayout)p_src_texture_layout, dst_tex_info->vk_view_create_info.image, (VkImageLayout)p_dst_texture_layout, p_regions.size(), vk_copy_regions);
+ vkCmdCopyImage((VkCommandBuffer)p_cmd_buffer.id, src_tex_info->vk_view_create_info.image, RD_TO_VK_LAYOUT[p_src_texture_layout], dst_tex_info->vk_view_create_info.image, RD_TO_VK_LAYOUT[p_dst_texture_layout], p_regions.size(), vk_copy_regions);
}
void RenderingDeviceDriverVulkan::command_resolve_texture(CommandBufferID p_cmd_buffer, TextureID p_src_texture, TextureLayout p_src_texture_layout, uint32_t p_src_layer, uint32_t p_src_mipmap, TextureID p_dst_texture, TextureLayout p_dst_texture_layout, uint32_t p_dst_layer, uint32_t p_dst_mipmap) {
@@ -3747,7 +3794,7 @@ void RenderingDeviceDriverVulkan::command_resolve_texture(CommandBufferID p_cmd_
vk_resolve.extent.height = MAX(1u, src_tex_info->vk_create_info.extent.height >> p_src_mipmap);
vk_resolve.extent.depth = MAX(1u, src_tex_info->vk_create_info.extent.depth >> p_src_mipmap);
- vkCmdResolveImage((VkCommandBuffer)p_cmd_buffer.id, src_tex_info->vk_view_create_info.image, (VkImageLayout)p_src_texture_layout, dst_tex_info->vk_view_create_info.image, (VkImageLayout)p_dst_texture_layout, 1, &vk_resolve);
+ vkCmdResolveImage((VkCommandBuffer)p_cmd_buffer.id, src_tex_info->vk_view_create_info.image, RD_TO_VK_LAYOUT[p_src_texture_layout], dst_tex_info->vk_view_create_info.image, RD_TO_VK_LAYOUT[p_dst_texture_layout], 1, &vk_resolve);
}
void RenderingDeviceDriverVulkan::command_clear_color_texture(CommandBufferID p_cmd_buffer, TextureID p_texture, TextureLayout p_texture_layout, const Color &p_color, const TextureSubresourceRange &p_subresources) {
@@ -3758,7 +3805,7 @@ void RenderingDeviceDriverVulkan::command_clear_color_texture(CommandBufferID p_
_texture_subresource_range_to_vk(p_subresources, &vk_subresources);
const TextureInfo *tex_info = (const TextureInfo *)p_texture.id;
- vkCmdClearColorImage((VkCommandBuffer)p_cmd_buffer.id, tex_info->vk_view_create_info.image, (VkImageLayout)p_texture_layout, &vk_color, 1, &vk_subresources);
+ vkCmdClearColorImage((VkCommandBuffer)p_cmd_buffer.id, tex_info->vk_view_create_info.image, RD_TO_VK_LAYOUT[p_texture_layout], &vk_color, 1, &vk_subresources);
}
void RenderingDeviceDriverVulkan::command_copy_buffer_to_texture(CommandBufferID p_cmd_buffer, BufferID p_src_buffer, TextureID p_dst_texture, TextureLayout p_dst_texture_layout, VectorView<BufferTextureCopyRegion> p_regions) {
@@ -3769,7 +3816,7 @@ void RenderingDeviceDriverVulkan::command_copy_buffer_to_texture(CommandBufferID
const BufferInfo *buf_info = (const BufferInfo *)p_src_buffer.id;
const TextureInfo *tex_info = (const TextureInfo *)p_dst_texture.id;
- vkCmdCopyBufferToImage((VkCommandBuffer)p_cmd_buffer.id, buf_info->vk_buffer, tex_info->vk_view_create_info.image, (VkImageLayout)p_dst_texture_layout, p_regions.size(), vk_copy_regions);
+ vkCmdCopyBufferToImage((VkCommandBuffer)p_cmd_buffer.id, buf_info->vk_buffer, tex_info->vk_view_create_info.image, RD_TO_VK_LAYOUT[p_dst_texture_layout], p_regions.size(), vk_copy_regions);
}
void RenderingDeviceDriverVulkan::command_copy_texture_to_buffer(CommandBufferID p_cmd_buffer, TextureID p_src_texture, TextureLayout p_src_texture_layout, BufferID p_dst_buffer, VectorView<BufferTextureCopyRegion> p_regions) {
@@ -3780,7 +3827,7 @@ void RenderingDeviceDriverVulkan::command_copy_texture_to_buffer(CommandBufferID
const TextureInfo *tex_info = (const TextureInfo *)p_src_texture.id;
const BufferInfo *buf_info = (const BufferInfo *)p_dst_buffer.id;
- vkCmdCopyImageToBuffer((VkCommandBuffer)p_cmd_buffer.id, tex_info->vk_view_create_info.image, (VkImageLayout)p_src_texture_layout, buf_info->vk_buffer, p_regions.size(), vk_copy_regions);
+ vkCmdCopyImageToBuffer((VkCommandBuffer)p_cmd_buffer.id, tex_info->vk_view_create_info.image, RD_TO_VK_LAYOUT[p_src_texture_layout], buf_info->vk_buffer, p_regions.size(), vk_copy_regions);
}
/******************/
@@ -3926,7 +3973,7 @@ static void _attachment_reference_to_vk(const RDD::AttachmentReference &p_attach
*r_vk_attachment_reference = {};
r_vk_attachment_reference->sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR;
r_vk_attachment_reference->attachment = p_attachment_reference.attachment;
- r_vk_attachment_reference->layout = (VkImageLayout)p_attachment_reference.layout;
+ r_vk_attachment_reference->layout = RD_TO_VK_LAYOUT[p_attachment_reference.layout];
r_vk_attachment_reference->aspectMask = (VkImageAspectFlags)p_attachment_reference.aspect;
}
@@ -3945,8 +3992,8 @@ RDD::RenderPassID RenderingDeviceDriverVulkan::render_pass_create(VectorView<Att
vk_attachments[i].storeOp = (VkAttachmentStoreOp)p_attachments[i].store_op;
vk_attachments[i].stencilLoadOp = (VkAttachmentLoadOp)p_attachments[i].stencil_load_op;
vk_attachments[i].stencilStoreOp = (VkAttachmentStoreOp)p_attachments[i].stencil_store_op;
- vk_attachments[i].initialLayout = (VkImageLayout)p_attachments[i].initial_layout;
- vk_attachments[i].finalLayout = (VkImageLayout)p_attachments[i].final_layout;
+ vk_attachments[i].initialLayout = RD_TO_VK_LAYOUT[p_attachments[i].initial_layout];
+ vk_attachments[i].finalLayout = RD_TO_VK_LAYOUT[p_attachments[i].final_layout];
}
VkSubpassDescription2KHR *vk_subpasses = ALLOCA_ARRAY(VkSubpassDescription2KHR, p_subpasses.size());
@@ -4010,10 +4057,10 @@ RDD::RenderPassID RenderingDeviceDriverVulkan::render_pass_create(VectorView<Att
vk_subpass_dependencies[i].sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2;
vk_subpass_dependencies[i].srcSubpass = p_subpass_dependencies[i].src_subpass;
vk_subpass_dependencies[i].dstSubpass = p_subpass_dependencies[i].dst_subpass;
- vk_subpass_dependencies[i].srcStageMask = (VkPipelineStageFlags)p_subpass_dependencies[i].src_stages;
- vk_subpass_dependencies[i].dstStageMask = (VkPipelineStageFlags)p_subpass_dependencies[i].dst_stages;
- vk_subpass_dependencies[i].srcAccessMask = (VkAccessFlags)p_subpass_dependencies[i].src_access;
- vk_subpass_dependencies[i].dstAccessMask = (VkAccessFlags)p_subpass_dependencies[i].dst_access;
+ vk_subpass_dependencies[i].srcStageMask = _rd_to_vk_pipeline_stages(p_subpass_dependencies[i].src_stages);
+ vk_subpass_dependencies[i].dstStageMask = _rd_to_vk_pipeline_stages(p_subpass_dependencies[i].dst_stages);
+ vk_subpass_dependencies[i].srcAccessMask = _rd_to_vk_access_flags(p_subpass_dependencies[i].src_access);
+ vk_subpass_dependencies[i].dstAccessMask = _rd_to_vk_access_flags(p_subpass_dependencies[i].dst_access);
}
VkRenderPassCreateInfo2KHR create_info = {};
diff --git a/drivers/vulkan/rendering_device_driver_vulkan.h b/drivers/vulkan/rendering_device_driver_vulkan.h
index b9e7563069..6847ae00be 100644
--- a/drivers/vulkan/rendering_device_driver_vulkan.h
+++ b/drivers/vulkan/rendering_device_driver_vulkan.h
@@ -210,6 +210,7 @@ public:
virtual uint8_t *texture_map(TextureID p_texture, const TextureSubresource &p_subresource) override final;
virtual void texture_unmap(TextureID p_texture) override final;
virtual BitField<TextureUsageBits> texture_get_usages_supported_by_format(DataFormat p_format, bool p_cpu_readable) override final;
+ virtual bool texture_can_make_shared_with_format(TextureID p_texture, DataFormat p_format, bool &r_raw_reinterpretation) override final;
/*****************/
/**** SAMPLER ****/
diff --git a/editor/animation_bezier_editor.cpp b/editor/animation_bezier_editor.cpp
index baec996016..2136a843b6 100644
--- a/editor/animation_bezier_editor.cpp
+++ b/editor/animation_bezier_editor.cpp
@@ -1950,5 +1950,5 @@ AnimationBezierTrackEdit::AnimationBezierTrackEdit() {
menu = memnew(PopupMenu);
add_child(menu);
- menu->connect("id_pressed", callable_mp(this, &AnimationBezierTrackEdit::_menu_selected));
+ menu->connect(SceneStringName(id_pressed), callable_mp(this, &AnimationBezierTrackEdit::_menu_selected));
}
diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp
index 045774080c..2d497a281f 100644
--- a/editor/animation_track_editor.cpp
+++ b/editor/animation_track_editor.cpp
@@ -2810,7 +2810,7 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
if (!menu) {
menu = memnew(PopupMenu);
add_child(menu);
- menu->connect("id_pressed", callable_mp(this, &AnimationTrackEdit::_menu_selected));
+ menu->connect(SceneStringName(id_pressed), callable_mp(this, &AnimationTrackEdit::_menu_selected));
}
menu->clear();
if (animation->track_get_type(track) == Animation::TYPE_AUDIO) {
@@ -2833,7 +2833,7 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
if (!menu) {
menu = memnew(PopupMenu);
add_child(menu);
- menu->connect("id_pressed", callable_mp(this, &AnimationTrackEdit::_menu_selected));
+ menu->connect(SceneStringName(id_pressed), callable_mp(this, &AnimationTrackEdit::_menu_selected));
}
menu->clear();
menu->add_icon_item(get_editor_theme_icon(SNAME("InterpRaw")), TTR("Nearest"), MENU_INTERPOLATION_NEAREST);
@@ -2879,7 +2879,7 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
if (!menu) {
menu = memnew(PopupMenu);
add_child(menu);
- menu->connect("id_pressed", callable_mp(this, &AnimationTrackEdit::_menu_selected));
+ menu->connect(SceneStringName(id_pressed), callable_mp(this, &AnimationTrackEdit::_menu_selected));
}
menu->clear();
menu->add_icon_item(get_editor_theme_icon(SNAME("InterpWrapClamp")), TTR("Clamp Loop Interp"), MENU_LOOP_CLAMP);
@@ -2913,7 +2913,7 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
if (!menu) {
menu = memnew(PopupMenu);
add_child(menu);
- menu->connect("id_pressed", callable_mp(this, &AnimationTrackEdit::_menu_selected));
+ menu->connect(SceneStringName(id_pressed), callable_mp(this, &AnimationTrackEdit::_menu_selected));
}
bool selected = _try_select_at_ui_pos(pos, mb->is_command_or_control_pressed() || mb->is_shift_pressed(), false);
@@ -4850,7 +4850,7 @@ void AnimationTrackEditor::_notification(int p_what) {
imported_anim_warning->set_icon(get_editor_theme_icon(SNAME("NodeWarning")));
dummy_player_warning->set_icon(get_editor_theme_icon(SNAME("NodeWarning")));
inactive_player_warning->set_icon(get_editor_theme_icon(SNAME("NodeWarning")));
- main_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Tree")));
+ main_panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("Tree")));
edit->get_popup()->set_item_icon(edit->get_popup()->get_item_index(EDIT_APPLY_RESET), get_editor_theme_icon(SNAME("Reload")));
auto_fit->set_icon(get_editor_theme_icon(SNAME("AnimationAutoFit")));
auto_fit_bezier->set_icon(get_editor_theme_icon(SNAME("AnimationAutoFitBezier")));
@@ -7365,7 +7365,7 @@ AnimationTrackEditor::AnimationTrackEditor() {
edit->get_popup()->add_item(TTR("Optimize Animation (no undo)..."), EDIT_OPTIMIZE_ANIMATION);
edit->get_popup()->add_item(TTR("Clean-Up Animation (no undo)..."), EDIT_CLEAN_UP_ANIMATION);
- edit->get_popup()->connect("id_pressed", callable_mp(this, &AnimationTrackEditor::_edit_menu_pressed));
+ edit->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &AnimationTrackEditor::_edit_menu_pressed));
edit->get_popup()->connect("about_to_popup", callable_mp(this, &AnimationTrackEditor::_edit_menu_about_to_popup));
pick_track = memnew(SceneTreeDialog);
diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp
index 253157a561..0e272429a3 100644
--- a/editor/code_editor.cpp
+++ b/editor/code_editor.cpp
@@ -1794,7 +1794,7 @@ CodeTextEditor::CodeTextEditor() {
zoom_menu->set_item_metadata(i, z);
}
- zoom_menu->connect("id_pressed", callable_mp(this, &CodeTextEditor::_zoom_popup_id_pressed));
+ zoom_menu->connect(SceneStringName(id_pressed), callable_mp(this, &CodeTextEditor::_zoom_popup_id_pressed));
status_bar->add_child(memnew(VSeparator));
diff --git a/editor/connections_dialog.cpp b/editor/connections_dialog.cpp
index cb775a67e7..4f669c774b 100644
--- a/editor/connections_dialog.cpp
+++ b/editor/connections_dialog.cpp
@@ -465,10 +465,10 @@ void ConnectDialog::_notification(int p_what) {
type_list->set_item_icon(i, get_editor_theme_icon(type_name));
}
- Ref<StyleBox> style = get_theme_stylebox("normal", "LineEdit")->duplicate();
+ Ref<StyleBox> style = get_theme_stylebox(CoreStringName(normal), "LineEdit")->duplicate();
if (style.is_valid()) {
style->set_content_margin(SIDE_TOP, style->get_content_margin(SIDE_TOP) + 1.0);
- from_signal->add_theme_style_override("normal", style);
+ from_signal->add_theme_style_override(CoreStringName(normal), style);
}
method_search->set_right_icon(get_editor_theme_icon("Search"));
open_method_tree->set_icon(get_editor_theme_icon("Edit"));
@@ -1596,13 +1596,13 @@ ConnectionsDock::ConnectionsDock() {
disconnect_all_dialog->set_text(TTR("Are you sure you want to remove all connections from this signal?"));
class_menu = memnew(PopupMenu);
- class_menu->connect("id_pressed", callable_mp(this, &ConnectionsDock::_handle_class_menu_option));
+ class_menu->connect(SceneStringName(id_pressed), callable_mp(this, &ConnectionsDock::_handle_class_menu_option));
class_menu->connect("about_to_popup", callable_mp(this, &ConnectionsDock::_class_menu_about_to_popup));
class_menu->add_item(TTR("Open Documentation"), CLASS_MENU_OPEN_DOCS);
add_child(class_menu);
signal_menu = memnew(PopupMenu);
- signal_menu->connect("id_pressed", callable_mp(this, &ConnectionsDock::_handle_signal_menu_option));
+ signal_menu->connect(SceneStringName(id_pressed), callable_mp(this, &ConnectionsDock::_handle_signal_menu_option));
signal_menu->connect("about_to_popup", callable_mp(this, &ConnectionsDock::_signal_menu_about_to_popup));
signal_menu->add_item(TTR("Connect..."), SIGNAL_MENU_CONNECT);
signal_menu->add_item(TTR("Disconnect All"), SIGNAL_MENU_DISCONNECT_ALL);
@@ -1612,7 +1612,7 @@ ConnectionsDock::ConnectionsDock() {
add_child(signal_menu);
slot_menu = memnew(PopupMenu);
- slot_menu->connect("id_pressed", callable_mp(this, &ConnectionsDock::_handle_slot_menu_option));
+ slot_menu->connect(SceneStringName(id_pressed), callable_mp(this, &ConnectionsDock::_handle_slot_menu_option));
slot_menu->connect("about_to_popup", callable_mp(this, &ConnectionsDock::_slot_menu_about_to_popup));
slot_menu->add_item(TTR("Edit..."), SLOT_MENU_EDIT);
slot_menu->add_item(TTR("Go to Method"), SLOT_MENU_GO_TO_METHOD);
diff --git a/editor/debugger/debug_adapter/debug_adapter_server.cpp b/editor/debugger/debug_adapter/debug_adapter_server.cpp
index a16c494299..6041fec06c 100644
--- a/editor/debugger/debug_adapter/debug_adapter_server.cpp
+++ b/editor/debugger/debug_adapter/debug_adapter_server.cpp
@@ -35,6 +35,8 @@
#include "editor/editor_node.h"
#include "editor/editor_settings.h"
+int DebugAdapterServer::port_override = -1;
+
DebugAdapterServer::DebugAdapterServer() {
_EDITOR_DEF("network/debug_adapter/remote_port", remote_port);
_EDITOR_DEF("network/debug_adapter/request_timeout", protocol._request_timeout);
@@ -67,7 +69,7 @@ void DebugAdapterServer::_notification(int p_what) {
}
protocol._request_timeout = EDITOR_GET("network/debug_adapter/request_timeout");
protocol._sync_breakpoints = EDITOR_GET("network/debug_adapter/sync_breakpoints");
- int port = _EDITOR_GET("network/debug_adapter/remote_port");
+ int port = (DebugAdapterServer::port_override > -1) ? DebugAdapterServer::port_override : (int)_EDITOR_GET("network/debug_adapter/remote_port");
if (port != remote_port) {
stop();
start();
@@ -77,9 +79,9 @@ void DebugAdapterServer::_notification(int p_what) {
}
void DebugAdapterServer::start() {
- remote_port = (int)_EDITOR_GET("network/debug_adapter/remote_port");
+ remote_port = (DebugAdapterServer::port_override > -1) ? DebugAdapterServer::port_override : (int)_EDITOR_GET("network/debug_adapter/remote_port");
if (protocol.start(remote_port, IPAddress("127.0.0.1")) == OK) {
- EditorNode::get_log()->add_message("--- Debug adapter server started ---", EditorLog::MSG_TYPE_EDITOR);
+ EditorNode::get_log()->add_message("--- Debug adapter server started on port " + itos(remote_port) + " ---", EditorLog::MSG_TYPE_EDITOR);
set_process_internal(true);
started = true;
}
diff --git a/editor/debugger/debug_adapter/debug_adapter_server.h b/editor/debugger/debug_adapter/debug_adapter_server.h
index 310bac1b6c..52271b1666 100644
--- a/editor/debugger/debug_adapter/debug_adapter_server.h
+++ b/editor/debugger/debug_adapter/debug_adapter_server.h
@@ -49,6 +49,7 @@ private:
void _notification(int p_what);
public:
+ static int port_override;
DebugAdapterServer();
void start();
void stop();
diff --git a/editor/debugger/editor_debugger_node.cpp b/editor/debugger/editor_debugger_node.cpp
index 2a98f50a3a..3f8df5e313 100644
--- a/editor/debugger/editor_debugger_node.cpp
+++ b/editor/debugger/editor_debugger_node.cpp
@@ -75,7 +75,7 @@ EditorDebuggerNode::EditorDebuggerNode() {
Ref<StyleBoxEmpty> empty;
empty.instantiate();
- tabs->add_theme_style_override("panel", empty);
+ tabs->add_theme_style_override(SceneStringName(panel), empty);
auto_switch_remote_scene_tree = EDITOR_GET("debugger/auto_switch_to_remote_scene_tree");
_add_debugger();
@@ -123,7 +123,7 @@ ScriptEditorDebugger *EditorDebuggerNode::_add_debugger() {
if (tabs->get_tab_count() > 1) {
node->clear_style();
tabs->set_tabs_visible(true);
- tabs->add_theme_style_override("panel", EditorNode::get_singleton()->get_editor_theme()->get_stylebox(SNAME("DebuggerPanel"), EditorStringName(EditorStyles)));
+ tabs->add_theme_style_override(SceneStringName(panel), EditorNode::get_singleton()->get_editor_theme()->get_stylebox(SNAME("DebuggerPanel"), EditorStringName(EditorStyles)));
}
if (!debugger_plugins.is_empty()) {
@@ -318,7 +318,7 @@ void EditorDebuggerNode::_notification(int p_what) {
add_theme_constant_override("margin_left", -EditorNode::get_singleton()->get_editor_theme()->get_stylebox(SNAME("BottomPanelDebuggerOverride"), EditorStringName(EditorStyles))->get_margin(SIDE_LEFT));
add_theme_constant_override("margin_right", -EditorNode::get_singleton()->get_editor_theme()->get_stylebox(SNAME("BottomPanelDebuggerOverride"), EditorStringName(EditorStyles))->get_margin(SIDE_RIGHT));
- tabs->add_theme_style_override("panel", EditorNode::get_singleton()->get_editor_theme()->get_stylebox(SNAME("DebuggerPanel"), EditorStringName(EditorStyles)));
+ tabs->add_theme_style_override(SceneStringName(panel), EditorNode::get_singleton()->get_editor_theme()->get_stylebox(SNAME("DebuggerPanel"), EditorStringName(EditorStyles)));
}
remote_scene_tree->update_icon_max_width();
@@ -496,7 +496,7 @@ void EditorDebuggerNode::set_script_debug_button(MenuButton *p_button) {
p->add_shortcut(ED_GET_SHORTCUT("debugger/continue"), DEBUG_CONTINUE);
p->add_separator();
p->add_check_shortcut(ED_GET_SHORTCUT("debugger/debug_with_external_editor"), DEBUG_WITH_EXTERNAL_EDITOR);
- p->connect("id_pressed", callable_mp(this, &EditorDebuggerNode::_menu_option));
+ p->connect(SceneStringName(id_pressed), callable_mp(this, &EditorDebuggerNode::_menu_option));
_break_state_changed();
script_menu->show();
diff --git a/editor/debugger/editor_debugger_tree.cpp b/editor/debugger/editor_debugger_tree.cpp
index 12b590da3c..f8ffce0c83 100644
--- a/editor/debugger/editor_debugger_tree.cpp
+++ b/editor/debugger/editor_debugger_tree.cpp
@@ -45,7 +45,7 @@ EditorDebuggerTree::EditorDebuggerTree() {
// Popup
item_menu = memnew(PopupMenu);
- item_menu->connect("id_pressed", callable_mp(this, &EditorDebuggerTree::_item_menu_id_pressed));
+ item_menu->connect(SceneStringName(id_pressed), callable_mp(this, &EditorDebuggerTree::_item_menu_id_pressed));
add_child(item_menu);
// File Dialog
diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp
index 37bb048b19..e35ca590b3 100644
--- a/editor/debugger/script_editor_debugger.cpp
+++ b/editor/debugger/script_editor_debugger.cpp
@@ -154,7 +154,7 @@ void ScriptEditorDebugger::update_tabs() {
}
void ScriptEditorDebugger::clear_style() {
- tabs->remove_theme_style_override("panel");
+ tabs->remove_theme_style_override(SceneStringName(panel));
}
void ScriptEditorDebugger::save_node(ObjectID p_id, const String &p_file) {
@@ -857,7 +857,7 @@ void ScriptEditorDebugger::_notification(int p_what) {
[[fallthrough]];
}
case NOTIFICATION_THEME_CHANGED: {
- tabs->add_theme_style_override("panel", get_theme_stylebox(SNAME("DebuggerPanel"), EditorStringName(EditorStyles)));
+ tabs->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("DebuggerPanel"), EditorStringName(EditorStyles)));
skip_breakpoints->set_icon(get_editor_theme_icon(skip_breakpoints_value ? SNAME("DebugSkipBreakpointsOn") : SNAME("DebugSkipBreakpointsOff")));
copy->set_icon(get_editor_theme_icon(SNAME("ActionCopy")));
@@ -1937,7 +1937,7 @@ ScriptEditorDebugger::ScriptEditorDebugger() {
tabs->add_child(dbg);
breakpoints_menu = memnew(PopupMenu);
- breakpoints_menu->connect("id_pressed", callable_mp(this, &ScriptEditorDebugger::_item_menu_id_pressed));
+ breakpoints_menu->connect(SceneStringName(id_pressed), callable_mp(this, &ScriptEditorDebugger::_item_menu_id_pressed));
breakpoints_tree->add_child(breakpoints_menu);
}
@@ -1990,7 +1990,7 @@ ScriptEditorDebugger::ScriptEditorDebugger() {
errors_tab->add_child(error_tree);
item_menu = memnew(PopupMenu);
- item_menu->connect("id_pressed", callable_mp(this, &ScriptEditorDebugger::_item_menu_id_pressed));
+ item_menu->connect(SceneStringName(id_pressed), callable_mp(this, &ScriptEditorDebugger::_item_menu_id_pressed));
error_tree->add_child(item_menu);
tabs->add_child(errors_tab);
diff --git a/editor/dependency_editor.cpp b/editor/dependency_editor.cpp
index 4c21f51e9c..0c870baec1 100644
--- a/editor/dependency_editor.cpp
+++ b/editor/dependency_editor.cpp
@@ -396,7 +396,7 @@ void DependencyEditorOwners::show(const String &p_path) {
DependencyEditorOwners::DependencyEditorOwners() {
file_options = memnew(PopupMenu);
add_child(file_options);
- file_options->connect("id_pressed", callable_mp(this, &DependencyEditorOwners::_file_option));
+ file_options->connect(SceneStringName(id_pressed), callable_mp(this, &DependencyEditorOwners::_file_option));
owners = memnew(ItemList);
owners->set_auto_translate_mode(AUTO_TRANSLATE_MODE_DISABLED);
diff --git a/editor/editor_audio_buses.cpp b/editor/editor_audio_buses.cpp
index 0b5122fce2..a4994d1f92 100644
--- a/editor/editor_audio_buses.cpp
+++ b/editor/editor_audio_buses.cpp
@@ -107,7 +107,7 @@ void EditorAudioBus::_notification(int p_what) {
audio_value_preview_label->add_theme_color_override("font_color", get_theme_color(SNAME("font_color"), SNAME("TooltipLabel")));
audio_value_preview_label->add_theme_color_override("font_shadow_color", get_theme_color(SNAME("font_shadow_color"), SNAME("TooltipLabel")));
- audio_value_preview_box->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("TooltipPanel")));
+ audio_value_preview_box->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("TooltipPanel")));
for (int i = 0; i < effect_options->get_item_count(); i++) {
String class_name = effect_options->get_item_metadata(i);
@@ -127,7 +127,7 @@ void EditorAudioBus::_notification(int p_what) {
} else if (has_focus()) {
draw_style_box(get_theme_stylebox(SNAME("focus"), SNAME("Button")), Rect2(Vector2(), get_size()));
} else {
- draw_style_box(get_theme_stylebox(SNAME("panel"), SNAME("TabContainer")), Rect2(Vector2(), get_size()));
+ draw_style_box(get_theme_stylebox(SceneStringName(panel), SNAME("TabContainer")), Rect2(Vector2(), get_size()));
}
if (get_index() != 0 && hovering_drop) {
@@ -608,7 +608,7 @@ Variant EditorAudioBus::get_drag_data(const Point2 &p_point) {
Panel *p = memnew(Panel);
c->add_child(p);
p->set_modulate(Color(1, 1, 1, 0.7));
- p->add_theme_style_override("panel", get_theme_stylebox(SNAME("focus"), SNAME("Button")));
+ p->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("focus"), SNAME("Button")));
p->set_size(get_size());
p->set_position(-p_point);
set_drag_preview(c);
@@ -837,7 +837,7 @@ EditorAudioBus::EditorAudioBus(EditorAudioBuses *p_buses, bool p_is_master) {
for (int i = 0; i < hbc->get_child_count(); i++) {
Control *child = Object::cast_to<Control>(hbc->get_child(i));
child->begin_bulk_theme_override();
- child->add_theme_style_override("normal", sbempty);
+ child->add_theme_style_override(CoreStringName(normal), sbempty);
child->add_theme_style_override("hover", sbempty);
child->add_theme_style_override("focus", sbempty);
@@ -1062,7 +1062,7 @@ void EditorAudioBuses::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE:
case NOTIFICATION_THEME_CHANGED: {
- bus_scroll->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Tree")));
+ bus_scroll->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("Tree")));
} break;
case NOTIFICATION_READY: {
diff --git a/editor/editor_dock_manager.cpp b/editor/editor_dock_manager.cpp
index 5d98fefa76..ccb47220db 100644
--- a/editor/editor_dock_manager.cpp
+++ b/editor/editor_dock_manager.cpp
@@ -838,7 +838,7 @@ EditorDockManager::EditorDockManager() {
docks_menu = memnew(PopupMenu);
docks_menu->set_hide_on_item_selection(false);
- docks_menu->connect("id_pressed", callable_mp(this, &EditorDockManager::_docks_menu_option));
+ docks_menu->connect(SceneStringName(id_pressed), callable_mp(this, &EditorDockManager::_docks_menu_option));
EditorNode::get_singleton()->get_gui_base()->connect(SceneStringName(theme_changed), callable_mp(this, &EditorDockManager::_update_docks_menu));
}
diff --git a/editor/editor_feature_profile.cpp b/editor/editor_feature_profile.cpp
index 020706c714..ba04f36abe 100644
--- a/editor/editor_feature_profile.cpp
+++ b/editor/editor_feature_profile.cpp
@@ -1010,7 +1010,7 @@ EditorFeatureProfileManager::EditorFeatureProfileManager() {
// Add some spacing above the help label.
Ref<StyleBoxEmpty> sb = memnew(StyleBoxEmpty);
sb->set_content_margin(SIDE_TOP, 20 * EDSCALE);
- no_profile_selected_help->add_theme_style_override("normal", sb);
+ no_profile_selected_help->add_theme_style_override(CoreStringName(normal), sb);
no_profile_selected_help->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER);
no_profile_selected_help->set_v_size_flags(Control::SIZE_EXPAND_FILL);
h_split->add_child(no_profile_selected_help);
diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp
index fa5cdd185f..ec064a92d7 100644
--- a/editor/editor_help.cpp
+++ b/editor/editor_help.cpp
@@ -345,7 +345,7 @@ void EditorHelp::_class_desc_resized(bool p_force_update_theme) {
Ref<StyleBox> class_desc_stylebox = theme_cache.background_style->duplicate();
class_desc_stylebox->set_content_margin(SIDE_LEFT, display_margin);
class_desc_stylebox->set_content_margin(SIDE_RIGHT, display_margin);
- class_desc->add_theme_style_override("normal", class_desc_stylebox);
+ class_desc->add_theme_style_override(CoreStringName(normal), class_desc_stylebox);
class_desc->add_theme_style_override("focused", class_desc_stylebox);
}
}
@@ -3723,7 +3723,7 @@ void EditorHelpBit::set_content_height_limits(float p_min, float p_max) {
void EditorHelpBit::update_content_height() {
float content_height = content->get_content_height();
- const Ref<StyleBox> style = content->get_theme_stylebox("normal");
+ const Ref<StyleBox> style = content->get_theme_stylebox(CoreStringName(normal));
if (style.is_valid()) {
content_height += style->get_content_margin(SIDE_TOP) + style->get_content_margin(SIDE_BOTTOM);
}
diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp
index fafefa7771..c1ee2ef0e0 100644
--- a/editor/editor_inspector.cpp
+++ b/editor/editor_inspector.cpp
@@ -517,9 +517,9 @@ void EditorProperty::_update_property_bg() {
add_theme_style_override("bg_selected", get_theme_stylebox("sub_inspector_property_bg" + itos(count_subinspectors), EditorStringName(EditorStyles)));
add_theme_style_override("bg", get_theme_stylebox("sub_inspector_property_bg" + itos(count_subinspectors), EditorStringName(EditorStyles)));
add_theme_color_override("property_color", get_theme_color(SNAME("sub_inspector_property_color"), EditorStringName(EditorStyles)));
- bottom_editor->add_theme_style_override("panel", get_theme_stylebox("sub_inspector_bg" + itos(count_subinspectors), EditorStringName(EditorStyles)));
+ bottom_editor->add_theme_style_override(SceneStringName(panel), get_theme_stylebox("sub_inspector_bg" + itos(count_subinspectors), EditorStringName(EditorStyles)));
} else {
- bottom_editor->add_theme_style_override("panel", get_theme_stylebox("sub_inspector_bg_no_border", EditorStringName(EditorStyles)));
+ bottom_editor->add_theme_style_override(SceneStringName(panel), get_theme_stylebox("sub_inspector_bg_no_border", EditorStringName(EditorStyles)));
}
} else {
remove_theme_style_override("bg_selected");
@@ -1094,7 +1094,7 @@ void EditorProperty::_update_popup() {
} else {
menu = memnew(PopupMenu);
add_child(menu);
- menu->connect("id_pressed", callable_mp(this, &EditorProperty::menu_option));
+ menu->connect(SceneStringName(id_pressed), callable_mp(this, &EditorProperty::menu_option));
}
menu->add_icon_shortcut(get_editor_theme_icon(SNAME("ActionCopy")), ED_GET_SHORTCUT("property_editor/copy_value"), MENU_COPY_VALUE);
menu->add_icon_shortcut(get_editor_theme_icon(SNAME("ActionPaste")), ED_GET_SHORTCUT("property_editor/paste_value"), MENU_PASTE_VALUE);
@@ -1290,7 +1290,7 @@ void EditorInspectorCategory::gui_input(const Ref<InputEvent> &p_event) {
EditorInspectorCategory::EditorInspectorCategory() {
menu = memnew(PopupMenu);
- menu->connect("id_pressed", callable_mp(this, &EditorInspectorCategory::_handle_menu_option));
+ menu->connect(SceneStringName(id_pressed), callable_mp(this, &EditorInspectorCategory::_handle_menu_option));
menu->add_item(TTR("Open Documentation"), MENU_OPEN_DOCS);
add_child(menu);
}
@@ -2174,7 +2174,7 @@ void EditorInspectorArray::_setup() {
ae.panel->connect(SceneStringName(focus_exited), callable_mp((CanvasItem *)ae.panel, &PanelContainer::queue_redraw));
ae.panel->connect(SceneStringName(draw), callable_mp(this, &EditorInspectorArray::_panel_draw).bind(i));
ae.panel->connect(SceneStringName(gui_input), callable_mp(this, &EditorInspectorArray::_panel_gui_input).bind(i));
- ae.panel->add_theme_style_override(SNAME("panel"), i % 2 ? odd_style : even_style);
+ ae.panel->add_theme_style_override(SceneStringName(panel), i % 2 ? odd_style : even_style);
elements_vbox->add_child(ae.panel);
ae.margin = memnew(MarginContainer);
@@ -2427,7 +2427,7 @@ EditorInspectorArray::EditorInspectorArray(bool p_read_only) {
rmb_popup->add_separator();
rmb_popup->add_item(TTR("Clear Array"), OPTION_CLEAR_ARRAY);
rmb_popup->add_item(TTR("Resize Array..."), OPTION_RESIZE_ARRAY);
- rmb_popup->connect("id_pressed", callable_mp(this, &EditorInspectorArray::_rmb_popup_id_pressed));
+ rmb_popup->connect(SceneStringName(id_pressed), callable_mp(this, &EditorInspectorArray::_rmb_popup_id_pressed));
add_child(rmb_popup);
elements_vbox = memnew(VBoxContainer);
@@ -4053,7 +4053,7 @@ void EditorInspector::_notification(int p_what) {
case NOTIFICATION_READY: {
EditorFeatureProfileManager::get_singleton()->connect("current_feature_profile_changed", callable_mp(this, &EditorInspector::_feature_profile_changed));
set_process(is_visible_in_tree());
- add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Tree")));
+ add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("Tree")));
if (!sub_inspector) {
get_tree()->connect("node_removed", callable_mp(this, &EditorInspector::_node_removed));
}
@@ -4120,7 +4120,7 @@ void EditorInspector::_notification(int p_what) {
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
bool needs_update = false;
if (EditorThemeManager::is_generated_theme_outdated() && !sub_inspector) {
- add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Tree")));
+ add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("Tree")));
}
if (use_settings_name_style && EditorSettings::get_singleton()->check_changed_settings_in_group("interface/editor/localize_settings")) {
diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp
index af06ccb885..087e9ff075 100644
--- a/editor/editor_node.cpp
+++ b/editor/editor_node.cpp
@@ -514,14 +514,14 @@ void EditorNode::_update_theme(bool p_skip_creation) {
// Update styles.
{
- gui_base->add_theme_style_override("panel", theme->get_stylebox(SNAME("Background"), EditorStringName(EditorStyles)));
+ gui_base->add_theme_style_override(SceneStringName(panel), theme->get_stylebox(SNAME("Background"), EditorStringName(EditorStyles)));
main_vbox->set_anchors_and_offsets_preset(Control::PRESET_FULL_RECT, Control::PRESET_MODE_MINSIZE, theme->get_constant(SNAME("window_border_margin"), EditorStringName(Editor)));
main_vbox->add_theme_constant_override("separation", theme->get_constant(SNAME("top_bar_separation"), EditorStringName(Editor)));
- scene_root_parent->add_theme_style_override("panel", theme->get_stylebox(SNAME("Content"), EditorStringName(EditorStyles)));
- bottom_panel->add_theme_style_override("panel", theme->get_stylebox(SNAME("BottomPanel"), EditorStringName(EditorStyles)));
+ scene_root_parent->add_theme_style_override(SceneStringName(panel), theme->get_stylebox(SNAME("Content"), EditorStringName(EditorStyles)));
+ bottom_panel->add_theme_style_override(SceneStringName(panel), theme->get_stylebox(SNAME("BottomPanel"), EditorStringName(EditorStyles)));
distraction_free->set_icon(theme->get_icon(SNAME("DistractionFree"), EditorStringName(EditorIcons)));
- distraction_free->add_theme_style_override(SceneStringName(pressed), theme->get_stylebox("normal", "FlatMenuButton"));
+ distraction_free->add_theme_style_override(SceneStringName(pressed), theme->get_stylebox(CoreStringName(normal), "FlatMenuButton"));
help_menu->set_item_icon(help_menu->get_item_index(HELP_SEARCH), theme->get_icon(SNAME("HelpSearch"), EditorStringName(EditorIcons)));
help_menu->set_item_icon(help_menu->get_item_index(HELP_COPY_SYSTEM_INFO), theme->get_icon(SNAME("ActionCopy"), EditorStringName(EditorIcons)));
@@ -529,7 +529,7 @@ void EditorNode::_update_theme(bool p_skip_creation) {
help_menu->set_item_icon(help_menu->get_item_index(HELP_SUPPORT_GODOT_DEVELOPMENT), theme->get_icon(SNAME("Heart"), EditorStringName(EditorIcons)));
if (EditorDebuggerNode::get_singleton()->is_visible()) {
- bottom_panel->add_theme_style_override("panel", theme->get_stylebox(SNAME("BottomPanelDebuggerOverride"), EditorStringName(EditorStyles)));
+ bottom_panel->add_theme_style_override(SceneStringName(panel), theme->get_stylebox(SNAME("BottomPanelDebuggerOverride"), EditorStringName(EditorStyles)));
}
for (int i = 0; i < main_editor_buttons.size(); i++) {
@@ -6792,7 +6792,7 @@ EditorNode::EditorNode() {
scene_root_parent = memnew(PanelContainer);
scene_root_parent->set_custom_minimum_size(Size2(0, 80) * EDSCALE);
- scene_root_parent->add_theme_style_override("panel", theme->get_stylebox(SNAME("Content"), EditorStringName(EditorStyles)));
+ scene_root_parent->add_theme_style_override(SceneStringName(panel), theme->get_stylebox(SNAME("Content"), EditorStringName(EditorStyles)));
scene_root_parent->set_draw_behind_parent(true);
srt->add_child(scene_root_parent);
scene_root_parent->set_v_size_flags(Control::SIZE_EXPAND_FILL);
@@ -6902,7 +6902,7 @@ EditorNode::EditorNode() {
recent_scenes = memnew(PopupMenu);
file_menu->add_submenu_node_item(TTR("Open Recent"), recent_scenes, FILE_OPEN_RECENT);
- recent_scenes->connect("id_pressed", callable_mp(this, &EditorNode::_open_recent_scene));
+ recent_scenes->connect(SceneStringName(id_pressed), callable_mp(this, &EditorNode::_open_recent_scene));
file_menu->add_separator();
file_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/save_scene", TTR("Save Scene"), KeyModifierMask::CMD_OR_CTRL + Key::S), FILE_SAVE_SCENE);
@@ -6947,7 +6947,7 @@ EditorNode::EditorNode() {
apple_menu->add_shortcut(ED_GET_SHORTCUT("editor/editor_settings"), SETTINGS_PREFERENCES);
apple_menu->add_separator();
- apple_menu->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option));
+ apple_menu->connect(SceneStringName(id_pressed), callable_mp(this, &EditorNode::_menu_option));
}
#endif
@@ -6956,7 +6956,7 @@ EditorNode::EditorNode() {
main_menu->add_child(project_menu);
project_menu->add_shortcut(ED_SHORTCUT_AND_COMMAND("editor/project_settings", TTR("Project Settings..."), Key::NONE, TTR("Project Settings")), RUN_SETTINGS);
- project_menu->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option));
+ project_menu->connect(SceneStringName(id_pressed), callable_mp(this, &EditorNode::_menu_option));
project_menu->add_separator();
project_menu->add_item(TTR("Version Control"), VCS_MENU);
@@ -7028,7 +7028,7 @@ EditorNode::EditorNode() {
editor_layouts = memnew(PopupMenu);
editor_layouts->set_auto_translate_mode(AUTO_TRANSLATE_MODE_DISABLED);
settings_menu->add_submenu_node_item(TTR("Editor Layout"), editor_layouts);
- editor_layouts->connect("id_pressed", callable_mp(this, &EditorNode::_layout_menu_option));
+ editor_layouts->connect(SceneStringName(id_pressed), callable_mp(this, &EditorNode::_layout_menu_option));
settings_menu->add_separator();
ED_SHORTCUT_AND_COMMAND("editor/take_screenshot", TTR("Take Screenshot"), KeyModifierMask::CTRL | Key::F12);
@@ -7071,7 +7071,7 @@ EditorNode::EditorNode() {
}
main_menu->add_child(help_menu);
- help_menu->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option));
+ help_menu->connect(SceneStringName(id_pressed), callable_mp(this, &EditorNode::_menu_option));
ED_SHORTCUT_AND_COMMAND("editor/editor_help", TTR("Search Help..."), Key::F1);
ED_SHORTCUT_OVERRIDE("editor/editor_help", "macos", KeyModifierMask::ALT | Key::SPACE);
@@ -7170,7 +7170,7 @@ EditorNode::EditorNode() {
update_spinner = memnew(MenuButton);
right_menu_hb->add_child(update_spinner);
update_spinner->set_icon(theme->get_icon(SNAME("Progress1"), EditorStringName(EditorIcons)));
- update_spinner->get_popup()->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option));
+ update_spinner->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &EditorNode::_menu_option));
PopupMenu *p = update_spinner->get_popup();
p->add_radio_check_item(TTR("Update Continuously"), SETTINGS_UPDATE_CONTINUOUSLY);
p->add_radio_check_item(TTR("Update When Changed"), SETTINGS_UPDATE_WHEN_CHANGED);
@@ -7341,11 +7341,11 @@ EditorNode::EditorNode() {
gui_base->add_child(file_script);
file_script->connect("file_selected", callable_mp(this, &EditorNode::_dialog_action));
- file_menu->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option));
+ file_menu->connect(SceneStringName(id_pressed), callable_mp(this, &EditorNode::_menu_option));
file_menu->connect("about_to_popup", callable_mp(this, &EditorNode::_update_file_menu_opened));
file_menu->connect("popup_hide", callable_mp(this, &EditorNode::_update_file_menu_closed));
- settings_menu->connect("id_pressed", callable_mp(this, &EditorNode::_menu_option));
+ settings_menu->connect(SceneStringName(id_pressed), callable_mp(this, &EditorNode::_menu_option));
file->connect("file_selected", callable_mp(this, &EditorNode::_dialog_action));
file_templates->connect("file_selected", callable_mp(this, &EditorNode::_dialog_action));
diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp
index a455258a6d..ecc31bb0e2 100644
--- a/editor/editor_properties.cpp
+++ b/editor/editor_properties.cpp
@@ -854,7 +854,7 @@ EditorPropertyLayersGrid::EditorPropertyLayersGrid() {
layer_rename = memnew(PopupMenu);
layer_rename->add_item(TTR("Rename layer"), 0);
add_child(layer_rename);
- layer_rename->connect("id_pressed", callable_mp(this, &EditorPropertyLayersGrid::_rename_pressed));
+ layer_rename->connect(SceneStringName(id_pressed), callable_mp(this, &EditorPropertyLayersGrid::_rename_pressed));
}
Size2 EditorPropertyLayersGrid::get_grid_size() const {
@@ -1304,7 +1304,7 @@ EditorPropertyLayers::EditorPropertyLayers() {
layers = memnew(PopupMenu);
add_child(layers);
layers->set_hide_on_checkable_item_selection(false);
- layers->connect("id_pressed", callable_mp(this, &EditorPropertyLayers::_menu_pressed));
+ layers->connect(SceneStringName(id_pressed), callable_mp(this, &EditorPropertyLayers::_menu_pressed));
layers->connect("popup_hide", callable_mp((BaseButton *)button, &BaseButton::set_pressed).bind(false));
ProjectSettings::get_singleton()->connect("settings_changed", callable_mp(this, &EditorPropertyLayers::_refresh_names));
}
@@ -1687,7 +1687,7 @@ EditorPropertyEasing::EditorPropertyEasing() {
preset = memnew(PopupMenu);
add_child(preset);
- preset->connect("id_pressed", callable_mp(this, &EditorPropertyEasing::_set_preset));
+ preset->connect(SceneStringName(id_pressed), callable_mp(this, &EditorPropertyEasing::_set_preset));
spin = memnew(EditorSpinSlider);
spin->set_flat(true);
@@ -2990,7 +2990,7 @@ EditorPropertyNodePath::EditorPropertyNodePath() {
menu->get_popup()->add_item(TTR("Copy as Text"), ACTION_COPY);
menu->get_popup()->add_item(TTR("Edit"), ACTION_EDIT);
menu->get_popup()->add_item(TTR("Show Node in Tree"), ACTION_SELECT);
- menu->get_popup()->connect(SNAME("id_pressed"), callable_mp(this, &EditorPropertyNodePath::_menu_option));
+ menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &EditorPropertyNodePath::_menu_option));
edit = memnew(LineEdit);
edit->set_h_size_flags(SIZE_EXPAND_FILL);
diff --git a/editor/editor_properties_array_dict.cpp b/editor/editor_properties_array_dict.cpp
index b5f34ecb3d..555165c156 100644
--- a/editor/editor_properties_array_dict.cpp
+++ b/editor/editor_properties_array_dict.cpp
@@ -841,7 +841,7 @@ EditorPropertyArray::EditorPropertyArray() {
change_type = memnew(PopupMenu);
add_child(change_type);
- change_type->connect("id_pressed", callable_mp(this, &EditorPropertyArray::_change_type_menu));
+ change_type->connect(SceneStringName(id_pressed), callable_mp(this, &EditorPropertyArray::_change_type_menu));
changing_type_index = -1;
subtype = Variant::NIL;
@@ -1005,7 +1005,7 @@ void EditorPropertyDictionary::update_property() {
add_panel = memnew(PanelContainer);
property_vbox->add_child(add_panel);
- add_panel->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("DictionaryAddItem")));
+ add_panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("DictionaryAddItem")));
VBoxContainer *add_vbox = memnew(VBoxContainer);
add_panel->add_child(add_vbox);
@@ -1101,7 +1101,7 @@ void EditorPropertyDictionary::_notification(int p_what) {
if (button_add_item) {
button_add_item->set_icon(get_editor_theme_icon(SNAME("Add")));
- add_panel->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("DictionaryAddItem")));
+ add_panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("DictionaryAddItem")));
}
} break;
}
@@ -1157,7 +1157,7 @@ EditorPropertyDictionary::EditorPropertyDictionary() {
paginator = nullptr;
change_type = memnew(PopupMenu);
add_child(change_type);
- change_type->connect("id_pressed", callable_mp(this, &EditorPropertyDictionary::_change_type_menu));
+ change_type->connect(SceneStringName(id_pressed), callable_mp(this, &EditorPropertyDictionary::_change_type_menu));
changing_type_index = -1;
has_borders = true;
}
diff --git a/editor/editor_resource_picker.cpp b/editor/editor_resource_picker.cpp
index 50820ac12f..fbd9d84e26 100644
--- a/editor/editor_resource_picker.cpp
+++ b/editor/editor_resource_picker.cpp
@@ -811,7 +811,7 @@ void EditorResourcePicker::_notification(int p_what) {
} break;
case NOTIFICATION_DRAW: {
- draw_style_box(get_theme_stylebox(SNAME("panel"), SNAME("Tree")), Rect2(Point2(), get_size()));
+ draw_style_box(get_theme_stylebox(SceneStringName(panel), SNAME("Tree")), Rect2(Point2(), get_size()));
} break;
case NOTIFICATION_DRAG_BEGIN: {
@@ -947,7 +947,7 @@ void EditorResourcePicker::_ensure_resource_menu() {
edit_menu = memnew(PopupMenu);
edit_menu->add_theme_constant_override("icon_max_width", get_theme_constant(SNAME("class_icon_size"), EditorStringName(Editor)));
add_child(edit_menu);
- edit_menu->connect("id_pressed", callable_mp(this, &EditorResourcePicker::_edit_menu_cbk));
+ edit_menu->connect(SceneStringName(id_pressed), callable_mp(this, &EditorResourcePicker::_edit_menu_cbk));
edit_menu->connect("popup_hide", callable_mp((BaseButton *)edit_button, &BaseButton::set_pressed).bind(false));
}
diff --git a/editor/editor_run_native.cpp b/editor/editor_run_native.cpp
index 5c50231623..715f310b5b 100644
--- a/editor/editor_run_native.cpp
+++ b/editor/editor_run_native.cpp
@@ -188,7 +188,7 @@ EditorRunNative::EditorRunNative() {
remote_debug = memnew(MenuButton);
remote_debug->set_flat(false);
remote_debug->set_theme_type_variation("RunBarButton");
- remote_debug->get_popup()->connect("id_pressed", callable_mp(this, &EditorRunNative::start_run_native));
+ remote_debug->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &EditorRunNative::start_run_native));
remote_debug->set_tooltip_text(TTR("Remote Debug"));
remote_debug->set_disabled(true);
diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp
index 1e292a3a7b..782d64621f 100644
--- a/editor/editor_settings.cpp
+++ b/editor/editor_settings.cpp
@@ -571,7 +571,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
EDITOR_SETTING_USAGE(Variant::STRING, PROPERTY_HINT_GLOBAL_FILE, "filesystem/import/blender/blender_path", "", "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)
EDITOR_SETTING_USAGE(Variant::INT, PROPERTY_HINT_RANGE, "filesystem/import/blender/rpc_port", 6011, "0,65535,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)
EDITOR_SETTING_USAGE(Variant::FLOAT, PROPERTY_HINT_RANGE, "filesystem/import/blender/rpc_server_uptime", 5, "0,300,1,or_greater,suffix:s", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)
- EDITOR_SETTING_USAGE(Variant::STRING, PROPERTY_HINT_GLOBAL_FILE, "filesystem/import/fbx2gltf/fbx2gltf_path", "", "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)
+ EDITOR_SETTING_USAGE(Variant::STRING, PROPERTY_HINT_GLOBAL_FILE, "filesystem/import/fbx/fbx2gltf_path", "", "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)
// Tools (denoise)
EDITOR_SETTING_USAGE(Variant::STRING, PROPERTY_HINT_GLOBAL_DIR, "filesystem/tools/oidn/oidn_denoise_path", "", "", PROPERTY_USAGE_DEFAULT)
diff --git a/editor/editor_settings_dialog.cpp b/editor/editor_settings_dialog.cpp
index b1f3875175..7f9310f715 100644
--- a/editor/editor_settings_dialog.cpp
+++ b/editor/editor_settings_dialog.cpp
@@ -211,7 +211,7 @@ void EditorSettingsDialog::_update_icons() {
shortcut_search_box->set_clear_button_enabled(true);
restart_close_button->set_icon(shortcuts->get_editor_theme_icon(SNAME("Close")));
- restart_container->add_theme_style_override("panel", shortcuts->get_theme_stylebox(SNAME("panel"), SNAME("Tree")));
+ restart_container->add_theme_style_override(SceneStringName(panel), shortcuts->get_theme_stylebox(SceneStringName(panel), SNAME("Tree")));
restart_icon->set_texture(shortcuts->get_editor_theme_icon(SNAME("StatusWarning")));
restart_label->add_theme_color_override("font_color", shortcuts->get_theme_color(SNAME("warning_color"), EditorStringName(Editor)));
}
diff --git a/editor/export/export_template_manager.cpp b/editor/export/export_template_manager.cpp
index 339a6e4b7f..b6584a6092 100644
--- a/editor/export/export_template_manager.cpp
+++ b/editor/export/export_template_manager.cpp
@@ -973,7 +973,7 @@ ExportTemplateManager::ExportTemplateManager() {
mirror_options_button->get_popup()->add_item(TTR("Copy Mirror URL"), COPY_MIRROR_URL);
mirror_options_button->set_disabled(!downloads_available);
download_install_hb->add_child(mirror_options_button);
- mirror_options_button->get_popup()->connect("id_pressed", callable_mp(this, &ExportTemplateManager::_mirror_options_button_cbk));
+ mirror_options_button->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &ExportTemplateManager::_mirror_options_button_cbk));
download_install_hb->add_spacer();
diff --git a/editor/export/project_export.cpp b/editor/export/project_export.cpp
index dd283ebfd6..7787512cc2 100644
--- a/editor/export/project_export.cpp
+++ b/editor/export/project_export.cpp
@@ -1373,7 +1373,7 @@ ProjectExportDialog::ProjectExportDialog() {
file_mode_popup->add_item(TTR("Strip Visuals"), EditorExportPreset::MODE_FILE_STRIP);
file_mode_popup->add_item(TTR("Keep"), EditorExportPreset::MODE_FILE_KEEP);
file_mode_popup->add_item(TTR("Remove"), EditorExportPreset::MODE_FILE_REMOVE);
- file_mode_popup->connect("id_pressed", callable_mp(this, &ProjectExportDialog::_set_file_export_mode));
+ file_mode_popup->connect(SceneStringName(id_pressed), callable_mp(this, &ProjectExportDialog::_set_file_export_mode));
include_filters = memnew(LineEdit);
resources_vb->add_margin_child(
diff --git a/editor/fbx_importer_manager.cpp b/editor/fbx_importer_manager.cpp
index f9673771e1..1fded345c8 100644
--- a/editor/fbx_importer_manager.cpp
+++ b/editor/fbx_importer_manager.cpp
@@ -50,7 +50,7 @@ void FBXImporterManager::_notification(int p_what) {
}
void FBXImporterManager::show_dialog(bool p_exclusive) {
- String fbx2gltf_path = EDITOR_GET("filesystem/import/fbx2gltf/fbx2gltf_path");
+ String fbx2gltf_path = EDITOR_GET("filesystem/import/fbx/fbx2gltf_path");
fbx_path->set_text(fbx2gltf_path);
_validate_path(fbx2gltf_path);
@@ -109,7 +109,7 @@ void FBXImporterManager::_select_file(const String &p_path) {
void FBXImporterManager::_path_confirmed() {
String path = fbx_path->get_text();
- EditorSettings::get_singleton()->set("filesystem/import/fbx2gltf/fbx2gltf_path", path);
+ EditorSettings::get_singleton()->set("filesystem/import/fbx/fbx2gltf_path", path);
EditorSettings::get_singleton()->save();
}
diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp
index c07667ac12..f91e970283 100644
--- a/editor/filesystem_dock.cpp
+++ b/editor/filesystem_dock.cpp
@@ -556,8 +556,8 @@ void FileSystemDock::_notification(int p_what) {
files->connect("item_activated", callable_mp(this, &FileSystemDock::_file_list_activate_file));
button_hist_next->connect(SceneStringName(pressed), callable_mp(this, &FileSystemDock::_fw_history));
button_hist_prev->connect(SceneStringName(pressed), callable_mp(this, &FileSystemDock::_bw_history));
- file_list_popup->connect("id_pressed", callable_mp(this, &FileSystemDock::_file_list_rmb_option));
- tree_popup->connect("id_pressed", callable_mp(this, &FileSystemDock::_tree_rmb_option));
+ file_list_popup->connect(SceneStringName(id_pressed), callable_mp(this, &FileSystemDock::_file_list_rmb_option));
+ tree_popup->connect(SceneStringName(id_pressed), callable_mp(this, &FileSystemDock::_tree_rmb_option));
current_path_line_edit->connect("text_submitted", callable_mp(this, &FileSystemDock::_navigate_to_path).bind(false));
always_show_folders = bool(EDITOR_GET("docks/filesystem/always_show_folders"));
@@ -646,7 +646,7 @@ void FileSystemDock::_notification(int p_what) {
button_hist_prev->set_icon(get_editor_theme_icon(SNAME("Back")));
}
- overwrite_dialog_scroll->add_theme_style_override("panel", get_theme_stylebox("panel", "Tree"));
+ overwrite_dialog_scroll->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), "Tree"));
} break;
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
@@ -3174,7 +3174,7 @@ void FileSystemDock::_file_and_folders_fill_popup(PopupMenu *p_popup, const Vect
if (p_paths.size() == 1 && p_display_path_dependent_options) {
PopupMenu *new_menu = memnew(PopupMenu);
- new_menu->connect("id_pressed", callable_mp(this, &FileSystemDock::_tree_rmb_option));
+ new_menu->connect(SceneStringName(id_pressed), callable_mp(this, &FileSystemDock::_tree_rmb_option));
p_popup->add_submenu_node_item(TTR("Create New"), new_menu, FILE_NEW);
p_popup->set_item_icon(p_popup->get_item_index(FILE_NEW), get_editor_theme_icon(SNAME("Add")));
@@ -3199,7 +3199,7 @@ void FileSystemDock::_file_and_folders_fill_popup(PopupMenu *p_popup, const Vect
if (p_paths[0] != "res://") {
PopupMenu *folder_colors_menu = memnew(PopupMenu);
- folder_colors_menu->connect("id_pressed", callable_mp(this, &FileSystemDock::_folder_color_index_pressed).bind(folder_colors_menu));
+ folder_colors_menu->connect(SceneStringName(id_pressed), callable_mp(this, &FileSystemDock::_folder_color_index_pressed).bind(folder_colors_menu));
p_popup->add_submenu_node_item(TTR("Set Folder Color..."), folder_colors_menu);
p_popup->set_item_icon(-1, get_editor_theme_icon(SNAME("Paint")));
@@ -3771,7 +3771,7 @@ MenuButton *FileSystemDock::_create_file_menu_button() {
button->set_tooltip_text(TTR("Sort Files"));
PopupMenu *p = button->get_popup();
- p->connect("id_pressed", callable_mp(this, &FileSystemDock::_file_sort_popup));
+ p->connect(SceneStringName(id_pressed), callable_mp(this, &FileSystemDock::_file_sort_popup));
p->add_radio_check_item(TTR("Sort by Name (Ascending)"), FILE_SORT_NAME);
p->add_radio_check_item(TTR("Sort by Name (Descending)"), FILE_SORT_NAME_REVERSE);
p->add_radio_check_item(TTR("Sort by Type (Ascending)"), FILE_SORT_TYPE);
diff --git a/editor/groups_editor.cpp b/editor/groups_editor.cpp
index fc2ea80be9..ed83ae98f3 100644
--- a/editor/groups_editor.cpp
+++ b/editor/groups_editor.cpp
@@ -858,7 +858,7 @@ GroupsEditor::GroupsEditor() {
add_child(tree);
menu = memnew(PopupMenu);
- menu->connect("id_pressed", callable_mp(this, &GroupsEditor::_menu_id_pressed));
+ menu->connect(SceneStringName(id_pressed), callable_mp(this, &GroupsEditor::_menu_id_pressed));
tree->add_child(menu);
ProjectSettingsEditor::get_singleton()->get_group_settings()->connect("group_changed", callable_mp(this, &GroupsEditor::_update_groups_and_tree));
diff --git a/editor/gui/editor_bottom_panel.cpp b/editor/gui/editor_bottom_panel.cpp
index 3dbefa5cbc..f2c4a13e05 100644
--- a/editor/gui/editor_bottom_panel.cpp
+++ b/editor/gui/editor_bottom_panel.cpp
@@ -81,9 +81,9 @@ void EditorBottomPanel::_switch_to_item(bool p_visible, int p_idx) {
}
if (EditorDebuggerNode::get_singleton() == items[p_idx].control) {
// This is the debug panel which uses tabs, so the top section should be smaller.
- add_theme_style_override("panel", get_theme_stylebox(SNAME("BottomPanelDebuggerOverride"), EditorStringName(EditorStyles)));
+ add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("BottomPanelDebuggerOverride"), EditorStringName(EditorStyles)));
} else {
- add_theme_style_override("panel", get_theme_stylebox(SNAME("BottomPanel"), EditorStringName(EditorStyles)));
+ add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("BottomPanel"), EditorStringName(EditorStyles)));
}
center_split->set_dragger_visibility(SplitContainer::DRAGGER_VISIBLE);
center_split->set_collapsed(false);
@@ -92,7 +92,7 @@ void EditorBottomPanel::_switch_to_item(bool p_visible, int p_idx) {
}
expand_button->show();
} else {
- add_theme_style_override("panel", get_theme_stylebox(SNAME("BottomPanel"), EditorStringName(EditorStyles)));
+ add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("BottomPanel"), EditorStringName(EditorStyles)));
items[p_idx].button->set_pressed_no_signal(false);
items[p_idx].control->set_visible(false);
center_split->set_dragger_visibility(SplitContainer::DRAGGER_HIDDEN);
diff --git a/editor/gui/editor_file_dialog.cpp b/editor/gui/editor_file_dialog.cpp
index 8883c0b9af..97c54e8f48 100644
--- a/editor/gui/editor_file_dialog.cpp
+++ b/editor/gui/editor_file_dialog.cpp
@@ -2265,7 +2265,7 @@ EditorFileDialog::EditorFileDialog() {
list_vb->add_child(item_list);
item_menu = memnew(PopupMenu);
- item_menu->connect("id_pressed", callable_mp(this, &EditorFileDialog::_item_menu_id_pressed));
+ item_menu->connect(SceneStringName(id_pressed), callable_mp(this, &EditorFileDialog::_item_menu_id_pressed));
add_child(item_menu);
// Other stuff.
diff --git a/editor/gui/editor_object_selector.cpp b/editor/gui/editor_object_selector.cpp
index a713aa1ecd..0985753430 100644
--- a/editor/gui/editor_object_selector.cpp
+++ b/editor/gui/editor_object_selector.cpp
@@ -251,7 +251,7 @@ EditorObjectSelector::EditorObjectSelector(EditorSelectionHistory *p_history) {
sub_objects_menu->set_auto_translate_mode(AUTO_TRANSLATE_MODE_DISABLED);
add_child(sub_objects_menu);
sub_objects_menu->connect("about_to_popup", callable_mp(this, &EditorObjectSelector::_about_to_show));
- sub_objects_menu->connect("id_pressed", callable_mp(this, &EditorObjectSelector::_id_pressed));
+ sub_objects_menu->connect(SceneStringName(id_pressed), callable_mp(this, &EditorObjectSelector::_id_pressed));
set_tooltip_text(TTR("Open a list of sub-resources."));
}
diff --git a/editor/gui/editor_run_bar.cpp b/editor/gui/editor_run_bar.cpp
index 31331126b2..af044cbfce 100644
--- a/editor/gui/editor_run_bar.cpp
+++ b/editor/gui/editor_run_bar.cpp
@@ -56,11 +56,11 @@ void EditorRunBar::_notification(int p_what) {
stop_button->set_icon(get_editor_theme_icon(SNAME("Stop")));
if (is_movie_maker_enabled()) {
- main_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("LaunchPadMovieMode"), EditorStringName(EditorStyles)));
- write_movie_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("MovieWriterButtonPressed"), EditorStringName(EditorStyles)));
+ main_panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("LaunchPadMovieMode"), EditorStringName(EditorStyles)));
+ write_movie_panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("MovieWriterButtonPressed"), EditorStringName(EditorStyles)));
} else {
- main_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("LaunchPadNormal"), EditorStringName(EditorStyles)));
- write_movie_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("MovieWriterButtonNormal"), EditorStringName(EditorStyles)));
+ main_panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("LaunchPadNormal"), EditorStringName(EditorStyles)));
+ write_movie_panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("MovieWriterButtonNormal"), EditorStringName(EditorStyles)));
}
write_movie_button->set_icon(get_editor_theme_icon(SNAME("MainMovieWrite")));
@@ -112,11 +112,11 @@ void EditorRunBar::_update_play_buttons() {
void EditorRunBar::_write_movie_toggled(bool p_enabled) {
if (p_enabled) {
- add_theme_style_override("panel", get_theme_stylebox(SNAME("LaunchPadMovieMode"), EditorStringName(EditorStyles)));
- write_movie_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("MovieWriterButtonPressed"), EditorStringName(EditorStyles)));
+ add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("LaunchPadMovieMode"), EditorStringName(EditorStyles)));
+ write_movie_panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("MovieWriterButtonPressed"), EditorStringName(EditorStyles)));
} else {
- add_theme_style_override("panel", get_theme_stylebox(SNAME("LaunchPadNormal"), EditorStringName(EditorStyles)));
- write_movie_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("MovieWriterButtonNormal"), EditorStringName(EditorStyles)));
+ add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("LaunchPadNormal"), EditorStringName(EditorStyles)));
+ write_movie_panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("MovieWriterButtonNormal"), EditorStringName(EditorStyles)));
}
}
diff --git a/editor/gui/editor_scene_tabs.cpp b/editor/gui/editor_scene_tabs.cpp
index f1ca59e0ac..2622645d7c 100644
--- a/editor/gui/editor_scene_tabs.cpp
+++ b/editor/gui/editor_scene_tabs.cpp
@@ -50,7 +50,7 @@ EditorSceneTabs *EditorSceneTabs::singleton = nullptr;
void EditorSceneTabs::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_THEME_CHANGED: {
- tabbar_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("tabbar_background"), SNAME("TabContainer")));
+ tabbar_panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("tabbar_background"), SNAME("TabContainer")));
scene_tabs->add_theme_constant_override("icon_max_width", get_theme_constant(SNAME("class_icon_size"), EditorStringName(Editor)));
scene_tab_add->set_icon(get_editor_theme_icon(SNAME("Add")));
@@ -409,7 +409,7 @@ EditorSceneTabs::EditorSceneTabs() {
scene_tabs_context_menu = memnew(PopupMenu);
tabbar_container->add_child(scene_tabs_context_menu);
- scene_tabs_context_menu->connect("id_pressed", callable_mp(EditorNode::get_singleton(), &EditorNode::trigger_menu_option).bind(false));
+ scene_tabs_context_menu->connect(SceneStringName(id_pressed), callable_mp(EditorNode::get_singleton(), &EditorNode::trigger_menu_option).bind(false));
scene_tab_add = memnew(Button);
scene_tab_add->set_flat(true);
diff --git a/editor/gui/editor_spin_slider.cpp b/editor/gui/editor_spin_slider.cpp
index bf487a5769..a838299288 100644
--- a/editor/gui/editor_spin_slider.cpp
+++ b/editor/gui/editor_spin_slider.cpp
@@ -300,7 +300,7 @@ void EditorSpinSlider::_update_value_input_stylebox() {
stylebox->set_content_margin(SIDE_LEFT, (!get_label().is_empty() ? 23 : 16) * EDSCALE);
}
- value_input->add_theme_style_override("normal", stylebox);
+ value_input->add_theme_style_override(CoreStringName(normal), stylebox);
}
void EditorSpinSlider::_draw_spin_slider() {
diff --git a/editor/gui/editor_toaster.cpp b/editor/gui/editor_toaster.cpp
index df6c494392..9be58326ac 100644
--- a/editor/gui/editor_toaster.cpp
+++ b/editor/gui/editor_toaster.cpp
@@ -348,13 +348,13 @@ Control *EditorToaster::popup(Control *p_control, Severity p_severity, double p_
panel->set_tooltip_text(p_tooltip);
switch (p_severity) {
case SEVERITY_INFO:
- panel->add_theme_style_override("panel", info_panel_style_background);
+ panel->add_theme_style_override(SceneStringName(panel), info_panel_style_background);
break;
case SEVERITY_WARNING:
- panel->add_theme_style_override("panel", warning_panel_style_background);
+ panel->add_theme_style_override(SceneStringName(panel), warning_panel_style_background);
break;
case SEVERITY_ERROR:
- panel->add_theme_style_override("panel", error_panel_style_background);
+ panel->add_theme_style_override(SceneStringName(panel), error_panel_style_background);
break;
default:
break;
@@ -552,7 +552,7 @@ EditorToaster::EditorToaster() {
// Disable notification button.
disable_notifications_panel = memnew(PanelContainer);
disable_notifications_panel->set_as_top_level(true);
- disable_notifications_panel->add_theme_style_override("panel", info_panel_style_background);
+ disable_notifications_panel->add_theme_style_override(SceneStringName(panel), info_panel_style_background);
add_child(disable_notifications_panel);
disable_notifications_button = memnew(Button);
diff --git a/editor/gui/editor_zoom_widget.cpp b/editor/gui/editor_zoom_widget.cpp
index e3d8d4b224..73afbc3ab5 100644
--- a/editor/gui/editor_zoom_widget.cpp
+++ b/editor/gui/editor_zoom_widget.cpp
@@ -205,7 +205,7 @@ EditorZoomWidget::EditorZoomWidget() {
zoom_reset->set_flat(true);
Ref<StyleBoxEmpty> empty_stylebox = memnew(StyleBoxEmpty);
- zoom_reset->add_theme_style_override("normal", empty_stylebox);
+ zoom_reset->add_theme_style_override(CoreStringName(normal), empty_stylebox);
zoom_reset->add_theme_style_override("hover", empty_stylebox);
zoom_reset->add_theme_style_override("focus", empty_stylebox);
zoom_reset->add_theme_style_override(SceneStringName(pressed), empty_stylebox);
diff --git a/editor/import/3d/scene_import_settings.cpp b/editor/import/3d/scene_import_settings.cpp
index 4c78c620c1..129d0544c3 100644
--- a/editor/import/3d/scene_import_settings.cpp
+++ b/editor/import/3d/scene_import_settings.cpp
@@ -1261,7 +1261,7 @@ void SceneImportSettingsDialog::_notification(int p_what) {
case NOTIFICATION_THEME_CHANGED: {
action_menu->begin_bulk_theme_override();
- action_menu->add_theme_style_override("normal", get_theme_stylebox("normal", "Button"));
+ action_menu->add_theme_style_override(CoreStringName(normal), get_theme_stylebox(CoreStringName(normal), "Button"));
action_menu->add_theme_style_override("hover", get_theme_stylebox("hover", "Button"));
action_menu->add_theme_style_override(SceneStringName(pressed), get_theme_stylebox(SceneStringName(pressed), "Button"));
action_menu->end_bulk_theme_override();
@@ -1584,7 +1584,7 @@ SceneImportSettingsDialog::SceneImportSettingsDialog() {
action_menu->get_popup()->add_item(TTR("Set Animation Save Paths"), ACTION_CHOOSE_ANIMATION_SAVE_PATHS);
action_menu->get_popup()->add_item(TTR("Set Mesh Save Paths"), ACTION_CHOOSE_MESH_SAVE_PATHS);
- action_menu->get_popup()->connect("id_pressed", callable_mp(this, &SceneImportSettingsDialog::_menu_callback));
+ action_menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &SceneImportSettingsDialog::_menu_callback));
tree_split = memnew(HSplitContainer);
main_vb->add_child(tree_split);
diff --git a/editor/import/dynamic_font_import_settings.cpp b/editor/import/dynamic_font_import_settings.cpp
index aad7302ec5..9b6a7b9a93 100644
--- a/editor/import/dynamic_font_import_settings.cpp
+++ b/editor/import/dynamic_font_import_settings.cpp
@@ -1515,8 +1515,8 @@ DynamicFontImportSettingsDialog::DynamicFontImportSettingsDialog() {
for (int i = 0; i < 16; i++) {
glyph_table->set_column_title(i + 1, String::num_int64(i, 16));
}
- glyph_table->add_theme_style_override("selected", glyph_table->get_theme_stylebox(SNAME("panel")));
- glyph_table->add_theme_style_override("selected_focus", glyph_table->get_theme_stylebox(SNAME("panel")));
+ glyph_table->add_theme_style_override("selected", glyph_table->get_theme_stylebox(SceneStringName(panel)));
+ glyph_table->add_theme_style_override("selected_focus", glyph_table->get_theme_stylebox(SceneStringName(panel)));
glyph_table->add_theme_constant_override("h_separation", 0);
glyph_table->set_h_size_flags(Control::SIZE_EXPAND_FILL);
glyph_table->set_v_size_flags(Control::SIZE_EXPAND_FILL);
diff --git a/editor/import_dock.cpp b/editor/import_dock.cpp
index 2d87e6592f..3c06c68414 100644
--- a/editor/import_dock.cpp
+++ b/editor/import_dock.cpp
@@ -718,7 +718,7 @@ void ImportDock::_notification(int p_what) {
switch (p_what) {
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
if (EditorThemeManager::is_generated_theme_outdated()) {
- imported->add_theme_style_override("normal", get_theme_stylebox(CoreStringName(normal), SNAME("LineEdit")));
+ imported->add_theme_style_override(CoreStringName(normal), get_theme_stylebox(CoreStringName(normal), SNAME("LineEdit")));
}
} break;
@@ -775,7 +775,7 @@ ImportDock::ImportDock() {
content->hide();
imported = memnew(Label);
- imported->add_theme_style_override("normal", EditorNode::get_singleton()->get_editor_theme()->get_stylebox(CoreStringName(normal), SNAME("LineEdit")));
+ imported->add_theme_style_override(CoreStringName(normal), EditorNode::get_singleton()->get_editor_theme()->get_stylebox(CoreStringName(normal), SNAME("LineEdit")));
imported->set_clip_text(true);
content->add_child(imported);
HBoxContainer *hb = memnew(HBoxContainer);
diff --git a/editor/inspector_dock.cpp b/editor/inspector_dock.cpp
index 5455933809..ad2e16636b 100644
--- a/editor/inspector_dock.cpp
+++ b/editor/inspector_dock.cpp
@@ -666,7 +666,7 @@ InspectorDock::InspectorDock(EditorData &p_editor_data) {
general_options_hb->add_child(resource_save_button);
resource_save_button->get_popup()->add_item(TTR("Save"), RESOURCE_SAVE);
resource_save_button->get_popup()->add_item(TTR("Save As..."), RESOURCE_SAVE_AS);
- resource_save_button->get_popup()->connect("id_pressed", callable_mp(this, &InspectorDock::_menu_option));
+ resource_save_button->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &InspectorDock::_menu_option));
resource_save_button->set_focus_mode(Control::FOCUS_NONE);
resource_save_button->set_disabled(true);
@@ -683,7 +683,7 @@ InspectorDock::InspectorDock(EditorData &p_editor_data) {
resource_extra_button->get_popup()->add_shortcut(ED_SHORTCUT("property_editor/show_in_filesystem", TTR("Show in FileSystem")), RESOURCE_SHOW_IN_FILESYSTEM);
resource_extra_button->get_popup()->add_shortcut(ED_SHORTCUT("property_editor/unref_resource", TTR("Make Resource Built-In")), RESOURCE_MAKE_BUILT_IN);
resource_extra_button->get_popup()->set_item_disabled(3, true);
- resource_extra_button->get_popup()->connect("id_pressed", callable_mp(this, &InspectorDock::_menu_option));
+ resource_extra_button->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &InspectorDock::_menu_option));
general_options_hb->add_spacer();
@@ -708,7 +708,7 @@ InspectorDock::InspectorDock(EditorData &p_editor_data) {
history_menu->set_tooltip_text(TTR("History of recently edited objects."));
general_options_hb->add_child(history_menu);
history_menu->connect("about_to_popup", callable_mp(this, &InspectorDock::_prepare_history));
- history_menu->get_popup()->connect("id_pressed", callable_mp(this, &InspectorDock::_select_history));
+ history_menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &InspectorDock::_select_history));
HBoxContainer *subresource_hb = memnew(HBoxContainer);
add_child(subresource_hb);
@@ -745,7 +745,7 @@ InspectorDock::InspectorDock(EditorData &p_editor_data) {
property_tools_hb->add_child(object_menu);
object_menu->set_tooltip_text(TTR("Manage object properties."));
object_menu->get_popup()->connect("about_to_popup", callable_mp(this, &InspectorDock::_prepare_menu));
- object_menu->get_popup()->connect("id_pressed", callable_mp(this, &InspectorDock::_menu_option));
+ object_menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &InspectorDock::_menu_option));
info = memnew(Button);
add_child(info);
diff --git a/editor/plugins/animation_blend_space_1d_editor.cpp b/editor/plugins/animation_blend_space_1d_editor.cpp
index 95b184b8ab..52ea7ff0ba 100644
--- a/editor/plugins/animation_blend_space_1d_editor.cpp
+++ b/editor/plugins/animation_blend_space_1d_editor.cpp
@@ -573,9 +573,9 @@ void AnimationNodeBlendSpace1DEditor::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE:
case NOTIFICATION_THEME_CHANGED: {
- error_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Tree")));
+ error_panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("Tree")));
error_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), EditorStringName(Editor)));
- panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Tree")));
+ panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("Tree")));
tool_blend->set_icon(get_editor_theme_icon(SNAME("EditPivot")));
tool_select->set_icon(get_editor_theme_icon(SNAME("ToolSelect")));
tool_create->set_icon(get_editor_theme_icon(SNAME("EditKey")));
@@ -799,7 +799,7 @@ AnimationNodeBlendSpace1DEditor::AnimationNodeBlendSpace1DEditor() {
menu = memnew(PopupMenu);
add_child(menu);
- menu->connect("id_pressed", callable_mp(this, &AnimationNodeBlendSpace1DEditor::_add_menu_type));
+ menu->connect(SceneStringName(id_pressed), callable_mp(this, &AnimationNodeBlendSpace1DEditor::_add_menu_type));
animations_menu = memnew(PopupMenu);
animations_menu->set_auto_translate_mode(AUTO_TRANSLATE_MODE_DISABLED);
diff --git a/editor/plugins/animation_blend_space_2d_editor.cpp b/editor/plugins/animation_blend_space_2d_editor.cpp
index 7ee86c77d2..ef61a95ee7 100644
--- a/editor/plugins/animation_blend_space_2d_editor.cpp
+++ b/editor/plugins/animation_blend_space_2d_editor.cpp
@@ -795,9 +795,9 @@ void AnimationNodeBlendSpace2DEditor::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE:
case NOTIFICATION_THEME_CHANGED: {
- error_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Tree")));
+ error_panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("Tree")));
error_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), EditorStringName(Editor)));
- panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Tree")));
+ panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("Tree")));
tool_blend->set_icon(get_editor_theme_icon(SNAME("EditPivot")));
tool_select->set_icon(get_editor_theme_icon(SNAME("ToolSelect")));
tool_create->set_icon(get_editor_theme_icon(SNAME("EditKey")));
@@ -1078,7 +1078,7 @@ AnimationNodeBlendSpace2DEditor::AnimationNodeBlendSpace2DEditor() {
menu = memnew(PopupMenu);
add_child(menu);
- menu->connect("id_pressed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_add_menu_type));
+ menu->connect(SceneStringName(id_pressed), callable_mp(this, &AnimationNodeBlendSpace2DEditor::_add_menu_type));
animations_menu = memnew(PopupMenu);
animations_menu->set_auto_translate_mode(AUTO_TRANSLATE_MODE_DISABLED);
diff --git a/editor/plugins/animation_blend_tree_editor_plugin.cpp b/editor/plugins/animation_blend_tree_editor_plugin.cpp
index 26a90c3ce8..28e1eeccc4 100644
--- a/editor/plugins/animation_blend_tree_editor_plugin.cpp
+++ b/editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -265,7 +265,7 @@ void AnimationNodeBlendTreeEditor::update_graph() {
}
// TODO: Avoid using strings, expose a method on GraphNode instead.
- Ref<StyleBoxFlat> sb = node->get_theme_stylebox(SNAME("panel"));
+ Ref<StyleBoxFlat> sb = node->get_theme_stylebox(SceneStringName(panel));
Color c = sb->get_border_color();
Color mono_color = ((c.r + c.g + c.b) / 3) < 0.7 ? Color(1.0, 1.0, 1.0) : Color(0.0, 0.0, 0.0);
mono_color.a = 0.85;
@@ -942,7 +942,7 @@ void AnimationNodeBlendTreeEditor::_notification(int p_what) {
} break;
case NOTIFICATION_THEME_CHANGED: {
- error_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Tree")));
+ error_panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("Tree")));
error_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), EditorStringName(Editor)));
if (is_visible_in_tree()) {
@@ -1193,7 +1193,7 @@ AnimationNodeBlendTreeEditor::AnimationNodeBlendTreeEditor() {
graph->get_menu_hbox()->add_child(add_node);
add_node->set_text(TTR("Add Node..."));
graph->get_menu_hbox()->move_child(add_node, 0);
- add_node->get_popup()->connect("id_pressed", callable_mp(this, &AnimationNodeBlendTreeEditor::_add_node));
+ add_node->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &AnimationNodeBlendTreeEditor::_add_node));
add_node->get_popup()->connect("popup_hide", callable_mp(this, &AnimationNodeBlendTreeEditor::_popup_hide), CONNECT_DEFERRED);
add_node->connect("about_to_popup", callable_mp(this, &AnimationNodeBlendTreeEditor::_update_options_menu).bind(false));
add_node->set_disabled(read_only);
diff --git a/editor/plugins/animation_library_editor.cpp b/editor/plugins/animation_library_editor.cpp
index 8620c3b883..a2f1fa5614 100644
--- a/editor/plugins/animation_library_editor.cpp
+++ b/editor/plugins/animation_library_editor.cpp
@@ -839,7 +839,7 @@ AnimationLibraryEditor::AnimationLibraryEditor() {
file_popup = memnew(PopupMenu);
add_child(file_popup);
- file_popup->connect("id_pressed", callable_mp(this, &AnimationLibraryEditor::_file_popup_selected));
+ file_popup->connect(SceneStringName(id_pressed), callable_mp(this, &AnimationLibraryEditor::_file_popup_selected));
add_child(vb);
diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp
index 1cf11f2a43..fe56f48889 100644
--- a/editor/plugins/animation_player_editor_plugin.cpp
+++ b/editor/plugins/animation_player_editor_plugin.cpp
@@ -121,20 +121,20 @@ void AnimationPlayerEditor::_notification(int p_what) {
} break;
case NOTIFICATION_ENTER_TREE: {
- tool_anim->get_popup()->connect(SNAME("id_pressed"), callable_mp(this, &AnimationPlayerEditor::_animation_tool_menu));
+ tool_anim->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &AnimationPlayerEditor::_animation_tool_menu));
- onion_skinning->get_popup()->connect(SNAME("id_pressed"), callable_mp(this, &AnimationPlayerEditor::_onion_skinning_menu));
+ onion_skinning->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &AnimationPlayerEditor::_onion_skinning_menu));
blend_editor.next->connect(SNAME("item_selected"), callable_mp(this, &AnimationPlayerEditor::_blend_editor_next_changed));
get_tree()->connect(SNAME("node_removed"), callable_mp(this, &AnimationPlayerEditor::_node_removed));
- add_theme_style_override("panel", EditorNode::get_singleton()->get_editor_theme()->get_stylebox(SNAME("panel"), SNAME("Panel")));
+ add_theme_style_override(SceneStringName(panel), EditorNode::get_singleton()->get_editor_theme()->get_stylebox(SceneStringName(panel), SNAME("Panel")));
} break;
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
if (EditorThemeManager::is_generated_theme_outdated()) {
- add_theme_style_override("panel", EditorNode::get_singleton()->get_editor_theme()->get_stylebox(SNAME("panel"), SNAME("Panel")));
+ add_theme_style_override(SceneStringName(panel), EditorNode::get_singleton()->get_editor_theme()->get_stylebox(SceneStringName(panel), SNAME("Panel")));
}
} break;
@@ -172,8 +172,8 @@ void AnimationPlayerEditor::_notification(int p_what) {
pin->set_icon(get_editor_theme_icon(SNAME("Pin")));
- tool_anim->add_theme_style_override("normal", get_theme_stylebox(CoreStringName(normal), SNAME("Button")));
- track_editor->get_edit_menu()->add_theme_style_override("normal", get_theme_stylebox(CoreStringName(normal), SNAME("Button")));
+ tool_anim->add_theme_style_override(CoreStringName(normal), get_theme_stylebox(CoreStringName(normal), SNAME("Button")));
+ track_editor->get_edit_menu()->add_theme_style_override(CoreStringName(normal), get_theme_stylebox(CoreStringName(normal), SNAME("Button")));
#define ITEM_ICON(m_item, m_icon) tool_anim->get_popup()->set_item_icon(tool_anim->get_popup()->get_item_index(m_item), get_editor_theme_icon(SNAME(m_icon)))
diff --git a/editor/plugins/animation_state_machine_editor.cpp b/editor/plugins/animation_state_machine_editor.cpp
index 449e99d692..8be010c00b 100644
--- a/editor/plugins/animation_state_machine_editor.cpp
+++ b/editor/plugins/animation_state_machine_editor.cpp
@@ -606,7 +606,7 @@ bool AnimationNodeStateMachineEditor::_create_submenu(PopupMenu *p_menu, Ref<Ani
PopupMenu *nodes_menu = memnew(PopupMenu);
nodes_menu->set_name(p_name);
- nodes_menu->connect("id_pressed", callable_mp(this, &AnimationNodeStateMachineEditor::_connect_to));
+ nodes_menu->connect(SceneStringName(id_pressed), callable_mp(this, &AnimationNodeStateMachineEditor::_connect_to));
p_menu->add_child(nodes_menu);
bool node_added = false;
@@ -1267,8 +1267,8 @@ void AnimationNodeStateMachineEditor::_update_graph() {
void AnimationNodeStateMachineEditor::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_THEME_CHANGED: {
- panel->add_theme_style_override("panel", theme_cache.panel_style);
- error_panel->add_theme_style_override("panel", theme_cache.error_panel_style);
+ panel->add_theme_style_override(SceneStringName(panel), theme_cache.panel_style);
+ error_panel->add_theme_style_override(SceneStringName(panel), theme_cache.error_panel_style);
error_label->add_theme_color_override("font_color", theme_cache.error_color);
tool_select->set_icon(theme_cache.tool_icon_select);
@@ -1766,7 +1766,7 @@ AnimationNodeStateMachineEditor::AnimationNodeStateMachineEditor() {
menu = memnew(PopupMenu);
add_child(menu);
- menu->connect("id_pressed", callable_mp(this, &AnimationNodeStateMachineEditor::_add_menu_type));
+ menu->connect(SceneStringName(id_pressed), callable_mp(this, &AnimationNodeStateMachineEditor::_add_menu_type));
menu->connect("popup_hide", callable_mp(this, &AnimationNodeStateMachineEditor::_stop_connecting));
animations_menu = memnew(PopupMenu);
@@ -1776,17 +1776,17 @@ AnimationNodeStateMachineEditor::AnimationNodeStateMachineEditor() {
connect_menu = memnew(PopupMenu);
add_child(connect_menu);
- connect_menu->connect("id_pressed", callable_mp(this, &AnimationNodeStateMachineEditor::_connect_to));
+ connect_menu->connect(SceneStringName(id_pressed), callable_mp(this, &AnimationNodeStateMachineEditor::_connect_to));
connect_menu->connect("popup_hide", callable_mp(this, &AnimationNodeStateMachineEditor::_stop_connecting));
state_machine_menu = memnew(PopupMenu);
state_machine_menu->set_name("state_machines");
- state_machine_menu->connect("id_pressed", callable_mp(this, &AnimationNodeStateMachineEditor::_connect_to));
+ state_machine_menu->connect(SceneStringName(id_pressed), callable_mp(this, &AnimationNodeStateMachineEditor::_connect_to));
connect_menu->add_child(state_machine_menu);
end_menu = memnew(PopupMenu);
end_menu->set_name("end_nodes");
- end_menu->connect("id_pressed", callable_mp(this, &AnimationNodeStateMachineEditor::_connect_to));
+ end_menu->connect(SceneStringName(id_pressed), callable_mp(this, &AnimationNodeStateMachineEditor::_connect_to));
connect_menu->add_child(end_menu);
name_edit_popup = memnew(Popup);
diff --git a/editor/plugins/asset_library_editor_plugin.cpp b/editor/plugins/asset_library_editor_plugin.cpp
index 99c7ab63e9..25c173ed35 100644
--- a/editor/plugins/asset_library_editor_plugin.cpp
+++ b/editor/plugins/asset_library_editor_plugin.cpp
@@ -127,7 +127,7 @@ EditorAssetLibraryItem::EditorAssetLibraryItem(bool p_clickable) {
Ref<StyleBoxEmpty> border;
border.instantiate();
border->set_content_margin_all(5 * EDSCALE);
- add_theme_style_override("panel", border);
+ add_theme_style_override(SceneStringName(panel), border);
HBoxContainer *hb = memnew(HBoxContainer);
// Add some spacing to visually separate the icon from the asset details.
@@ -181,7 +181,7 @@ EditorAssetLibraryItem::EditorAssetLibraryItem(bool p_clickable) {
label_margin->set_content_margin_all(0);
price = memnew(Label);
- price->add_theme_style_override("normal", label_margin);
+ price->add_theme_style_override(CoreStringName(normal), label_margin);
price->set_tooltip_text(TTR("License"));
price->set_mouse_filter(MOUSE_FILTER_PASS);
@@ -240,7 +240,7 @@ void EditorAssetLibraryItemDescription::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE:
case NOTIFICATION_THEME_CHANGED: {
- previews_bg->add_theme_style_override("panel", previews->get_theme_stylebox(CoreStringName(normal), SNAME("TextEdit")));
+ previews_bg->add_theme_style_override(SceneStringName(panel), previews->get_theme_stylebox(CoreStringName(normal), SNAME("TextEdit")));
} break;
}
}
@@ -456,7 +456,7 @@ void EditorAssetLibraryItemDownload::configure(const String &p_title, int p_asse
void EditorAssetLibraryItemDownload::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_THEME_CHANGED: {
- panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("AssetLib")));
+ panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("AssetLib")));
status->add_theme_color_override("font_color", get_theme_color(SNAME("status_color"), SNAME("AssetLib")));
dismiss_button->set_texture_normal(get_theme_icon(SNAME("dismiss"), SNAME("AssetLib")));
} break;
@@ -631,7 +631,7 @@ EditorAssetLibraryItemDownload::EditorAssetLibraryItemDownload() {
void EditorAssetLibrary::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_READY: {
- add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("AssetLib")));
+ add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("bg"), SNAME("AssetLib")));
error_label->move_to_front();
} break;
@@ -639,8 +639,8 @@ void EditorAssetLibrary::_notification(int p_what) {
case NOTIFICATION_THEME_CHANGED: {
error_tr->set_texture(get_editor_theme_icon(SNAME("Error")));
filter->set_right_icon(get_editor_theme_icon(SNAME("Search")));
- library_scroll_bg->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Tree")));
- downloads_scroll->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Tree")));
+ library_scroll_bg->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("Tree")));
+ downloads_scroll->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("Tree")));
error_label->add_theme_color_override("color", get_theme_color(SNAME("error_color"), EditorStringName(Editor)));
} break;
@@ -1679,7 +1679,7 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) {
support->get_popup()->add_check_item(TTRGET(support_text[SUPPORT_TESTING]), SUPPORT_TESTING);
support->get_popup()->set_item_checked(SUPPORT_FEATURED, true);
support->get_popup()->set_item_checked(SUPPORT_COMMUNITY, true);
- support->get_popup()->connect("id_pressed", callable_mp(this, &EditorAssetLibrary::_support_toggled));
+ support->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &EditorAssetLibrary::_support_toggled));
/////////
@@ -1698,7 +1698,7 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) {
PanelContainer *library_vb_border = memnew(PanelContainer);
library_scroll->add_child(library_vb_border);
- library_vb_border->add_theme_style_override("panel", border2);
+ library_vb_border->add_theme_style_override(SceneStringName(panel), border2);
library_vb_border->set_h_size_flags(Control::SIZE_EXPAND_FILL);
library_vb = memnew(VBoxContainer);
diff --git a/editor/plugins/bit_map_editor_plugin.cpp b/editor/plugins/bit_map_editor_plugin.cpp
index f1d86de537..668ea04d69 100644
--- a/editor/plugins/bit_map_editor_plugin.cpp
+++ b/editor/plugins/bit_map_editor_plugin.cpp
@@ -55,7 +55,7 @@ BitMapEditor::BitMapEditor() {
Ref<StyleBoxEmpty> stylebox;
stylebox.instantiate();
stylebox->set_content_margin(SIDE_RIGHT, 4 * EDSCALE);
- size_label->add_theme_style_override("normal", stylebox);
+ size_label->add_theme_style_override(CoreStringName(normal), stylebox);
}
///////////////////////
diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp
index 59be0fa1de..5c7d02dcfa 100644
--- a/editor/plugins/canvas_item_editor_plugin.cpp
+++ b/editor/plugins/canvas_item_editor_plugin.cpp
@@ -3952,7 +3952,7 @@ void CanvasItemEditor::_update_editor_settings() {
key_auto_insert_button->add_theme_color_override("icon_pressed_color", key_auto_color.lerp(Color(1, 0, 0), 0.55));
animation_menu->set_icon(get_editor_theme_icon(SNAME("GuiTabMenuHl")));
- context_toolbar_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("ContextualToolbar"), EditorStringName(EditorStyles)));
+ context_toolbar_panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("ContextualToolbar"), EditorStringName(EditorStyles)));
panner->setup((ViewPanner::ControlScheme)EDITOR_GET("editors/panning/2d_editor_panning_scheme").operator int(), ED_GET_SHORTCUT("canvas_item_editor/pan_view"), bool(EDITOR_GET("editors/panning/simple_panning")));
panner->set_scroll_speed(EDITOR_GET("editors/panning/2d_editor_pan_speed"));
@@ -5388,7 +5388,7 @@ CanvasItemEditor::CanvasItemEditor() {
snap_config_menu->set_switch_on_hover(true);
PopupMenu *p = snap_config_menu->get_popup();
- p->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_popup_callback));
+ p->connect(SceneStringName(id_pressed), callable_mp(this, &CanvasItemEditor::_popup_callback));
p->set_hide_on_checkable_item_selection(false);
p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/use_rotation_snap", TTR("Use Rotation Snap")), SNAP_USE_ROTATION);
p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/use_scale_snap", TTR("Use Scale Snap")), SNAP_USE_SCALE);
@@ -5396,7 +5396,7 @@ CanvasItemEditor::CanvasItemEditor() {
p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/use_pixel_snap", TTR("Use Pixel Snap")), SNAP_USE_PIXEL);
smartsnap_config_popup = memnew(PopupMenu);
- smartsnap_config_popup->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_popup_callback));
+ smartsnap_config_popup->connect(SceneStringName(id_pressed), callable_mp(this, &CanvasItemEditor::_popup_callback));
smartsnap_config_popup->set_hide_on_checkable_item_selection(false);
smartsnap_config_popup->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/snap_node_parent", TTR("Snap to Parent")), SNAP_USE_NODE_PARENT);
smartsnap_config_popup->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/snap_node_anchors", TTR("Snap to Node Anchor")), SNAP_USE_NODE_ANCHORS);
@@ -5459,7 +5459,7 @@ CanvasItemEditor::CanvasItemEditor() {
p->add_shortcut(ED_SHORTCUT("canvas_item_editor/skeleton_show_bones", TTR("Show Bones")), SKELETON_SHOW_BONES);
p->add_separator();
p->add_shortcut(ED_SHORTCUT("canvas_item_editor/skeleton_make_bones", TTR("Make Bone2D Node(s) from Node(s)"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::B), SKELETON_MAKE_BONES);
- p->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_popup_callback));
+ p->connect(SceneStringName(id_pressed), callable_mp(this, &CanvasItemEditor::_popup_callback));
main_menu_hbox->add_child(memnew(VSeparator));
@@ -5481,14 +5481,14 @@ CanvasItemEditor::CanvasItemEditor() {
view_menu->set_switch_on_hover(true);
view_menu->set_shortcut_context(this);
main_menu_hbox->add_child(view_menu);
- view_menu->get_popup()->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_popup_callback));
+ view_menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &CanvasItemEditor::_popup_callback));
p = view_menu->get_popup();
p->set_hide_on_checkable_item_selection(false);
grid_menu = memnew(PopupMenu);
grid_menu->connect("about_to_popup", callable_mp(this, &CanvasItemEditor::_prepare_grid_menu));
- grid_menu->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_on_grid_menu_id_pressed));
+ grid_menu->connect(SceneStringName(id_pressed), callable_mp(this, &CanvasItemEditor::_on_grid_menu_id_pressed));
grid_menu->add_radio_check_item(TTR("Show"), GRID_VISIBILITY_SHOW);
grid_menu->add_radio_check_item(TTR("Show When Snapping"), GRID_VISIBILITY_SHOW_WHEN_SNAPPING);
grid_menu->add_radio_check_item(TTR("Hide"), GRID_VISIBILITY_HIDE);
@@ -5505,7 +5505,7 @@ CanvasItemEditor::CanvasItemEditor() {
gizmos_menu = memnew(PopupMenu);
gizmos_menu->set_name("GizmosMenu");
- gizmos_menu->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_popup_callback));
+ gizmos_menu->connect(SceneStringName(id_pressed), callable_mp(this, &CanvasItemEditor::_popup_callback));
gizmos_menu->set_hide_on_checkable_item_selection(false);
gizmos_menu->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_position_gizmos", TTR("Position")), SHOW_POSITION_GIZMOS);
gizmos_menu->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_lock_gizmos", TTR("Lock")), SHOW_LOCK_GIZMOS);
@@ -5522,7 +5522,7 @@ CanvasItemEditor::CanvasItemEditor() {
p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/preview_canvas_scale", TTR("Preview Canvas Scale")), PREVIEW_CANVAS_SCALE);
theme_menu = memnew(PopupMenu);
- theme_menu->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_switch_theme_preview));
+ theme_menu->connect(SceneStringName(id_pressed), callable_mp(this, &CanvasItemEditor::_switch_theme_preview));
theme_menu->add_radio_check_item(TTR("Project theme"), THEME_PREVIEW_PROJECT);
theme_menu->add_radio_check_item(TTR("Editor theme"), THEME_PREVIEW_EDITOR);
theme_menu->add_radio_check_item(TTR("Default theme"), THEME_PREVIEW_DEFAULT);
@@ -5596,7 +5596,7 @@ CanvasItemEditor::CanvasItemEditor() {
animation_menu->set_shortcut_context(this);
animation_menu->set_tooltip_text(TTR("Animation Key and Pose Options"));
animation_hb->add_child(animation_menu);
- animation_menu->get_popup()->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_popup_callback));
+ animation_menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &CanvasItemEditor::_popup_callback));
animation_menu->set_switch_on_hover(true);
p = animation_menu->get_popup();
@@ -5618,12 +5618,12 @@ CanvasItemEditor::CanvasItemEditor() {
add_child(selection_menu);
selection_menu->set_min_size(Vector2(100, 0));
selection_menu->set_auto_translate_mode(AUTO_TRANSLATE_MODE_DISABLED);
- selection_menu->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_selection_result_pressed));
+ selection_menu->connect(SceneStringName(id_pressed), callable_mp(this, &CanvasItemEditor::_selection_result_pressed));
selection_menu->connect("popup_hide", callable_mp(this, &CanvasItemEditor::_selection_menu_hide), CONNECT_DEFERRED);
add_node_menu = memnew(PopupMenu);
add_child(add_node_menu);
- add_node_menu->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_add_node_pressed));
+ add_node_menu->connect(SceneStringName(id_pressed), callable_mp(this, &CanvasItemEditor::_add_node_pressed));
multiply_grid_step_shortcut = ED_SHORTCUT("canvas_item_editor/multiply_grid_step", TTR("Multiply grid step by 2"), Key::KP_MULTIPLY);
divide_grid_step_shortcut = ED_SHORTCUT("canvas_item_editor/divide_grid_step", TTR("Divide grid step by 2"), Key::KP_DIVIDE);
diff --git a/editor/plugins/control_editor_plugin.cpp b/editor/plugins/control_editor_plugin.cpp
index 1d5b0a832a..a3804eff00 100644
--- a/editor/plugins/control_editor_plugin.cpp
+++ b/editor/plugins/control_editor_plugin.cpp
@@ -65,7 +65,7 @@ void ControlPositioningWarning::_update_warning() {
hint_label->set_text(TTR("Use anchors and the rectangle for positioning."));
}
- bg_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg_group_note"), SNAME("EditorProperty")));
+ bg_panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("bg_group_note"), SNAME("EditorProperty")));
}
void ControlPositioningWarning::_update_toggler() {
diff --git a/editor/plugins/cpu_particles_2d_editor_plugin.cpp b/editor/plugins/cpu_particles_2d_editor_plugin.cpp
index 1d53a1b4d4..1c0d93248d 100644
--- a/editor/plugins/cpu_particles_2d_editor_plugin.cpp
+++ b/editor/plugins/cpu_particles_2d_editor_plugin.cpp
@@ -251,7 +251,7 @@ void CPUParticles2DEditorPlugin::_generate_emission_mask() {
void CPUParticles2DEditorPlugin::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
- menu->get_popup()->connect("id_pressed", callable_mp(this, &CPUParticles2DEditorPlugin::_menu_callback));
+ menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &CPUParticles2DEditorPlugin::_menu_callback));
menu->set_icon(file->get_editor_theme_icon(SNAME("CPUParticles2D")));
file->connect("file_selected", callable_mp(this, &CPUParticles2DEditorPlugin::_file_selected));
} break;
diff --git a/editor/plugins/cpu_particles_3d_editor_plugin.cpp b/editor/plugins/cpu_particles_3d_editor_plugin.cpp
index baf70e45f0..a833c8c356 100644
--- a/editor/plugins/cpu_particles_3d_editor_plugin.cpp
+++ b/editor/plugins/cpu_particles_3d_editor_plugin.cpp
@@ -173,7 +173,7 @@ CPUParticles3DEditor::CPUParticles3DEditor() {
options->get_popup()->add_item(TTR("Generate AABB"), MENU_OPTION_GENERATE_AABB);
options->get_popup()->add_item(TTR("Create Emission Points From Node"), MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_NODE);
options->get_popup()->add_item(TTR("Convert to GPUParticles3D"), MENU_OPTION_CONVERT_TO_GPU_PARTICLES);
- options->get_popup()->connect("id_pressed", callable_mp(this, &CPUParticles3DEditor::_menu_option));
+ options->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &CPUParticles3DEditor::_menu_option));
generate_aabb = memnew(ConfirmationDialog);
generate_aabb->set_title(TTR("Generate Visibility AABB"));
diff --git a/editor/plugins/curve_editor_plugin.cpp b/editor/plugins/curve_editor_plugin.cpp
index ee9a2e99d9..278543dc36 100644
--- a/editor/plugins/curve_editor_plugin.cpp
+++ b/editor/plugins/curve_editor_plugin.cpp
@@ -788,7 +788,7 @@ void CurveEdit::_redraw() {
// Draw background.
Vector2 view_size = get_rect().size;
- draw_style_box(get_theme_stylebox(SNAME("panel"), SNAME("Tree")), Rect2(Point2(), view_size));
+ draw_style_box(get_theme_stylebox(SceneStringName(panel), SNAME("Tree")), Rect2(Point2(), view_size));
// Draw snapping grid, then primary grid.
draw_set_transform_matrix(_world_to_view);
@@ -1026,7 +1026,7 @@ CurveEditor::CurveEditor() {
presets_button->set_switch_on_hover(true);
presets_button->set_h_size_flags(SIZE_EXPAND | SIZE_SHRINK_END);
toolbar->add_child(presets_button);
- presets_button->get_popup()->connect("id_pressed", callable_mp(this, &CurveEditor::_on_preset_item_selected));
+ presets_button->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &CurveEditor::_on_preset_item_selected));
curve_editor_rect = memnew(CurveEdit);
add_child(curve_editor_rect);
diff --git a/editor/plugins/debugger_editor_plugin.cpp b/editor/plugins/debugger_editor_plugin.cpp
index 53cb76f133..55416ab4eb 100644
--- a/editor/plugins/debugger_editor_plugin.cpp
+++ b/editor/plugins/debugger_editor_plugin.cpp
@@ -99,7 +99,7 @@ DebuggerEditorPlugin::DebuggerEditorPlugin(PopupMenu *p_debug_menu) {
// Multi-instance, start/stop.
debug_menu->add_separator();
debug_menu->add_item(TTR("Customize Run Instances..."), RUN_MULTIPLE_INSTANCES);
- debug_menu->connect("id_pressed", callable_mp(this, &DebuggerEditorPlugin::_menu_option));
+ debug_menu->connect(SceneStringName(id_pressed), callable_mp(this, &DebuggerEditorPlugin::_menu_option));
run_instances_dialog = memnew(RunInstancesDialog);
EditorNode::get_singleton()->get_gui_base()->add_child(run_instances_dialog);
diff --git a/editor/plugins/font_config_plugin.cpp b/editor/plugins/font_config_plugin.cpp
index 1b104f9075..6d1e102808 100644
--- a/editor/plugins/font_config_plugin.cpp
+++ b/editor/plugins/font_config_plugin.cpp
@@ -372,7 +372,7 @@ EditorPropertyFontMetaOverride::EditorPropertyFontMetaOverride(bool p_script) {
}
}
add_child(menu);
- menu->connect("id_pressed", callable_mp(this, &EditorPropertyFontMetaOverride::_add_script));
+ menu->connect(SceneStringName(id_pressed), callable_mp(this, &EditorPropertyFontMetaOverride::_add_script));
locale_select = memnew(EditorLocaleDialog);
locale_select->connect("locale_selected", callable_mp(this, &EditorPropertyFontMetaOverride::_add_lang));
@@ -840,12 +840,12 @@ EditorPropertyOTFeatures::EditorPropertyOTFeatures() {
menu = memnew(PopupMenu);
add_child(menu);
- menu->connect("id_pressed", callable_mp(this, &EditorPropertyOTFeatures::_add_feature));
+ menu->connect(SceneStringName(id_pressed), callable_mp(this, &EditorPropertyOTFeatures::_add_feature));
for (int i = 0; i < FGRP_MAX; i++) {
menu_sub[i] = memnew(PopupMenu);
menu->add_child(menu_sub[i]);
- menu_sub[i]->connect("id_pressed", callable_mp(this, &EditorPropertyOTFeatures::_add_feature));
+ menu_sub[i]->connect(SceneStringName(id_pressed), callable_mp(this, &EditorPropertyOTFeatures::_add_feature));
}
group_names[FGRP_STYLISTIC_SET] = TTRC("Stylistic Sets");
@@ -1018,7 +1018,7 @@ EditorPropertyFontNamesArray::EditorPropertyFontNamesArray() {
}
}
add_child(menu);
- menu->connect("id_pressed", callable_mp(this, &EditorPropertyFontNamesArray::_add_font));
+ menu->connect(SceneStringName(id_pressed), callable_mp(this, &EditorPropertyFontNamesArray::_add_font));
}
/*************************************************************************/
diff --git a/editor/plugins/gpu_particles_2d_editor_plugin.cpp b/editor/plugins/gpu_particles_2d_editor_plugin.cpp
index 328b272562..ba28305cf0 100644
--- a/editor/plugins/gpu_particles_2d_editor_plugin.cpp
+++ b/editor/plugins/gpu_particles_2d_editor_plugin.cpp
@@ -352,7 +352,7 @@ void GPUParticles2DEditorPlugin::_generate_emission_mask() {
void GPUParticles2DEditorPlugin::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
- menu->get_popup()->connect("id_pressed", callable_mp(this, &GPUParticles2DEditorPlugin::_menu_callback));
+ menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &GPUParticles2DEditorPlugin::_menu_callback));
menu->set_icon(menu->get_editor_theme_icon(SNAME("GPUParticles2D")));
file->connect("file_selected", callable_mp(this, &GPUParticles2DEditorPlugin::_file_selected));
EditorNode::get_singleton()->get_editor_selection()->connect("selection_changed", callable_mp(this, &GPUParticles2DEditorPlugin::_selection_changed));
diff --git a/editor/plugins/gpu_particles_3d_editor_plugin.cpp b/editor/plugins/gpu_particles_3d_editor_plugin.cpp
index 9063109ece..b682ec1de6 100644
--- a/editor/plugins/gpu_particles_3d_editor_plugin.cpp
+++ b/editor/plugins/gpu_particles_3d_editor_plugin.cpp
@@ -420,7 +420,7 @@ GPUParticles3DEditor::GPUParticles3DEditor() {
options->get_popup()->add_item(TTR("Create Emission Points From Node"), MENU_OPTION_CREATE_EMISSION_VOLUME_FROM_NODE);
options->get_popup()->add_item(TTR("Convert to CPUParticles3D"), MENU_OPTION_CONVERT_TO_CPU_PARTICLES);
- options->get_popup()->connect("id_pressed", callable_mp(this, &GPUParticles3DEditor::_menu_option));
+ options->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &GPUParticles3DEditor::_menu_option));
generate_aabb = memnew(ConfirmationDialog);
generate_aabb->set_title(TTR("Generate Visibility AABB"));
diff --git a/editor/plugins/mesh_instance_3d_editor_plugin.cpp b/editor/plugins/mesh_instance_3d_editor_plugin.cpp
index 4d1b31a8dc..6eae3b975a 100644
--- a/editor/plugins/mesh_instance_3d_editor_plugin.cpp
+++ b/editor/plugins/mesh_instance_3d_editor_plugin.cpp
@@ -540,7 +540,7 @@ MeshInstance3DEditor::MeshInstance3DEditor() {
options->get_popup()->add_item(TTR("View UV2"), MENU_OPTION_DEBUG_UV2);
options->get_popup()->add_item(TTR("Unwrap UV2 for Lightmap/AO"), MENU_OPTION_CREATE_UV2);
- options->get_popup()->connect("id_pressed", callable_mp(this, &MeshInstance3DEditor::_menu_option));
+ options->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &MeshInstance3DEditor::_menu_option));
outline_dialog = memnew(ConfirmationDialog);
outline_dialog->set_title(TTR("Create Outline Mesh"));
diff --git a/editor/plugins/mesh_library_editor_plugin.cpp b/editor/plugins/mesh_library_editor_plugin.cpp
index 950aced7a1..0b2549986c 100644
--- a/editor/plugins/mesh_library_editor_plugin.cpp
+++ b/editor/plugins/mesh_library_editor_plugin.cpp
@@ -271,7 +271,7 @@ MeshLibraryEditor::MeshLibraryEditor() {
menu->get_popup()->add_item(TTR("Import from Scene (Apply Transforms)"), MENU_OPTION_IMPORT_FROM_SCENE_APPLY_XFORMS);
menu->get_popup()->add_item(TTR("Update from Scene"), MENU_OPTION_UPDATE_FROM_SCENE);
menu->get_popup()->set_item_disabled(menu->get_popup()->get_item_index(MENU_OPTION_UPDATE_FROM_SCENE), true);
- menu->get_popup()->connect("id_pressed", callable_mp(this, &MeshLibraryEditor::_menu_cbk));
+ menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &MeshLibraryEditor::_menu_cbk));
menu->hide();
cd_remove = memnew(ConfirmationDialog);
diff --git a/editor/plugins/multimesh_editor_plugin.cpp b/editor/plugins/multimesh_editor_plugin.cpp
index ffe46d5daa..3980f23c8a 100644
--- a/editor/plugins/multimesh_editor_plugin.cpp
+++ b/editor/plugins/multimesh_editor_plugin.cpp
@@ -278,7 +278,7 @@ MultiMeshEditor::MultiMeshEditor() {
options->set_icon(EditorNode::get_singleton()->get_editor_theme()->get_icon(SNAME("MultiMeshInstance3D"), EditorStringName(EditorIcons)));
options->get_popup()->add_item(TTR("Populate Surface"));
- options->get_popup()->connect("id_pressed", callable_mp(this, &MultiMeshEditor::_menu_option));
+ options->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &MultiMeshEditor::_menu_option));
populate_dialog = memnew(ConfirmationDialog);
populate_dialog->set_title(TTR("Populate MultiMesh"));
diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp
index 69b66cd7b2..295167eea2 100644
--- a/editor/plugins/node_3d_editor_plugin.cpp
+++ b/editor/plugins/node_3d_editor_plugin.cpp
@@ -3044,7 +3044,7 @@ void Node3DEditorViewport::_notification(int p_what) {
Control *gui_base = EditorNode::get_singleton()->get_gui_base();
view_menu->begin_bulk_theme_override();
- view_menu->add_theme_style_override("normal", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), EditorStringName(EditorStyles)));
+ view_menu->add_theme_style_override(CoreStringName(normal), gui_base->get_theme_stylebox(SNAME("Information3dViewport"), EditorStringName(EditorStyles)));
view_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), EditorStringName(EditorStyles)));
view_menu->add_theme_style_override(SceneStringName(pressed), gui_base->get_theme_stylebox(SNAME("Information3dViewport"), EditorStringName(EditorStyles)));
view_menu->add_theme_style_override("focus", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), EditorStringName(EditorStyles)));
@@ -3052,7 +3052,7 @@ void Node3DEditorViewport::_notification(int p_what) {
view_menu->end_bulk_theme_override();
preview_camera->begin_bulk_theme_override();
- preview_camera->add_theme_style_override("normal", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), EditorStringName(EditorStyles)));
+ preview_camera->add_theme_style_override(CoreStringName(normal), gui_base->get_theme_stylebox(SNAME("Information3dViewport"), EditorStringName(EditorStyles)));
preview_camera->add_theme_style_override("hover", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), EditorStringName(EditorStyles)));
preview_camera->add_theme_style_override(SceneStringName(pressed), gui_base->get_theme_stylebox(SNAME("Information3dViewport"), EditorStringName(EditorStyles)));
preview_camera->add_theme_style_override("focus", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), EditorStringName(EditorStyles)));
@@ -3063,9 +3063,9 @@ void Node3DEditorViewport::_notification(int p_what) {
frame_time_gradient->set_color(1, get_theme_color(SNAME("warning_color"), EditorStringName(Editor)));
frame_time_gradient->set_color(2, get_theme_color(SNAME("error_color"), EditorStringName(Editor)));
- info_label->add_theme_style_override("normal", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), EditorStringName(EditorStyles)));
+ info_label->add_theme_style_override(CoreStringName(normal), gui_base->get_theme_stylebox(SNAME("Information3dViewport"), EditorStringName(EditorStyles)));
- frame_time_panel->add_theme_style_override("panel", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), EditorStringName(EditorStyles)));
+ frame_time_panel->add_theme_style_override(SceneStringName(panel), gui_base->get_theme_stylebox(SNAME("Information3dViewport"), EditorStringName(EditorStyles)));
// Set a minimum width to prevent the width from changing all the time
// when numbers vary rapidly. This minimum width is set based on a
// GPU time of 999.99 ms in the current editor language.
@@ -3073,8 +3073,8 @@ void Node3DEditorViewport::_notification(int p_what) {
frame_time_panel->set_custom_minimum_size(Size2(min_width, 0) * EDSCALE);
frame_time_vbox->add_theme_constant_override("separation", Math::round(-1 * EDSCALE));
- cinema_label->add_theme_style_override("normal", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), EditorStringName(EditorStyles)));
- locked_label->add_theme_style_override("normal", gui_base->get_theme_stylebox(SNAME("Information3dViewport"), EditorStringName(EditorStyles)));
+ cinema_label->add_theme_style_override(CoreStringName(normal), gui_base->get_theme_stylebox(SNAME("Information3dViewport"), EditorStringName(EditorStyles)));
+ locked_label->add_theme_style_override(CoreStringName(normal), gui_base->get_theme_stylebox(SNAME("Information3dViewport"), EditorStringName(EditorStyles)));
} break;
case NOTIFICATION_DRAG_END: {
@@ -5294,8 +5294,8 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, int p
view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/focus_selection"), VIEW_CENTER_TO_SELECTION);
view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/align_transform_with_view"), VIEW_ALIGN_TRANSFORM_WITH_VIEW);
view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/align_rotation_with_view"), VIEW_ALIGN_ROTATION_WITH_VIEW);
- view_menu->get_popup()->connect("id_pressed", callable_mp(this, &Node3DEditorViewport::_menu_option));
- display_submenu->connect("id_pressed", callable_mp(this, &Node3DEditorViewport::_menu_option));
+ view_menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &Node3DEditorViewport::_menu_option));
+ display_submenu->connect(SceneStringName(id_pressed), callable_mp(this, &Node3DEditorViewport::_menu_option));
view_menu->set_disable_shortcuts(true);
// TODO: Re-evaluate with new OpenGL3 renderer, and implement.
@@ -5474,7 +5474,7 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, int p
selection_menu = memnew(PopupMenu);
add_child(selection_menu);
selection_menu->set_min_size(Size2(100, 0) * EDSCALE);
- selection_menu->connect("id_pressed", callable_mp(this, &Node3DEditorViewport::_selection_result_pressed));
+ selection_menu->connect(SceneStringName(id_pressed), callable_mp(this, &Node3DEditorViewport::_selection_result_pressed));
selection_menu->connect("popup_hide", callable_mp(this, &Node3DEditorViewport::_selection_menu_hide));
if (p_index == 0) {
@@ -7809,7 +7809,7 @@ void Node3DEditor::_update_theme() {
environ_sky_color->set_custom_minimum_size(Size2(0, get_theme_constant(SNAME("color_picker_button_height"), EditorStringName(Editor))));
environ_ground_color->set_custom_minimum_size(Size2(0, get_theme_constant(SNAME("color_picker_button_height"), EditorStringName(Editor))));
- context_toolbar_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("ContextualToolbar"), EditorStringName(EditorStyles)));
+ context_toolbar_panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("ContextualToolbar"), EditorStringName(EditorStyles)));
}
void Node3DEditor::_notification(int p_what) {
@@ -8640,7 +8640,7 @@ Node3DEditor::Node3DEditor() {
p->add_separator();
p->add_shortcut(ED_SHORTCUT("spatial_editor/configure_snap", TTR("Configure Snap...")), MENU_TRANSFORM_CONFIGURE_SNAP);
- p->connect("id_pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed));
+ p->connect(SceneStringName(id_pressed), callable_mp(this, &Node3DEditor::_menu_item_pressed));
view_menu = memnew(MenuButton);
view_menu->set_flat(false);
@@ -8676,7 +8676,7 @@ Node3DEditor::Node3DEditor() {
gizmos_menu = memnew(PopupMenu);
gizmos_menu->set_hide_on_checkable_item_selection(false);
p->add_submenu_node_item(TTR("Gizmos"), gizmos_menu);
- gizmos_menu->connect("id_pressed", callable_mp(this, &Node3DEditor::_menu_gizmo_toggled));
+ gizmos_menu->connect(SceneStringName(id_pressed), callable_mp(this, &Node3DEditor::_menu_gizmo_toggled));
p->add_separator();
p->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_origin", TTR("View Origin")), MENU_VIEW_ORIGIN);
@@ -8688,7 +8688,7 @@ Node3DEditor::Node3DEditor() {
p->set_item_checked(p->get_item_index(MENU_VIEW_ORIGIN), true);
p->set_item_checked(p->get_item_index(MENU_VIEW_GRID), true);
- p->connect("id_pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed));
+ p->connect(SceneStringName(id_pressed), callable_mp(this, &Node3DEditor::_menu_item_pressed));
/* REST OF MENU */
diff --git a/editor/plugins/parallax_background_editor_plugin.cpp b/editor/plugins/parallax_background_editor_plugin.cpp
index e14a81778e..6c55fd2753 100644
--- a/editor/plugins/parallax_background_editor_plugin.cpp
+++ b/editor/plugins/parallax_background_editor_plugin.cpp
@@ -118,7 +118,7 @@ void ParallaxBackgroundEditorPlugin::convert_to_parallax2d() {
void ParallaxBackgroundEditorPlugin::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
- menu->get_popup()->connect("id_pressed", callable_mp(this, &ParallaxBackgroundEditorPlugin::_menu_callback));
+ menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &ParallaxBackgroundEditorPlugin::_menu_callback));
menu->set_icon(menu->get_editor_theme_icon(SNAME("ParallaxBackground")));
} break;
}
diff --git a/editor/plugins/path_2d_editor_plugin.cpp b/editor/plugins/path_2d_editor_plugin.cpp
index f404dca88b..a5717c3bb3 100644
--- a/editor/plugins/path_2d_editor_plugin.cpp
+++ b/editor/plugins/path_2d_editor_plugin.cpp
@@ -672,7 +672,7 @@ Path2DEditor::Path2DEditor() {
menu->set_item_checked(HANDLE_OPTION_ANGLE, mirror_handle_angle);
menu->add_check_item(TTR("Mirror Handle Lengths"));
menu->set_item_checked(HANDLE_OPTION_LENGTH, mirror_handle_length);
- menu->connect("id_pressed", callable_mp(this, &Path2DEditor::_handle_option_pressed));
+ menu->connect(SceneStringName(id_pressed), callable_mp(this, &Path2DEditor::_handle_option_pressed));
}
void Path2DEditorPlugin::edit(Object *p_object) {
diff --git a/editor/plugins/path_3d_editor_plugin.cpp b/editor/plugins/path_3d_editor_plugin.cpp
index 3f5ade8a03..447e82f70d 100644
--- a/editor/plugins/path_3d_editor_plugin.cpp
+++ b/editor/plugins/path_3d_editor_plugin.cpp
@@ -896,7 +896,7 @@ Path3DEditorPlugin::Path3DEditorPlugin() {
menu->set_item_checked(HANDLE_OPTION_ANGLE, mirror_handle_angle);
menu->add_check_item(TTR("Mirror Handle Lengths"));
menu->set_item_checked(HANDLE_OPTION_LENGTH, mirror_handle_length);
- menu->connect("id_pressed", callable_mp(this, &Path3DEditorPlugin::_handle_option_pressed));
+ menu->connect(SceneStringName(id_pressed), callable_mp(this, &Path3DEditorPlugin::_handle_option_pressed));
curve_edit->set_pressed(true);
}
diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp
index 8bffbeaf15..61bd21db67 100644
--- a/editor/plugins/polygon_2d_editor_plugin.cpp
+++ b/editor/plugins/polygon_2d_editor_plugin.cpp
@@ -113,8 +113,8 @@ void Polygon2DEditor::_notification(int p_what) {
[[fallthrough]];
}
case NOTIFICATION_THEME_CHANGED: {
- uv_edit_draw->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Tree")));
- bone_scroll->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Tree")));
+ uv_edit_draw->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("Tree")));
+ bone_scroll->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("Tree")));
} break;
case NOTIFICATION_VISIBILITY_CHANGED: {
@@ -1434,7 +1434,7 @@ Polygon2DEditor::Polygon2DEditor() {
uv_menu->get_popup()->add_item(TTR("Clear UV"), UVEDIT_UV_CLEAR);
uv_menu->get_popup()->add_separator();
uv_menu->get_popup()->add_item(TTR("Grid Settings"), UVEDIT_GRID_SETTINGS);
- uv_menu->get_popup()->connect("id_pressed", callable_mp(this, &Polygon2DEditor::_menu_option));
+ uv_menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &Polygon2DEditor::_menu_option));
uv_mode_hb->add_child(memnew(VSeparator));
diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp
index 4812c623c9..334b253316 100644
--- a/editor/plugins/script_editor_plugin.cpp
+++ b/editor/plugins/script_editor_plugin.cpp
@@ -1719,7 +1719,7 @@ void ScriptEditor::_notification(int p_what) {
case NOTIFICATION_TRANSLATION_CHANGED:
case NOTIFICATION_LAYOUT_DIRECTION_CHANGED:
case NOTIFICATION_THEME_CHANGED: {
- tab_container->add_theme_style_override("panel", get_theme_stylebox(SNAME("ScriptEditor"), EditorStringName(EditorStyles)));
+ tab_container->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("ScriptEditor"), EditorStringName(EditorStyles)));
help_search->set_icon(get_editor_theme_icon(SNAME("HelpSearch")));
site_search->set_icon(get_editor_theme_icon(SNAME("ExternalLink")));
@@ -1737,7 +1737,7 @@ void ScriptEditor::_notification(int p_what) {
filter_scripts->set_right_icon(get_editor_theme_icon(SNAME("Search")));
filter_methods->set_right_icon(get_editor_theme_icon(SNAME("Search")));
- filename->add_theme_style_override("normal", get_theme_stylebox(CoreStringName(normal), SNAME("LineEdit")));
+ filename->add_theme_style_override(CoreStringName(normal), get_theme_stylebox(CoreStringName(normal), SNAME("LineEdit")));
recent_scripts->reset_size();
@@ -1748,7 +1748,7 @@ void ScriptEditor::_notification(int p_what) {
case NOTIFICATION_READY: {
// Can't set own styles in NOTIFICATION_THEME_CHANGED, so for now this will do.
- add_theme_style_override("panel", get_theme_stylebox(SNAME("ScriptEditorPanel"), EditorStringName(EditorStyles)));
+ add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("ScriptEditorPanel"), EditorStringName(EditorStyles)));
get_tree()->connect("tree_changed", callable_mp(this, &ScriptEditor::_tree_changed));
InspectorDock::get_singleton()->connect("request_help", callable_mp(this, &ScriptEditor::_help_class_open));
@@ -4038,7 +4038,7 @@ ScriptEditor::ScriptEditor(WindowWrapper *p_wrapper) {
context_menu = memnew(PopupMenu);
add_child(context_menu);
- context_menu->connect("id_pressed", callable_mp(this, &ScriptEditor::_menu_option));
+ context_menu->connect(SceneStringName(id_pressed), callable_mp(this, &ScriptEditor::_menu_option));
overview_vbox = memnew(VBoxContainer);
overview_vbox->set_custom_minimum_size(Size2(0, 90));
@@ -4052,7 +4052,7 @@ ScriptEditor::ScriptEditor(WindowWrapper *p_wrapper) {
filename = memnew(Label);
filename->set_clip_text(true);
filename->set_h_size_flags(SIZE_EXPAND_FILL);
- filename->add_theme_style_override("normal", EditorNode::get_singleton()->get_editor_theme()->get_stylebox(CoreStringName(normal), SNAME("LineEdit")));
+ filename->add_theme_style_override(CoreStringName(normal), EditorNode::get_singleton()->get_editor_theme()->get_stylebox(CoreStringName(normal), SNAME("LineEdit")));
buttons_hbox->add_child(filename);
members_overview_alphabeta_sort_button = memnew(Button);
@@ -4122,7 +4122,7 @@ ScriptEditor::ScriptEditor(WindowWrapper *p_wrapper) {
recent_scripts = memnew(PopupMenu);
file_menu->get_popup()->add_submenu_node_item(TTR("Open Recent"), recent_scripts, FILE_OPEN_RECENT);
- recent_scripts->connect("id_pressed", callable_mp(this, &ScriptEditor::_open_recent_script));
+ recent_scripts->connect(SceneStringName(id_pressed), callable_mp(this, &ScriptEditor::_open_recent_script));
_update_recent_scripts();
@@ -4148,7 +4148,7 @@ ScriptEditor::ScriptEditor(WindowWrapper *p_wrapper) {
theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/import_theme", TTR("Import Theme...")), THEME_IMPORT);
theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/reload_theme", TTR("Reload Theme")), THEME_RELOAD);
file_menu->get_popup()->add_submenu_node_item(TTR("Theme"), theme_submenu, FILE_THEME);
- theme_submenu->connect("id_pressed", callable_mp(this, &ScriptEditor::_theme_option));
+ theme_submenu->connect(SceneStringName(id_pressed), callable_mp(this, &ScriptEditor::_theme_option));
theme_submenu->add_separator();
theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/save_theme", TTR("Save Theme")), THEME_SAVE);
@@ -4165,7 +4165,7 @@ ScriptEditor::ScriptEditor(WindowWrapper *p_wrapper) {
file_menu->get_popup()->add_separator();
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/toggle_scripts_panel", TTR("Toggle Scripts Panel"), KeyModifierMask::CMD_OR_CTRL | Key::BACKSLASH), TOGGLE_SCRIPTS_PANEL);
- file_menu->get_popup()->connect("id_pressed", callable_mp(this, &ScriptEditor::_menu_option));
+ file_menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &ScriptEditor::_menu_option));
file_menu->get_popup()->connect("about_to_popup", callable_mp(this, &ScriptEditor::_prepare_file_menu));
file_menu->get_popup()->connect("popup_hide", callable_mp(this, &ScriptEditor::_file_menu_closed));
@@ -4173,7 +4173,7 @@ ScriptEditor::ScriptEditor(WindowWrapper *p_wrapper) {
script_search_menu->set_text(TTR("Search"));
script_search_menu->set_switch_on_hover(true);
script_search_menu->set_shortcut_context(this);
- script_search_menu->get_popup()->connect("id_pressed", callable_mp(this, &ScriptEditor::_menu_option));
+ script_search_menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &ScriptEditor::_menu_option));
menu_hb->add_child(script_search_menu);
MenuButton *debug_menu_btn = memnew(MenuButton);
@@ -4356,9 +4356,9 @@ void ScriptEditorPlugin::_save_last_editor(const String &p_editor) {
void ScriptEditorPlugin::_window_visibility_changed(bool p_visible) {
_focus_another_editor();
if (p_visible) {
- script_editor->add_theme_style_override("panel", script_editor->get_theme_stylebox("ScriptEditorPanelFloating", EditorStringName(EditorStyles)));
+ script_editor->add_theme_style_override(SceneStringName(panel), script_editor->get_theme_stylebox("ScriptEditorPanelFloating", EditorStringName(EditorStyles)));
} else {
- script_editor->add_theme_style_override("panel", script_editor->get_theme_stylebox("ScriptEditorPanel", EditorStringName(EditorStyles)));
+ script_editor->add_theme_style_override(SceneStringName(panel), script_editor->get_theme_stylebox("ScriptEditorPanel", EditorStringName(EditorStyles)));
}
}
diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp
index b11ad8b7d5..059e177874 100644
--- a/editor/plugins/script_text_editor.cpp
+++ b/editor/plugins/script_text_editor.cpp
@@ -2254,7 +2254,7 @@ void ScriptTextEditor::_enable_code_editor() {
errors_panel->connect("meta_clicked", callable_mp(this, &ScriptTextEditor::_error_clicked));
add_child(context_menu);
- context_menu->connect("id_pressed", callable_mp(this, &ScriptTextEditor::_edit_option));
+ context_menu->connect(SceneStringName(id_pressed), callable_mp(this, &ScriptTextEditor::_edit_option));
add_child(color_panel);
@@ -2297,7 +2297,7 @@ void ScriptTextEditor::_enable_code_editor() {
sub_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/unindent"), EDIT_UNINDENT);
sub_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/delete_line"), EDIT_DELETE_LINE);
sub_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_comment"), EDIT_TOGGLE_COMMENT);
- sub_menu->connect("id_pressed", callable_mp(this, &ScriptTextEditor::_edit_option));
+ sub_menu->connect(SceneStringName(id_pressed), callable_mp(this, &ScriptTextEditor::_edit_option));
edit_menu->get_popup()->add_submenu_node_item(TTR("Line"), sub_menu);
}
{
@@ -2306,7 +2306,7 @@ void ScriptTextEditor::_enable_code_editor() {
sub_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/fold_all_lines"), EDIT_FOLD_ALL_LINES);
sub_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/unfold_all_lines"), EDIT_UNFOLD_ALL_LINES);
sub_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/create_code_region"), EDIT_CREATE_CODE_REGION);
- sub_menu->connect("id_pressed", callable_mp(this, &ScriptTextEditor::_edit_option));
+ sub_menu->connect(SceneStringName(id_pressed), callable_mp(this, &ScriptTextEditor::_edit_option));
edit_menu->get_popup()->add_submenu_node_item(TTR("Folding"), sub_menu);
}
edit_menu->get_popup()->add_separator();
@@ -2318,21 +2318,21 @@ void ScriptTextEditor::_enable_code_editor() {
sub_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_indent_to_spaces"), EDIT_CONVERT_INDENT_TO_SPACES);
sub_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_indent_to_tabs"), EDIT_CONVERT_INDENT_TO_TABS);
sub_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/auto_indent"), EDIT_AUTO_INDENT);
- sub_menu->connect("id_pressed", callable_mp(this, &ScriptTextEditor::_edit_option));
+ sub_menu->connect(SceneStringName(id_pressed), callable_mp(this, &ScriptTextEditor::_edit_option));
edit_menu->get_popup()->add_submenu_node_item(TTR("Indentation"), sub_menu);
}
- edit_menu->get_popup()->connect("id_pressed", callable_mp(this, &ScriptTextEditor::_edit_option));
+ edit_menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &ScriptTextEditor::_edit_option));
edit_menu->get_popup()->add_separator();
{
PopupMenu *sub_menu = memnew(PopupMenu);
sub_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_to_uppercase"), EDIT_TO_UPPERCASE);
sub_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_to_lowercase"), EDIT_TO_LOWERCASE);
sub_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/capitalize"), EDIT_CAPITALIZE);
- sub_menu->connect("id_pressed", callable_mp(this, &ScriptTextEditor::_edit_option));
+ sub_menu->connect(SceneStringName(id_pressed), callable_mp(this, &ScriptTextEditor::_edit_option));
edit_menu->get_popup()->add_submenu_node_item(TTR("Convert Case"), sub_menu);
}
edit_menu->get_popup()->add_submenu_node_item(TTR("Syntax Highlighter"), highlighter_menu);
- highlighter_menu->connect("id_pressed", callable_mp(this, &ScriptTextEditor::_change_syntax_highlighter));
+ highlighter_menu->connect(SceneStringName(id_pressed), callable_mp(this, &ScriptTextEditor::_change_syntax_highlighter));
edit_hb->add_child(search_menu);
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find"), SEARCH_FIND);
@@ -2344,7 +2344,7 @@ void ScriptTextEditor::_enable_code_editor() {
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/replace_in_files"), REPLACE_IN_FILES);
search_menu->get_popup()->add_separator();
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/contextual_help"), HELP_CONTEXTUAL);
- search_menu->get_popup()->connect("id_pressed", callable_mp(this, &ScriptTextEditor::_edit_option));
+ search_menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &ScriptTextEditor::_edit_option));
_load_theme_settings();
@@ -2363,7 +2363,7 @@ void ScriptTextEditor::_enable_code_editor() {
breakpoints_menu->connect("about_to_popup", callable_mp(this, &ScriptTextEditor::_update_breakpoint_list));
breakpoints_menu->connect("index_pressed", callable_mp(this, &ScriptTextEditor::_breakpoint_item_pressed));
- goto_menu->get_popup()->connect("id_pressed", callable_mp(this, &ScriptTextEditor::_edit_option));
+ goto_menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &ScriptTextEditor::_edit_option));
}
ScriptTextEditor::ScriptTextEditor() {
diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp
index a83f95f680..8dc398138c 100644
--- a/editor/plugins/shader_editor_plugin.cpp
+++ b/editor/plugins/shader_editor_plugin.cpp
@@ -699,7 +699,7 @@ ShaderEditorPlugin::ShaderEditorPlugin() {
file_menu->get_popup()->add_item(TTR("Open File in Inspector"), FILE_INSPECT);
file_menu->get_popup()->add_separator();
file_menu->get_popup()->add_item(TTR("Close File"), FILE_CLOSE);
- file_menu->get_popup()->connect("id_pressed", callable_mp(this, &ShaderEditorPlugin::_menu_item_pressed));
+ file_menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &ShaderEditorPlugin::_menu_item_pressed));
menu_hb->add_child(file_menu);
for (int i = FILE_SAVE; i < FILE_MAX; i++) {
@@ -738,7 +738,7 @@ ShaderEditorPlugin::ShaderEditorPlugin() {
main_split->add_child(shader_tabs);
Ref<StyleBoxEmpty> empty;
empty.instantiate();
- shader_tabs->add_theme_style_override("panel", empty);
+ shader_tabs->add_theme_style_override(SceneStringName(panel), empty);
button = EditorNode::get_bottom_panel()->add_item(TTR("Shader Editor"), window_wrapper, ED_SHORTCUT_AND_COMMAND("bottom_panels/toggle_shader_editor_bottom_panel", TTR("Toggle Shader Editor Bottom Panel"), KeyModifierMask::ALT | Key::S));
diff --git a/editor/plugins/skeleton_2d_editor_plugin.cpp b/editor/plugins/skeleton_2d_editor_plugin.cpp
index 44543ffa9f..8308fe6d6e 100644
--- a/editor/plugins/skeleton_2d_editor_plugin.cpp
+++ b/editor/plugins/skeleton_2d_editor_plugin.cpp
@@ -107,7 +107,7 @@ Skeleton2DEditor::Skeleton2DEditor() {
options->get_popup()->add_item(TTR("Overwrite Rest Pose"), MENU_OPTION_MAKE_REST);
options->set_switch_on_hover(true);
- options->get_popup()->connect("id_pressed", callable_mp(this, &Skeleton2DEditor::_menu_option));
+ options->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &Skeleton2DEditor::_menu_option));
err_dialog = memnew(AcceptDialog);
add_child(err_dialog);
diff --git a/editor/plugins/skeleton_3d_editor_plugin.cpp b/editor/plugins/skeleton_3d_editor_plugin.cpp
index e792f0998b..202817f6ee 100644
--- a/editor/plugins/skeleton_3d_editor_plugin.cpp
+++ b/editor/plugins/skeleton_3d_editor_plugin.cpp
@@ -735,7 +735,7 @@ void Skeleton3DEditor::create_editors() {
p->add_item(TTR("Create Physical Skeleton"), SKELETON_OPTION_CREATE_PHYSICAL_SKELETON);
p->add_item(TTR("Export Skeleton Profile"), SKELETON_OPTION_EXPORT_SKELETON_PROFILE);
- p->connect("id_pressed", callable_mp(this, &Skeleton3DEditor::_on_click_skeleton_option));
+ p->connect(SceneStringName(id_pressed), callable_mp(this, &Skeleton3DEditor::_on_click_skeleton_option));
set_bone_options_enabled(false);
Vector<Variant> button_binds;
diff --git a/editor/plugins/sprite_2d_editor_plugin.cpp b/editor/plugins/sprite_2d_editor_plugin.cpp
index 0b882e265d..c7a89484f0 100644
--- a/editor/plugins/sprite_2d_editor_plugin.cpp
+++ b/editor/plugins/sprite_2d_editor_plugin.cpp
@@ -587,7 +587,7 @@ Sprite2DEditor::Sprite2DEditor() {
options->get_popup()->add_item(TTR("Create LightOccluder2D Sibling"), MENU_OPTION_CREATE_LIGHT_OCCLUDER_2D);
options->set_switch_on_hover(true);
- options->get_popup()->connect("id_pressed", callable_mp(this, &Sprite2DEditor::_menu_option));
+ options->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &Sprite2DEditor::_menu_option));
err_dialog = memnew(AcceptDialog);
add_child(err_dialog);
diff --git a/editor/plugins/sprite_frames_editor_plugin.cpp b/editor/plugins/sprite_frames_editor_plugin.cpp
index c14336418c..ae6ec0f702 100644
--- a/editor/plugins/sprite_frames_editor_plugin.cpp
+++ b/editor/plugins/sprite_frames_editor_plugin.cpp
@@ -587,7 +587,7 @@ void SpriteFramesEditor::_notification(int p_what) {
split_sheet_zoom_out->set_icon(get_editor_theme_icon(SNAME("ZoomLess")));
split_sheet_zoom_reset->set_icon(get_editor_theme_icon(SNAME("ZoomReset")));
split_sheet_zoom_in->set_icon(get_editor_theme_icon(SNAME("ZoomMore")));
- split_sheet_scroll->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Tree")));
+ split_sheet_scroll->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("Tree")));
_update_show_settings();
} break;
diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp
index c4c3f3b4e3..ecdc4acf47 100644
--- a/editor/plugins/text_editor.cpp
+++ b/editor/plugins/text_editor.cpp
@@ -614,7 +614,7 @@ TextEditor::TextEditor() {
context_menu = memnew(PopupMenu);
add_child(context_menu);
- context_menu->connect("id_pressed", callable_mp(this, &TextEditor::_edit_option));
+ context_menu->connect(SceneStringName(id_pressed), callable_mp(this, &TextEditor::_edit_option));
edit_hb = memnew(HBoxContainer);
@@ -624,7 +624,7 @@ TextEditor::TextEditor() {
edit_menu->set_text(TTR("Edit"));
edit_menu->set_switch_on_hover(true);
edit_menu->connect("about_to_popup", callable_mp(this, &TextEditor::_prepare_edit_menu));
- edit_menu->get_popup()->connect("id_pressed", callable_mp(this, &TextEditor::_edit_option));
+ edit_menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &TextEditor::_edit_option));
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_undo"), EDIT_UNDO);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_redo"), EDIT_REDO);
@@ -658,11 +658,11 @@ TextEditor::TextEditor() {
convert_case->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_to_uppercase"), EDIT_TO_UPPERCASE);
convert_case->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_to_lowercase"), EDIT_TO_LOWERCASE);
convert_case->add_shortcut(ED_GET_SHORTCUT("script_text_editor/capitalize"), EDIT_CAPITALIZE);
- convert_case->connect("id_pressed", callable_mp(this, &TextEditor::_edit_option));
+ convert_case->connect(SceneStringName(id_pressed), callable_mp(this, &TextEditor::_edit_option));
highlighter_menu = memnew(PopupMenu);
edit_menu->get_popup()->add_submenu_node_item(TTR("Syntax Highlighter"), highlighter_menu);
- highlighter_menu->connect("id_pressed", callable_mp(this, &TextEditor::_change_syntax_highlighter));
+ highlighter_menu->connect(SceneStringName(id_pressed), callable_mp(this, &TextEditor::_change_syntax_highlighter));
Ref<EditorPlainTextSyntaxHighlighter> plain_highlighter;
plain_highlighter.instantiate();
@@ -678,7 +678,7 @@ TextEditor::TextEditor() {
edit_hb->add_child(search_menu);
search_menu->set_text(TTR("Search"));
search_menu->set_switch_on_hover(true);
- search_menu->get_popup()->connect("id_pressed", callable_mp(this, &TextEditor::_edit_option));
+ search_menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &TextEditor::_edit_option));
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find"), SEARCH_FIND);
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_next"), SEARCH_FIND_NEXT);
@@ -693,7 +693,7 @@ TextEditor::TextEditor() {
edit_hb->add_child(goto_menu);
goto_menu->set_text(TTR("Go To"));
goto_menu->set_switch_on_hover(true);
- goto_menu->get_popup()->connect("id_pressed", callable_mp(this, &TextEditor::_edit_option));
+ goto_menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &TextEditor::_edit_option));
goto_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_line"), SEARCH_GOTO_LINE);
goto_menu->get_popup()->add_separator();
diff --git a/editor/plugins/text_shader_editor.cpp b/editor/plugins/text_shader_editor.cpp
index fb8bed381e..6c47f3aadb 100644
--- a/editor/plugins/text_shader_editor.cpp
+++ b/editor/plugins/text_shader_editor.cpp
@@ -1138,7 +1138,7 @@ TextShaderEditor::TextShaderEditor() {
context_menu = memnew(PopupMenu);
add_child(context_menu);
- context_menu->connect("id_pressed", callable_mp(this, &TextShaderEditor::_menu_option));
+ context_menu->connect(SceneStringName(id_pressed), callable_mp(this, &TextShaderEditor::_menu_option));
VBoxContainer *main_container = memnew(VBoxContainer);
HBoxContainer *hbc = memnew(HBoxContainer);
@@ -1169,7 +1169,7 @@ TextShaderEditor::TextShaderEditor() {
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_word_wrap"), EDIT_TOGGLE_WORD_WRAP);
edit_menu->get_popup()->add_separator();
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_text_completion_query"), EDIT_COMPLETE);
- edit_menu->get_popup()->connect("id_pressed", callable_mp(this, &TextShaderEditor::_menu_option));
+ edit_menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &TextShaderEditor::_menu_option));
search_menu = memnew(MenuButton);
search_menu->set_shortcut_context(this);
@@ -1180,13 +1180,13 @@ TextShaderEditor::TextShaderEditor() {
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_next"), SEARCH_FIND_NEXT);
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_previous"), SEARCH_FIND_PREV);
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/replace"), SEARCH_REPLACE);
- search_menu->get_popup()->connect("id_pressed", callable_mp(this, &TextShaderEditor::_menu_option));
+ search_menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &TextShaderEditor::_menu_option));
MenuButton *goto_menu = memnew(MenuButton);
goto_menu->set_shortcut_context(this);
goto_menu->set_text(TTR("Go To"));
goto_menu->set_switch_on_hover(true);
- goto_menu->get_popup()->connect("id_pressed", callable_mp(this, &TextShaderEditor::_menu_option));
+ goto_menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &TextShaderEditor::_menu_option));
goto_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/goto_line"), SEARCH_GOTO_LINE);
goto_menu->get_popup()->add_separator();
@@ -1201,7 +1201,7 @@ TextShaderEditor::TextShaderEditor() {
help_menu->set_text(TTR("Help"));
help_menu->set_switch_on_hover(true);
help_menu->get_popup()->add_item(TTR("Online Docs"), HELP_DOCS);
- help_menu->get_popup()->connect("id_pressed", callable_mp(this, &TextShaderEditor::_menu_option));
+ help_menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &TextShaderEditor::_menu_option));
add_child(main_container);
main_container->add_child(hbc);
@@ -1209,7 +1209,7 @@ TextShaderEditor::TextShaderEditor() {
hbc->add_child(edit_menu);
hbc->add_child(goto_menu);
hbc->add_child(help_menu);
- hbc->add_theme_style_override("panel", EditorNode::get_singleton()->get_editor_theme()->get_stylebox(SNAME("ScriptEditorPanel"), EditorStringName(EditorStyles)));
+ hbc->add_theme_style_override(SceneStringName(panel), EditorNode::get_singleton()->get_editor_theme()->get_stylebox(SNAME("ScriptEditorPanel"), EditorStringName(EditorStyles)));
VSplitContainer *editor_box = memnew(VSplitContainer);
main_container->add_child(editor_box);
diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp
index 6b90ea79b2..799d7c757d 100644
--- a/editor/plugins/texture_region_editor_plugin.cpp
+++ b/editor/plugins/texture_region_editor_plugin.cpp
@@ -842,8 +842,8 @@ void TextureRegionEditor::_notification(int p_what) {
} break;
case NOTIFICATION_THEME_CHANGED: {
- texture_preview->add_theme_style_override("panel", get_theme_stylebox(SNAME("TextureRegionPreviewBG"), EditorStringName(EditorStyles)));
- texture_overlay->add_theme_style_override("panel", get_theme_stylebox(SNAME("TextureRegionPreviewFG"), EditorStringName(EditorStyles)));
+ texture_preview->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("TextureRegionPreviewBG"), EditorStringName(EditorStyles)));
+ texture_overlay->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("TextureRegionPreviewFG"), EditorStringName(EditorStyles)));
zoom_out->set_icon(get_editor_theme_icon(SNAME("ZoomLess")));
zoom_reset->set_icon(get_editor_theme_icon(SNAME("ZoomReset")));
diff --git a/editor/plugins/theme_editor_plugin.cpp b/editor/plugins/theme_editor_plugin.cpp
index 8489574194..b307832ff6 100644
--- a/editor/plugins/theme_editor_plugin.cpp
+++ b/editor/plugins/theme_editor_plugin.cpp
@@ -3670,7 +3670,7 @@ void ThemeEditor::_notification(int p_what) {
case NOTIFICATION_THEME_CHANGED: {
preview_tabs->add_theme_style_override("tab_selected", get_theme_stylebox(SNAME("ThemeEditorPreviewFG"), EditorStringName(EditorStyles)));
preview_tabs->add_theme_style_override("tab_unselected", get_theme_stylebox(SNAME("ThemeEditorPreviewBG"), EditorStringName(EditorStyles)));
- preview_tabs_content->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("TabContainerOdd")));
+ preview_tabs_content->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("TabContainerOdd")));
add_preview_button->set_icon(get_editor_theme_icon(SNAME("Add")));
} break;
diff --git a/editor/plugins/tiles/tile_data_editors.cpp b/editor/plugins/tiles/tile_data_editors.cpp
index a94080e253..df90383678 100644
--- a/editor/plugins/tiles/tile_data_editors.cpp
+++ b/editor/plugins/tiles/tile_data_editors.cpp
@@ -903,7 +903,7 @@ GenericTilePolygonEditor::GenericTilePolygonEditor() {
button_advanced_menu->get_popup()->add_item(TTR("Rotate Left"), ROTATE_LEFT, Key::E);
button_advanced_menu->get_popup()->add_item(TTR("Flip Horizontally"), FLIP_HORIZONTALLY, Key::H);
button_advanced_menu->get_popup()->add_item(TTR("Flip Vertically"), FLIP_VERTICALLY, Key::V);
- button_advanced_menu->get_popup()->connect("id_pressed", callable_mp(this, &GenericTilePolygonEditor::_advanced_menu_item_pressed));
+ button_advanced_menu->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &GenericTilePolygonEditor::_advanced_menu_item_pressed));
button_advanced_menu->set_focus_mode(FOCUS_ALL);
toolbar->add_child(button_advanced_menu);
diff --git a/editor/plugins/tiles/tile_map_layer_editor.cpp b/editor/plugins/tiles/tile_map_layer_editor.cpp
index 5fd4fb3602..6cf0bec535 100644
--- a/editor/plugins/tiles/tile_map_layer_editor.cpp
+++ b/editor/plugins/tiles/tile_map_layer_editor.cpp
@@ -2389,7 +2389,7 @@ TileMapLayerEditorTilesPlugin::TileMapLayerEditorTilesPlugin() {
source_sort_button->set_tooltip_text(TTR("Sort sources"));
PopupMenu *p = source_sort_button->get_popup();
- p->connect("id_pressed", callable_mp(this, &TileMapLayerEditorTilesPlugin::_set_source_sort));
+ p->connect(SceneStringName(id_pressed), callable_mp(this, &TileMapLayerEditorTilesPlugin::_set_source_sort));
p->add_radio_check_item(TTR("Sort by ID (Ascending)"), TilesEditorUtils::SOURCE_SORT_ID);
p->add_radio_check_item(TTR("Sort by ID (Descending)"), TilesEditorUtils::SOURCE_SORT_ID_REVERSE);
p->add_radio_check_item(TTR("Sort by Name (Ascending)"), TilesEditorUtils::SOURCE_SORT_NAME);
@@ -4491,7 +4491,7 @@ TileMapLayerEditor::TileMapLayerEditor() {
advanced_menu_button->set_theme_type_variation("FlatButton");
advanced_menu_button->get_popup()->add_item(TTR("Automatically Replace Tiles with Proxies"), ADVANCED_MENU_REPLACE_WITH_PROXIES);
advanced_menu_button->get_popup()->add_item(TTR("Extract TileMap layers as individual TileMapLayer nodes"), ADVANCED_MENU_EXTRACT_TILE_MAP_LAYERS);
- advanced_menu_button->get_popup()->connect("id_pressed", callable_mp(this, &TileMapLayerEditor::_advanced_menu_button_id_pressed));
+ advanced_menu_button->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &TileMapLayerEditor::_advanced_menu_button_id_pressed));
tile_map_toolbar->add_child(advanced_menu_button);
// A label for editing errors.
diff --git a/editor/plugins/tiles/tile_proxies_manager_dialog.cpp b/editor/plugins/tiles/tile_proxies_manager_dialog.cpp
index 9add6ef586..35e64899fb 100644
--- a/editor/plugins/tiles/tile_proxies_manager_dialog.cpp
+++ b/editor/plugins/tiles/tile_proxies_manager_dialog.cpp
@@ -378,7 +378,7 @@ TileProxiesManagerDialog::TileProxiesManagerDialog() {
popup_menu = memnew(PopupMenu);
popup_menu->add_shortcut(ED_GET_SHORTCUT("ui_text_delete"));
- popup_menu->connect("id_pressed", callable_mp(this, &TileProxiesManagerDialog::_menu_id_pressed));
+ popup_menu->connect(SceneStringName(id_pressed), callable_mp(this, &TileProxiesManagerDialog::_menu_id_pressed));
add_child(popup_menu);
// Add proxy panel.
diff --git a/editor/plugins/tiles/tile_set_atlas_source_editor.cpp b/editor/plugins/tiles/tile_set_atlas_source_editor.cpp
index 03070bc6b5..8b9d2a4e71 100644
--- a/editor/plugins/tiles/tile_set_atlas_source_editor.cpp
+++ b/editor/plugins/tiles/tile_set_atlas_source_editor.cpp
@@ -997,7 +997,7 @@ void TileSetAtlasSourceEditor::_update_atlas_view() {
Button *button = memnew(Button);
button->set_flat(true);
button->set_icon(get_editor_theme_icon(SNAME("Add")));
- button->add_theme_style_override("normal", memnew(StyleBoxEmpty));
+ button->add_theme_style_override(CoreStringName(normal), memnew(StyleBoxEmpty));
button->add_theme_style_override("hover", memnew(StyleBoxEmpty));
button->add_theme_style_override("focus", memnew(StyleBoxEmpty));
button->add_theme_style_override(SceneStringName(pressed), memnew(StyleBoxEmpty));
@@ -2637,7 +2637,7 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() {
tool_advanced_menu_button->get_popup()->add_item(TTR("Create Tiles in Non-Transparent Texture Regions"), ADVANCED_AUTO_CREATE_TILES);
tool_advanced_menu_button->get_popup()->add_item(TTR("Remove Tiles in Fully Transparent Texture Regions"), ADVANCED_AUTO_REMOVE_TILES);
tool_advanced_menu_button->get_popup()->add_item(TTR("Remove Tiles Outside the Texture"), ADVANCED_CLEANUP_TILES);
- tool_advanced_menu_button->get_popup()->connect("id_pressed", callable_mp(this, &TileSetAtlasSourceEditor::_menu_option));
+ tool_advanced_menu_button->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &TileSetAtlasSourceEditor::_menu_option));
tool_settings->add_child(tool_advanced_menu_button);
outside_tiles_warning = memnew(TextureRect);
@@ -2689,12 +2689,12 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() {
base_tile_popup_menu = memnew(PopupMenu);
base_tile_popup_menu->add_shortcut(ED_GET_SHORTCUT("tiles_editor/delete"), TILE_DELETE);
base_tile_popup_menu->add_item(TTR("Create an Alternative Tile"), TILE_CREATE_ALTERNATIVE);
- base_tile_popup_menu->connect("id_pressed", callable_mp(this, &TileSetAtlasSourceEditor::_menu_option));
+ base_tile_popup_menu->connect(SceneStringName(id_pressed), callable_mp(this, &TileSetAtlasSourceEditor::_menu_option));
tile_atlas_view->add_child(base_tile_popup_menu);
empty_base_tile_popup_menu = memnew(PopupMenu);
empty_base_tile_popup_menu->add_item(TTR("Create a Tile"), TILE_CREATE);
- empty_base_tile_popup_menu->connect("id_pressed", callable_mp(this, &TileSetAtlasSourceEditor::_menu_option));
+ empty_base_tile_popup_menu->connect(SceneStringName(id_pressed), callable_mp(this, &TileSetAtlasSourceEditor::_menu_option));
tile_atlas_view->add_child(empty_base_tile_popup_menu);
tile_atlas_control = memnew(TileAtlasControl(this));
@@ -2710,7 +2710,7 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() {
alternative_tile_popup_menu = memnew(PopupMenu);
alternative_tile_popup_menu->add_shortcut(ED_SHORTCUT("tiles_editor/delete_tile", TTR("Delete"), Key::KEY_DELETE), TILE_DELETE);
- alternative_tile_popup_menu->connect("id_pressed", callable_mp(this, &TileSetAtlasSourceEditor::_menu_option));
+ alternative_tile_popup_menu->connect(SceneStringName(id_pressed), callable_mp(this, &TileSetAtlasSourceEditor::_menu_option));
tile_atlas_view->add_child(alternative_tile_popup_menu);
alternative_tiles_control = memnew(Control);
diff --git a/editor/plugins/tiles/tile_set_editor.cpp b/editor/plugins/tiles/tile_set_editor.cpp
index 0efed44ac7..a20bd51328 100644
--- a/editor/plugins/tiles/tile_set_editor.cpp
+++ b/editor/plugins/tiles/tile_set_editor.cpp
@@ -371,7 +371,7 @@ void TileSetEditor::_notification(int p_what) {
source_sort_button->set_icon(get_editor_theme_icon(SNAME("Sort")));
sources_advanced_menu_button->set_icon(get_editor_theme_icon(SNAME("GuiTabMenuHl")));
missing_texture_texture = get_editor_theme_icon(SNAME("TileSet"));
- expanded_area->add_theme_style_override("panel", get_theme_stylebox("panel", "Tree"));
+ expanded_area->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), "Tree"));
_update_sources_list();
} break;
@@ -849,7 +849,7 @@ TileSetEditor::TileSetEditor() {
source_sort_button->set_tooltip_text(TTR("Sort Sources"));
PopupMenu *p = source_sort_button->get_popup();
- p->connect("id_pressed", callable_mp(this, &TileSetEditor::_set_source_sort));
+ p->connect(SceneStringName(id_pressed), callable_mp(this, &TileSetEditor::_set_source_sort));
p->add_radio_check_item(TTR("Sort by ID (Ascending)"), TilesEditorUtils::SOURCE_SORT_ID);
p->add_radio_check_item(TTR("Sort by ID (Descending)"), TilesEditorUtils::SOURCE_SORT_ID_REVERSE);
p->add_radio_check_item(TTR("Sort by Name (Ascending)"), TilesEditorUtils::SOURCE_SORT_NAME);
@@ -887,7 +887,7 @@ TileSetEditor::TileSetEditor() {
sources_add_button->get_popup()->set_item_tooltip(-1, TTR("A palette of tiles made from a texture."));
sources_add_button->get_popup()->add_item(TTR("Scenes Collection"));
sources_add_button->get_popup()->set_item_tooltip(-1, TTR("A collection of scenes that can be instantiated and placed as tiles."));
- sources_add_button->get_popup()->connect("id_pressed", callable_mp(this, &TileSetEditor::_source_add_id_pressed));
+ sources_add_button->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &TileSetEditor::_source_add_id_pressed));
sources_bottom_actions->add_child(sources_add_button);
sources_advanced_menu_button = memnew(MenuButton);
@@ -895,7 +895,7 @@ TileSetEditor::TileSetEditor() {
sources_advanced_menu_button->set_theme_type_variation("FlatButton");
sources_advanced_menu_button->get_popup()->add_item(TTR("Open Atlas Merging Tool"));
sources_advanced_menu_button->get_popup()->add_item(TTR("Manage Tile Proxies"));
- sources_advanced_menu_button->get_popup()->connect("id_pressed", callable_mp(this, &TileSetEditor::_sources_advanced_menu_id_pressed));
+ sources_advanced_menu_button->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &TileSetEditor::_sources_advanced_menu_id_pressed));
sources_bottom_actions->add_child(sources_advanced_menu_button);
sources_bottom_actions->add_child(source_sort_button);
diff --git a/editor/plugins/version_control_editor_plugin.cpp b/editor/plugins/version_control_editor_plugin.cpp
index beed89ea10..1e88916672 100644
--- a/editor/plugins/version_control_editor_plugin.cpp
+++ b/editor/plugins/version_control_editor_plugin.cpp
@@ -1432,7 +1432,7 @@ VersionControlEditorPlugin::VersionControlEditorPlugin() {
extra_options = memnew(MenuButton);
extra_options->set_icon(EditorNode::get_singleton()->get_editor_theme()->get_icon(SNAME("GuiTabMenuHl"), EditorStringName(EditorIcons)));
extra_options->get_popup()->connect(SNAME("about_to_popup"), callable_mp(this, &VersionControlEditorPlugin::_update_extra_options));
- extra_options->get_popup()->connect(SNAME("id_pressed"), callable_mp(this, &VersionControlEditorPlugin::_extra_option_selected));
+ extra_options->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &VersionControlEditorPlugin::_extra_option_selected));
menu_bar->add_child(extra_options);
extra_options->get_popup()->add_item(TTR("Force Push"), EXTRA_OPTION_FORCE_PUSH);
@@ -1440,14 +1440,14 @@ VersionControlEditorPlugin::VersionControlEditorPlugin() {
extra_options->get_popup()->add_item(TTR("Create New Branch"), EXTRA_OPTION_CREATE_BRANCH);
extra_options_remove_branch_list = memnew(PopupMenu);
- extra_options_remove_branch_list->connect(SNAME("id_pressed"), callable_mp(this, &VersionControlEditorPlugin::_popup_branch_remove_confirm));
+ extra_options_remove_branch_list->connect(SceneStringName(id_pressed), callable_mp(this, &VersionControlEditorPlugin::_popup_branch_remove_confirm));
extra_options->get_popup()->add_submenu_node_item(TTR("Remove Branch"), extra_options_remove_branch_list);
extra_options->get_popup()->add_separator();
extra_options->get_popup()->add_item(TTR("Create New Remote"), EXTRA_OPTION_CREATE_REMOTE);
extra_options_remove_remote_list = memnew(PopupMenu);
- extra_options_remove_remote_list->connect(SNAME("id_pressed"), callable_mp(this, &VersionControlEditorPlugin::_popup_remote_remove_confirm));
+ extra_options_remove_remote_list->connect(SceneStringName(id_pressed), callable_mp(this, &VersionControlEditorPlugin::_popup_remote_remove_confirm));
extra_options->get_popup()->add_submenu_node_item(TTR("Remove Remote"), extra_options_remove_remote_list);
change_type_to_strings[EditorVCSInterface::CHANGE_TYPE_NEW] = TTR("New");
diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp
index 438d798120..290e0a3239 100644
--- a/editor/plugins/visual_shader_editor_plugin.cpp
+++ b/editor/plugins/visual_shader_editor_plugin.cpp
@@ -789,7 +789,7 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id, bool
}
// Set the minimum width of a node based on the preview size to avoid a resize when toggling the preview.
- Ref<StyleBoxFlat> graph_node_stylebox = graph->get_theme_stylebox("panel", "GraphNode");
+ Ref<StyleBoxFlat> graph_node_stylebox = graph->get_theme_stylebox(SceneStringName(panel), "GraphNode");
int port_preview_size = EDITOR_GET("editors/visual_editors/visual_shader/port_preview_size");
if (!is_frame && !is_reroute) {
node->set_custom_minimum_size(Size2((Math::ceil(graph_node_stylebox->get_minimum_size().width) + port_preview_size) * EDSCALE, 0));
@@ -1138,14 +1138,14 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id, bool
Label *label = memnew(Label);
label->set_auto_translate_mode(Node::AUTO_TRANSLATE_MODE_DISABLED); // TODO: Implement proper translation switch.
label->set_text(name_left);
- label->add_theme_style_override("normal", editor->get_theme_stylebox(SNAME("label_style"), SNAME("VShaderEditor"))); //more compact
+ label->add_theme_style_override(CoreStringName(normal), editor->get_theme_stylebox(SNAME("label_style"), SNAME("VShaderEditor"))); //more compact
hb->add_child(label);
if (vsnode->is_input_port_default(j, mode) && !port_left_used) {
Label *hint_label = memnew(Label);
hint_label->set_text(TTR("[default]"));
hint_label->add_theme_color_override("font_color", editor->get_theme_color(SNAME("font_readonly_color"), SNAME("TextEdit")));
- hint_label->add_theme_style_override("normal", editor->get_theme_stylebox(SNAME("label_style"), SNAME("VShaderEditor")));
+ hint_label->add_theme_style_override(CoreStringName(normal), editor->get_theme_stylebox(SNAME("label_style"), SNAME("VShaderEditor")));
hb->add_child(hint_label);
}
}
@@ -1188,7 +1188,7 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id, bool
Label *label = memnew(Label);
label->set_auto_translate_mode(Node::AUTO_TRANSLATE_MODE_DISABLED); // TODO: Implement proper translation switch.
label->set_text(name_right);
- label->add_theme_style_override("normal", editor->get_theme_stylebox(SNAME("label_style"), SNAME("VShaderEditor"))); //more compact
+ label->add_theme_style_override(CoreStringName(normal), editor->get_theme_stylebox(SNAME("label_style"), SNAME("VShaderEditor"))); //more compact
hb->add_child(label);
}
}
@@ -4929,7 +4929,7 @@ void VisualShaderEditor::_notification(int p_what) {
preview_text->add_comment_delimiter("/*", "*/", false);
preview_text->add_comment_delimiter("//", "", true);
- error_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Panel")));
+ error_panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("Panel")));
error_label->begin_bulk_theme_override();
error_label->add_theme_font_override("font", get_theme_font(SNAME("status_source"), EditorStringName(EditorFonts)));
error_label->add_theme_font_size_override("font_size", get_theme_font_size(SNAME("status_source_size"), EditorStringName(EditorFonts)));
@@ -6195,7 +6195,7 @@ VisualShaderEditor::VisualShaderEditor() {
PopupMenu *varying_menu = varying_button->get_popup();
varying_menu->add_item(TTR("Add Varying"), int(VaryingMenuOptions::ADD));
varying_menu->add_item(TTR("Remove Varying"), int(VaryingMenuOptions::REMOVE));
- varying_menu->connect("id_pressed", callable_mp(this, &VisualShaderEditor::_varying_menu_id_pressed));
+ varying_menu->connect(SceneStringName(id_pressed), callable_mp(this, &VisualShaderEditor::_varying_menu_id_pressed));
preview_shader = memnew(Button);
preview_shader->set_theme_type_variation("FlatButton");
@@ -6251,14 +6251,14 @@ VisualShaderEditor::VisualShaderEditor() {
popup_menu->add_item(TTR("Delete"), NodeMenuOptions::DELETE);
popup_menu->add_item(TTR("Duplicate"), NodeMenuOptions::DUPLICATE);
popup_menu->add_item(TTR("Clear Copy Buffer"), NodeMenuOptions::CLEAR_COPY_BUFFER);
- popup_menu->connect("id_pressed", callable_mp(this, &VisualShaderEditor::_node_menu_id_pressed));
+ popup_menu->connect(SceneStringName(id_pressed), callable_mp(this, &VisualShaderEditor::_node_menu_id_pressed));
connection_popup_menu = memnew(PopupMenu);
add_child(connection_popup_menu);
connection_popup_menu->add_item(TTR("Disconnect"), ConnectionMenuOptions::DISCONNECT);
connection_popup_menu->add_item(TTR("Insert New Node"), ConnectionMenuOptions::INSERT_NEW_NODE);
connection_popup_menu->add_item(TTR("Insert New Reroute"), ConnectionMenuOptions::INSERT_NEW_REROUTE);
- connection_popup_menu->connect("id_pressed", callable_mp(this, &VisualShaderEditor::_connection_menu_id_pressed));
+ connection_popup_menu->connect(SceneStringName(id_pressed), callable_mp(this, &VisualShaderEditor::_connection_menu_id_pressed));
///////////////////////////////////////
// SHADER NODES TREE
@@ -6280,7 +6280,7 @@ VisualShaderEditor::VisualShaderEditor() {
tools = memnew(MenuButton);
filter_hb->add_child(tools);
tools->set_tooltip_text(TTR("Options"));
- tools->get_popup()->connect("id_pressed", callable_mp(this, &VisualShaderEditor::_tools_menu_option));
+ tools->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &VisualShaderEditor::_tools_menu_option));
tools->get_popup()->add_item(TTR("Expand All"), EXPAND_ALL);
tools->get_popup()->add_item(TTR("Collapse All"), COLLAPSE_ALL);
diff --git a/editor/progress_dialog.cpp b/editor/progress_dialog.cpp
index 746b244bed..406425e9fd 100644
--- a/editor/progress_dialog.cpp
+++ b/editor/progress_dialog.cpp
@@ -130,7 +130,7 @@ void ProgressDialog::_popup() {
Size2 ms = main->get_combined_minimum_size();
ms.width = MAX(500 * EDSCALE, ms.width);
- Ref<StyleBox> style = main->get_theme_stylebox(SNAME("panel"), SNAME("PopupMenu"));
+ Ref<StyleBox> style = main->get_theme_stylebox(SceneStringName(panel), SNAME("PopupMenu"));
ms += style->get_minimum_size();
main->set_offset(SIDE_LEFT, style->get_margin(SIDE_LEFT));
diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp
index 00aa78f342..79066608f9 100644
--- a/editor/project_manager.cpp
+++ b/editor/project_manager.cpp
@@ -220,8 +220,8 @@ void ProjectManager::_update_theme(bool p_skip_creation) {
root_container->add_theme_constant_override("margin_right", top_bar_separation);
main_vbox->add_theme_constant_override("separation", top_bar_separation);
- background_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("Background"), EditorStringName(EditorStyles)));
- main_view_container->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("TabContainer")));
+ background_panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("Background"), EditorStringName(EditorStyles)));
+ main_view_container->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("TabContainer")));
title_bar_logo->set_icon(get_editor_theme_icon(SNAME("TitleBarLogo")));
@@ -231,7 +231,7 @@ void ProjectManager::_update_theme(bool p_skip_creation) {
// Project list.
{
loading_label->add_theme_font_override("font", get_theme_font(SNAME("bold"), EditorStringName(EditorFonts)));
- project_list_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("project_list"), SNAME("ProjectManager")));
+ project_list_panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("project_list"), SNAME("ProjectManager")));
empty_list_create_project->set_icon(get_editor_theme_icon(SNAME("Add")));
empty_list_import_project->set_icon(get_editor_theme_icon(SNAME("Load")));
@@ -273,7 +273,7 @@ void ProjectManager::_update_theme(bool p_skip_creation) {
// Asset library popup.
if (asset_library) {
// Removes extra border margins.
- asset_library->add_theme_style_override("panel", memnew(StyleBoxEmpty));
+ asset_library->add_theme_style_override(SceneStringName(panel), memnew(StyleBoxEmpty));
}
}
}
@@ -1297,7 +1297,7 @@ ProjectManager::ProjectManager() {
empty_list_message->set_use_bbcode(true);
empty_list_message->set_fit_content(true);
empty_list_message->set_h_size_flags(SIZE_EXPAND_FILL);
- empty_list_message->add_theme_style_override("normal", memnew(StyleBoxEmpty));
+ empty_list_message->add_theme_style_override(CoreStringName(normal), memnew(StyleBoxEmpty));
const String line1 = TTR("You don't have any projects yet.");
const String line2 = TTR("Get started by creating a new one,\nimporting one that exists, or by downloading a project template from the Asset Library!");
diff --git a/editor/project_manager/quick_settings_dialog.cpp b/editor/project_manager/quick_settings_dialog.cpp
index 63fe423b1f..c9a43f863e 100644
--- a/editor/project_manager/quick_settings_dialog.cpp
+++ b/editor/project_manager/quick_settings_dialog.cpp
@@ -181,7 +181,7 @@ void QuickSettingsDialog::update_size_limits(const Size2 &p_max_popup_size) {
void QuickSettingsDialog::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_THEME_CHANGED: {
- settings_list_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("Background"), EditorStringName(EditorStyles)));
+ settings_list_panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SNAME("Background"), EditorStringName(EditorStyles)));
restart_required_label->add_theme_color_override("font_color", get_theme_color(SNAME("warning_color"), EditorStringName(Editor)));
custom_theme_label->add_theme_color_override("font_color", get_theme_color(SNAME("font_placeholder_color"), EditorStringName(Editor)));
diff --git a/editor/project_settings_editor.cpp b/editor/project_settings_editor.cpp
index dc9d1df4e8..cf1ad36adc 100644
--- a/editor/project_settings_editor.cpp
+++ b/editor/project_settings_editor.cpp
@@ -587,7 +587,7 @@ void ProjectSettingsEditor::_update_theme() {
del_button->set_icon(get_editor_theme_icon(SNAME("Remove")));
search_box->set_right_icon(get_editor_theme_icon(SNAME("Search")));
restart_close_button->set_icon(get_editor_theme_icon(SNAME("Close")));
- restart_container->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Tree")));
+ restart_container->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("Tree")));
restart_icon->set_texture(get_editor_theme_icon(SNAME("StatusWarning")));
restart_label->add_theme_color_override("font_color", get_theme_color(SNAME("warning_color"), EditorStringName(Editor)));
diff --git a/editor/renames_map_3_to_4.cpp b/editor/renames_map_3_to_4.cpp
index c1d19fdd38..8eab3fbea9 100644
--- a/editor/renames_map_3_to_4.cpp
+++ b/editor/renames_map_3_to_4.cpp
@@ -1046,7 +1046,7 @@ const char *RenamesMap3To4::gdscript_properties_renames[][2] = {
// make sure to add it to the C# rename map too.
// Too common words, users may use these names for variables or in comments.
- // { "bg", "panel" }, // Theme
+ // { "bg", SceneStringName(panel) }, // Theme
// { "alt", "alt_pressed" }, // InputEventWithModifiers
// { "command", "command_pressed" }, // InputEventWithModifiers
// { "control", "ctrl_pressed" }, // InputEventWithModifiers
diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp
index 9209c26876..23588e0e6c 100644
--- a/editor/scene_tree_dock.cpp
+++ b/editor/scene_tree_dock.cpp
@@ -4397,12 +4397,12 @@ SceneTreeDock::SceneTreeDock(Node *p_scene_root, EditorSelection *p_editor_selec
filter->add_theme_constant_override("minimum_character_width", 0);
filter->connect("text_changed", callable_mp(this, &SceneTreeDock::_filter_changed));
filter->connect(SceneStringName(gui_input), callable_mp(this, &SceneTreeDock::_filter_gui_input));
- filter->get_menu()->connect("id_pressed", callable_mp(this, &SceneTreeDock::_filter_option_selected));
+ filter->get_menu()->connect(SceneStringName(id_pressed), callable_mp(this, &SceneTreeDock::_filter_option_selected));
_append_filter_options_to(filter->get_menu());
filter_quick_menu = memnew(PopupMenu);
filter_quick_menu->set_theme_type_variation("FlatMenuButton");
- filter_quick_menu->connect("id_pressed", callable_mp(this, &SceneTreeDock::_filter_option_selected));
+ filter_quick_menu->connect(SceneStringName(id_pressed), callable_mp(this, &SceneTreeDock::_filter_option_selected));
filter->add_child(filter_quick_menu);
button_create_script = memnew(Button);
@@ -4429,7 +4429,7 @@ SceneTreeDock::SceneTreeDock(Node *p_scene_root, EditorSelection *p_editor_selec
filter_hbc->add_child(button_tree_menu);
PopupMenu *tree_menu = button_tree_menu->get_popup();
- tree_menu->connect("id_pressed", callable_mp(this, &SceneTreeDock::_tool_selected).bind(false));
+ tree_menu->connect(SceneStringName(id_pressed), callable_mp(this, &SceneTreeDock::_tool_selected).bind(false));
button_hb = memnew(HBoxContainer);
vbc->add_child(button_hb);
@@ -4549,15 +4549,15 @@ SceneTreeDock::SceneTreeDock(Node *p_scene_root, EditorSelection *p_editor_selec
menu = memnew(PopupMenu);
add_child(menu);
- menu->connect("id_pressed", callable_mp(this, &SceneTreeDock::_tool_selected).bind(false));
+ menu->connect(SceneStringName(id_pressed), callable_mp(this, &SceneTreeDock::_tool_selected).bind(false));
menu_subresources = memnew(PopupMenu);
- menu_subresources->connect("id_pressed", callable_mp(this, &SceneTreeDock::_tool_selected).bind(false));
+ menu_subresources->connect(SceneStringName(id_pressed), callable_mp(this, &SceneTreeDock::_tool_selected).bind(false));
menu->add_child(menu_subresources);
menu_properties = memnew(PopupMenu);
add_child(menu_properties);
- menu_properties->connect("id_pressed", callable_mp(this, &SceneTreeDock::_property_selected));
+ menu_properties->connect(SceneStringName(id_pressed), callable_mp(this, &SceneTreeDock::_property_selected));
clear_inherit_confirm = memnew(ConfirmationDialog);
clear_inherit_confirm->set_text(TTR("Clear Inheritance? (No Undo!)"));
diff --git a/editor/themes/editor_theme_manager.cpp b/editor/themes/editor_theme_manager.cpp
index d56094b0f3..9a0941c75e 100644
--- a/editor/themes/editor_theme_manager.cpp
+++ b/editor/themes/editor_theme_manager.cpp
@@ -675,10 +675,10 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
// Panels.
{
// Panel.
- p_theme->set_stylebox("panel", "Panel", make_flat_stylebox(p_config.dark_color_1, 6, 4, 6, 4, p_config.corner_radius));
+ p_theme->set_stylebox(SceneStringName(panel), "Panel", make_flat_stylebox(p_config.dark_color_1, 6, 4, 6, 4, p_config.corner_radius));
// PanelContainer.
- p_theme->set_stylebox("panel", "PanelContainer", p_config.panel_container_style);
+ p_theme->set_stylebox(SceneStringName(panel), "PanelContainer", p_config.panel_container_style);
// TooltipPanel & TooltipLabel.
{
@@ -693,18 +693,18 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
style_tooltip->set_content_margin_all(p_config.base_margin * EDSCALE * 0.5);
style_tooltip->set_bg_color(p_config.dark_color_3 * Color(0.8, 0.8, 0.8, 0.9));
style_tooltip->set_border_width_all(0);
- p_theme->set_stylebox("panel", "TooltipPanel", style_tooltip);
+ p_theme->set_stylebox(SceneStringName(panel), "TooltipPanel", style_tooltip);
}
// PopupPanel
- p_theme->set_stylebox("panel", "PopupPanel", p_config.popup_style);
+ p_theme->set_stylebox(SceneStringName(panel), "PopupPanel", p_config.popup_style);
}
// Buttons.
{
// Button.
- p_theme->set_stylebox("normal", "Button", p_config.button_style);
+ p_theme->set_stylebox(CoreStringName(normal), "Button", p_config.button_style);
p_theme->set_stylebox("hover", "Button", p_config.button_style_hover);
p_theme->set_stylebox(SceneStringName(pressed), "Button", p_config.button_style_pressed);
p_theme->set_stylebox("focus", "Button", p_config.button_style_focus);
@@ -730,7 +730,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
// MenuButton.
- p_theme->set_stylebox("normal", "MenuButton", p_config.panel_container_style);
+ p_theme->set_stylebox(CoreStringName(normal), "MenuButton", p_config.panel_container_style);
p_theme->set_stylebox("hover", "MenuButton", p_config.button_style_hover);
p_theme->set_stylebox(SceneStringName(pressed), "MenuButton", p_config.panel_container_style);
p_theme->set_stylebox("focus", "MenuButton", p_config.panel_container_style);
@@ -746,7 +746,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
// MenuBar.
- p_theme->set_stylebox("normal", "MenuBar", p_config.button_style);
+ p_theme->set_stylebox(CoreStringName(normal), "MenuBar", p_config.button_style);
p_theme->set_stylebox("hover", "MenuBar", p_config.button_style_hover);
p_theme->set_stylebox(SceneStringName(pressed), "MenuBar", p_config.button_style_pressed);
p_theme->set_stylebox("disabled", "MenuBar", p_config.button_style_disabled);
@@ -783,7 +783,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
option_button_disabled_style->set_content_margin(SIDE_RIGHT, 4 * EDSCALE);
p_theme->set_stylebox("focus", "OptionButton", option_button_focus_style);
- p_theme->set_stylebox("normal", "OptionButton", p_config.button_style);
+ p_theme->set_stylebox(CoreStringName(normal), "OptionButton", p_config.button_style);
p_theme->set_stylebox("hover", "OptionButton", p_config.button_style_hover);
p_theme->set_stylebox(SceneStringName(pressed), "OptionButton", p_config.button_style_pressed);
p_theme->set_stylebox("disabled", "OptionButton", p_config.button_style_disabled);
@@ -816,7 +816,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
// CheckButton.
- p_theme->set_stylebox("normal", "CheckButton", p_config.panel_container_style);
+ p_theme->set_stylebox(CoreStringName(normal), "CheckButton", p_config.panel_container_style);
p_theme->set_stylebox(SceneStringName(pressed), "CheckButton", p_config.panel_container_style);
p_theme->set_stylebox("disabled", "CheckButton", p_config.panel_container_style);
p_theme->set_stylebox("hover", "CheckButton", p_config.panel_container_style);
@@ -855,7 +855,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
Ref<StyleBoxFlat> checkbox_style = p_config.panel_container_style->duplicate();
checkbox_style->set_content_margin_all(p_config.base_margin * EDSCALE);
- p_theme->set_stylebox("normal", "CheckBox", checkbox_style);
+ p_theme->set_stylebox(CoreStringName(normal), "CheckBox", checkbox_style);
p_theme->set_stylebox(SceneStringName(pressed), "CheckBox", checkbox_style);
p_theme->set_stylebox("disabled", "CheckBox", checkbox_style);
p_theme->set_stylebox("hover", "CheckBox", checkbox_style);
@@ -926,7 +926,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
p_theme->set_icon("updown", "Tree", p_theme->get_icon(SNAME("GuiTreeUpdown"), EditorStringName(EditorIcons)));
p_theme->set_icon("select_arrow", "Tree", p_theme->get_icon(SNAME("GuiDropdown"), EditorStringName(EditorIcons)));
- p_theme->set_stylebox("panel", "Tree", p_config.tree_panel_style);
+ p_theme->set_stylebox(SceneStringName(panel), "Tree", p_config.tree_panel_style);
p_theme->set_stylebox("focus", "Tree", p_config.button_style_focus);
p_theme->set_stylebox("custom_button", "Tree", make_empty_stylebox());
p_theme->set_stylebox("custom_button_pressed", "Tree", make_empty_stylebox());
@@ -1029,7 +1029,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
style_itemlist_hover->set_bg_color(p_config.highlight_color * Color(1, 1, 1, 0.3));
style_itemlist_hover->set_border_width_all(0);
- p_theme->set_stylebox("panel", "ItemList", style_itemlist_bg);
+ p_theme->set_stylebox(SceneStringName(panel), "ItemList", style_itemlist_bg);
p_theme->set_stylebox("focus", "ItemList", p_config.button_style_focus);
p_theme->set_stylebox("cursor", "ItemList", style_itemlist_cursor);
p_theme->set_stylebox("cursor_unfocused", "ItemList", style_itemlist_cursor);
@@ -1100,7 +1100,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
style_tabbar_background->set_corner_radius(CORNER_BOTTOM_LEFT, 0);
style_tabbar_background->set_corner_radius(CORNER_BOTTOM_RIGHT, 0);
p_theme->set_stylebox("tabbar_background", "TabContainer", style_tabbar_background);
- p_theme->set_stylebox("panel", "TabContainer", p_config.content_panel_style);
+ p_theme->set_stylebox(SceneStringName(panel), "TabContainer", p_config.content_panel_style);
p_theme->set_stylebox("tab_selected", "TabContainer", style_tab_selected);
p_theme->set_stylebox("tab_hovered", "TabContainer", style_tab_hovered);
@@ -1177,7 +1177,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
// LineEdit.
- p_theme->set_stylebox("normal", "LineEdit", text_editor_style);
+ p_theme->set_stylebox(CoreStringName(normal), "LineEdit", text_editor_style);
p_theme->set_stylebox("focus", "LineEdit", p_config.button_style_focus);
p_theme->set_stylebox("read_only", "LineEdit", text_editor_disabled_style);
@@ -1199,7 +1199,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
// TextEdit.
- p_theme->set_stylebox("normal", "TextEdit", text_editor_style);
+ p_theme->set_stylebox(CoreStringName(normal), "TextEdit", text_editor_style);
p_theme->set_stylebox("focus", "TextEdit", p_config.button_style_focus);
p_theme->set_stylebox("read_only", "TextEdit", text_editor_disabled_style);
@@ -1274,7 +1274,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
p_theme->set_font_size("title_font_size", "Window", p_theme->get_font_size(SNAME("title_size"), EditorStringName(EditorFonts)));
// AcceptDialog.
- p_theme->set_stylebox("panel", "AcceptDialog", p_config.dialog_style);
+ p_theme->set_stylebox(SceneStringName(panel), "AcceptDialog", p_config.dialog_style);
p_theme->set_constant("buttons_separation", "AcceptDialog", 8 * EDSCALE);
// Make buttons with short texts such as "OK" easier to click/tap.
p_theme->set_constant("buttons_min_width", "AcceptDialog", p_config.dialogs_buttons_min_size.x * EDSCALE);
@@ -1294,7 +1294,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
p_theme->set_color("file_disabled_color", "FileDialog", p_config.font_disabled_color);
// PopupDialog.
- p_theme->set_stylebox("panel", "PopupDialog", p_config.popup_style);
+ p_theme->set_stylebox(SceneStringName(panel), "PopupDialog", p_config.popup_style);
// PopupMenu.
{
@@ -1310,7 +1310,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
} else {
style_popup_menu->set_border_color(p_config.dark_color_2);
}
- p_theme->set_stylebox("panel", "PopupMenu", style_popup_menu);
+ p_theme->set_stylebox(SceneStringName(panel), "PopupMenu", style_popup_menu);
Ref<StyleBoxFlat> style_menu_hover = p_config.button_style_hover->duplicate();
// Don't use rounded corners for hover highlights since the StyleBox touches the PopupMenu's edges.
@@ -1430,7 +1430,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
{
// RichTextLabel.
- p_theme->set_stylebox("normal", "RichTextLabel", p_config.tree_panel_style);
+ p_theme->set_stylebox(CoreStringName(normal), "RichTextLabel", p_config.tree_panel_style);
p_theme->set_stylebox("focus", "RichTextLabel", make_empty_stylebox());
p_theme->set_color("default_color", "RichTextLabel", p_config.font_color);
@@ -1445,7 +1445,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
// Label.
- p_theme->set_stylebox("normal", "Label", p_config.base_empty_style);
+ p_theme->set_stylebox(CoreStringName(normal), "Label", p_config.base_empty_style);
p_theme->set_color("font_color", "Label", p_config.font_color);
p_theme->set_color("font_shadow_color", "Label", Color(0, 0, 0, 0));
@@ -1473,7 +1473,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
{
// GraphEdit.
- p_theme->set_stylebox("panel", "GraphEdit", p_config.tree_panel_style);
+ p_theme->set_stylebox(SceneStringName(panel), "GraphEdit", p_config.tree_panel_style);
p_theme->set_stylebox("menu_panel", "GraphEdit", make_flat_stylebox(p_config.dark_color_1 * Color(1, 1, 1, 0.6), 4, 2, 4, 2, 3));
float grid_base_brightness = p_config.dark_theme ? 1.0 : 0.0;
@@ -1513,7 +1513,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
Ref<StyleBoxFlat> style_minimap_bg = make_flat_stylebox(p_config.dark_color_1, 0, 0, 0, 0);
style_minimap_bg->set_border_color(p_config.dark_color_3);
style_minimap_bg->set_border_width_all(1);
- p_theme->set_stylebox("panel", "GraphEditMinimap", style_minimap_bg);
+ p_theme->set_stylebox(SceneStringName(panel), "GraphEditMinimap", style_minimap_bg);
Ref<StyleBoxFlat> style_minimap_camera;
Ref<StyleBoxFlat> style_minimap_node;
@@ -1590,7 +1590,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
// GraphElement.
- p_theme->set_stylebox("panel", "GraphElement", gn_panel_style);
+ p_theme->set_stylebox(SceneStringName(panel), "GraphElement", gn_panel_style);
p_theme->set_stylebox("panel_selected", "GraphElement", gn_panel_selected_style);
p_theme->set_stylebox("titlebar", "GraphElement", gn_titlebar_style);
p_theme->set_stylebox("titlebar_selected", "GraphElement", gn_titlebar_selected_style);
@@ -1602,7 +1602,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
Ref<StyleBoxEmpty> gn_slot_style = make_empty_stylebox(12, 0, 12, 0);
- p_theme->set_stylebox("panel", "GraphNode", gn_panel_style);
+ p_theme->set_stylebox(SceneStringName(panel), "GraphNode", gn_panel_style);
p_theme->set_stylebox("panel_selected", "GraphNode", gn_panel_selected_style);
p_theme->set_stylebox("titlebar", "GraphNode", gn_titlebar_style);
p_theme->set_stylebox("titlebar_selected", "GraphNode", gn_titlebar_selected_style);
@@ -1620,7 +1620,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
// GraphNode's title Label.
p_theme->set_type_variation("GraphNodeTitleLabel", "Label");
- p_theme->set_stylebox("normal", "GraphNodeTitleLabel", make_empty_stylebox(0, 0, 0, 0));
+ p_theme->set_stylebox(CoreStringName(normal), "GraphNodeTitleLabel", make_empty_stylebox(0, 0, 0, 0));
p_theme->set_color("font_color", "GraphNodeTitleLabel", p_config.dark_theme ? p_config.font_color : Color(1, 1, 1)); // Also use a bright font color for light themes.
p_theme->set_color("font_shadow_color", "GraphNodeTitleLabel", Color(0, 0, 0, 0.35));
p_theme->set_constant("shadow_outline_size", "GraphNodeTitleLabel", 4);
@@ -1644,7 +1644,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
Ref<StyleBoxFlat> graphframe_sb_selected = graphframe_sb->duplicate();
graphframe_sb_selected->set_border_color(gn_selected_border_color);
- p_theme->set_stylebox("panel", "GraphFrame", graphframe_sb);
+ p_theme->set_stylebox(SceneStringName(panel), "GraphFrame", graphframe_sb);
p_theme->set_stylebox("panel_selected", "GraphFrame", graphframe_sb_selected);
p_theme->set_stylebox("titlebar", "GraphFrame", make_empty_stylebox(4, 4, 4, 4));
p_theme->set_stylebox("titlebar_selected", "GraphFrame", make_empty_stylebox(4, 4, 4, 4));
@@ -1652,7 +1652,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
// GraphFrame's title Label.
p_theme->set_type_variation("GraphFrameTitleLabel", "Label");
- p_theme->set_stylebox("normal", "GraphFrameTitleLabel", memnew(StyleBoxEmpty));
+ p_theme->set_stylebox(CoreStringName(normal), "GraphFrameTitleLabel", memnew(StyleBoxEmpty));
p_theme->set_font_size("font_size", "GraphFrameTitleLabel", 22);
p_theme->set_color("font_color", "GraphFrameTitleLabel", Color(1, 1, 1));
p_theme->set_color("font_shadow_color", "GraphFrameTitleLabel", Color(0, 0, 0, 0));
@@ -1669,7 +1669,7 @@ void EditorThemeManager::_populate_standard_styles(const Ref<EditorTheme> &p_the
Ref<StyleBox> vs_reroute_panel_style = make_empty_stylebox();
Ref<StyleBox> vs_reroute_titlebar_style = vs_reroute_panel_style->duplicate();
vs_reroute_titlebar_style->set_content_margin_all(16);
- p_theme->set_stylebox("panel", "VSRerouteNode", vs_reroute_panel_style);
+ p_theme->set_stylebox(SceneStringName(panel), "VSRerouteNode", vs_reroute_panel_style);
p_theme->set_stylebox("panel_selected", "VSRerouteNode", vs_reroute_panel_style);
p_theme->set_stylebox("titlebar", "VSRerouteNode", vs_reroute_titlebar_style);
p_theme->set_stylebox("titlebar_selected", "VSRerouteNode", vs_reroute_titlebar_style);
@@ -1730,7 +1730,7 @@ void EditorThemeManager::_populate_editor_styles(const Ref<EditorTheme> &p_theme
tag->set_corner_radius(CORNER_BOTTOM_LEFT, 0);
tag->set_corner_radius(CORNER_TOP_RIGHT, 4);
tag->set_corner_radius(CORNER_BOTTOM_RIGHT, 4);
- p_theme->set_stylebox("normal", "ProjectTag", tag);
+ p_theme->set_stylebox(CoreStringName(normal), "ProjectTag", tag);
tag = p_config.button_style_hover->duplicate();
tag->set_corner_radius(CORNER_TOP_LEFT, 0);
@@ -1809,13 +1809,13 @@ void EditorThemeManager::_populate_editor_styles(const Ref<EditorTheme> &p_theme
menu_transparent_style->set_content_margin((Side)i, p_config.button_style->get_content_margin((Side)i));
main_screen_button_hover->set_content_margin((Side)i, p_config.button_style_hover->get_content_margin((Side)i));
}
- p_theme->set_stylebox("normal", "MainScreenButton", menu_transparent_style);
+ p_theme->set_stylebox(CoreStringName(normal), "MainScreenButton", menu_transparent_style);
p_theme->set_stylebox(SceneStringName(pressed), "MainScreenButton", menu_transparent_style);
p_theme->set_stylebox("hover", "MainScreenButton", main_screen_button_hover);
p_theme->set_stylebox("hover_pressed", "MainScreenButton", main_screen_button_hover);
p_theme->set_type_variation("MainMenuBar", "FlatMenuButton");
- p_theme->set_stylebox("normal", "MainMenuBar", menu_transparent_style);
+ p_theme->set_stylebox(CoreStringName(normal), "MainMenuBar", menu_transparent_style);
p_theme->set_stylebox(SceneStringName(pressed), "MainMenuBar", main_screen_button_hover);
p_theme->set_stylebox("hover", "MainMenuBar", main_screen_button_hover);
p_theme->set_stylebox("hover_pressed", "MainMenuBar", main_screen_button_hover);
@@ -1830,7 +1830,7 @@ void EditorThemeManager::_populate_editor_styles(const Ref<EditorTheme> &p_theme
style_bottom_panel->set_corner_radius_all(p_config.corner_radius * EDSCALE);
p_theme->set_stylebox("BottomPanel", EditorStringName(EditorStyles), style_bottom_panel);
p_theme->set_type_variation("BottomPanelButton", "FlatMenuButton");
- p_theme->set_stylebox("normal", "BottomPanelButton", menu_transparent_style);
+ p_theme->set_stylebox(CoreStringName(normal), "BottomPanelButton", menu_transparent_style);
p_theme->set_stylebox(SceneStringName(pressed), "BottomPanelButton", menu_transparent_style);
p_theme->set_stylebox("hover_pressed", "BottomPanelButton", main_screen_button_hover);
p_theme->set_stylebox("hover", "BottomPanelButton", main_screen_button_hover);
@@ -1900,12 +1900,12 @@ void EditorThemeManager::_populate_editor_styles(const Ref<EditorTheme> &p_theme
}
style_flat_button_pressed->set_bg_color(flat_pressed_color);
- p_theme->set_stylebox("normal", "FlatButton", style_flat_button);
+ p_theme->set_stylebox(CoreStringName(normal), "FlatButton", style_flat_button);
p_theme->set_stylebox("hover", "FlatButton", style_flat_button_hover);
p_theme->set_stylebox(SceneStringName(pressed), "FlatButton", style_flat_button_pressed);
p_theme->set_stylebox("disabled", "FlatButton", style_flat_button);
- p_theme->set_stylebox("normal", "FlatMenuButton", style_flat_button);
+ p_theme->set_stylebox(CoreStringName(normal), "FlatMenuButton", style_flat_button);
p_theme->set_stylebox("hover", "FlatMenuButton", style_flat_button_hover);
p_theme->set_stylebox(SceneStringName(pressed), "FlatMenuButton", style_flat_button_pressed);
p_theme->set_stylebox("disabled", "FlatMenuButton", style_flat_button);
@@ -1930,7 +1930,7 @@ void EditorThemeManager::_populate_editor_styles(const Ref<EditorTheme> &p_theme
if (!p_config.dark_theme) {
editor_log_button_pressed->set_bg_color(flat_pressed_color.lightened(0.5));
}
- p_theme->set_stylebox("normal", "EditorLogFilterButton", style_flat_button);
+ p_theme->set_stylebox(CoreStringName(normal), "EditorLogFilterButton", style_flat_button);
p_theme->set_stylebox("hover", "EditorLogFilterButton", style_flat_button_hover);
p_theme->set_stylebox(SceneStringName(pressed), "EditorLogFilterButton", editor_log_button_pressed);
}
@@ -1951,7 +1951,7 @@ void EditorThemeManager::_populate_editor_styles(const Ref<EditorTheme> &p_theme
Ref<StyleBoxFlat> panel_button_style_disabled = p_config.button_style_disabled->duplicate();
panel_button_style_disabled->set_bg_color(p_config.disabled_bg_color);
- p_theme->set_stylebox("normal", "PanelBackgroundButton", panel_button_style);
+ p_theme->set_stylebox(CoreStringName(normal), "PanelBackgroundButton", panel_button_style);
p_theme->set_stylebox("hover", "PanelBackgroundButton", panel_button_style_hover);
p_theme->set_stylebox(SceneStringName(pressed), "PanelBackgroundButton", panel_button_style_pressed);
p_theme->set_stylebox("disabled", "PanelBackgroundButton", panel_button_style_disabled);
@@ -1969,9 +1969,9 @@ void EditorThemeManager::_populate_editor_styles(const Ref<EditorTheme> &p_theme
Ref<StyleBoxFlat> style_complex_window = p_config.window_style->duplicate();
style_complex_window->set_bg_color(p_config.dark_color_2);
style_complex_window->set_border_color(p_config.dark_color_2);
- p_theme->set_stylebox("panel", "EditorSettingsDialog", style_complex_window);
- p_theme->set_stylebox("panel", "ProjectSettingsEditor", style_complex_window);
- p_theme->set_stylebox("panel", "EditorAbout", style_complex_window);
+ p_theme->set_stylebox(SceneStringName(panel), "EditorSettingsDialog", style_complex_window);
+ p_theme->set_stylebox(SceneStringName(panel), "ProjectSettingsEditor", style_complex_window);
+ p_theme->set_stylebox(SceneStringName(panel), "EditorAbout", style_complex_window);
}
// InspectorActionButton.
@@ -1986,7 +1986,7 @@ void EditorThemeManager::_populate_editor_styles(const Ref<EditorTheme> &p_theme
Ref<StyleBoxFlat> style_inspector_action = p_config.button_style->duplicate();
style_inspector_action->set_bg_color(color_inspector_action);
style_inspector_action->set_content_margin(SIDE_RIGHT, action_extra_margin);
- p_theme->set_stylebox("normal", "InspectorActionButton", style_inspector_action);
+ p_theme->set_stylebox(CoreStringName(normal), "InspectorActionButton", style_inspector_action);
style_inspector_action = p_config.button_style_hover->duplicate();
style_inspector_action->set_content_margin(SIDE_RIGHT, action_extra_margin);
@@ -2016,7 +2016,7 @@ void EditorThemeManager::_populate_editor_styles(const Ref<EditorTheme> &p_theme
// Unpressed icon is dim, so use a dim highlight.
p_theme->set_color("icon_hover_color", "PreviewLightButton", dim_light_highlighted_color);
- p_theme->set_stylebox("normal", "PreviewLightButton", sb_empty_borderless);
+ p_theme->set_stylebox(CoreStringName(normal), "PreviewLightButton", sb_empty_borderless);
p_theme->set_stylebox("hover", "PreviewLightButton", sb_empty_borderless);
p_theme->set_stylebox("focus", "PreviewLightButton", sb_empty_borderless);
p_theme->set_stylebox(SceneStringName(pressed), "PreviewLightButton", sb_empty_borderless);
@@ -2033,11 +2033,11 @@ void EditorThemeManager::_populate_editor_styles(const Ref<EditorTheme> &p_theme
Ref<StyleBoxFlat> style_content_panel_odd = p_config.content_panel_style->duplicate();
style_content_panel_odd->set_bg_color(p_config.disabled_bg_color);
- p_theme->set_stylebox("panel", "TabContainerOdd", style_content_panel_odd);
+ p_theme->set_stylebox(SceneStringName(panel), "TabContainerOdd", style_content_panel_odd);
}
// EditorValidationPanel.
- p_theme->set_stylebox("panel", "EditorValidationPanel", p_config.tree_panel_style);
+ p_theme->set_stylebox(SceneStringName(panel), "EditorValidationPanel", p_config.tree_panel_style);
// ControlEditor.
{
@@ -2051,7 +2051,7 @@ void EditorThemeManager::_populate_editor_styles(const Ref<EditorTheme> &p_theme
control_editor_popup_style->set_content_margin(SIDE_BOTTOM, p_config.base_margin * EDSCALE);
control_editor_popup_style->set_border_width_all(0);
- p_theme->set_stylebox("panel", "ControlEditorPopupPanel", control_editor_popup_style);
+ p_theme->set_stylebox(SceneStringName(panel), "ControlEditorPopupPanel", control_editor_popup_style);
}
}
@@ -2232,7 +2232,7 @@ void EditorThemeManager::_populate_editor_styles(const Ref<EditorTheme> &p_theme
style->set_corner_radius(CORNER_BOTTOM_RIGHT, 0);
p_theme->set_type_variation("EditorHelpBitTitle", "RichTextLabel");
- p_theme->set_stylebox("normal", "EditorHelpBitTitle", style);
+ p_theme->set_stylebox(CoreStringName(normal), "EditorHelpBitTitle", style);
}
// EditorHelpBitContent.
@@ -2242,12 +2242,12 @@ void EditorThemeManager::_populate_editor_styles(const Ref<EditorTheme> &p_theme
style->set_corner_radius(CORNER_TOP_RIGHT, 0);
p_theme->set_type_variation("EditorHelpBitContent", "RichTextLabel");
- p_theme->set_stylebox("normal", "EditorHelpBitContent", style);
+ p_theme->set_stylebox(CoreStringName(normal), "EditorHelpBitContent", style);
}
// Asset Library.
p_theme->set_stylebox("bg", "AssetLib", p_config.base_empty_style);
- p_theme->set_stylebox("panel", "AssetLib", p_config.content_panel_style);
+ p_theme->set_stylebox(SceneStringName(panel), "AssetLib", p_config.content_panel_style);
p_theme->set_color("status_color", "AssetLib", Color(0.5, 0.5, 0.5)); // FIXME: Use a defined color instead.
p_theme->set_icon("dismiss", "AssetLib", p_theme->get_icon(SNAME("Close"), EditorStringName(EditorIcons)));
@@ -2261,7 +2261,7 @@ void EditorThemeManager::_populate_editor_styles(const Ref<EditorTheme> &p_theme
// FIXME: Introduce Theme::get_font_height() / Control::get_theme_font_height() / Window::get_theme_font_height().
const int offset_i1 = p_theme->get_font(SNAME("tab_selected"), SNAME("TabContainer"))->get_height(p_theme->get_font_size(SNAME("tab_selected"), SNAME("TabContainer")));
const int offset_i2 = p_theme->get_stylebox(SNAME("tab_selected"), SNAME("TabContainer"))->get_minimum_size().height;
- const int offset_i3 = p_theme->get_stylebox(SNAME("panel"), SNAME("TabContainer"))->get_content_margin(SIDE_TOP);
+ const int offset_i3 = p_theme->get_stylebox(SceneStringName(panel), SNAME("TabContainer"))->get_content_margin(SIDE_TOP);
const int invisible_top_offset = offset_i1 + offset_i2 + offset_i3;
Ref<StyleBoxFlat> invisible_top_panel_style = p_config.content_panel_style->duplicate();
@@ -2308,7 +2308,7 @@ void EditorThemeManager::_populate_editor_styles(const Ref<EditorTheme> &p_theme
// StateMachine graph.
{
- p_theme->set_stylebox("panel", "GraphStateMachine", p_config.tree_panel_style);
+ p_theme->set_stylebox(SceneStringName(panel), "GraphStateMachine", p_config.tree_panel_style);
p_theme->set_stylebox("error_panel", "GraphStateMachine", p_config.tree_panel_style);
p_theme->set_color("error_color", "GraphStateMachine", p_config.error_color);
@@ -2486,7 +2486,7 @@ void EditorThemeManager::_populate_text_editor_styles(const Ref<EditorTheme> &p_
const Color background_color = EDITOR_GET("text_editor/theme/highlighting/background_color");
Ref<StyleBoxFlat> code_edit_stylebox = make_flat_stylebox(background_color, p_config.widget_margin.x, p_config.widget_margin.y, p_config.widget_margin.x, p_config.widget_margin.y, p_config.corner_radius);
- p_theme->set_stylebox("normal", "CodeEdit", code_edit_stylebox);
+ p_theme->set_stylebox(CoreStringName(normal), "CodeEdit", code_edit_stylebox);
p_theme->set_stylebox("read_only", "CodeEdit", code_edit_stylebox);
p_theme->set_stylebox("focus", "CodeEdit", memnew(StyleBoxEmpty));
@@ -2554,7 +2554,7 @@ void EditorThemeManager::_populate_visual_shader_styles(const Ref<EditorTheme> &
ed_settings->set_initial_value("editors/visual_editors/connection_colors/sampler_color", Color(1.0, 1.0, 0.0), true);
// Node category colors (used for the node headers)
- Ref<StyleBoxFlat> gn_panel_style = p_theme->get_stylebox("panel", "GraphNode");
+ Ref<StyleBoxFlat> gn_panel_style = p_theme->get_stylebox(SceneStringName(panel), "GraphNode");
Color gn_bg_color = gn_panel_style->get_bg_color();
ed_settings->set_initial_value("editors/visual_editors/category_colors/output_color", gn_bg_color, true);
ed_settings->set_initial_value("editors/visual_editors/category_colors/color_color", gn_bg_color, true);
diff --git a/editor/window_wrapper.cpp b/editor/window_wrapper.cpp
index b964a07285..b75d641509 100644
--- a/editor/window_wrapper.cpp
+++ b/editor/window_wrapper.cpp
@@ -152,7 +152,7 @@ void WindowWrapper::_notification(int p_what) {
set_process_shortcut_input(true);
} break;
case NOTIFICATION_THEME_CHANGED: {
- window_background->add_theme_style_override("panel", get_theme_stylebox("PanelForeground", EditorStringName(EditorStyles)));
+ window_background->add_theme_style_override(SceneStringName(panel), get_theme_stylebox("PanelForeground", EditorStringName(EditorStyles)));
} break;
}
}
@@ -391,7 +391,7 @@ void ScreenSelect::_notification(int p_what) {
} break;
case NOTIFICATION_THEME_CHANGED: {
set_icon(get_editor_theme_icon("MakeFloating"));
- popup_background->add_theme_style_override("panel", get_theme_stylebox("PanelForeground", EditorStringName(EditorStyles)));
+ popup_background->add_theme_style_override(SceneStringName(panel), get_theme_stylebox("PanelForeground", EditorStringName(EditorStyles)));
const real_t popup_height = real_t(get_theme_font_size("font_size")) * 2.0;
popup->set_min_size(Size2(0, popup_height * 3));
diff --git a/main/main.cpp b/main/main.cpp
index 6b17c55efc..af29e18c46 100644
--- a/main/main.cpp
+++ b/main/main.cpp
@@ -90,6 +90,7 @@
#endif
#ifdef TOOLS_ENABLED
+#include "editor/debugger/debug_adapter/debug_adapter_server.h"
#include "editor/debugger/editor_debugger_node.h"
#include "editor/doc_data_class_path.gen.h"
#include "editor/doc_tools.h"
@@ -518,8 +519,9 @@ void Main::print_help(const char *p_binary) {
print_help_option("-e, --editor", "Start the editor instead of running the scene.\n", CLI_OPTION_AVAILABILITY_EDITOR);
print_help_option("-p, --project-manager", "Start the project manager, even if a project is auto-detected.\n", CLI_OPTION_AVAILABILITY_EDITOR);
print_help_option("--debug-server <uri>", "Start the editor debug server (<protocol>://<host/IP>[:port], e.g. tcp://127.0.0.1:6007)\n", CLI_OPTION_AVAILABILITY_EDITOR);
+ print_help_option("--dap-port <port>", "Use the specified port for the GDScript Debugger Adaptor protocol. Recommended port range [1024, 49151].\n", CLI_OPTION_AVAILABILITY_EDITOR);
#if defined(MODULE_GDSCRIPT_ENABLED) && !defined(GDSCRIPT_NO_LSP)
- print_help_option("--lsp-port <port>", "Use the specified port for the GDScript language server protocol. The port should be between 1025 and 49150.\n", CLI_OPTION_AVAILABILITY_EDITOR);
+ print_help_option("--lsp-port <port>", "Use the specified port for the GDScript language server protocol. Recommended port range [1024, 49151].\n", CLI_OPTION_AVAILABILITY_EDITOR);
#endif // MODULE_GDSCRIPT_ENABLED && !GDSCRIPT_NO_LSP
#endif
print_help_option("--quit", "Quit after the first iteration.\n");
@@ -1714,6 +1716,21 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
goto error;
}
#endif // TOOLS_ENABLED && MODULE_GDSCRIPT_ENABLED && !GDSCRIPT_NO_LSP
+#if defined(TOOLS_ENABLED)
+ } else if (arg == "--dap-port") {
+ if (N) {
+ int port_override = N->get().to_int();
+ if (port_override < 0 || port_override > 65535) {
+ OS::get_singleton()->print("<port> argument for --dap-port <port> must be between 0 and 65535.\n");
+ goto error;
+ }
+ DebugAdapterServer::port_override = port_override;
+ N = N->next();
+ } else {
+ OS::get_singleton()->print("Missing <port> argument for --dap-port <port>.\n");
+ goto error;
+ }
+#endif // TOOLS_ENABLED
} else if (arg == "--" || arg == "++") {
adding_user_args = true;
} else {
diff --git a/modules/fbx/doc_classes/EditorSceneFormatImporterFBX2GLTF.xml b/modules/fbx/doc_classes/EditorSceneFormatImporterFBX2GLTF.xml
index e30782780f..3bf4e7ddc0 100644
--- a/modules/fbx/doc_classes/EditorSceneFormatImporterFBX2GLTF.xml
+++ b/modules/fbx/doc_classes/EditorSceneFormatImporterFBX2GLTF.xml
@@ -5,7 +5,7 @@
</brief_description>
<description>
Imports Autodesk FBX 3D scenes by way of converting them to glTF 2.0 using the FBX2glTF command line tool.
- The location of the FBX2glTF binary is set via the [member EditorSettings.filesystem/import/fbx2gltf/fbx2gltf_path] editor setting.
+ The location of the FBX2glTF binary is set via the [member EditorSettings.filesystem/import/fbx/fbx2gltf_path] editor setting.
This importer is only used if [member ProjectSettings.filesystem/import/fbx2gltf/enabled] is set to [code]true[/code].
</description>
<tutorials>
diff --git a/modules/fbx/editor/editor_scene_importer_fbx2gltf.cpp b/modules/fbx/editor/editor_scene_importer_fbx2gltf.cpp
index 6629e05197..afb63246e4 100644
--- a/modules/fbx/editor/editor_scene_importer_fbx2gltf.cpp
+++ b/modules/fbx/editor/editor_scene_importer_fbx2gltf.cpp
@@ -73,7 +73,7 @@ Node *EditorSceneFormatImporterFBX2GLTF::import_scene(const String &p_path, uint
// Run fbx2gltf.
- String fbx2gltf_path = EDITOR_GET("filesystem/import/fbx2gltf/fbx2gltf_path");
+ String fbx2gltf_path = EDITOR_GET("filesystem/import/fbx/fbx2gltf_path");
List<String> args;
args.push_back("--pbr-metallic-roughness");
diff --git a/modules/gdscript/gdscript_analyzer.cpp b/modules/gdscript/gdscript_analyzer.cpp
index 7fe96146da..aa26bb222d 100644
--- a/modules/gdscript/gdscript_analyzer.cpp
+++ b/modules/gdscript/gdscript_analyzer.cpp
@@ -1971,7 +1971,12 @@ void GDScriptAnalyzer::resolve_assignable(GDScriptParser::AssignableNode *p_assi
const bool is_parameter = p_assignable->type == GDScriptParser::Node::PARAMETER;
const String declaration_type = is_constant ? "Constant" : (is_parameter ? "Parameter" : "Variable");
if (p_assignable->infer_datatype || is_constant) {
- parser->push_warning(p_assignable, GDScriptWarning::INFERRED_DECLARATION, declaration_type, p_assignable->identifier->name);
+ // Do not produce the `INFERRED_DECLARATION` warning on type import because there is no way to specify the true type.
+ // And removing the metatype makes it impossible to use the constant as a type hint (especially for enums).
+ const bool is_type_import = is_constant && p_assignable->initializer != nullptr && p_assignable->initializer->datatype.is_meta_type;
+ if (!is_type_import) {
+ parser->push_warning(p_assignable, GDScriptWarning::INFERRED_DECLARATION, declaration_type, p_assignable->identifier->name);
+ }
} else {
parser->push_warning(p_assignable, GDScriptWarning::UNTYPED_DECLARATION, declaration_type, p_assignable->identifier->name);
}
@@ -4342,15 +4347,45 @@ void GDScriptAnalyzer::reduce_subscript(GDScriptParser::SubscriptNode *p_subscri
GDScriptParser::DataType base_type = p_subscript->base->get_datatype();
bool valid = false;
+
// If the base is a metatype, use the analyzer instead.
- if (p_subscript->base->is_constant && !base_type.is_meta_type && base_type.kind != GDScriptParser::DataType::CLASS) {
- // Just try to get it.
- Variant value = p_subscript->base->reduced_value.get_named(p_subscript->attribute->name, valid);
- if (valid) {
- p_subscript->is_constant = true;
- p_subscript->reduced_value = value;
- result_type = type_from_variant(value, p_subscript);
+ if (p_subscript->base->is_constant && !base_type.is_meta_type) {
+ // GH-92534. If the base is a GDScript, use the analyzer instead.
+ bool base_is_gdscript = false;
+ if (p_subscript->base->reduced_value.get_type() == Variant::OBJECT) {
+ Ref<GDScript> gdscript = Object::cast_to<GDScript>(p_subscript->base->reduced_value.get_validated_object());
+ if (gdscript.is_valid()) {
+ base_is_gdscript = true;
+ // Makes a metatype from a constant GDScript, since `base_type` is not a metatype.
+ GDScriptParser::DataType base_type_meta = type_from_variant(gdscript, p_subscript);
+ // First try to reduce the attribute from the metatype.
+ reduce_identifier_from_base(p_subscript->attribute, &base_type_meta);
+ GDScriptParser::DataType attr_type = p_subscript->attribute->get_datatype();
+ if (attr_type.is_set()) {
+ valid = !attr_type.is_pseudo_type || p_can_be_pseudo_type;
+ result_type = attr_type;
+ p_subscript->is_constant = p_subscript->attribute->is_constant;
+ p_subscript->reduced_value = p_subscript->attribute->reduced_value;
+ }
+ if (!valid) {
+ // If unsuccessful, reset and return to the normal route.
+ p_subscript->attribute->set_datatype(GDScriptParser::DataType());
+ }
+ }
+ }
+ if (!base_is_gdscript) {
+ // Just try to get it.
+ Variant value = p_subscript->base->reduced_value.get_named(p_subscript->attribute->name, valid);
+ if (valid) {
+ p_subscript->is_constant = true;
+ p_subscript->reduced_value = value;
+ result_type = type_from_variant(value, p_subscript);
+ }
}
+ }
+
+ if (valid) {
+ // Do nothing.
} else if (base_type.is_variant() || !base_type.is_hard_type()) {
valid = !base_type.is_pseudo_type || p_can_be_pseudo_type;
result_type.kind = GDScriptParser::DataType::VARIANT;
@@ -4388,6 +4423,7 @@ void GDScriptAnalyzer::reduce_subscript(GDScriptParser::SubscriptNode *p_subscri
mark_node_unsafe(p_subscript);
}
}
+
if (!valid) {
GDScriptParser::DataType attr_type = p_subscript->attribute->get_datatype();
if (!p_can_be_pseudo_type && (attr_type.is_pseudo_type || result_type.is_pseudo_type)) {
@@ -4406,6 +4442,7 @@ void GDScriptAnalyzer::reduce_subscript(GDScriptParser::SubscriptNode *p_subscri
if (p_subscript->base->is_constant && p_subscript->index->is_constant) {
// Just try to get it.
bool valid = false;
+ // TODO: Check if `p_subscript->base->reduced_value` is GDScript.
Variant value = p_subscript->base->reduced_value.get(p_subscript->index->reduced_value, &valid);
if (!valid) {
push_error(vformat(R"(Cannot get index "%s" from "%s".)", p_subscript->index->reduced_value, p_subscript->base->reduced_value), p_subscript->index);
diff --git a/modules/gdscript/language_server/gdscript_text_document.cpp b/modules/gdscript/language_server/gdscript_text_document.cpp
index 9bf458e031..2224bb0040 100644
--- a/modules/gdscript/language_server/gdscript_text_document.cpp
+++ b/modules/gdscript/language_server/gdscript_text_document.cpp
@@ -490,7 +490,7 @@ void GDScriptTextDocument::sync_script_content(const String &p_path, const Strin
}
void GDScriptTextDocument::show_native_symbol_in_editor(const String &p_symbol_id) {
- ScriptEditor::get_singleton()->call_deferred(SNAME("_help_class_goto"), p_symbol_id);
+ callable_mp(ScriptEditor::get_singleton(), &ScriptEditor::goto_help).call_deferred(p_symbol_id);
DisplayServer::get_singleton()->window_move_to_foreground();
}
diff --git a/modules/gdscript/tests/scripts/runtime/features/metatypes.gd b/modules/gdscript/tests/scripts/runtime/features/metatypes.gd
index 6c5df32ffe..fd23ea0db5 100644
--- a/modules/gdscript/tests/scripts/runtime/features/metatypes.gd
+++ b/modules/gdscript/tests/scripts/runtime/features/metatypes.gd
@@ -25,12 +25,24 @@ func test():
if str(property.name).begins_with("test_"):
print(Utils.get_property_signature(property))
+ print("---")
check_gdscript_native_class(test_native)
check_gdscript(test_script)
check_gdscript(test_class)
check_enum(test_enum)
+ print("---")
print(test_native.stringify([]))
print(test_script.TEST)
print(test_class.TEST)
print(test_enum.keys())
+
+ print("---")
+ # Some users add unnecessary type hints to `const`-`preload`, which removes metatypes.
+ # For **constant** `GDScript` we still check the class members, despite the wider type.
+ const ScriptNoMeta: GDScript = Other
+ const ClassNoMeta: GDScript = MyClass
+ var a := ScriptNoMeta.TEST
+ var b := ClassNoMeta.TEST
+ print(a)
+ print(b)
diff --git a/modules/gdscript/tests/scripts/runtime/features/metatypes.out b/modules/gdscript/tests/scripts/runtime/features/metatypes.out
index 352d1caa59..c42287438c 100644
--- a/modules/gdscript/tests/scripts/runtime/features/metatypes.out
+++ b/modules/gdscript/tests/scripts/runtime/features/metatypes.out
@@ -3,11 +3,16 @@ var test_native: GDScriptNativeClass
var test_script: GDScript
var test_class: GDScript
var test_enum: Dictionary
+---
GDScriptNativeClass
GDScript
GDScript
{ "A": 0, "B": 1, "C": 2 }
+---
[]
100
10
["A", "B", "C"]
+---
+100
+10
diff --git a/modules/gridmap/editor/grid_map_editor_plugin.cpp b/modules/gridmap/editor/grid_map_editor_plugin.cpp
index 27c74421db..226cb48eb8 100644
--- a/modules/gridmap/editor/grid_map_editor_plugin.cpp
+++ b/modules/gridmap/editor/grid_map_editor_plugin.cpp
@@ -1275,7 +1275,7 @@ GridMapEditor::GridMapEditor() {
settings_pick_distance->set_value(EDITOR_GET("editors/grid_map/pick_distance"));
settings_vbc->add_margin_child(TTR("Pick Distance:"), settings_pick_distance);
- options->get_popup()->connect("id_pressed", callable_mp(this, &GridMapEditor::_menu_option));
+ options->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &GridMapEditor::_menu_option));
HBoxContainer *hb = memnew(HBoxContainer);
add_child(hb);
diff --git a/modules/multiplayer/editor/replication_editor.cpp b/modules/multiplayer/editor/replication_editor.cpp
index 3cc0a5ae53..b28572cf72 100644
--- a/modules/multiplayer/editor/replication_editor.cpp
+++ b/modules/multiplayer/editor/replication_editor.cpp
@@ -372,7 +372,7 @@ void ReplicationEditor::_notification(int p_what) {
[[fallthrough]];
}
case NOTIFICATION_ENTER_TREE: {
- add_theme_style_override("panel", EditorNode::get_singleton()->get_editor_theme()->get_stylebox(SNAME("panel"), SNAME("Panel")));
+ add_theme_style_override(SceneStringName(panel), EditorNode::get_singleton()->get_editor_theme()->get_stylebox(SceneStringName(panel), SNAME("Panel")));
add_pick_button->set_icon(get_theme_icon(SNAME("Add"), EditorStringName(EditorIcons)));
pin->set_icon(get_theme_icon(SNAME("Pin"), EditorStringName(EditorIcons)));
} break;
diff --git a/modules/openxr/editor/openxr_action_map_editor.cpp b/modules/openxr/editor/openxr_action_map_editor.cpp
index 62b4a427b9..937973f388 100644
--- a/modules/openxr/editor/openxr_action_map_editor.cpp
+++ b/modules/openxr/editor/openxr_action_map_editor.cpp
@@ -59,7 +59,7 @@ void OpenXRActionMapEditor::_notification(int p_what) {
for (int i = 0; i < tabs->get_child_count(); i++) {
Control *tab = Object::cast_to<Control>(tabs->get_child(i));
if (tab) {
- tab->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Tree")));
+ tab->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("Tree")));
}
}
} break;
@@ -110,7 +110,7 @@ OpenXRInteractionProfileEditorBase *OpenXRActionMapEditor::_add_interaction_prof
// now add it in..
ERR_FAIL_NULL_V(new_profile_editor, nullptr);
tabs->add_child(new_profile_editor);
- new_profile_editor->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Tree")));
+ new_profile_editor->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("Tree")));
tabs->set_tab_button_icon(tabs->get_tab_count() - 1, get_theme_icon(SNAME("close"), SNAME("TabBar")));
return new_profile_editor;
diff --git a/modules/openxr/editor/openxr_action_set_editor.cpp b/modules/openxr/editor/openxr_action_set_editor.cpp
index 5d9a3155fb..e2a843a051 100644
--- a/modules/openxr/editor/openxr_action_set_editor.cpp
+++ b/modules/openxr/editor/openxr_action_set_editor.cpp
@@ -63,7 +63,7 @@ void OpenXRActionSetEditor::_notification(int p_what) {
case NOTIFICATION_ENTER_TREE:
case NOTIFICATION_THEME_CHANGED: {
_theme_changed();
- panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("TabContainer")));
+ panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("TabContainer")));
} break;
}
}
diff --git a/modules/openxr/editor/openxr_interaction_profile_editor.cpp b/modules/openxr/editor/openxr_interaction_profile_editor.cpp
index ab36c0744e..651171358c 100644
--- a/modules/openxr/editor/openxr_interaction_profile_editor.cpp
+++ b/modules/openxr/editor/openxr_interaction_profile_editor.cpp
@@ -285,7 +285,7 @@ void OpenXRInteractionProfileEditor::_update_interaction_profile() {
PanelContainer *panel = memnew(PanelContainer);
panel->set_v_size_flags(Control::SIZE_EXPAND_FILL);
main_hb->add_child(panel);
- panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("TabContainer")));
+ panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("TabContainer")));
VBoxContainer *container = memnew(VBoxContainer);
panel->add_child(container);
@@ -310,7 +310,7 @@ void OpenXRInteractionProfileEditor::_theme_changed() {
for (int i = 0; i < main_hb->get_child_count(); i++) {
Control *panel = Object::cast_to<Control>(main_hb->get_child(i));
if (panel) {
- panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("TabContainer")));
+ panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("TabContainer")));
}
}
}
diff --git a/modules/openxr/editor/openxr_select_action_dialog.cpp b/modules/openxr/editor/openxr_select_action_dialog.cpp
index de0ab40f9e..a4ccc98408 100644
--- a/modules/openxr/editor/openxr_select_action_dialog.cpp
+++ b/modules/openxr/editor/openxr_select_action_dialog.cpp
@@ -38,7 +38,7 @@ void OpenXRSelectActionDialog::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE:
case NOTIFICATION_THEME_CHANGED: {
- scroll->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Tree")));
+ scroll->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("Tree")));
} break;
}
}
diff --git a/modules/openxr/editor/openxr_select_interaction_profile_dialog.cpp b/modules/openxr/editor/openxr_select_interaction_profile_dialog.cpp
index e6705d5c82..53b8cbd401 100644
--- a/modules/openxr/editor/openxr_select_interaction_profile_dialog.cpp
+++ b/modules/openxr/editor/openxr_select_interaction_profile_dialog.cpp
@@ -38,7 +38,7 @@ void OpenXRSelectInteractionProfileDialog::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE:
case NOTIFICATION_THEME_CHANGED: {
- scroll->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Tree")));
+ scroll->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), SNAME("Tree")));
} break;
}
}
diff --git a/platform/android/detect.py b/platform/android/detect.py
index ed0ceb5862..0b182aca90 100644
--- a/platform/android/detect.py
+++ b/platform/android/detect.py
@@ -68,7 +68,7 @@ def get_min_target_api():
def get_flags():
return {
- "arch": "arm64", # Default for convenience.
+ "arch": "arm64",
"target": "template_debug",
"supported": ["mono"],
}
diff --git a/platform/ios/detect.py b/platform/ios/detect.py
index 35e1b9cd6d..53b367a0a7 100644
--- a/platform/ios/detect.py
+++ b/platform/ios/detect.py
@@ -48,7 +48,7 @@ def get_doc_path():
def get_flags():
return {
- "arch": "arm64", # Default for convenience.
+ "arch": "arm64",
"target": "template_debug",
"use_volk": False,
"supported": ["mono"],
diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp
index 62e1a433e2..4c52d88377 100644
--- a/platform/windows/display_server_windows.cpp
+++ b/platform/windows/display_server_windows.cpp
@@ -3595,6 +3595,30 @@ void DisplayServerWindows::popup_close(WindowID p_window) {
}
}
+BitField<DisplayServerWindows::WinKeyModifierMask> DisplayServerWindows::_get_mods() const {
+ BitField<WinKeyModifierMask> mask;
+ static unsigned char keyboard_state[256];
+ if (GetKeyboardState((PBYTE)&keyboard_state)) {
+ if ((keyboard_state[VK_LSHIFT] & 0x80) || (keyboard_state[VK_RSHIFT] & 0x80)) {
+ mask.set_flag(WinKeyModifierMask::SHIFT);
+ }
+ if ((keyboard_state[VK_LCONTROL] & 0x80) || (keyboard_state[VK_RCONTROL] & 0x80)) {
+ mask.set_flag(WinKeyModifierMask::CTRL);
+ }
+ if ((keyboard_state[VK_LMENU] & 0x80) || (keyboard_state[VK_RMENU] & 0x80)) {
+ mask.set_flag(WinKeyModifierMask::ALT);
+ }
+ if ((keyboard_state[VK_RMENU] & 0x80)) {
+ mask.set_flag(WinKeyModifierMask::ALT_GR);
+ }
+ if ((keyboard_state[VK_LWIN] & 0x80) || (keyboard_state[VK_RWIN] & 0x80)) {
+ mask.set_flag(WinKeyModifierMask::META);
+ }
+ }
+
+ return mask;
+}
+
LRESULT DisplayServerWindows::MouseProc(int code, WPARAM wParam, LPARAM lParam) {
_THREAD_SAFE_METHOD_
@@ -3850,7 +3874,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
if (((lParam >> 16) <= 0) && !engine->is_project_manager_hint() && !engine->is_editor_hint() && !GLOBAL_GET("application/run/enable_alt_space_menu")) {
return 0;
}
- if (!alt_mem || !(GetAsyncKeyState(VK_SPACE) & (1 << 15))) {
+ if (!_get_mods().has_flag(WinKeyModifierMask::ALT) || !(GetAsyncKeyState(VK_SPACE) & (1 << 15))) {
return 0;
}
SendMessage(windows[window_id].hWnd, WM_SYSKEYUP, VK_SPACE, 0);
@@ -3936,20 +3960,22 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
RAWINPUT *raw = (RAWINPUT *)lpb;
+ const BitField<WinKeyModifierMask> &mods = _get_mods();
if (raw->header.dwType == RIM_TYPEKEYBOARD) {
if (raw->data.keyboard.VKey == VK_SHIFT) {
// If multiple Shifts are held down at the same time,
// Windows natively only sends a KEYUP for the last one to be released.
if (raw->data.keyboard.Flags & RI_KEY_BREAK) {
- if (GetAsyncKeyState(VK_SHIFT) < 0) {
+ if (!mods.has_flag(WinKeyModifierMask::SHIFT)) {
// A Shift is released, but another Shift is still held
ERR_BREAK(key_event_pos >= KEY_EVENT_BUFFER_SIZE);
KeyEvent ke;
ke.shift = false;
- ke.alt = alt_mem;
- ke.control = control_mem;
- ke.meta = meta_mem;
+ ke.altgr = mods.has_flag(WinKeyModifierMask::ALT_GR);
+ ke.alt = mods.has_flag(WinKeyModifierMask::ALT);
+ ke.control = mods.has_flag(WinKeyModifierMask::CTRL);
+ ke.meta = mods.has_flag(WinKeyModifierMask::META);
ke.uMsg = WM_KEYUP;
ke.window_id = window_id;
@@ -3966,9 +3992,10 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
mm.instantiate();
mm->set_window_id(window_id);
- mm->set_ctrl_pressed(control_mem);
- mm->set_shift_pressed(shift_mem);
- mm->set_alt_pressed(alt_mem);
+ mm->set_ctrl_pressed(mods.has_flag(WinKeyModifierMask::CTRL));
+ mm->set_shift_pressed(mods.has_flag(WinKeyModifierMask::SHIFT));
+ mm->set_alt_pressed(mods.has_flag(WinKeyModifierMask::ALT));
+ mm->set_meta_pressed(mods.has_flag(WinKeyModifierMask::META));
mm->set_pressure((raw->data.mouse.ulButtons & RI_MOUSE_LEFT_BUTTON_DOWN) ? 1.0f : 0.0f);
@@ -4063,12 +4090,14 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
break;
}
+ const BitField<WinKeyModifierMask> &mods = _get_mods();
Ref<InputEventMouseMotion> mm;
mm.instantiate();
mm->set_window_id(window_id);
- mm->set_ctrl_pressed(GetKeyState(VK_CONTROL) < 0);
- mm->set_shift_pressed(GetKeyState(VK_SHIFT) < 0);
- mm->set_alt_pressed(alt_mem);
+ mm->set_ctrl_pressed(mods.has_flag(WinKeyModifierMask::CTRL));
+ mm->set_shift_pressed(mods.has_flag(WinKeyModifierMask::SHIFT));
+ mm->set_alt_pressed(mods.has_flag(WinKeyModifierMask::ALT));
+ mm->set_meta_pressed(mods.has_flag(WinKeyModifierMask::META));
mm->set_pressure(windows[window_id].last_pressure);
mm->set_tilt(windows[window_id].last_tilt);
@@ -4213,9 +4242,11 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
}
mm->set_pen_inverted(pen_info.penFlags & (PEN_FLAG_INVERTED | PEN_FLAG_ERASER));
- mm->set_ctrl_pressed(GetKeyState(VK_CONTROL) < 0);
- mm->set_shift_pressed(GetKeyState(VK_SHIFT) < 0);
- mm->set_alt_pressed(alt_mem);
+ const BitField<WinKeyModifierMask> &mods = _get_mods();
+ mm->set_ctrl_pressed(mods.has_flag(WinKeyModifierMask::CTRL));
+ mm->set_shift_pressed(mods.has_flag(WinKeyModifierMask::SHIFT));
+ mm->set_alt_pressed(mods.has_flag(WinKeyModifierMask::ALT));
+ mm->set_meta_pressed(mods.has_flag(WinKeyModifierMask::META));
mm->set_button_mask(last_button_state);
@@ -4318,12 +4349,15 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
if (receiving_window_id == INVALID_WINDOW_ID) {
receiving_window_id = window_id;
}
+
+ const BitField<WinKeyModifierMask> &mods = _get_mods();
Ref<InputEventMouseMotion> mm;
mm.instantiate();
mm->set_window_id(receiving_window_id);
- mm->set_ctrl_pressed((wParam & MK_CONTROL) != 0);
- mm->set_shift_pressed((wParam & MK_SHIFT) != 0);
- mm->set_alt_pressed(alt_mem);
+ mm->set_ctrl_pressed(mods.has_flag(WinKeyModifierMask::CTRL));
+ mm->set_shift_pressed(mods.has_flag(WinKeyModifierMask::SHIFT));
+ mm->set_alt_pressed(mods.has_flag(WinKeyModifierMask::ALT));
+ mm->set_meta_pressed(mods.has_flag(WinKeyModifierMask::META));
if ((tablet_get_current_driver() == "wintab") && wintab_available && windows[window_id].wtctx) {
// Note: WinTab sends both WT_PACKET and WM_xBUTTONDOWN/UP/MOUSEMOVE events, use mouse 1/0 pressure only when last_pressure was not updated recently.
@@ -4512,10 +4546,12 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
}
}
- mb->set_ctrl_pressed((wParam & MK_CONTROL) != 0);
- mb->set_shift_pressed((wParam & MK_SHIFT) != 0);
- mb->set_alt_pressed(alt_mem);
- // mb->is_alt_pressed()=(wParam&MK_MENU)!=0;
+ const BitField<WinKeyModifierMask> &mods = _get_mods();
+ mb->set_ctrl_pressed(mods.has_flag(WinKeyModifierMask::CTRL));
+ mb->set_shift_pressed(mods.has_flag(WinKeyModifierMask::SHIFT));
+ mb->set_alt_pressed(mods.has_flag(WinKeyModifierMask::ALT));
+ mb->set_meta_pressed(mods.has_flag(WinKeyModifierMask::META));
+
if (mb->is_pressed()) {
last_button_state.set_flag(mouse_button_to_mask(mb->get_button_index()));
} else {
@@ -4691,19 +4727,6 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
case WM_KEYUP:
case WM_SYSKEYDOWN:
case WM_KEYDOWN: {
- if (wParam == VK_SHIFT) {
- shift_mem = (uMsg == WM_KEYDOWN || uMsg == WM_SYSKEYDOWN);
- }
- if (wParam == VK_CONTROL) {
- control_mem = (uMsg == WM_KEYDOWN || uMsg == WM_SYSKEYDOWN);
- }
- if (wParam == VK_MENU) {
- alt_mem = (uMsg == WM_KEYDOWN || uMsg == WM_SYSKEYDOWN);
- if (lParam & (1 << 24)) {
- gr_mem = alt_mem;
- }
- }
-
if (windows[window_id].ime_suppress_next_keyup && (uMsg == WM_KEYUP || uMsg == WM_SYSKEYUP)) {
windows[window_id].ime_suppress_next_keyup = false;
break;
@@ -4714,7 +4737,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
if (mouse_mode == MOUSE_MODE_CAPTURED) {
// When SetCapture is used, ALT+F4 hotkey is ignored by Windows, so handle it ourselves
- if (wParam == VK_F4 && alt_mem && (uMsg == WM_KEYDOWN || uMsg == WM_SYSKEYDOWN)) {
+ if (wParam == VK_F4 && _get_mods().has_flag(WinKeyModifierMask::ALT) && (uMsg == WM_KEYDOWN || uMsg == WM_SYSKEYDOWN)) {
_send_window_event(windows[window_id], WINDOW_EVENT_CLOSE_REQUEST);
}
}
@@ -4722,13 +4745,14 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
}
case WM_CHAR: {
ERR_BREAK(key_event_pos >= KEY_EVENT_BUFFER_SIZE);
+ const BitField<WinKeyModifierMask> &mods = _get_mods();
- // Make sure we don't include modifiers for the modifier key itself.
KeyEvent ke;
- ke.shift = (wParam != VK_SHIFT) ? shift_mem : false;
- ke.alt = (!(wParam == VK_MENU && (uMsg == WM_KEYDOWN || uMsg == WM_SYSKEYDOWN))) ? alt_mem : false;
- ke.control = (wParam != VK_CONTROL) ? control_mem : false;
- ke.meta = meta_mem;
+ ke.shift = mods.has_flag(WinKeyModifierMask::SHIFT);
+ ke.alt = mods.has_flag(WinKeyModifierMask::ALT);
+ ke.altgr = mods.has_flag(WinKeyModifierMask::ALT_GR);
+ ke.control = mods.has_flag(WinKeyModifierMask::CTRL);
+ ke.meta = mods.has_flag(WinKeyModifierMask::META);
ke.uMsg = uMsg;
ke.window_id = window_id;
@@ -4899,10 +4923,6 @@ void DisplayServerWindows::_process_activate_event(WindowID p_window_id) {
WindowData &wd = windows[p_window_id];
if (wd.activate_state == WA_ACTIVE || wd.activate_state == WA_CLICKACTIVE) {
last_focused_window = p_window_id;
- alt_mem = false;
- control_mem = false;
- shift_mem = false;
- gr_mem = false;
_set_mouse_mode_impl(mouse_mode);
if (!IsIconic(wd.hWnd)) {
SetFocus(wd.hWnd);
@@ -4914,7 +4934,6 @@ void DisplayServerWindows::_process_activate_event(WindowID p_window_id) {
track_mouse_leave_event(wd.hWnd);
// Release capture unconditionally because it can be set due to dragging, in addition to captured mode.
ReleaseCapture();
- alt_mem = false;
wd.window_focused = false;
_send_window_event(wd, WINDOW_EVENT_FOCUS_OUT);
}
@@ -4985,7 +5004,7 @@ void DisplayServerWindows::_process_key_events() {
k->set_physical_keycode(physical_keycode);
k->set_key_label(key_label);
k->set_unicode(fix_unicode(unicode));
- if (k->get_unicode() && gr_mem) {
+ if (k->get_unicode() && ke.altgr) {
k->set_alt_pressed(false);
k->set_ctrl_pressed(false);
}
@@ -5061,7 +5080,7 @@ void DisplayServerWindows::_process_key_events() {
}
k->set_unicode(fix_unicode(unicode));
}
- if (k->get_unicode() && gr_mem) {
+ if (k->get_unicode() && ke.altgr) {
k->set_alt_pressed(false);
k->set_ctrl_pressed(false);
}
@@ -5527,11 +5546,6 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
drop_events = false;
key_event_pos = 0;
- alt_mem = false;
- gr_mem = false;
- shift_mem = false;
- control_mem = false;
- meta_mem = false;
hInstance = static_cast<OS_Windows *>(OS::get_singleton())->get_hinstance();
pressrc = 0;
diff --git a/platform/windows/display_server_windows.h b/platform/windows/display_server_windows.h
index 9a4eeba486..7ef64d2ce3 100644
--- a/platform/windows/display_server_windows.h
+++ b/platform/windows/display_server_windows.h
@@ -337,7 +337,7 @@ class DisplayServerWindows : public DisplayServer {
struct KeyEvent {
WindowID window_id;
- bool alt, shift, control, meta;
+ bool alt, shift, control, meta, altgr;
UINT uMsg;
WPARAM wParam;
LPARAM lParam;
@@ -478,11 +478,6 @@ class DisplayServerWindows : public DisplayServer {
MouseMode mouse_mode;
int restore_mouse_trails = 0;
- bool alt_mem = false;
- bool gr_mem = false;
- bool shift_mem = false;
- bool control_mem = false;
- bool meta_mem = false;
BitField<MouseButtonMask> last_button_state;
bool use_raw_input = false;
bool drop_events = false;
@@ -519,6 +514,15 @@ class DisplayServerWindows : public DisplayServer {
LRESULT _handle_early_window_message(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
Point2i _get_screens_origin() const;
+ enum class WinKeyModifierMask {
+ ALT_GR = (1 << 1),
+ SHIFT = (1 << 2),
+ ALT = (1 << 3),
+ META = (1 << 4),
+ CTRL = (1 << 5),
+ };
+ BitField<WinKeyModifierMask> _get_mods() const;
+
Error _file_dialog_with_options_show(const String &p_title, const String &p_current_directory, const String &p_root, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const TypedArray<Dictionary> &p_options, const Callable &p_callback, bool p_options_in_cb);
public:
diff --git a/scene/3d/physics/collision_object_3d.cpp b/scene/3d/physics/collision_object_3d.cpp
index dddaf7eb4a..f11aa7012a 100644
--- a/scene/3d/physics/collision_object_3d.cpp
+++ b/scene/3d/physics/collision_object_3d.cpp
@@ -439,6 +439,9 @@ void CollisionObject3D::_on_transform_changed() {
}
const ShapeData::ShapeBase *shape_bases = shapedata.shapes.ptr();
for (int i = 0; i < shapedata.shapes.size(); i++) {
+ if (shape_bases[i].debug_shape.is_null()) {
+ continue;
+ }
RS::get_singleton()->instance_set_transform(shape_bases[i].debug_shape, debug_shape_old_transform * shapedata.xform);
}
}
diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp
index 245a086dda..8913650689 100644
--- a/scene/gui/color_picker.cpp
+++ b/scene/gui/color_picker.cpp
@@ -1560,7 +1560,7 @@ void ColorPicker::_pick_button_pressed_legacy() {
picker_preview_style_box = (Ref<StyleBoxFlat>)memnew(StyleBoxFlat);
picker_preview_style_box->set_bg_color(Color(1.0, 1.0, 1.0));
- picker_preview->add_theme_style_override("panel", picker_preview_style_box);
+ picker_preview->add_theme_style_override(SceneStringName(panel), picker_preview_style_box);
}
Rect2i screen_rect;
@@ -1863,7 +1863,7 @@ ColorPicker::ColorPicker() {
shape_popup->add_radio_check_item("VHS Circle", SHAPE_VHS_CIRCLE);
shape_popup->add_radio_check_item("OKHSL Circle", SHAPE_OKHSL_CIRCLE);
shape_popup->set_item_checked(current_shape, true);
- shape_popup->connect("id_pressed", callable_mp(this, &ColorPicker::set_picker_shape));
+ shape_popup->connect(SceneStringName(id_pressed), callable_mp(this, &ColorPicker::set_picker_shape));
add_mode(new ColorModeRGB(this));
add_mode(new ColorModeHSV(this));
@@ -1904,7 +1904,7 @@ ColorPicker::ColorPicker() {
mode_popup->add_check_item("Colorized Sliders", MODE_MAX);
mode_popup->set_item_checked(current_mode, true);
mode_popup->set_item_checked(MODE_MAX + 1, true);
- mode_popup->connect("id_pressed", callable_mp(this, &ColorPicker::_set_mode_popup_value));
+ mode_popup->connect(SceneStringName(id_pressed), callable_mp(this, &ColorPicker::_set_mode_popup_value));
VBoxContainer *vbl = memnew(VBoxContainer);
real_vbox->add_child(vbl);
diff --git a/scene/gui/dialogs.cpp b/scene/gui/dialogs.cpp
index 3d8be38fbd..088c8fca26 100644
--- a/scene/gui/dialogs.cpp
+++ b/scene/gui/dialogs.cpp
@@ -88,7 +88,7 @@ void AcceptDialog::_notification(int p_what) {
} break;
case NOTIFICATION_THEME_CHANGED: {
- bg_panel->add_theme_style_override("panel", theme_cache.panel_style);
+ bg_panel->add_theme_style_override(SceneStringName(panel), theme_cache.panel_style);
child_controls_changed();
if (is_visible()) {
diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp
index 6c2a61d255..e725bb5ba5 100644
--- a/scene/gui/graph_edit.cpp
+++ b/scene/gui/graph_edit.cpp
@@ -717,7 +717,7 @@ void GraphEdit::_notification(int p_what) {
zoom_label->set_custom_minimum_size(Size2(48, 0) * theme_cache.base_scale);
- menu_panel->add_theme_style_override("panel", theme_cache.menu_panel);
+ menu_panel->add_theme_style_override(SceneStringName(panel), theme_cache.menu_panel);
} break;
case NOTIFICATION_READY: {
Size2 hmin = h_scrollbar->get_combined_minimum_size();
@@ -1536,7 +1536,7 @@ void GraphEdit::_minimap_draw() {
Ref<StyleBoxFlat> sb_minimap = minimap->theme_cache.node_style->duplicate();
// Override default values with colors provided by the GraphNode's stylebox, if possible.
- Ref<StyleBoxFlat> sb_frame = graph_frame->get_theme_stylebox(graph_frame->is_selected() ? SNAME("panel_selected") : SNAME("panel"));
+ Ref<StyleBoxFlat> sb_frame = graph_frame->get_theme_stylebox(graph_frame->is_selected() ? SNAME("panel_selected") : SceneStringName(panel));
if (sb_frame.is_valid()) {
Color node_color = sb_frame->get_bg_color();
if (graph_frame->is_tint_color_enabled()) {
diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp
index 729e219825..aa41e46f82 100644
--- a/scene/gui/line_edit.cpp
+++ b/scene/gui/line_edit.cpp
@@ -2469,9 +2469,9 @@ void LineEdit::_generate_context_menu() {
menu->add_check_item(ETR("Display Control Characters"), MENU_DISPLAY_UCC);
menu->add_submenu_node_item(ETR("Insert Control Character"), menu_ctl, MENU_SUBMENU_INSERT_UCC);
- menu->connect("id_pressed", callable_mp(this, &LineEdit::menu_option));
- menu_dir->connect("id_pressed", callable_mp(this, &LineEdit::menu_option));
- menu_ctl->connect("id_pressed", callable_mp(this, &LineEdit::menu_option));
+ menu->connect(SceneStringName(id_pressed), callable_mp(this, &LineEdit::menu_option));
+ menu_dir->connect(SceneStringName(id_pressed), callable_mp(this, &LineEdit::menu_option));
+ menu_ctl->connect(SceneStringName(id_pressed), callable_mp(this, &LineEdit::menu_option));
menu->connect(SceneStringName(focus_entered), callable_mp(this, &LineEdit::_validate_caret_can_draw));
menu->connect(SceneStringName(focus_exited), callable_mp(this, &LineEdit::_validate_caret_can_draw));
diff --git a/scene/gui/popup.cpp b/scene/gui/popup.cpp
index 38204af6d5..10fadeeba1 100644
--- a/scene/gui/popup.cpp
+++ b/scene/gui/popup.cpp
@@ -271,7 +271,7 @@ void PopupPanel::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_READY:
case NOTIFICATION_THEME_CHANGED: {
- panel->add_theme_style_override("panel", theme_cache.panel_style);
+ panel->add_theme_style_override(SceneStringName(panel), theme_cache.panel_style);
_update_child_rects();
} break;
diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp
index bdd0102b63..4f07fdb87b 100644
--- a/scene/gui/popup_menu.cpp
+++ b/scene/gui/popup_menu.cpp
@@ -1026,7 +1026,7 @@ void PopupMenu::_notification(int p_what) {
} break;
case NOTIFICATION_THEME_CHANGED: {
- scroll_container->add_theme_style_override("panel", theme_cache.panel_style);
+ scroll_container->add_theme_style_override(SceneStringName(panel), theme_cache.panel_style);
[[fallthrough]];
}
@@ -2422,7 +2422,7 @@ void PopupMenu::activate_item(int p_idx) {
hide();
}
- emit_signal(SNAME("id_pressed"), id);
+ emit_signal(SceneStringName(id_pressed), id);
emit_signal(SNAME("index_pressed"), p_idx);
}
diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp
index f6942ca206..048892a4a5 100644
--- a/scene/gui/rich_text_label.cpp
+++ b/scene/gui/rich_text_label.cpp
@@ -4538,6 +4538,7 @@ void RichTextLabel::append_text(const String &p_bbcode) {
if (subtag_a.size() == 2) {
if (subtag_a[0] == "justification_flags" || subtag_a[0] == "jst") {
Vector<String> subtag_b = subtag_a[1].split(",");
+ jst_flags = 0; // Clear flags.
for (const String &E : subtag_b) {
if (E == "kashida" || E == "k") {
jst_flags.set_flag(TextServer::JUSTIFICATION_KASHIDA);
@@ -4551,7 +4552,7 @@ void RichTextLabel::append_text(const String &p_bbcode) {
jst_flags.set_flag(TextServer::JUSTIFICATION_SKIP_LAST_LINE);
} else if (E == "skip_last_with_chars" || E == "sv") {
jst_flags.set_flag(TextServer::JUSTIFICATION_SKIP_LAST_LINE_WITH_VISIBLE_CHARS);
- } else if (E == "do_not_skip_singe" || E == "ns") {
+ } else if (E == "do_not_skip_single" || E == "ns") {
jst_flags.set_flag(TextServer::JUSTIFICATION_DO_NOT_SKIP_SINGLE_LINE);
}
}
@@ -6308,7 +6309,7 @@ Size2 RichTextLabel::get_minimum_size() const {
void RichTextLabel::_generate_context_menu() {
menu = memnew(PopupMenu);
add_child(menu, false, INTERNAL_MODE_FRONT);
- menu->connect("id_pressed", callable_mp(this, &RichTextLabel::menu_option));
+ menu->connect(SceneStringName(id_pressed), callable_mp(this, &RichTextLabel::menu_option));
menu->add_item(ETR("Copy"), MENU_COPY);
menu->add_item(ETR("Select All"), MENU_SELECT_ALL);
diff --git a/scene/gui/scroll_container.cpp b/scene/gui/scroll_container.cpp
index 6f5d0cdcfb..1f4d1dbf52 100644
--- a/scene/gui/scroll_container.cpp
+++ b/scene/gui/scroll_container.cpp
@@ -31,7 +31,6 @@
#include "scroll_container.h"
#include "core/config/project_settings.h"
-#include "core/os/os.h"
#include "scene/main/window.h"
#include "scene/theme/theme_db.h"
@@ -250,18 +249,21 @@ void ScrollContainer::_update_scrollbar_position() {
return;
}
- Size2 hmin = h_scroll->get_combined_minimum_size();
- Size2 vmin = v_scroll->get_combined_minimum_size();
+ Size2 hmin = h_scroll->is_visible() ? h_scroll->get_combined_minimum_size() : Size2();
+ Size2 vmin = v_scroll->is_visible() ? v_scroll->get_combined_minimum_size() : Size2();
+
+ int lmar = is_layout_rtl() ? theme_cache.panel_style->get_margin(SIDE_RIGHT) : theme_cache.panel_style->get_margin(SIDE_LEFT);
+ int rmar = is_layout_rtl() ? theme_cache.panel_style->get_margin(SIDE_LEFT) : theme_cache.panel_style->get_margin(SIDE_RIGHT);
- h_scroll->set_anchor_and_offset(SIDE_LEFT, ANCHOR_BEGIN, 0);
- h_scroll->set_anchor_and_offset(SIDE_RIGHT, ANCHOR_END, 0);
- h_scroll->set_anchor_and_offset(SIDE_TOP, ANCHOR_END, -hmin.height);
- h_scroll->set_anchor_and_offset(SIDE_BOTTOM, ANCHOR_END, 0);
+ h_scroll->set_anchor_and_offset(SIDE_LEFT, ANCHOR_BEGIN, lmar);
+ h_scroll->set_anchor_and_offset(SIDE_RIGHT, ANCHOR_END, -rmar - vmin.width);
+ h_scroll->set_anchor_and_offset(SIDE_TOP, ANCHOR_END, -hmin.height - theme_cache.panel_style->get_margin(SIDE_BOTTOM));
+ h_scroll->set_anchor_and_offset(SIDE_BOTTOM, ANCHOR_END, -theme_cache.panel_style->get_margin(SIDE_BOTTOM));
- v_scroll->set_anchor_and_offset(SIDE_LEFT, ANCHOR_END, -vmin.width);
- v_scroll->set_anchor_and_offset(SIDE_RIGHT, ANCHOR_END, 0);
- v_scroll->set_anchor_and_offset(SIDE_TOP, ANCHOR_BEGIN, 0);
- v_scroll->set_anchor_and_offset(SIDE_BOTTOM, ANCHOR_END, 0);
+ v_scroll->set_anchor_and_offset(SIDE_LEFT, ANCHOR_END, -vmin.width - rmar);
+ v_scroll->set_anchor_and_offset(SIDE_RIGHT, ANCHOR_END, -rmar);
+ v_scroll->set_anchor_and_offset(SIDE_TOP, ANCHOR_BEGIN, theme_cache.panel_style->get_margin(SIDE_TOP));
+ v_scroll->set_anchor_and_offset(SIDE_BOTTOM, ANCHOR_END, -hmin.height - theme_cache.panel_style->get_margin(SIDE_BOTTOM));
_updating_scrollbars = false;
}
@@ -339,7 +341,7 @@ void ScrollContainer::_notification(int p_what) {
case NOTIFICATION_LAYOUT_DIRECTION_CHANGED:
case NOTIFICATION_TRANSLATION_CHANGED: {
_updating_scrollbars = true;
- callable_mp(this, &ScrollContainer::_update_scrollbar_position).call_deferred();
+ callable_mp(this, is_ready() ? &ScrollContainer::_reposition_children : &ScrollContainer::_update_scrollbar_position).call_deferred();
} break;
case NOTIFICATION_READY: {
@@ -444,8 +446,8 @@ void ScrollContainer::update_scrollbars() {
v_scroll->set_page((h_scroll->is_visible() && h_scroll->get_parent() == this) ? size.height - hmin.height : size.height);
// Avoid scrollbar overlapping.
- h_scroll->set_anchor_and_offset(SIDE_RIGHT, ANCHOR_END, (v_scroll->is_visible() && v_scroll->get_parent() == this) ? -vmin.width : 0);
- v_scroll->set_anchor_and_offset(SIDE_BOTTOM, ANCHOR_END, (h_scroll->is_visible() && h_scroll->get_parent() == this) ? -hmin.height : 0);
+ _updating_scrollbars = true;
+ callable_mp(this, &ScrollContainer::_update_scrollbar_position).call_deferred();
}
void ScrollContainer::_scroll_moved(float) {
diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp
index 1dd00fab4d..a9dc4c765c 100644
--- a/scene/gui/text_edit.cpp
+++ b/scene/gui/text_edit.cpp
@@ -4393,13 +4393,7 @@ int TextEdit::get_minimap_line_at_pos(const Point2i &p_pos) const {
}
}
- if (row < 0) {
- row = 0;
- }
-
- if (row >= text.size()) {
- row = text.size() - 1;
- }
+ row = CLAMP(row, 0, text.size() - 1);
return row;
}
@@ -7188,9 +7182,9 @@ void TextEdit::_generate_context_menu() {
menu->add_check_item(ETR("Display Control Characters"), MENU_DISPLAY_UCC);
menu->add_submenu_node_item(ETR("Insert Control Character"), menu_ctl, MENU_SUBMENU_INSERT_UCC);
- menu->connect("id_pressed", callable_mp(this, &TextEdit::menu_option));
- menu_dir->connect("id_pressed", callable_mp(this, &TextEdit::menu_option));
- menu_ctl->connect("id_pressed", callable_mp(this, &TextEdit::menu_option));
+ menu->connect(SceneStringName(id_pressed), callable_mp(this, &TextEdit::menu_option));
+ menu_dir->connect(SceneStringName(id_pressed), callable_mp(this, &TextEdit::menu_option));
+ menu_ctl->connect(SceneStringName(id_pressed), callable_mp(this, &TextEdit::menu_option));
}
void TextEdit::_update_context_menu() {
@@ -7991,7 +7985,7 @@ void TextEdit::_update_minimap_click() {
}
Point2i next_line = get_next_visible_line_index_offset_from(row, 0, -get_visible_line_count() / 2);
- int first_line = row - next_line.x + 1;
+ int first_line = MAX(0, row - next_line.x + 1);
double delta = get_scroll_pos_for_line(first_line, next_line.y) - get_v_scroll();
if (delta < 0) {
_scroll_up(-delta, true);
diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp
index fc5b942918..56be6b90a2 100644
--- a/scene/gui/tree.cpp
+++ b/scene/gui/tree.cpp
@@ -5821,7 +5821,7 @@ Tree::Tree() {
line_editor->connect("text_submitted", callable_mp(this, &Tree::_line_editor_submit));
text_editor->connect(SceneStringName(gui_input), callable_mp(this, &Tree::_text_editor_gui_input));
popup_editor->connect("popup_hide", callable_mp(this, &Tree::_text_editor_popup_modal_close));
- popup_menu->connect("id_pressed", callable_mp(this, &Tree::popup_select));
+ popup_menu->connect(SceneStringName(id_pressed), callable_mp(this, &Tree::popup_select));
value_editor->connect("value_changed", callable_mp(this, &Tree::value_editor_changed));
set_notify_transform(true);
diff --git a/scene/resources/particle_process_material.cpp b/scene/resources/particle_process_material.cpp
index 01d26a8bed..ee986f5820 100644
--- a/scene/resources/particle_process_material.cpp
+++ b/scene/resources/particle_process_material.cpp
@@ -147,13 +147,13 @@ void ParticleProcessMaterial::finish_shaders() {
void ParticleProcessMaterial::_update_shader() {
MaterialKey mk = _compute_key();
if (mk == current_key) {
- return; //no update required in the end
+ return; // No update required in the end.
}
if (shader_map.has(current_key)) {
shader_map[current_key].users--;
if (shader_map[current_key].users == 0) {
- //deallocate shader, as it's no longer in use
+ // Deallocate shader, as it's no longer in use.
RS::get_singleton()->free(shader_map[current_key].shader);
shader_map.erase(current_key);
}
@@ -166,23 +166,26 @@ void ParticleProcessMaterial::_update_shader() {
shader_map[mk].users++;
return;
}
- //must create a shader!
+
+ // No pre-existing shader, create one.
// Add a comment to describe the shader origin (useful when converting to ShaderMaterial).
String code = "// NOTE: Shader automatically converted from " VERSION_NAME " " VERSION_FULL_CONFIG "'s ParticleProcessMaterial.\n\n";
code += "shader_type particles;\n";
code += "render_mode disable_velocity;\n";
-
if (collision_scale) {
code += "render_mode collision_use_scale;\n";
}
+ code += "\n";
+
+ // Define uniforms.
code += "uniform vec3 direction;\n";
code += "uniform float spread;\n";
code += "uniform float flatness;\n";
- code += "uniform float inherit_emitter_velocity_ratio = 0;\n";
+ code += "uniform float inherit_emitter_velocity_ratio = 0.0;\n";
code += "uniform float initial_linear_velocity_min;\n";
code += "uniform float initial_linear_velocity_max;\n";
@@ -227,10 +230,10 @@ void ParticleProcessMaterial::_update_shader() {
code += "uniform float anim_offset_max;\n";
code += "uniform float lifetime_randomness;\n";
- code += "uniform vec3 emission_shape_offset = vec3(0.);\n";
- code += "uniform vec3 emission_shape_scale = vec3(1.);\n";
+ code += "uniform vec3 emission_shape_offset = vec3(0.0);\n";
+ code += "uniform vec3 emission_shape_scale = vec3(1.0);\n";
- code += "uniform vec3 velocity_pivot = vec3(0.);\n";
+ code += "uniform vec3 velocity_pivot = vec3(0.0);\n";
if (tex_parameters[PARAM_SCALE_OVER_VELOCITY].is_valid()) {
code += "uniform float scale_over_velocity_min = 0.0;\n";
@@ -346,10 +349,10 @@ void ParticleProcessMaterial::_update_shader() {
code += "uniform sampler2D scale_over_velocity_curve : repeat_disable;\n";
}
if (tex_parameters[PARAM_DIRECTIONAL_VELOCITY].is_valid()) {
- code += "uniform sampler2D directional_velocity_curve: repeat_disable;\n";
+ code += "uniform sampler2D directional_velocity_curve : repeat_disable;\n";
}
if (velocity_limit_curve.is_valid()) {
- code += "uniform sampler2D velocity_limit_curve: repeat_disable;\n";
+ code += "uniform sampler2D velocity_limit_curve : repeat_disable;\n";
}
if (collision_mode == COLLISION_RIGID) {
@@ -372,23 +375,29 @@ void ParticleProcessMaterial::_update_shader() {
if (turbulence_color_ramp.is_valid()) {
code += "uniform sampler2D turbulence_color_ramp;\n";
}
- code += "\n";
+ }
+
+ code += "\n";
+
+ // Define helper functions.
- //functions for 3D noise / turbulence
- code += "\n\n";
+ if (turbulence_enabled) {
+ // Functions for 3D noise / turbulence.
+ code += "// Functions for 3D noise / turbulence.\n";
code += "vec4 grad(vec4 p) {\n";
code += " p = fract(vec4(\n";
- code += " dot(p, vec4(0.143081, 0.001724, 0.280166, 0.262771)),\n";
- code += " dot(p, vec4(0.645401, -0.047791, -0.146698, 0.595016)),\n";
- code += " dot(p, vec4(-0.499665, -0.095734, 0.425674, -0.207367)),\n";
- code += " dot(p, vec4(-0.013596, -0.848588, 0.423736, 0.17044))));\n";
+ code += " dot(p, vec4(0.143081, 0.001724, 0.280166, 0.262771)),\n";
+ code += " dot(p, vec4(0.645401, -0.047791, -0.146698, 0.595016)),\n";
+ code += " dot(p, vec4(-0.499665, -0.095734, 0.425674, -0.207367)),\n";
+ code += " dot(p, vec4(-0.013596, -0.848588, 0.423736, 0.17044))));\n";
code += " return fract((p.xyzw * p.yzwx) * 2365.952041) * 2.0 - 1.0;\n";
- code += "}\n";
+ code += "}\n\n";
+
code += "float noise(vec4 coord) {\n";
code += " // Domain rotation to improve the look of XYZ slices + animation patterns.\n";
code += " coord = vec4(\n";
- code += " coord.xyz + dot(coord, vec4(vec3(-0.1666667), -0.5)),\n";
- code += " dot(coord, vec4(0.5)));\n\n";
+ code += " coord.xyz + dot(coord, vec4(vec3(-0.1666667), -0.5)),\n";
+ code += " dot(coord, vec4(0.5)));\n\n";
code += " vec4 base = floor(coord), delta = coord - base;\n\n";
code += " vec4 grad_0000 = grad(base + vec4(0.0, 0.0, 0.0, 0.0)), grad_1000 = grad(base + vec4(1.0, 0.0, 0.0, 0.0));\n";
code += " vec4 grad_0100 = grad(base + vec4(0.0, 1.0, 0.0, 0.0)), grad_1100 = grad(base + vec4(1.0, 1.0, 0.0, 0.0));\n";
@@ -399,23 +408,24 @@ void ParticleProcessMaterial::_update_shader() {
code += " vec4 grad_0011 = grad(base + vec4(0.0, 0.0, 1.0, 1.0)), grad_1011 = grad(base + vec4(1.0, 0.0, 1.0, 1.0));\n";
code += " vec4 grad_0111 = grad(base + vec4(0.0, 1.0, 1.0, 1.0)), grad_1111 = grad(base + vec4(1.0, 1.0, 1.0, 1.0));\n\n";
code += " vec4 result_0123 = vec4(\n";
- code += " dot(delta - vec4(0.0, 0.0, 0.0, 0.0), grad_0000), dot(delta - vec4(1.0, 0.0, 0.0, 0.0), grad_1000),\n";
- code += " dot(delta - vec4(0.0, 1.0, 0.0, 0.0), grad_0100), dot(delta - vec4(1.0, 1.0, 0.0, 0.0), grad_1100));\n";
+ code += " dot(delta - vec4(0.0, 0.0, 0.0, 0.0), grad_0000), dot(delta - vec4(1.0, 0.0, 0.0, 0.0), grad_1000),\n";
+ code += " dot(delta - vec4(0.0, 1.0, 0.0, 0.0), grad_0100), dot(delta - vec4(1.0, 1.0, 0.0, 0.0), grad_1100));\n";
code += " vec4 result_4567 = vec4(\n";
- code += " dot(delta - vec4(0.0, 0.0, 1.0, 0.0), grad_0010), dot(delta - vec4(1.0, 0.0, 1.0, 0.0), grad_1010),\n";
- code += " dot(delta - vec4(0.0, 1.0, 1.0, 0.0), grad_0110), dot(delta - vec4(1.0, 1.0, 1.0, 0.0), grad_1110));\n";
+ code += " dot(delta - vec4(0.0, 0.0, 1.0, 0.0), grad_0010), dot(delta - vec4(1.0, 0.0, 1.0, 0.0), grad_1010),\n";
+ code += " dot(delta - vec4(0.0, 1.0, 1.0, 0.0), grad_0110), dot(delta - vec4(1.0, 1.0, 1.0, 0.0), grad_1110));\n";
code += " vec4 result_89AB = vec4(\n";
- code += " dot(delta - vec4(0.0, 0.0, 0.0, 1.0), grad_0001), dot(delta - vec4(1.0, 0.0, 0.0, 1.0), grad_1001),\n";
- code += " dot(delta - vec4(0.0, 1.0, 0.0, 1.0), grad_0101), dot(delta - vec4(1.0, 1.0, 0.0, 1.0), grad_1101));\n";
+ code += " dot(delta - vec4(0.0, 0.0, 0.0, 1.0), grad_0001), dot(delta - vec4(1.0, 0.0, 0.0, 1.0), grad_1001),\n";
+ code += " dot(delta - vec4(0.0, 1.0, 0.0, 1.0), grad_0101), dot(delta - vec4(1.0, 1.0, 0.0, 1.0), grad_1101));\n";
code += " vec4 result_CDEF = vec4(\n";
- code += " dot(delta - vec4(0.0, 0.0, 1.0, 1.0), grad_0011), dot(delta - vec4(1.0, 0.0, 1.0, 1.0), grad_1011),\n";
- code += " dot(delta - vec4(0.0, 1.0, 1.0, 1.0), grad_0111), dot(delta - vec4(1.0, 1.0, 1.0, 1.0), grad_1111));\n\n";
+ code += " dot(delta - vec4(0.0, 0.0, 1.0, 1.0), grad_0011), dot(delta - vec4(1.0, 0.0, 1.0, 1.0), grad_1011),\n";
+ code += " dot(delta - vec4(0.0, 1.0, 1.0, 1.0), grad_0111), dot(delta - vec4(1.0, 1.0, 1.0, 1.0), grad_1111));\n\n";
code += " vec4 fade = delta * delta * delta * (10.0 + delta * (-15.0 + delta * 6.0));\n";
code += " vec4 result_W0 = mix(result_0123, result_89AB, fade.w), result_W1 = mix(result_4567, result_CDEF, fade.w);\n";
code += " vec4 result_WZ = mix(result_W0, result_W1, fade.z);\n";
code += " vec2 result_WZY = mix(result_WZ.xy, result_WZ.zw, fade.y);\n";
code += " return mix(result_WZY.x, result_WZY.y, fade.x);\n";
code += "}\n\n";
+
code += "// Curl 3D and three-noise function with friendly permission by Isaac Cohen.\n";
code += "// Modified to accept 4D noise.\n";
code += "vec3 noise_3x(vec4 p) {\n";
@@ -424,7 +434,8 @@ void ParticleProcessMaterial::_update_shader() {
code += " float s2 = noise(p - vec4(vec3(0.0), 1.7320508 * 2048.333333));\n";
code += " vec3 c = vec3(s, s1, s2);\n";
code += " return c;\n";
- code += "}\n";
+ code += "}\n\n";
+
code += "vec3 curl_3d(vec4 p, float c) {\n";
code += " float epsilon = 0.001 + c;\n";
code += " vec4 dx = vec4(epsilon, 0.0, 0.0, 0.0);\n";
@@ -440,7 +451,8 @@ void ParticleProcessMaterial::_update_shader() {
code += " float y = (z1.x - z0.x) - (x1.z - x0.z);\n";
code += " float z = (x1.y - x0.y) - (y1.x - y0.x);\n";
code += " return normalize(vec3(x, y, z));\n";
- code += "}\n";
+ code += "}\n\n";
+
code += "vec3 get_noise_direction(vec3 pos) {\n";
code += " float adj_contrast = max((turbulence_noise_strength - 1.0), 0.0) * 70.0;\n";
code += " vec4 noise_time = TIME * vec4(turbulence_noise_speed, turbulence_noise_speed_random);\n";
@@ -448,66 +460,70 @@ void ParticleProcessMaterial::_update_shader() {
code += " vec3 noise_direction = curl_3d(noise_pos + noise_time, adj_contrast);\n";
code += " noise_direction = mix(0.9 * noise_direction, noise_direction, turbulence_noise_strength - 9.0);\n";
code += " return noise_direction;\n";
- code += "}\n";
+ code += "}\n\n";
}
- code += "vec4 rotate_hue(vec4 current_color, float hue_rot_angle){\n";
+
+ code += "vec4 rotate_hue(vec4 current_color, float hue_rot_angle) {\n";
code += " float hue_rot_c = cos(hue_rot_angle);\n";
code += " float hue_rot_s = sin(hue_rot_angle);\n";
- code += " mat4 hue_rot_mat = mat4(vec4(0.299, 0.587, 0.114, 0.0),\n";
- code += " vec4(0.299, 0.587, 0.114, 0.0),\n";
- code += " vec4(0.299, 0.587, 0.114, 0.0),\n";
- code += " vec4(0.000, 0.000, 0.000, 1.0)) +\n";
- code += " mat4(vec4(0.701, -0.587, -0.114, 0.0),\n";
- code += " vec4(-0.299, 0.413, -0.114, 0.0),\n";
- code += " vec4(-0.300, -0.588, 0.886, 0.0),\n";
- code += " vec4(0.000, 0.000, 0.000, 0.0)) * hue_rot_c +\n";
- code += " mat4(vec4(0.168, 0.330, -0.497, 0.0),\n";
- code += " vec4(-0.328, 0.035, 0.292, 0.0),\n";
- code += " vec4(1.250, -1.050, -0.203, 0.0),\n";
- code += " vec4(0.000, 0.000, 0.000, 0.0)) * hue_rot_s;\n";
+ code += " mat4 hue_rot_mat =\n";
+ code += " mat4(vec4(0.299, 0.587, 0.114, 0.0),\n";
+ code += " vec4(0.299, 0.587, 0.114, 0.0),\n";
+ code += " vec4(0.299, 0.587, 0.114, 0.0),\n";
+ code += " vec4(0.000, 0.000, 0.000, 1.0)) +\n";
+ code += " mat4(vec4(0.701, -0.587, -0.114, 0.0),\n";
+ code += " vec4(-0.299, 0.413, -0.114, 0.0),\n";
+ code += " vec4(-0.300, -0.588, 0.886, 0.0),\n";
+ code += " vec4(0.000, 0.000, 0.000, 0.0)) *\n";
+ code += " hue_rot_c +\n";
+ code += " mat4(vec4(0.168, 0.330, -0.497, 0.0),\n";
+ code += " vec4(-0.328, 0.035, 0.292, 0.0),\n";
+ code += " vec4(1.250, -1.050, -0.203, 0.0),\n";
+ code += " vec4(0.000, 0.000, 0.000, 0.0)) *\n";
+ code += " hue_rot_s;\n";
code += " return hue_rot_mat * current_color;\n";
- code += "}\n";
+ code += "}\n\n";
- //need a random function
- code += "\n\n";
+ // Random functions.
code += "float rand_from_seed(inout uint seed) {\n";
code += " int k;\n";
code += " int s = int(seed);\n";
- code += " if (s == 0)\n";
- code += " s = 305420679;\n";
+ code += " if (s == 0) {\n";
+ code += " s = 305420679;\n";
+ code += " }\n";
code += " k = s / 127773;\n";
code += " s = 16807 * (s - k * 127773) - 2836 * k;\n";
- code += " if (s < 0)\n";
+ code += " if (s < 0) {\n";
code += " s += 2147483647;\n";
+ code += " }\n";
code += " seed = uint(s);\n";
code += " return float(seed % uint(65536)) / 65535.0;\n";
- code += "}\n";
- code += "\n";
+ code += "}\n\n";
code += "float rand_from_seed_m1_p1(inout uint seed) {\n";
code += " return rand_from_seed(seed) * 2.0 - 1.0;\n";
- code += "}\n";
- code += "\n";
+ code += "}\n\n";
- //improve seed quality
+ // Improve seed quality.
code += "uint hash(uint x) {\n";
code += " x = ((x >> uint(16)) ^ x) * uint(73244475);\n";
code += " x = ((x >> uint(16)) ^ x) * uint(73244475);\n";
code += " x = (x >> uint(16)) ^ x;\n";
code += " return x;\n";
- code += "}\n";
- code += "\n";
+ code += "}\n\n";
+
+ // Define structs.
- code += "struct DisplayParameters{\n";
+ code += "struct DisplayParameters {\n";
code += " vec3 scale;\n";
code += " float hue_rotation;\n";
code += " float animation_speed;\n";
code += " float animation_offset;\n";
code += " float lifetime;\n";
code += " vec4 color;\n";
- code += "};\n";
- code += "\n";
- code += "struct DynamicsParameters{\n";
+ code += "};\n\n";
+
+ code += "struct DynamicsParameters {\n";
code += " float angle;\n";
code += " float angular_velocity;\n";
code += " float initial_velocity_multiplier;\n";
@@ -517,44 +533,43 @@ void ParticleProcessMaterial::_update_shader() {
if (turbulence_enabled) {
code += " float turb_influence;\n";
}
- code += "};\n";
- code += "struct PhysicalParameters{\n";
+ code += "};\n\n";
+
+ code += "struct PhysicalParameters {\n";
code += " float linear_accel;\n";
code += " float radial_accel;\n";
code += " float tangent_accel;\n";
code += " float damping;\n";
- code += "};\n";
+ code += "};\n\n";
- code += "\n";
- code += "void calculate_initial_physical_params(inout PhysicalParameters params, inout uint alt_seed){\n";
+ code += "void calculate_initial_physical_params(inout PhysicalParameters params, inout uint alt_seed) {\n";
code += " params.linear_accel = mix(linear_accel_min, linear_accel_max, rand_from_seed(alt_seed));\n";
code += " params.radial_accel = mix(radial_accel_min, radial_accel_max, rand_from_seed(alt_seed));\n";
code += " params.tangent_accel = mix(tangent_accel_min, tangent_accel_max, rand_from_seed(alt_seed));\n";
code += " params.damping = mix(damping_min, damping_max, rand_from_seed(alt_seed));\n";
- code += "}\n";
- code += "\n";
- code += "void calculate_initial_dynamics_params(inout DynamicsParameters params,inout uint alt_seed){\n";
+ code += "}\n\n";
+
+ code += "void calculate_initial_dynamics_params(inout DynamicsParameters params, inout uint alt_seed) {\n";
code += " // -------------------- DO NOT REORDER OPERATIONS, IT BREAKS VISUAL COMPATIBILITY\n";
code += " // -------------------- ADD NEW OPERATIONS AT THE BOTTOM\n";
code += " params.angle = mix(initial_angle_min, initial_angle_max, rand_from_seed(alt_seed));\n";
code += " params.angular_velocity = mix(angular_velocity_min, angular_velocity_max, rand_from_seed(alt_seed));\n";
- code += " params.initial_velocity_multiplier = mix(initial_linear_velocity_min, initial_linear_velocity_max,rand_from_seed(alt_seed));\n";
- code += " params.directional_velocity = mix(directional_velocity_min, directional_velocity_max,rand_from_seed(alt_seed));\n";
- code += " params.radial_velocity = mix(radial_velocity_min, radial_velocity_max,rand_from_seed(alt_seed));\n";
- code += " params.orbit_velocity = mix(orbit_velocity_min, orbit_velocity_max,rand_from_seed(alt_seed));\n";
+ code += " params.initial_velocity_multiplier = mix(initial_linear_velocity_min, initial_linear_velocity_max, rand_from_seed(alt_seed));\n";
+ code += " params.directional_velocity = mix(directional_velocity_min, directional_velocity_max, rand_from_seed(alt_seed));\n";
+ code += " params.radial_velocity = mix(radial_velocity_min, radial_velocity_max, rand_from_seed(alt_seed));\n";
+ code += " params.orbit_velocity = mix(orbit_velocity_min, orbit_velocity_max, rand_from_seed(alt_seed));\n";
if (turbulence_enabled) {
- code += " params.turb_influence = mix(turbulence_influence_min,turbulence_influence_max,rand_from_seed(alt_seed));\n";
+ code += " params.turb_influence = mix(turbulence_influence_min, turbulence_influence_max, rand_from_seed(alt_seed));\n";
}
- code += "}\n";
- code += "void calculate_initial_display_params(inout DisplayParameters params,inout uint alt_seed){\n";
+ code += "}\n\n";
+
+ code += "void calculate_initial_display_params(inout DisplayParameters params, inout uint alt_seed) {\n";
code += " // -------------------- DO NOT REORDER OPERATIONS, IT BREAKS VISUAL COMPATIBILITY\n";
code += " // -------------------- ADD NEW OPERATIONS AT THE BOTTOM\n";
code += " float pi = 3.14159;\n";
- code += " float degree_to_rad = pi / 180.0;\n";
-
- code += " params.scale = vec3(mix(scale_min, scale_max, rand_from_seed(alt_seed)));\n";
- code += " params.scale = sign(params.scale) * max(abs(params.scale), 0.001);\n";
- code += " params.hue_rotation = pi * 2.0 * mix(hue_variation_min, hue_variation_max, rand_from_seed(alt_seed));\n";
+ code += " params.scale = vec3(mix(scale_min, scale_max, rand_from_seed(alt_seed)));\n";
+ code += " params.scale = sign(params.scale) * max(abs(params.scale), 0.001);\n";
+ code += " params.hue_rotation = pi * 2.0 * mix(hue_variation_min, hue_variation_max, rand_from_seed(alt_seed));\n";
code += " params.animation_speed = mix(anim_speed_min, anim_speed_max, rand_from_seed(alt_seed));\n";
code += " params.animation_offset = mix(anim_offset_min, anim_offset_max, rand_from_seed(alt_seed));\n";
code += " params.lifetime = (1.0 - lifetime_randomness * rand_from_seed(alt_seed));\n";
@@ -568,11 +583,11 @@ void ParticleProcessMaterial::_update_shader() {
code += " ivec2 emission_tex_ofs = ivec2(point % emission_tex_size.x, point / emission_tex_size.x);\n";
code += " params.color *= texelFetch(emission_texture_color, emission_tex_ofs, 0);\n";
}
- code += "}\n";
+ code += "}\n\n";
- // process display parameters that are bound solely by lifetime
- code += "void process_display_param(inout DisplayParameters parameters, float lifetime){\n";
- code += " // compile-time add textures\n";
+ // Process display parameters that are bound solely by lifetime.
+ code += "void process_display_param(inout DisplayParameters parameters, float lifetime) {\n";
+ code += " // Compile-time add textures.\n";
if (tex_parameters[PARAM_SCALE].is_valid()) {
code += " parameters.scale *= texture(scale_curve, vec2(lifetime)).rgb;\n";
}
@@ -586,7 +601,7 @@ void ParticleProcessMaterial::_update_shader() {
code += " parameters.animation_speed *= texture(animation_speed_curve, vec2(lifetime)).r;\n";
}
if (color_ramp.is_valid()) {
- code += " parameters.color *= texture(color_ramp, vec2(lifetime));\n";
+ code += " parameters.color *= texture(color_ramp, vec2(lifetime));\n";
}
if (alpha_curve.is_valid()) {
code += " parameters.color.a *= texture(alpha_curve, vec2(lifetime)).r;\n";
@@ -595,14 +610,14 @@ void ParticleProcessMaterial::_update_shader() {
if (emission_curve.is_valid()) {
code += " parameters.color.rgb *= 1.0 + texture(emission_curve, vec2(lifetime)).r;\n";
}
- code += "}\n";
+ code += "}\n\n";
code += "vec3 calculate_initial_position(inout uint alt_seed) {\n";
code += " float pi = 3.14159;\n";
- code += " float degree_to_rad = pi / 180.0;\n";
- code += " vec3 pos = vec3(0.);\n";
+ code += " vec3 pos = vec3(0.0);\n";
+ code += " { // Emission shape.\n";
if (emission_shape == EMISSION_SHAPE_POINT) {
- code += " pos = vec3(0.);\n";
+ code += " pos = vec3(0.0);\n";
}
if (emission_shape == EMISSION_SHAPE_SPHERE) {
code += " float s = rand_from_seed(alt_seed) * 2.0 - 1.0;\n";
@@ -628,7 +643,6 @@ void ParticleProcessMaterial::_update_shader() {
code += " pos = texelFetch(emission_texture_points, emission_tex_ofs, 0).xyz;\n";
}
if (emission_shape == EMISSION_SHAPE_RING) {
- code += " \n";
code += " float ring_spawn_angle = rand_from_seed(alt_seed) * 2.0 * pi;\n";
code += " float ring_random_radius = sqrt(rand_from_seed(alt_seed) * (emission_ring_radius * emission_ring_radius - emission_ring_inner_radius * emission_ring_inner_radius) + emission_ring_inner_radius * emission_ring_inner_radius);\n";
code += " vec3 axis = emission_ring_axis == vec3(0.0) ? vec3(0.0, 0.0, 1.0) : normalize(emission_ring_axis);\n";
@@ -650,91 +664,86 @@ void ParticleProcessMaterial::_update_shader() {
code += " ortho_axis = normalize(ortho_axis);\n";
code += " pos = ortho_axis * ring_random_radius + (rand_from_seed(alt_seed) * emission_ring_height - emission_ring_height / 2.0) * axis;\n";
}
-
+ code += " }\n";
code += " return pos * emission_shape_scale + emission_shape_offset;\n";
- code += "}\n";
- code += "\n";
+ code += "}\n\n";
+
if (tex_parameters[PARAM_ORBIT_VELOCITY].is_valid() || particle_flags[PARTICLE_FLAG_DISABLE_Z]) {
- code += "vec3 process_orbit_displacement(DynamicsParameters param, float lifetime, inout uint alt_seed, mat4 transform, mat4 emission_transform,float delta, float total_lifetime){\n";
+ code += "vec3 process_orbit_displacement(DynamicsParameters param, float lifetime, inout uint alt_seed, mat4 transform, mat4 emission_transform, float delta, float total_lifetime) {\n";
// No reason to run all these expensive calculation below if we have no orbit velocity
// HOWEVER
// May be a bad idea for fps consistency?
- code += "if(abs(param.orbit_velocity) < 0.01 || delta < 0.001){ return vec3(0.0);}\n";
- code += "\n";
- code += " vec3 displacement = vec3(0.);\n";
+ code += " if (abs(param.orbit_velocity) < 0.01 || delta < 0.001) {\n";
+ code += " return vec3(0.0);\n";
+ code += " }\n";
+ code += " vec3 displacement = vec3(0.0);\n";
code += " float pi = 3.14159;\n";
- code += " float degree_to_rad = pi / 180.0;\n";
if (particle_flags[PARTICLE_FLAG_DISABLE_Z]) {
code += " float orbit_amount = param.orbit_velocity;\n";
-
if (tex_parameters[PARAM_ORBIT_VELOCITY].is_valid()) {
CurveTexture *texture = Object::cast_to<CurveTexture>(tex_parameters[PARAM_ORBIT_VELOCITY].ptr());
if (texture) {
- code += " orbit_amount *= texture(orbit_velocity_curve, vec2(lifetime)).r;\n";
+ code += " orbit_amount *= texture(orbit_velocity_curve, vec2(lifetime)).r;\n";
} else {
- code += " orbit_amount *= texture(orbit_velocity_curve, vec2(lifetime)).b;\n";
+ code += " orbit_amount *= texture(orbit_velocity_curve, vec2(lifetime)).b;\n";
}
}
code += " if (orbit_amount != 0.0) {\n";
- code += " vec3 pos = transform[3].xyz;\n";
- code += " vec3 org = emission_transform[3].xyz;\n";
- code += " vec3 diff = pos - org;\n";
- code += " float ang = orbit_amount * pi * 2.0 * delta;\n";
- code += " mat2 rot = mat2(vec2(cos(ang), -sin(ang)), vec2(sin(ang), cos(ang)));\n";
- code += " displacement.xy -= diff.xy;\n";
- code += " displacement.xy += rot * diff.xy;\n";
+ code += " vec3 pos = transform[3].xyz;\n";
+ code += " vec3 org = emission_transform[3].xyz;\n";
+ code += " vec3 diff = pos - org;\n";
+ code += " float ang = orbit_amount * pi * 2.0 * delta;\n";
+ code += " mat2 rot = mat2(vec2(cos(ang), -sin(ang)), vec2(sin(ang), cos(ang)));\n";
+ code += " displacement.xy -= diff.xy;\n";
+ code += " displacement.xy += rot * diff.xy;\n";
code += " }\n";
} else {
code += " vec3 orbit_velocities = vec3(param.orbit_velocity);\n";
- code += " orbit_velocities *= texture(orbit_velocity_curve, vec2(lifetime)).rgb;\n";
-
+ code += " orbit_velocities *= texture(orbit_velocity_curve, vec2(lifetime)).rgb;\n";
code += " orbit_velocities *= pi * 2.0;\n";
- code += " orbit_velocities *= delta; // we wanna process those by the delta angle\n";
- code += " //vec3 local_velocity_pivot = ((emission_transform) * vec4(velocity_pivot,1.0)).xyz;\n";
- code += " // X axis\n";
+ code += " orbit_velocities *= delta; // We wanna process those by the delta angle.\n\n";
+
+ code += " // X axis.\n";
code += " vec3 local_pos = (inverse(emission_transform) * transform[3]).xyz;\n";
code += " local_pos -= velocity_pivot;\n";
- code += " local_pos.x = 0.;\n";
+ code += " local_pos.x = 0.0;\n";
code += " mat3 x_rotation_mat = mat3(\n";
- code += " vec3(1.0,0.0,0.0),\n";
+ code += " vec3(1.0, 0.0, 0.0),\n";
code += " vec3(0.0, cos(orbit_velocities.x), sin(orbit_velocities.x)),\n";
code += " vec3(0.0, -sin(orbit_velocities.x), cos(orbit_velocities.x))\n";
code += " );\n";
code += " vec3 new_pos = x_rotation_mat * local_pos;\n";
- code += " displacement = new_pos - local_pos;\n";
- code += "\n";
- code += " // Y axis\n";
+ code += " displacement = new_pos - local_pos;\n\n";
+
+ code += " // Y axis.\n";
code += " local_pos = (inverse(emission_transform) * transform[3]).xyz;\n";
code += " local_pos -= velocity_pivot;\n";
- code += " local_pos.y = 0.;\n";
+ code += " local_pos.y = 0.0;\n";
code += " mat3 y_rotation_mat = mat3(\n";
code += " vec3(cos(orbit_velocities.y), 0.0, -sin(orbit_velocities.y)),\n";
- code += " vec3(0.0, 1.0,0.0),\n";
+ code += " vec3(0.0, 1.0, 0.0),\n";
code += " vec3(sin(orbit_velocities.y), 0.0, cos(orbit_velocities.y))\n";
code += " );\n";
code += " new_pos = y_rotation_mat * local_pos;\n";
- code += " displacement += new_pos - local_pos;\n";
- code += " // z axis\n";
- code += "\n";
+ code += " displacement += new_pos - local_pos;\n\n";
+
+ code += " // Z axis.\n";
code += " local_pos = (inverse(emission_transform) * transform[3]).xyz;\n";
code += " local_pos -= velocity_pivot;\n";
- code += " local_pos.z = 0.;\n";
+ code += " local_pos.z = 0.0;\n";
code += " mat3 z_rotation_mat = mat3(\n";
- code += " vec3(cos(orbit_velocities.z),sin(orbit_velocities.z),0.0),\n";
- code += " vec3(-sin(orbit_velocities.z),cos(orbit_velocities.z), 0.0),\n";
- code += " vec3(0.0,0.0,1.0)\n";
+ code += " vec3(cos(orbit_velocities.z), sin(orbit_velocities.z), 0.0),\n";
+ code += " vec3(-sin(orbit_velocities.z), cos(orbit_velocities.z), 0.0),\n";
+ code += " vec3(0.0, 0.0, 1.0)\n";
code += " );\n";
code += " new_pos = z_rotation_mat * local_pos;\n";
- code += " displacement += new_pos - local_pos;\n";
- code += "\n";
+ code += " displacement += new_pos - local_pos;\n\n";
}
- code += " return (emission_transform * vec4(displacement/delta, 0.0)).xyz;\n";
- code += "}\n";
- code += "\n";
- code += "\n";
+ code += " return (emission_transform * vec4(displacement / delta, 0.0)).xyz;\n";
+ code += "}\n\n";
}
- code += "vec3 get_random_direction_from_spread(inout uint alt_seed, float spread_angle){\n";
+ code += "vec3 get_random_direction_from_spread(inout uint alt_seed, float spread_angle) {\n";
code += " float pi = 3.14159;\n";
code += " float degree_to_rad = pi / 180.0;\n";
code += " float spread_rad = spread_angle * degree_to_rad;\n";
@@ -750,13 +759,13 @@ void ParticleProcessMaterial::_update_shader() {
code += " float angle2_rad = rand_from_seed_m1_p1(alt_seed) * spread_rad * (1.0 - flatness);\n";
code += " vec3 direction_xz = vec3(sin(angle1_rad), 0.0, cos(angle1_rad));\n";
code += " vec3 direction_yz = vec3(0.0, sin(angle2_rad), cos(angle2_rad));\n";
- code += " direction_yz.z = direction_yz.z / max(0.0001,sqrt(abs(direction_yz.z))); // better uniform distribution\n";
+ code += " direction_yz.z = direction_yz.z / max(0.0001, sqrt(abs(direction_yz.z))); // Better uniform distribution.\n";
code += " vec3 spread_direction = vec3(direction_xz.x * direction_yz.z, direction_yz.y, direction_xz.z * direction_yz.z);\n";
code += " vec3 direction_nrm = length(direction) > 0.0 ? normalize(direction) : vec3(0.0, 0.0, 1.0);\n";
- code += " // rotate spread to direction\n";
+ code += " // Rotate spread to direction.\n";
code += " vec3 binormal = cross(vec3(0.0, 1.0, 0.0), direction_nrm);\n";
code += " if (length(binormal) < 0.0001) {\n";
- code += " // direction is parallel to Y. Choose Z as the binormal.\n";
+ code += " // Direction is parallel to Y. Choose Z as the binormal.\n";
code += " binormal = vec3(0.0, 0.0, 1.0);\n";
code += " }\n";
code += " binormal = normalize(binormal);\n";
@@ -764,43 +773,41 @@ void ParticleProcessMaterial::_update_shader() {
code += " spread_direction = binormal * spread_direction.x + normal * spread_direction.y + direction_nrm * spread_direction.z;\n";
code += " return normalize(spread_direction);\n";
}
- code += "}\n";
+ code += "}\n\n";
- code += "vec3 process_radial_displacement(DynamicsParameters param, float lifetime, inout uint alt_seed, mat4 transform, mat4 emission_transform, float delta){\n";
+ code += "vec3 process_radial_displacement(DynamicsParameters param, float lifetime, inout uint alt_seed, mat4 transform, mat4 emission_transform, float delta) {\n";
code += " vec3 radial_displacement = vec3(0.0);\n";
- code += " if (delta < 0.001){\n";
+ code += " if (delta < 0.001) {\n";
code += " return radial_displacement;\n";
code += " }\n";
code += " float radial_displacement_multiplier = 1.0;\n";
if (tex_parameters[PARAM_RADIAL_VELOCITY].is_valid()) {
- code += " radial_displacement_multiplier = texture(radial_velocity_curve, vec2(lifetime)).r;\n";
+ code += " radial_displacement_multiplier = texture(radial_velocity_curve, vec2(lifetime)).r;\n";
}
code += " vec3 global_pivot = (emission_transform * vec4(velocity_pivot, 1.0)).xyz;\n";
- code += " if(length(transform[3].xyz - global_pivot) > 0.01){\n";
+ code += " if (length(transform[3].xyz - global_pivot) > 0.01) {\n";
code += " radial_displacement = normalize(transform[3].xyz - global_pivot) * radial_displacement_multiplier * param.radial_velocity;\n";
- code += " }else{radial_displacement = get_random_direction_from_spread(alt_seed, 360.0)* param.radial_velocity;} \n";
- code += " if (radial_displacement_multiplier * param.radial_velocity < 0.0){\n // Prevent inwards velocity to flicker once the point is reached.";
- code += " if (length(radial_displacement) > 0.01){\n";
- code += " radial_displacement = normalize(radial_displacement) * min(abs((radial_displacement_multiplier * param.radial_velocity)), length(transform[3].xyz - global_pivot) / delta);\n";
- code += " }\n";
- code += " \n";
+ code += " } else {\n";
+ code += " radial_displacement = get_random_direction_from_spread(alt_seed, 360.0) * param.radial_velocity;\n";
+ code += " }\n";
+ code += " if (radial_displacement_multiplier * param.radial_velocity < 0.0) {\n";
+ code += " // Prevent inwards velocity to flicker once the point is reached.\n";
+ code += " radial_displacement = normalize(radial_displacement) * min(abs(radial_displacement_multiplier * param.radial_velocity), length(transform[3].xyz - global_pivot) / delta);\n";
+ code += " }\n";
code += " return radial_displacement;\n";
- code += "}\n";
+ code += "}\n\n";
+
if (tex_parameters[PARAM_DIRECTIONAL_VELOCITY].is_valid()) {
- code += "vec3 process_directional_displacement(DynamicsParameters param, float lifetime_percent,mat4 transform, mat4 emission_transform){\n";
- code += " vec3 displacement = vec3(0.);\n";
+ code += "vec3 process_directional_displacement(DynamicsParameters param, float lifetime_percent, mat4 transform, mat4 emission_transform) {\n";
+ code += " vec3 displacement = texture(directional_velocity_curve, vec2(lifetime_percent)).xyz * param.directional_velocity;\n";
if (directional_velocity_global) {
- code += " displacement = texture(directional_velocity_curve, vec2(lifetime_percent)).xyz * param.directional_velocity;\n";
- code += " displacement = (emission_transform * vec4(displacement, 0.0)).xyz;\n";
- } else {
- code += " displacement = texture(directional_velocity_curve, vec2(lifetime_percent)).xyz * param.directional_velocity;\n";
+ code += " displacement = (emission_transform * vec4(displacement, 0.0)).xyz;\n";
}
code += " return displacement;\n";
- code += "}\n";
+ code += "}\n\n";
}
- code += "\n";
- code += "void process_physical_parameters(inout PhysicalParameters params, float lifetime_percent){\n";
+ code += "void process_physical_parameters(inout PhysicalParameters params, float lifetime_percent) {\n";
if (tex_parameters[PARAM_LINEAR_ACCEL].is_valid()) {
code += " params.linear_accel *= texture(linear_accel_texture, vec2(lifetime_percent)).r;\n";
}
@@ -813,35 +820,30 @@ void ParticleProcessMaterial::_update_shader() {
if (tex_parameters[PARAM_DAMPING].is_valid()) {
code += " params.damping *= texture(damping_texture, vec2(lifetime_percent)).r;\n";
}
- code += " \n";
- code += "}\n";
- code += "\n";
+ code += "}\n\n";
code += "void start() {\n";
code += " uint base_number = NUMBER;\n";
code += " uint alt_seed = hash(base_number + uint(1) + RANDOM_SEED);\n";
code += " DisplayParameters params;\n";
code += " calculate_initial_display_params(params, alt_seed);\n";
- code += " // reset alt seed?\n";
- code += " // alt_seed = hash(base_number + uint(1) + RANDOM_SEED);\n";
+ code += " // Reset alt seed?\n";
+ code += " //alt_seed = hash(base_number + uint(1) + RANDOM_SEED);\n";
code += " DynamicsParameters dynamic_params;\n";
code += " calculate_initial_dynamics_params(dynamic_params, alt_seed);\n";
code += " PhysicalParameters physics_params;\n";
code += " calculate_initial_physical_params(physics_params, alt_seed);\n";
- code += " process_display_param(params, 0.0);\n";
+ code += " process_display_param(params, 0.0);\n";
code += " if (rand_from_seed(alt_seed) > AMOUNT_RATIO) {\n";
code += " ACTIVE = false;\n";
- code += " }\n";
- code += " \n";
- code += " float pi = 3.14159;\n";
- code += " float degree_to_rad = pi / 180.0;\n";
- code += " \n";
- code += " if (RESTART_CUSTOM){\n";
- code += " CUSTOM = vec4(0.);\n";
+ code += " }\n\n";
+
+ code += " if (RESTART_CUSTOM) {\n";
+ code += " CUSTOM = vec4(0.0);\n";
code += " CUSTOM.w = params.lifetime;\n";
code += " CUSTOM.x = dynamic_params.angle;\n";
code += " }\n";
- code += " if (RESTART_COLOR){\n";
+ code += " if (RESTART_COLOR) {\n";
code += " COLOR = params.color;\n";
code += " }\n";
code += " if (RESTART_ROT_SCALE) {\n";
@@ -849,16 +851,15 @@ void ParticleProcessMaterial::_update_shader() {
code += " TRANSFORM[1].xyz = vec3(0.0, 1.0, 0.0);\n";
code += " TRANSFORM[2].xyz = vec3(0.0, 0.0, 1.0);\n";
code += " }\n";
- code += "\n";
code += " if (RESTART_POSITION) {\n";
code += " TRANSFORM[3].xyz = calculate_initial_position(alt_seed);\n";
if (turbulence_enabled) {
- code += " float initial_turbulence_displacement = mix(turbulence_initial_displacement_min, turbulence_initial_displacement_max, rand_from_seed(alt_seed));\n";
- code += " vec3 noise_direction = get_noise_direction(TRANSFORM[3].xyz);\n";
- code += " TRANSFORM[3].xyz += noise_direction * initial_turbulence_displacement;\n";
+ code += " float initial_turbulence_displacement = mix(turbulence_initial_displacement_min, turbulence_initial_displacement_max, rand_from_seed(alt_seed));\n";
+ code += " vec3 noise_direction = get_noise_direction(TRANSFORM[3].xyz);\n";
+ code += " TRANSFORM[3].xyz += noise_direction * initial_turbulence_displacement;\n";
}
code += " TRANSFORM = EMISSION_TRANSFORM * TRANSFORM;\n";
- code += " }\n";
+ code += " }\n";
code += " if (RESTART_VELOCITY) {\n";
code += " VELOCITY = get_random_direction_from_spread(alt_seed, spread) * dynamic_params.initial_velocity_multiplier;\n";
if (emission_shape == EMISSION_SHAPE_DIRECTED_POINTS) {
@@ -867,7 +868,7 @@ void ParticleProcessMaterial::_update_shader() {
code += " ivec2 emission_tex_ofs = ivec2(point % emission_tex_size.x, point / emission_tex_size.x);\n";
if (particle_flags[PARTICLE_FLAG_DISABLE_Z]) {
code += " {\n";
- code += " mat2 rotm;";
+ code += " mat2 rotm;\n";
code += " rotm[0] = texelFetch(emission_texture_normal, emission_tex_ofs, 0).xy;\n";
code += " rotm[1] = rotm[0].yx * vec2(1.0, -1.0);\n";
code += " VELOCITY.xy = rotm * VELOCITY.xy;\n";
@@ -882,76 +883,66 @@ void ParticleProcessMaterial::_update_shader() {
code += " }\n";
}
}
- code += " }\n";
- code += " process_display_param(params, 0.);\n";
- code += "// process_dynamic_parameters(dynamic_params, 0., alt_seed, TRANSFORM, EMISSION_TRANSFORM, DELTA);\n";
+ code += " }\n\n";
+ code += " process_display_param(params, 0.0);\n\n";
code += " VELOCITY = (EMISSION_TRANSFORM * vec4(VELOCITY, 0.0)).xyz;\n";
code += " VELOCITY += EMITTER_VELOCITY * inherit_emitter_velocity_ratio;\n";
if (particle_flags[PARTICLE_FLAG_DISABLE_Z]) {
- code += " VELOCITY.z = 0.;\n";
- code += " TRANSFORM[3].z = 0.;\n";
+ code += " VELOCITY.z = 0.0;\n";
+ code += " TRANSFORM[3].z = 0.0;\n";
}
- code += "}\n";
- code += "\n";
+ code += "}\n\n";
code += "void process() {\n";
code += " uint base_number = NUMBER;\n";
- // TODO add optional determinism here
- code += "// if (repeatable){\n";
- code += "// base_number = INDEX;\n";
- code += "// }\n";
+ // TODO: Add optional determinism here.
+ code += " //if (repeatable) {\n";
+ code += " // base_number = INDEX;\n";
+ code += " //}\n";
code += " uint alt_seed = hash(base_number + uint(1) + RANDOM_SEED);\n";
code += " DisplayParameters params;\n";
code += " calculate_initial_display_params(params, alt_seed);\n";
code += " DynamicsParameters dynamic_params;\n";
code += " calculate_initial_dynamics_params(dynamic_params, alt_seed);\n";
code += " PhysicalParameters physics_params;\n";
- code += " calculate_initial_physical_params(physics_params, alt_seed);\n";
+ code += " calculate_initial_physical_params(physics_params, alt_seed);\n\n";
+
code += " float pi = 3.14159;\n";
- code += " float degree_to_rad = pi / 180.0;\n";
- code += "\n";
+ code += " float degree_to_rad = pi / 180.0;\n\n";
+
code += " CUSTOM.y += DELTA / LIFETIME;\n";
code += " CUSTOM.y = mix(CUSTOM.y, 1.0, INTERPOLATE_TO_END);\n";
- code += " float lifetime_percent = CUSTOM.y/ params.lifetime;\n";
+ code += " float lifetime_percent = CUSTOM.y / params.lifetime;\n";
code += " if (CUSTOM.y > CUSTOM.w) {\n";
code += " ACTIVE = false;\n";
- code += " }\n";
- code += " \n";
- code += " \n";
- code += " \n";
- code += " // will use this later to calculate final displacement and orient the particle.\n";
- code += " vec3 starting_position = TRANSFORM[3].xyz;\n";
+ code += " }\n\n";
+
+ code += " // Calculate all velocity.\n";
code += " vec3 controlled_displacement = vec3(0.0);\n";
- code += " \n";
- code += "// VELOCITY += process_physics_parameters(dynamic_params, lifetime_percent, alt_seed, TRANSFORM, EMISSION_TRANSFORM, DELTA);\n";
- code += " \n";
if (tex_parameters[PARAM_ORBIT_VELOCITY].is_valid() || particle_flags[PARTICLE_FLAG_DISABLE_Z]) {
code += " controlled_displacement += process_orbit_displacement(dynamic_params, lifetime_percent, alt_seed, TRANSFORM, EMISSION_TRANSFORM, DELTA, params.lifetime * LIFETIME);\n";
}
- code += " // calculate all velocity\n";
- code += " \n";
code += " controlled_displacement += process_radial_displacement(dynamic_params, lifetime_percent, alt_seed, TRANSFORM, EMISSION_TRANSFORM, DELTA);\n";
- code += " \n";
if (tex_parameters[PARAM_DIRECTIONAL_VELOCITY].is_valid()) {
code += " controlled_displacement += process_directional_displacement(dynamic_params, lifetime_percent, TRANSFORM, EMISSION_TRANSFORM);\n";
}
- code += " \n";
+ code += "\n";
code += " process_physical_parameters(physics_params, lifetime_percent);\n";
code += " vec3 force;\n";
code += " {\n";
- code += " // copied from previous version\n";
+ code += " // Copied from previous version.\n";
code += " vec3 pos = TRANSFORM[3].xyz;\n";
code += " force = gravity;\n";
- code += " // apply linear acceleration\n";
+ code += " // Apply linear acceleration.\n";
code += " force += length(VELOCITY) > 0.0 ? normalize(VELOCITY) * physics_params.linear_accel : vec3(0.0);\n";
- code += " // apply radial acceleration\n";
+ code += " // Apply radial acceleration.\n";
code += " vec3 org = EMISSION_TRANSFORM[3].xyz;\n";
code += " vec3 diff = pos - org;\n";
code += " force += length(diff) > 0.0 ? normalize(diff) * physics_params.radial_accel : vec3(0.0);\n";
- code += " // apply tangential acceleration;\n";
+ code += " // Apply tangential acceleration.\n";
code += " float tangent_accel_val = physics_params.tangent_accel;\n";
if (particle_flags[PARTICLE_FLAG_DISABLE_Z]) {
- code += " force += length(diff.yx) > 0.0 ? vec3(normalize(diff.yx * vec2(-1.0, 1.0)), 0.0) * tangent_accel_val : vec3(0.0);\n";
+ code += " force += length(diff.yx) > 0.0 ? vec3(normalize(diff.yx * vec2(-1.0, 1.0)), 0.0) * tangent_accel_val : vec3(0.0);\n";
} else {
code += " vec3 crossDiff = cross(normalize(diff), normalize(gravity));\n";
code += " force += length(crossDiff) > 0.0 ? normalize(crossDiff) * tangent_accel_val : vec3(0.0);\n";
@@ -959,107 +950,103 @@ void ParticleProcessMaterial::_update_shader() {
if (attractor_interaction_enabled) {
code += " force += ATTRACTOR_FORCE;\n";
}
- code += "\n";
- code += " // apply attractor forces\n";
if (particle_flags[PARTICLE_FLAG_DISABLE_Z]) {
- code += " force.z = 0.;\n";
+ code += " force.z = 0.0;\n";
}
+ code += " // Apply attractor forces.\n";
code += " VELOCITY += force * DELTA;\n";
code += " }\n";
code += " {\n";
- code += " // copied from previous version\n";
+ code += " // Copied from previous version.\n";
code += " if (physics_params.damping > 0.0) {\n";
code += " float v = length(VELOCITY);\n";
if (!particle_flags[PARTICLE_FLAG_DAMPING_AS_FRICTION]) {
code += " v -= physics_params.damping * DELTA;\n";
} else {
code += " if (v > 0.001) {\n";
- code += " // Realistic friction formula. We assume the mass of a particle to be 0.05kg.\n";
+ code += " // Realistic friction formula. We assume the mass of a particle to be 0.05 kg.\n";
code += " float damp = v * v * physics_params.damping * 0.05 * DELTA;\n";
code += " v -= damp;\n";
code += " }\n";
}
-
code += " if (v < 0.0) {\n";
code += " VELOCITY = vec3(0.0);\n";
code += " } else {\n";
code += " VELOCITY = normalize(VELOCITY) * v;\n";
code += " }\n";
code += " }\n";
- code += " \n";
- code += " }\n";
- code += " \n";
+ code += " }\n\n";
+
if (collision_mode == COLLISION_RIGID) {
code += " if (COLLIDED) {\n";
code += " float collision_response = dot(COLLISION_NORMAL, VELOCITY);\n";
- code += " float slide_to_bounce_trigger = step(2.0/clamp(collision_bounce + 1.0, 1.0, 2.0), abs(collision_response));\n";
+ code += " float slide_to_bounce_trigger = step(2.0 / clamp(collision_bounce + 1.0, 1.0, 2.0), abs(collision_response));\n";
code += " TRANSFORM[3].xyz += COLLISION_NORMAL * COLLISION_DEPTH;\n";
- code += " // Remove all components of VELOCITY that is not tangent to COLLISION_NORMAL\n";
+ code += " // Remove all components of VELOCITY that are not tangential to COLLISION_NORMAL.\n";
code += " VELOCITY -= COLLISION_NORMAL * collision_response;\n";
- code += " // Apply friction only to VELOCITY across the surface (Effectively decouples friction and bounce behavior).\n";
- code += " VELOCITY = mix(VELOCITY,vec3(0.0),clamp(collision_friction, 0.0, 1.0));\n";
- code += " // Add bounce velocity to VELOCITY\n";
+ code += " // Apply friction only to VELOCITY across the surface (effectively decouples friction and bounce behavior).\n";
+ code += " VELOCITY = mix(VELOCITY, vec3(0.0), clamp(collision_friction, 0.0, 1.0));\n";
+ code += " // Add bounce velocity to VELOCITY.\n";
code += " VELOCITY -= COLLISION_NORMAL * collision_response * (collision_bounce * slide_to_bounce_trigger);\n";
- code += " }\n";
+ code += " }\n\n";
} else if (collision_mode == COLLISION_HIDE_ON_CONTACT) {
code += " if (COLLIDED) {\n";
code += " ACTIVE = false;\n";
- code += " }\n";
+ code += " }\n\n";
}
- code += " \n";
- code += " // turbulence before limiting\n";
+
+ code += " // Turbulence before limiting.\n";
if (turbulence_enabled) {
if (tex_parameters[PARAM_TURB_INFLUENCE_OVER_LIFE].is_valid()) {
- code += " float turbulence_influence = textureLod(turbulence_influence_over_life, vec2(lifetime_percent, 0.0), 0.0).r;\n";
+ code += " float turbulence_influence = textureLod(turbulence_influence_over_life, vec2(lifetime_percent, 0.0), 0.0).r;\n";
} else {
- code += " float turbulence_influence = 1.0;\n";
+ code += " float turbulence_influence = 1.0;\n";
}
- code += " \n";
- code += " vec3 noise_direction = get_noise_direction(TRANSFORM[3].xyz);\n";
+ code += "\n";
+ code += " vec3 noise_direction = get_noise_direction(TRANSFORM[3].xyz);\n";
// Godot detects when the COLLIDED keyword is used. If it's used anywhere in the shader then Godot will generate the screen space SDF for collisions.
// We don't need it as long as collision is disabled. Refer to GH-83744 for more info.
if (collision_mode == COLLISION_RIGID) {
- code += " if (!COLLIDED) {\n";
- }
- code += " float vel_mag = length(VELOCITY);\n";
- code += " float vel_infl = clamp(dynamic_params.turb_influence * turbulence_influence, 0.0,1.0);\n";
- code += " VELOCITY = mix(VELOCITY, normalize(noise_direction) * vel_mag * (1.0 + (1.0 - vel_infl) * 0.2), vel_infl);\n";
- code += " vel_mag = length(controlled_displacement);\n";
- code += " controlled_displacement = mix(controlled_displacement, normalize(noise_direction) * vel_mag * (1.0 + (1.0 - vel_infl) * 0.2), vel_infl);\n";
- if (collision_mode == COLLISION_RIGID) {
- code += " }\n";
+ code += " if (!COLLIDED) {\n";
+ } else {
+ code += " {\n";
}
+ code += " float vel_mag = length(VELOCITY);\n";
+ code += " float vel_infl = clamp(dynamic_params.turb_influence * turbulence_influence, 0.0, 1.0);\n";
+ code += " VELOCITY = mix(VELOCITY, normalize(noise_direction) * vel_mag * (1.0 + (1.0 - vel_infl) * 0.2), vel_infl);\n";
+ code += " vel_mag = length(controlled_displacement);\n";
+ code += " controlled_displacement = mix(controlled_displacement, normalize(noise_direction) * vel_mag * (1.0 + (1.0 - vel_infl) * 0.2), vel_infl);\n";
+ code += " }\n";
}
- code += " vec3 final_velocity = controlled_displacement + VELOCITY;\n";
- code += " \n";
- code += " // limit velocity\n";
+ code += " vec3 final_velocity = controlled_displacement + VELOCITY;\n\n";
+
if (velocity_limit_curve.is_valid()) {
- code += " if (length(final_velocity) > 0.001){\n";
+ code += " // Limit velocity.\n";
+ code += " if (length(final_velocity) > 0.001) {\n";
code += " final_velocity = normalize(final_velocity) * min(abs(length(final_velocity)), abs(texture(velocity_limit_curve, vec2(lifetime_percent)).r));\n";
- code += " }\n";
+ code += " }\n\n";
}
- code += " \n";
+
if (particle_flags[PARTICLE_FLAG_DISABLE_Z]) {
- code += " final_velocity.z = 0.;\n";
+ code += " final_velocity.z = 0.0;\n\n";
}
- code += " TRANSFORM[3].xyz += final_velocity * DELTA;\n";
- code += " \n";
- code += " \n";
- code += " process_display_param(params, lifetime_percent);\n";
- code += " \n";
+
+ code += " TRANSFORM[3].xyz += final_velocity * DELTA;\n\n";
+
+ code += " process_display_param(params, lifetime_percent);\n\n";
+
code += " float base_angle = dynamic_params.angle;\n";
if (tex_parameters[PARAM_ANGLE].is_valid()) {
code += " base_angle *= texture(angle_texture, vec2(lifetime_percent)).r;\n";
}
if (tex_parameters[PARAM_ANGULAR_VELOCITY].is_valid()) {
code += " base_angle += CUSTOM.y * LIFETIME * dynamic_params.angular_velocity * texture(angular_velocity_texture, vec2(lifetime_percent)).r;\n";
-
} else {
code += " base_angle += CUSTOM.y * LIFETIME * dynamic_params.angular_velocity;\n";
}
code += " CUSTOM.x = base_angle * degree_to_rad;\n";
- code += " COLOR = params.color;\n";
+ code += " COLOR = params.color;\n\n";
if (particle_flags[PARTICLE_FLAG_DISABLE_Z]) {
if (particle_flags[PARTICLE_FLAG_ALIGN_Y_TO_VELOCITY]) {
@@ -1075,9 +1062,8 @@ void ParticleProcessMaterial::_update_shader() {
code += " TRANSFORM[1] = vec4(sin(CUSTOM.x), cos(CUSTOM.x), 0.0, 0.0);\n";
code += " TRANSFORM[2] = vec4(0.0, 0.0, 1.0, 0.0);\n";
}
-
} else {
- // orient particle Y towards velocity
+ // Orient particle Y towards velocity.
if (particle_flags[PARTICLE_FLAG_ALIGN_Y_TO_VELOCITY]) {
code += " if (length(final_velocity) > 0.0) {\n";
code += " TRANSFORM[1].xyz = normalize(final_velocity);\n";
@@ -1096,42 +1082,44 @@ void ParticleProcessMaterial::_update_shader() {
code += " TRANSFORM[1].xyz = normalize(TRANSFORM[1].xyz);\n";
code += " TRANSFORM[2].xyz = normalize(TRANSFORM[2].xyz);\n";
}
- // turn particle by rotation in Y
+ // Turn particle by rotation in Y.
if (particle_flags[PARTICLE_FLAG_ROTATE_Y]) {
code += " vec4 origin = TRANSFORM[3];\n";
code += " TRANSFORM = mat4(vec4(cos(CUSTOM.x), 0.0, -sin(CUSTOM.x), 0.0), vec4(0.0, 1.0, 0.0, 0.0), vec4(sin(CUSTOM.x), 0.0, cos(CUSTOM.x), 0.0), vec4(0.0, 0.0, 0.0, 1.0));\n";
code += " TRANSFORM[3] = origin;\n";
}
}
-
if (particle_flags[PARTICLE_FLAG_DISABLE_Z]) {
- code += " TRANSFORM[3].z = 0.0;\n";
+ code += " TRANSFORM[3].z = 0.0;\n\n";
}
+
if (tex_parameters[PARAM_SCALE_OVER_VELOCITY].is_valid()) {
- code += " if(length(final_velocity) > 0.001){\n";
- code += " params.scale *= texture(scale_over_velocity_curve, vec2(clamp(length(final_velocity)/(scale_over_velocity_max - scale_over_velocity_min), 0.0,1.0), 0.0)).rgb;\n";
- code += " } else {params.scale *= texture(scale_over_velocity_curve, vec2(0.0)).rgb;}\n \n";
+ code += " if (length(final_velocity) > 0.001) {\n";
+ code += " params.scale *= texture(scale_over_velocity_curve, vec2(clamp(length(final_velocity) / (scale_over_velocity_max - scale_over_velocity_min), 0.0, 1.0), 0.0)).rgb;\n";
+ code += " } else {\n";
+ code += " params.scale *= texture(scale_over_velocity_curve, vec2(0.0)).rgb;\n";
+ code += " }\n";
}
- code += "// params.scale *= length(final_velocity)/100.0;\n";
- code += "\n";
code += " TRANSFORM[0].xyz *= sign(params.scale.x) * max(abs(params.scale.x), 0.001);\n";
code += " TRANSFORM[1].xyz *= sign(params.scale.y) * max(abs(params.scale.y), 0.001);\n";
code += " TRANSFORM[2].xyz *= sign(params.scale.z) * max(abs(params.scale.z), 0.001);\n";
- code += " \n";
- code += " // \n";
- code += " CUSTOM.z = params.animation_offset + lifetime_percent * params.animation_speed;\n";
- code += " \n";
+ code += "\n";
+ code += " CUSTOM.z = params.animation_offset + lifetime_percent * params.animation_speed;\n\n";
if (sub_emitter_mode != SUB_EMITTER_DISABLED && !RenderingServer::get_singleton()->is_low_end()) {
code += " int emit_count = 0;\n";
switch (sub_emitter_mode) {
case SUB_EMITTER_CONSTANT: {
code += " float interval_from = CUSTOM.y * LIFETIME - DELTA;\n";
- code += " float interval_rem = sub_emitter_frequency - mod(interval_from,sub_emitter_frequency);\n";
- code += " if (DELTA >= interval_rem) emit_count = 1;\n";
+ code += " float interval_rem = sub_emitter_frequency - mod(interval_from, sub_emitter_frequency);\n";
+ code += " if (DELTA >= interval_rem) {\n";
+ code += " emit_count = 1;\n";
+ code += " }\n";
} break;
case SUB_EMITTER_AT_COLLISION: {
- code += " if (COLLIDED) emit_count = sub_emitter_amount_at_collision;\n";
+ code += " if (COLLIDED) {\n";
+ code += " emit_count = sub_emitter_amount_at_collision;\n";
+ code += " }\n";
} break;
case SUB_EMITTER_AT_END: {
code += " if ((CUSTOM.y / CUSTOM.w * LIFETIME) > (LIFETIME - DELTA)) {\n";
@@ -1141,18 +1129,19 @@ void ParticleProcessMaterial::_update_shader() {
default: {
}
}
- code += " for(int i=0;i<emit_count;i++) {\n";
- code += " uint flags = FLAG_EMIT_POSITION|FLAG_EMIT_ROT_SCALE;\n";
- code += " if (sub_emitter_keep_velocity) flags|=FLAG_EMIT_VELOCITY;\n";
- code += " emit_subparticle(TRANSFORM,VELOCITY,vec4(0.0),vec4(0.0),flags);\n";
- code += " }";
+ code += " for (int i = 0; i < emit_count; i++) {\n";
+ code += " uint flags = FLAG_EMIT_POSITION | FLAG_EMIT_ROT_SCALE;\n";
+ code += " if (sub_emitter_keep_velocity) {\n";
+ code += " flags |= FLAG_EMIT_VELOCITY;\n";
+ code += " }\n";
+ code += " emit_subparticle(TRANSFORM, VELOCITY, vec4(0.0), vec4(0.0), flags);\n";
+ code += " }\n\n";
}
code += " if (CUSTOM.y > CUSTOM.w) {\n";
code += " ACTIVE = false;\n";
code += " }\n";
code += "}\n";
- code += "\n";
ShaderData shader_data;
shader_data.shader = RS::get_singleton()->shader_create();
diff --git a/scene/scene_string_names.cpp b/scene/scene_string_names.cpp
index ac3ff7f38c..c6a2151de5 100644
--- a/scene/scene_string_names.cpp
+++ b/scene/scene_string_names.cpp
@@ -128,4 +128,7 @@ SceneStringNames::SceneStringNames() {
shader_overrides_group_active = StaticCString::create("_shader_overrides_group_active_");
pressed = StaticCString::create("pressed");
+ id_pressed = StaticCString::create("id_pressed");
+
+ panel = StaticCString::create("panel");
}
diff --git a/scene/scene_string_names.h b/scene/scene_string_names.h
index 5f68e5180c..9af5422391 100644
--- a/scene/scene_string_names.h
+++ b/scene/scene_string_names.h
@@ -141,6 +141,9 @@ public:
StringName shader_overrides_group_active;
StringName pressed;
+ StringName id_pressed;
+
+ StringName panel;
};
#define SceneStringName(m_name) SceneStringNames::get_singleton()->m_name
diff --git a/scene/theme/default_theme.cpp b/scene/theme/default_theme.cpp
index aa4d669238..6d187bbd64 100644
--- a/scene/theme/default_theme.cpp
+++ b/scene/theme/default_theme.cpp
@@ -147,7 +147,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
}
// Panel
- theme->set_stylebox("panel", "Panel", make_flat_stylebox(style_normal_color, 0, 0, 0, 0));
+ theme->set_stylebox(SceneStringName(panel), "Panel", make_flat_stylebox(style_normal_color, 0, 0, 0, 0));
// Button
@@ -159,7 +159,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
// Make the focus outline appear to be flush with the buttons it's focusing.
focus->set_expand_margin_all(Math::round(2 * scale));
- theme->set_stylebox("normal", "Button", button_normal);
+ theme->set_stylebox(CoreStringName(normal), "Button", button_normal);
theme->set_stylebox("hover", "Button", button_hover);
theme->set_stylebox(SceneStringName(pressed), "Button", button_pressed);
theme->set_stylebox("disabled", "Button", button_disabled);
@@ -188,7 +188,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
theme->set_constant("icon_max_width", "Button", 0);
// MenuBar
- theme->set_stylebox("normal", "MenuBar", button_normal);
+ theme->set_stylebox(CoreStringName(normal), "MenuBar", button_normal);
theme->set_stylebox("hover", "MenuBar", button_hover);
theme->set_stylebox(SceneStringName(pressed), "MenuBar", button_pressed);
theme->set_stylebox("disabled", "MenuBar", button_disabled);
@@ -231,7 +231,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
Ref<StyleBox> sb_optbutton_pressed = make_flat_stylebox(style_pressed_color, 2 * default_margin, default_margin, 2 * default_margin, default_margin);
Ref<StyleBox> sb_optbutton_disabled = make_flat_stylebox(style_disabled_color, 2 * default_margin, default_margin, 2 * default_margin, default_margin);
- theme->set_stylebox("normal", "OptionButton", sb_optbutton_normal);
+ theme->set_stylebox(CoreStringName(normal), "OptionButton", sb_optbutton_normal);
theme->set_stylebox("hover", "OptionButton", sb_optbutton_hover);
theme->set_stylebox(SceneStringName(pressed), "OptionButton", sb_optbutton_pressed);
theme->set_stylebox("disabled", "OptionButton", sb_optbutton_disabled);
@@ -266,7 +266,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
// MenuButton
- theme->set_stylebox("normal", "MenuButton", button_normal);
+ theme->set_stylebox(CoreStringName(normal), "MenuButton", button_normal);
theme->set_stylebox(SceneStringName(pressed), "MenuButton", button_pressed);
theme->set_stylebox("hover", "MenuButton", button_hover);
theme->set_stylebox("disabled", "MenuButton", button_disabled);
@@ -292,7 +292,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
Ref<StyleBox> cbx_focus = focus;
cbx_focus->set_content_margin_all(Math::round(4 * scale));
- theme->set_stylebox("normal", "CheckBox", cbx_empty);
+ theme->set_stylebox(CoreStringName(normal), "CheckBox", cbx_empty);
theme->set_stylebox(SceneStringName(pressed), "CheckBox", cbx_empty);
theme->set_stylebox("disabled", "CheckBox", cbx_empty);
theme->set_stylebox("hover", "CheckBox", cbx_empty);
@@ -328,7 +328,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
Ref<StyleBox> cb_empty = memnew(StyleBoxEmpty);
cb_empty->set_content_margin_individual(Math::round(6 * scale), Math::round(4 * scale), Math::round(6 * scale), Math::round(4 * scale));
- theme->set_stylebox("normal", "CheckButton", cb_empty);
+ theme->set_stylebox(CoreStringName(normal), "CheckButton", cb_empty);
theme->set_stylebox(SceneStringName(pressed), "CheckButton", cb_empty);
theme->set_stylebox("disabled", "CheckButton", cb_empty);
theme->set_stylebox("hover", "CheckButton", cb_empty);
@@ -372,19 +372,19 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
Ref<StyleBoxFlat> flat_button_pressed = button_pressed->duplicate();
flat_button_pressed->set_bg_color(style_pressed_color * Color(1, 1, 1, 0.85));
- theme->set_stylebox("normal", "FlatButton", flat_button_normal);
+ theme->set_stylebox(CoreStringName(normal), "FlatButton", flat_button_normal);
theme->set_stylebox("hover", "FlatButton", flat_button_normal);
theme->set_stylebox(SceneStringName(pressed), "FlatButton", flat_button_pressed);
theme->set_stylebox("disabled", "FlatButton", flat_button_normal);
- theme->set_stylebox("normal", "FlatMenuButton", flat_button_normal);
+ theme->set_stylebox(CoreStringName(normal), "FlatMenuButton", flat_button_normal);
theme->set_stylebox("hover", "FlatMenuButton", flat_button_normal);
theme->set_stylebox(SceneStringName(pressed), "FlatMenuButton", flat_button_pressed);
theme->set_stylebox("disabled", "FlatMenuButton", flat_button_normal);
// Label
- theme->set_stylebox("normal", "Label", memnew(StyleBoxEmpty));
+ theme->set_stylebox(CoreStringName(normal), "Label", memnew(StyleBoxEmpty));
theme->set_font("font", "Label", Ref<Font>());
theme->set_font_size("font_size", "Label", -1);
@@ -413,7 +413,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
// Add a line at the bottom to make LineEdits distinguishable from Buttons.
style_line_edit->set_border_width(SIDE_BOTTOM, 2);
style_line_edit->set_border_color(style_pressed_color);
- theme->set_stylebox("normal", "LineEdit", style_line_edit);
+ theme->set_stylebox(CoreStringName(normal), "LineEdit", style_line_edit);
theme->set_stylebox("focus", "LineEdit", focus);
@@ -457,7 +457,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
// TextEdit
- theme->set_stylebox("normal", "TextEdit", style_line_edit);
+ theme->set_stylebox(CoreStringName(normal), "TextEdit", style_line_edit);
theme->set_stylebox("focus", "TextEdit", focus);
theme->set_stylebox("read_only", "TextEdit", style_line_edit_read_only);
@@ -487,7 +487,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
// CodeEdit
- theme->set_stylebox("normal", "CodeEdit", style_line_edit);
+ theme->set_stylebox(CoreStringName(normal), "CodeEdit", style_line_edit);
theme->set_stylebox("focus", "CodeEdit", focus);
theme->set_stylebox("read_only", "CodeEdit", style_line_edit_read_only);
theme->set_stylebox("completion", "CodeEdit", make_flat_stylebox(style_normal_color, 0, 0, 0, 0));
@@ -617,7 +617,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
Ref<StyleBoxEmpty> empty;
empty.instantiate();
- theme->set_stylebox("panel", "ScrollContainer", empty);
+ theme->set_stylebox(SceneStringName(panel), "ScrollContainer", empty);
// Window
@@ -640,7 +640,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
// Dialogs
// AcceptDialog is currently the base dialog, so this defines styles for all extending nodes.
- theme->set_stylebox("panel", "AcceptDialog", make_flat_stylebox(style_popup_color, Math::round(8 * scale), Math::round(8 * scale), Math::round(8 * scale), Math::round(8 * scale), 0));
+ theme->set_stylebox(SceneStringName(panel), "AcceptDialog", make_flat_stylebox(style_popup_color, Math::round(8 * scale), Math::round(8 * scale), Math::round(8 * scale), Math::round(8 * scale), 0));
theme->set_constant("buttons_separation", "AcceptDialog", Math::round(10 * scale));
// File Dialog
@@ -659,11 +659,11 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
// Popup
- theme->set_stylebox("panel", "PopupPanel", make_flat_stylebox(style_normal_color));
+ theme->set_stylebox(SceneStringName(panel), "PopupPanel", make_flat_stylebox(style_normal_color));
// PopupDialog
- theme->set_stylebox("panel", "PopupDialog", make_flat_stylebox(style_normal_color));
+ theme->set_stylebox(SceneStringName(panel), "PopupDialog", make_flat_stylebox(style_normal_color));
// PopupMenu
@@ -680,7 +680,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
style_popup_panel->set_border_width_all(2);
style_popup_panel->set_border_color(style_popup_border_color);
- theme->set_stylebox("panel", "PopupMenu", style_popup_panel);
+ theme->set_stylebox(SceneStringName(panel), "PopupMenu", style_popup_panel);
theme->set_stylebox("hover", "PopupMenu", make_flat_stylebox(style_popup_hover_color));
theme->set_stylebox("separator", "PopupMenu", separator_horizontal);
theme->set_stylebox("labeled_separator_left", "PopupMenu", separator_horizontal);
@@ -731,7 +731,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
graphn_sb_titlebar_selected->set_bg_color(Color(1.0, 0.625, 0.625, 0.6));
Ref<StyleBoxEmpty> graphnode_slot = make_empty_stylebox(0, 0, 0, 0);
- theme->set_stylebox("panel", "GraphNode", graphnode_normal);
+ theme->set_stylebox(SceneStringName(panel), "GraphNode", graphnode_normal);
theme->set_stylebox("panel_selected", "GraphNode", graphnode_selected);
theme->set_stylebox("titlebar", "GraphNode", graphn_sb_titlebar);
theme->set_stylebox("titlebar_selected", "GraphNode", graphn_sb_titlebar_selected);
@@ -746,7 +746,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
theme->set_type_variation("GraphNodeTitleLabel", "Label");
- theme->set_stylebox("normal", "GraphNodeTitleLabel", make_empty_stylebox(0, 0, 0, 0));
+ theme->set_stylebox(CoreStringName(normal), "GraphNodeTitleLabel", make_empty_stylebox(0, 0, 0, 0));
theme->set_font("font", "GraphNodeTitleLabel", Ref<Font>());
theme->set_font_size("font_size", "GraphNodeTitleLabel", -1);
theme->set_color("font_color", "GraphNodeTitleLabel", control_font_color);
@@ -766,7 +766,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
Ref<StyleBoxFlat> graphframe_sb_selected = graphframe_sb->duplicate();
graphframe_sb_selected->set_border_color(style_hover_color);
- theme->set_stylebox("panel", "GraphFrame", graphframe_sb);
+ theme->set_stylebox(SceneStringName(panel), "GraphFrame", graphframe_sb);
theme->set_stylebox("panel_selected", "GraphFrame", graphframe_sb_selected);
theme->set_stylebox("titlebar", "GraphFrame", make_empty_stylebox(4, 4, 4, 4));
theme->set_stylebox("titlebar_selected", "GraphFrame", make_empty_stylebox(4, 4, 4, 4));
@@ -777,7 +777,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
theme->set_type_variation("GraphFrameTitleLabel", "Label");
- theme->set_stylebox("normal", "GraphFrameTitleLabel", memnew(StyleBoxEmpty));
+ theme->set_stylebox(CoreStringName(normal), "GraphFrameTitleLabel", memnew(StyleBoxEmpty));
theme->set_font_size("font_size", "GraphFrameTitleLabel", 22);
theme->set_color("font_color", "GraphFrameTitleLabel", Color(1, 1, 1));
theme->set_color("font_shadow_color", "GraphFrameTitleLabel", Color(0, 0, 0, 0));
@@ -790,7 +790,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
// Tree
- theme->set_stylebox("panel", "Tree", make_flat_stylebox(style_normal_color, 4, 4, 4, 5));
+ theme->set_stylebox(SceneStringName(panel), "Tree", make_flat_stylebox(style_normal_color, 4, 4, 4, 5));
theme->set_stylebox("focus", "Tree", focus);
theme->set_stylebox("selected", "Tree", make_flat_stylebox(style_selected_color));
theme->set_stylebox("selected_focus", "Tree", make_flat_stylebox(style_selected_color));
@@ -860,7 +860,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
// ItemList
- theme->set_stylebox("panel", "ItemList", make_flat_stylebox(style_normal_color));
+ theme->set_stylebox(SceneStringName(panel), "ItemList", make_flat_stylebox(style_normal_color));
theme->set_stylebox("focus", "ItemList", focus);
theme->set_constant("h_separation", "ItemList", Math::round(4 * scale));
theme->set_constant("v_separation", "ItemList", Math::round(4 * scale));
@@ -904,7 +904,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
theme->set_stylebox("tab_unselected", "TabContainer", style_tab_unselected);
theme->set_stylebox("tab_disabled", "TabContainer", style_tab_disabled);
theme->set_stylebox("tab_focus", "TabContainer", style_tab_focus);
- theme->set_stylebox("panel", "TabContainer", make_flat_stylebox(style_normal_color, 0, 0, 0, 0));
+ theme->set_stylebox(SceneStringName(panel), "TabContainer", make_flat_stylebox(style_normal_color, 0, 0, 0, 0));
theme->set_stylebox("tabbar_background", "TabContainer", make_empty_stylebox(0, 0, 0, 0));
theme->set_icon("increment", "TabContainer", icons["scroll_button_right"]);
@@ -1050,7 +1050,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
// ColorPickerButton
theme->set_icon("bg", "ColorPickerButton", icons["mini_checkerboard"]);
- theme->set_stylebox("normal", "ColorPickerButton", button_normal);
+ theme->set_stylebox(CoreStringName(normal), "ColorPickerButton", button_normal);
theme->set_stylebox(SceneStringName(pressed), "ColorPickerButton", button_pressed);
theme->set_stylebox("hover", "ColorPickerButton", button_hover);
theme->set_stylebox("disabled", "ColorPickerButton", button_disabled);
@@ -1083,7 +1083,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
// TooltipPanel + TooltipLabel
theme->set_type_variation("TooltipPanel", "PopupPanel");
- theme->set_stylebox("panel", "TooltipPanel",
+ theme->set_stylebox(SceneStringName(panel), "TooltipPanel",
make_flat_stylebox(Color(0, 0, 0, 0.5), 2 * default_margin, 0.5 * default_margin, 2 * default_margin, 0.5 * default_margin));
theme->set_type_variation("TooltipLabel", "Label");
@@ -1101,7 +1101,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
// RichTextLabel
theme->set_stylebox("focus", "RichTextLabel", focus);
- theme->set_stylebox("normal", "RichTextLabel", make_empty_stylebox(0, 0, 0, 0));
+ theme->set_stylebox(CoreStringName(normal), "RichTextLabel", make_empty_stylebox(0, 0, 0, 0));
theme->set_font("normal_font", "RichTextLabel", Ref<Font>());
theme->set_font("bold_font", "RichTextLabel", bold_font);
@@ -1171,7 +1171,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
theme->set_constant("h_separation", "VFlowContainer", Math::round(4 * scale));
theme->set_constant("v_separation", "VFlowContainer", Math::round(4 * scale));
- theme->set_stylebox("panel", "PanelContainer", make_flat_stylebox(style_normal_color, 0, 0, 0, 0));
+ theme->set_stylebox(SceneStringName(panel), "PanelContainer", make_flat_stylebox(style_normal_color, 0, 0, 0, 0));
theme->set_icon("zoom_out", "GraphEdit", icons["zoom_less"]);
theme->set_icon("zoom_in", "GraphEdit", icons["zoom_more"]);
@@ -1181,7 +1181,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
theme->set_icon("snapping_toggle", "GraphEdit", icons["grid_snap"]);
theme->set_icon("layout", "GraphEdit", icons["grid_layout"]);
- theme->set_stylebox("panel", "GraphEdit", make_flat_stylebox(style_normal_color, 4, 4, 4, 5));
+ theme->set_stylebox(SceneStringName(panel), "GraphEdit", make_flat_stylebox(style_normal_color, 4, 4, 4, 5));
Ref<StyleBoxFlat> graph_toolbar_style = make_flat_stylebox(Color(0.24, 0.24, 0.24, 0.6), 4, 2, 4, 2);
theme->set_stylebox("menu_panel", "GraphEdit", graph_toolbar_style);
@@ -1200,7 +1200,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
theme->set_constant("port_hotzone_inner_extent", "GraphEdit", 22 * scale);
theme->set_constant("port_hotzone_outer_extent", "GraphEdit", 26 * scale);
- theme->set_stylebox("panel", "GraphEditMinimap", make_flat_stylebox(Color(0.24, 0.24, 0.24), 0, 0, 0, 0));
+ theme->set_stylebox(SceneStringName(panel), "GraphEditMinimap", make_flat_stylebox(Color(0.24, 0.24, 0.24), 0, 0, 0, 0));
Ref<StyleBoxFlat> style_minimap_camera = make_flat_stylebox(Color(0.65, 0.65, 0.65, 0.2), 0, 0, 0, 0, 0);
style_minimap_camera->set_border_color(Color(0.65, 0.65, 0.65, 0.45));
style_minimap_camera->set_border_width_all(1);
diff --git a/servers/physics_server_3d.cpp b/servers/physics_server_3d.cpp
index f56ef11c14..cda04e0aae 100644
--- a/servers/physics_server_3d.cpp
+++ b/servers/physics_server_3d.cpp
@@ -704,9 +704,11 @@ void PhysicsServer3D::_bind_methods() {
ClassDB::bind_method(D_METHOD("custom_shape_create"), &PhysicsServer3D::custom_shape_create);
ClassDB::bind_method(D_METHOD("shape_set_data", "shape", "data"), &PhysicsServer3D::shape_set_data);
+ ClassDB::bind_method(D_METHOD("shape_set_margin", "shape", "margin"), &PhysicsServer3D::shape_set_margin);
ClassDB::bind_method(D_METHOD("shape_get_type", "shape"), &PhysicsServer3D::shape_get_type);
ClassDB::bind_method(D_METHOD("shape_get_data", "shape"), &PhysicsServer3D::shape_get_data);
+ ClassDB::bind_method(D_METHOD("shape_get_margin", "shape"), &PhysicsServer3D::shape_get_margin);
ClassDB::bind_method(D_METHOD("space_create"), &PhysicsServer3D::space_create);
ClassDB::bind_method(D_METHOD("space_set_active", "space", "active"), &PhysicsServer3D::space_set_active);
diff --git a/servers/rendering/renderer_rd/shaders/particles.glsl b/servers/rendering/renderer_rd/shaders/particles.glsl
index efdf1c2278..60c49bacae 100644
--- a/servers/rendering/renderer_rd/shaders/particles.glsl
+++ b/servers/rendering/renderer_rd/shaders/particles.glsl
@@ -528,11 +528,13 @@ void main() {
vec3 rel_vec = PARTICLE.xform[3].xyz - FRAME.colliders[i].transform[3].xyz;
vec3 local_pos = rel_vec * mat3(FRAME.colliders[i].transform);
+ // Allowing for a small epsilon to allow particle just touching colliders to count as collided
+ const float EPSILON = 0.001;
switch (FRAME.colliders[i].type) {
case COLLIDER_TYPE_SPHERE: {
float d = length(rel_vec) - (particle_size + FRAME.colliders[i].extents.x);
- if (d < 0.0) {
+ if (d <= EPSILON) {
col = true;
depth = -d;
normal = normalize(rel_vec);
@@ -549,7 +551,7 @@ void main() {
vec3 closest = min(abs_pos, FRAME.colliders[i].extents);
vec3 rel = abs_pos - closest;
depth = length(rel) - particle_size;
- if (depth < 0.0) {
+ if (depth <= EPSILON) {
col = true;
normal = mat3(FRAME.colliders[i].transform) * (normalize(rel) * sgn_pos);
depth = -depth;
@@ -588,10 +590,10 @@ void main() {
float s = texture(sampler3D(sdf_vec_textures[FRAME.colliders[i].texture_index], SAMPLER_LINEAR_CLAMP), uvw_pos).r;
s *= FRAME.colliders[i].scale;
s += extra_dist;
- if (s < particle_size) {
+ if (s <= particle_size + EPSILON) {
col = true;
depth = particle_size - s;
- const float EPSILON = 0.001;
+
normal = mat3(FRAME.colliders[i].transform) *
normalize(
vec3(
@@ -614,7 +616,7 @@ void main() {
float y = texture(sampler2D(height_field_texture, SAMPLER_LINEAR_CLAMP), uvw_pos.xz).r;
- if (y > uvw_pos.y) {
+ if (y + EPSILON >= uvw_pos.y) {
//inside heightfield
vec3 pos1 = (vec3(uvw_pos.x, y, uvw_pos.z) * 2.0 - 1.0) * FRAME.colliders[i].extents;
diff --git a/servers/rendering/renderer_rd/storage_rd/material_storage.cpp b/servers/rendering/renderer_rd/storage_rd/material_storage.cpp
index a10c672379..d1c8c71b7f 100644
--- a/servers/rendering/renderer_rd/storage_rd/material_storage.cpp
+++ b/servers/rendering/renderer_rd/storage_rd/material_storage.cpp
@@ -746,8 +746,10 @@ MaterialStorage::MaterialData::~MaterialData() {
material_storage->global_shader_uniforms.materials_using_texture.erase(global_texture_E);
}
- if (uniform_buffer.is_valid()) {
- RD::get_singleton()->free(uniform_buffer);
+ for (int i = 0; i < 2; i++) {
+ if (uniform_buffer[i].is_valid()) {
+ RD::get_singleton()->free(uniform_buffer[i]);
+ }
}
}
@@ -987,17 +989,17 @@ void MaterialStorage::MaterialData::free_parameters_uniform_set(RID p_uniform_se
}
bool MaterialStorage::MaterialData::update_parameters_uniform_set(const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty, const HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> &p_uniforms, const uint32_t *p_uniform_offsets, const Vector<ShaderCompiler::GeneratedCode::Texture> &p_texture_uniforms, const HashMap<StringName, HashMap<int, RID>> &p_default_texture_params, uint32_t p_ubo_size, RID &uniform_set, RID p_shader, uint32_t p_shader_uniform_set, bool p_use_linear_color, bool p_3d_material) {
- if ((uint32_t)ubo_data.size() != p_ubo_size) {
+ if ((uint32_t)ubo_data[p_use_linear_color].size() != p_ubo_size) {
p_uniform_dirty = true;
- if (uniform_buffer.is_valid()) {
- RD::get_singleton()->free(uniform_buffer);
- uniform_buffer = RID();
+ if (uniform_buffer[p_use_linear_color].is_valid()) {
+ RD::get_singleton()->free(uniform_buffer[p_use_linear_color]);
+ uniform_buffer[p_use_linear_color] = RID();
}
- ubo_data.resize(p_ubo_size);
- if (ubo_data.size()) {
- uniform_buffer = RD::get_singleton()->uniform_buffer_create(ubo_data.size());
- memset(ubo_data.ptrw(), 0, ubo_data.size()); //clear
+ ubo_data[p_use_linear_color].resize(p_ubo_size);
+ if (ubo_data[p_use_linear_color].size()) {
+ uniform_buffer[p_use_linear_color] = RD::get_singleton()->uniform_buffer_create(ubo_data[p_use_linear_color].size());
+ memset(ubo_data[p_use_linear_color].ptrw(), 0, ubo_data[p_use_linear_color].size()); //clear
}
//clear previous uniform set
@@ -1009,9 +1011,9 @@ bool MaterialStorage::MaterialData::update_parameters_uniform_set(const HashMap<
}
//check whether buffer changed
- if (p_uniform_dirty && ubo_data.size()) {
- update_uniform_buffer(p_uniforms, p_uniform_offsets, p_parameters, ubo_data.ptrw(), ubo_data.size(), p_use_linear_color);
- RD::get_singleton()->buffer_update(uniform_buffer, 0, ubo_data.size(), ubo_data.ptrw());
+ if (p_uniform_dirty && ubo_data[p_use_linear_color].size()) {
+ update_uniform_buffer(p_uniforms, p_uniform_offsets, p_parameters, ubo_data[p_use_linear_color].ptrw(), ubo_data[p_use_linear_color].size(), p_use_linear_color);
+ RD::get_singleton()->buffer_update(uniform_buffer[p_use_linear_color], 0, ubo_data[p_use_linear_color].size(), ubo_data[p_use_linear_color].ptrw());
}
uint32_t tex_uniform_count = 0U;
@@ -1053,7 +1055,7 @@ bool MaterialStorage::MaterialData::update_parameters_uniform_set(const HashMap<
RD::Uniform u;
u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
u.binding = 0;
- u.append_id(uniform_buffer);
+ u.append_id(uniform_buffer[p_use_linear_color]);
uniforms.push_back(u);
}
diff --git a/servers/rendering/renderer_rd/storage_rd/material_storage.h b/servers/rendering/renderer_rd/storage_rd/material_storage.h
index fe769a778d..9c53450462 100644
--- a/servers/rendering/renderer_rd/storage_rd/material_storage.h
+++ b/servers/rendering/renderer_rd/storage_rd/material_storage.h
@@ -100,8 +100,8 @@ public:
HashMap<StringName, uint64_t> used_global_textures;
//internally by update_parameters_uniform_set
- Vector<uint8_t> ubo_data;
- RID uniform_buffer;
+ Vector<uint8_t> ubo_data[2]; // 0: linear buffer; 1: sRGB buffer.
+ RID uniform_buffer[2]; // 0: linear buffer; 1: sRGB buffer.
Vector<RID> texture_cache;
};
diff --git a/servers/rendering/rendering_device.cpp b/servers/rendering/rendering_device.cpp
index 0227472d0e..f9883106c2 100644
--- a/servers/rendering/rendering_device.cpp
+++ b/servers/rendering/rendering_device.cpp
@@ -824,8 +824,8 @@ RID RenderingDevice::texture_create(const TextureFormat &p_format, const Texture
}
if (texture.draw_tracker != nullptr) {
- // Draw tracker can assume the texture will be in transfer destination.
- texture.draw_tracker->usage = RDG::RESOURCE_USAGE_TRANSFER_TO;
+ // Draw tracker can assume the texture will be in copy destination.
+ texture.draw_tracker->usage = RDG::RESOURCE_USAGE_COPY_TO;
}
}
@@ -847,8 +847,11 @@ RID RenderingDevice::texture_create_shared(const TextureView &p_view, RID p_with
// Create view.
Texture texture = *src_texture;
+ texture.shared_fallback = nullptr;
RDD::TextureView tv;
+ bool create_shared = true;
+ bool raw_reintepretation = false;
if (p_view.format_override == DATA_FORMAT_MAX || p_view.format_override == texture.format) {
tv.format = texture.format;
} else {
@@ -857,13 +860,47 @@ RID RenderingDevice::texture_create_shared(const TextureView &p_view, RID p_with
ERR_FAIL_COND_V_MSG(!texture.allowed_shared_formats.has(p_view.format_override), RID(),
"Format override is not in the list of allowed shareable formats for original texture.");
tv.format = p_view.format_override;
+ create_shared = driver->texture_can_make_shared_with_format(texture.driver_id, p_view.format_override, raw_reintepretation);
}
tv.swizzle_r = p_view.swizzle_r;
tv.swizzle_g = p_view.swizzle_g;
tv.swizzle_b = p_view.swizzle_b;
tv.swizzle_a = p_view.swizzle_a;
- texture.driver_id = driver->texture_create_shared(texture.driver_id, tv);
+ if (create_shared) {
+ texture.driver_id = driver->texture_create_shared(texture.driver_id, tv);
+ } else {
+ // The regular view will use the same format as the main texture.
+ RDD::TextureView regular_view = tv;
+ regular_view.format = src_texture->format;
+ texture.driver_id = driver->texture_create_shared(texture.driver_id, regular_view);
+
+ // Create the independent texture for the alias.
+ RDD::TextureFormat alias_format = texture.texture_format();
+ alias_format.format = tv.format;
+ alias_format.usage_bits = TEXTURE_USAGE_SAMPLING_BIT | TEXTURE_USAGE_CAN_COPY_TO_BIT;
+
+ _texture_check_shared_fallback(src_texture);
+ _texture_check_shared_fallback(&texture);
+
+ texture.shared_fallback->texture = driver->texture_create(alias_format, tv);
+ texture.shared_fallback->raw_reinterpretation = raw_reintepretation;
+ texture_memory += driver->texture_get_allocation_size(texture.shared_fallback->texture);
+
+ RDG::ResourceTracker *tracker = RDG::resource_tracker_create();
+ tracker->texture_driver_id = texture.shared_fallback->texture;
+ tracker->texture_subresources = texture.barrier_range();
+ tracker->texture_usage = alias_format.usage_bits;
+ tracker->reference_count = 1;
+ texture.shared_fallback->texture_tracker = tracker;
+ texture.shared_fallback->revision = 0;
+
+ if (raw_reintepretation && src_texture->shared_fallback->buffer.id == 0) {
+ // For shared textures of the same size, we create the buffer on the main texture if it doesn't have it already.
+ _texture_create_reinterpret_buffer(src_texture);
+ }
+ }
+
ERR_FAIL_COND_V(!texture.driver_id, RID());
texture.slice_trackers.clear();
@@ -965,6 +1002,7 @@ RID RenderingDevice::texture_create_shared_from_slice(const TextureView &p_view,
}
Texture texture = *src_texture;
+ texture.shared_fallback = nullptr;
get_image_format_required_size(texture.format, texture.width, texture.height, texture.depth, p_mipmap + 1, &texture.width, &texture.height);
texture.mipmaps = p_mipmaps;
@@ -979,6 +1017,8 @@ RID RenderingDevice::texture_create_shared_from_slice(const TextureView &p_view,
}
RDD::TextureView tv;
+ bool create_shared = true;
+ bool raw_reintepretation = false;
if (p_view.format_override == DATA_FORMAT_MAX || p_view.format_override == texture.format) {
tv.format = texture.format;
} else {
@@ -987,7 +1027,9 @@ RID RenderingDevice::texture_create_shared_from_slice(const TextureView &p_view,
ERR_FAIL_COND_V_MSG(!texture.allowed_shared_formats.has(p_view.format_override), RID(),
"Format override is not in the list of allowed shareable formats for original texture.");
tv.format = p_view.format_override;
+ create_shared = driver->texture_can_make_shared_with_format(texture.driver_id, p_view.format_override, raw_reintepretation);
}
+
tv.swizzle_r = p_view.swizzle_r;
tv.swizzle_g = p_view.swizzle_g;
tv.swizzle_b = p_view.swizzle_b;
@@ -1000,7 +1042,47 @@ RID RenderingDevice::texture_create_shared_from_slice(const TextureView &p_view,
"Specified layer must be a multiple of 6.");
}
- texture.driver_id = driver->texture_create_shared_from_slice(src_texture->driver_id, tv, p_slice_type, p_layer, slice_layers, p_mipmap, p_mipmaps);
+ if (create_shared) {
+ texture.driver_id = driver->texture_create_shared_from_slice(src_texture->driver_id, tv, p_slice_type, p_layer, slice_layers, p_mipmap, p_mipmaps);
+ } else {
+ // The regular view will use the same format as the main texture.
+ RDD::TextureView regular_view = tv;
+ regular_view.format = src_texture->format;
+ texture.driver_id = driver->texture_create_shared_from_slice(src_texture->driver_id, regular_view, p_slice_type, p_layer, slice_layers, p_mipmap, p_mipmaps);
+
+ // Create the independent texture for the slice.
+ RDD::TextureSubresourceRange slice_range = texture.barrier_range();
+ slice_range.base_mipmap = 0;
+ slice_range.base_layer = 0;
+
+ RDD::TextureFormat slice_format = texture.texture_format();
+ slice_format.width = MAX(texture.width >> p_mipmap, 1U);
+ slice_format.height = MAX(texture.height >> p_mipmap, 1U);
+ slice_format.depth = MAX(texture.depth >> p_mipmap, 1U);
+ slice_format.format = tv.format;
+ slice_format.usage_bits = TEXTURE_USAGE_SAMPLING_BIT | TEXTURE_USAGE_CAN_COPY_TO_BIT;
+
+ _texture_check_shared_fallback(src_texture);
+ _texture_check_shared_fallback(&texture);
+
+ texture.shared_fallback->texture = driver->texture_create(slice_format, tv);
+ texture.shared_fallback->raw_reinterpretation = raw_reintepretation;
+ texture_memory += driver->texture_get_allocation_size(texture.shared_fallback->texture);
+
+ RDG::ResourceTracker *tracker = RDG::resource_tracker_create();
+ tracker->texture_driver_id = texture.shared_fallback->texture;
+ tracker->texture_subresources = slice_range;
+ tracker->texture_usage = slice_format.usage_bits;
+ tracker->reference_count = 1;
+ texture.shared_fallback->texture_tracker = tracker;
+ texture.shared_fallback->revision = 0;
+
+ if (raw_reintepretation && src_texture->shared_fallback->buffer.id == 0) {
+ // For shared texture slices, we create the buffer on the slice if the source texture has no reinterpretation buffer.
+ _texture_create_reinterpret_buffer(&texture);
+ }
+ }
+
ERR_FAIL_COND_V(!texture.driver_id, RID());
const Rect2i slice_rect(p_mipmap, p_layer, p_mipmaps, slice_layers);
@@ -1093,15 +1175,18 @@ Error RenderingDevice::_texture_update(RID p_texture, uint32_t p_layer, const Ve
// When using the setup queue directly, we transition the texture to the optimal layout.
RDD::TextureBarrier tb;
tb.texture = texture->driver_id;
- tb.dst_access = RDD::BARRIER_ACCESS_TRANSFER_WRITE_BIT;
+ tb.dst_access = RDD::BARRIER_ACCESS_COPY_WRITE_BIT;
tb.prev_layout = RDD::TEXTURE_LAYOUT_UNDEFINED;
- tb.next_layout = RDD::TEXTURE_LAYOUT_TRANSFER_DST_OPTIMAL;
+ tb.next_layout = RDD::TEXTURE_LAYOUT_COPY_DST_OPTIMAL;
tb.subresources.aspect = texture->barrier_aspect_flags;
tb.subresources.mipmap_count = texture->mipmaps;
tb.subresources.base_layer = p_layer;
tb.subresources.layer_count = 1;
- driver->command_pipeline_barrier(frames[frame].setup_command_buffer, RDD::PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, RDD::PIPELINE_STAGE_TRANSFER_BIT, {}, {}, tb);
+ driver->command_pipeline_barrier(frames[frame].setup_command_buffer, RDD::PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, RDD::PIPELINE_STAGE_COPY_BIT, {}, {}, tb);
+ } else if (!p_use_setup_queue) {
+ // Indicate the texture will get modified for the shared texture fallback.
+ _texture_update_shared_fallback(p_texture, texture, true);
}
uint32_t mipmap_offset = 0;
@@ -1199,7 +1284,7 @@ Error RenderingDevice::_texture_update(RID p_texture, uint32_t p_layer, const Ve
copy_region.texture_region_size = Vector3i(region_logic_w, region_logic_h, 1);
if (p_use_setup_queue) {
- driver->command_copy_buffer_to_texture(frames[frame].setup_command_buffer, staging_buffer_blocks[staging_buffer_current].driver_id, texture->driver_id, RDD::TEXTURE_LAYOUT_TRANSFER_DST_OPTIMAL, copy_region);
+ driver->command_copy_buffer_to_texture(frames[frame].setup_command_buffer, staging_buffer_blocks[staging_buffer_current].driver_id, texture->driver_id, RDD::TEXTURE_LAYOUT_COPY_DST_OPTIMAL, copy_region);
} else {
RDG::RecordedBufferToTextureCopy buffer_to_texture_copy;
buffer_to_texture_copy.from_buffer = staging_buffer_blocks[staging_buffer_current].driver_id;
@@ -1221,14 +1306,14 @@ Error RenderingDevice::_texture_update(RID p_texture, uint32_t p_layer, const Ve
// If the texture does not have a tracker, it means it must be transitioned to the sampling state.
RDD::TextureBarrier tb;
tb.texture = texture->driver_id;
- tb.src_access = RDD::BARRIER_ACCESS_TRANSFER_WRITE_BIT;
- tb.prev_layout = RDD::TEXTURE_LAYOUT_TRANSFER_DST_OPTIMAL;
+ tb.src_access = RDD::BARRIER_ACCESS_COPY_WRITE_BIT;
+ tb.prev_layout = RDD::TEXTURE_LAYOUT_COPY_DST_OPTIMAL;
tb.next_layout = RDD::TEXTURE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
tb.subresources.aspect = texture->barrier_aspect_flags;
tb.subresources.mipmap_count = texture->mipmaps;
tb.subresources.base_layer = p_layer;
tb.subresources.layer_count = 1;
- driver->command_pipeline_barrier(frames[frame].setup_command_buffer, RDD::PIPELINE_STAGE_TRANSFER_BIT, RDD::PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, {}, {}, tb);
+ driver->command_pipeline_barrier(frames[frame].setup_command_buffer, RDD::PIPELINE_STAGE_COPY_BIT, RDD::PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, {}, {}, tb);
} else if (!p_use_setup_queue && !command_buffer_to_texture_copies_vector.is_empty()) {
if (_texture_make_mutable(texture, p_texture)) {
// The texture must be mutable to be used as a copy destination.
@@ -1241,6 +1326,186 @@ Error RenderingDevice::_texture_update(RID p_texture, uint32_t p_layer, const Ve
return OK;
}
+void RenderingDevice::_texture_check_shared_fallback(Texture *p_texture) {
+ if (p_texture->shared_fallback == nullptr) {
+ p_texture->shared_fallback = memnew(Texture::SharedFallback);
+ }
+}
+
+void RenderingDevice::_texture_update_shared_fallback(RID p_texture_rid, Texture *p_texture, bool p_for_writing) {
+ if (p_texture->shared_fallback == nullptr) {
+ // This texture does not use any of the shared texture fallbacks.
+ return;
+ }
+
+ if (p_texture->owner.is_valid()) {
+ Texture *owner_texture = texture_owner.get_or_null(p_texture->owner);
+ ERR_FAIL_NULL(owner_texture);
+ if (p_for_writing) {
+ // Only the main texture is used for writing when using the shared fallback.
+ owner_texture->shared_fallback->revision++;
+ } else if (p_texture->shared_fallback->revision != owner_texture->shared_fallback->revision) {
+ // Copy the contents of the main texture into the shared texture fallback slice. Update the revision.
+ _texture_copy_shared(p_texture->owner, owner_texture, p_texture_rid, p_texture);
+ p_texture->shared_fallback->revision = owner_texture->shared_fallback->revision;
+ }
+ } else if (p_for_writing) {
+ // Increment the revision of the texture so shared texture fallback slices must be updated.
+ p_texture->shared_fallback->revision++;
+ }
+}
+
+void RenderingDevice::_texture_free_shared_fallback(Texture *p_texture) {
+ if (p_texture->shared_fallback != nullptr) {
+ if (p_texture->shared_fallback->texture_tracker != nullptr) {
+ RDG::resource_tracker_free(p_texture->shared_fallback->texture_tracker);
+ }
+
+ if (p_texture->shared_fallback->buffer_tracker != nullptr) {
+ RDG::resource_tracker_free(p_texture->shared_fallback->buffer_tracker);
+ }
+
+ if (p_texture->shared_fallback->texture.id != 0) {
+ texture_memory -= driver->texture_get_allocation_size(p_texture->shared_fallback->texture);
+ driver->texture_free(p_texture->shared_fallback->texture);
+ }
+
+ if (p_texture->shared_fallback->buffer.id != 0) {
+ buffer_memory -= driver->buffer_get_allocation_size(p_texture->shared_fallback->buffer);
+ driver->buffer_free(p_texture->shared_fallback->buffer);
+ }
+
+ memdelete(p_texture->shared_fallback);
+ p_texture->shared_fallback = nullptr;
+ }
+}
+
+void RenderingDevice::_texture_copy_shared(RID p_src_texture_rid, Texture *p_src_texture, RID p_dst_texture_rid, Texture *p_dst_texture) {
+ // The only type of copying allowed is from the main texture to the slice texture, as slice textures are not allowed to be used for writing when using this fallback.
+ DEV_ASSERT(p_src_texture != nullptr);
+ DEV_ASSERT(p_dst_texture != nullptr);
+ DEV_ASSERT(p_src_texture->owner.is_null());
+ DEV_ASSERT(p_dst_texture->owner == p_src_texture_rid);
+
+ bool src_made_mutable = _texture_make_mutable(p_src_texture, p_src_texture_rid);
+ bool dst_made_mutable = _texture_make_mutable(p_dst_texture, p_dst_texture_rid);
+ if (src_made_mutable || dst_made_mutable) {
+ draw_graph.add_synchronization();
+ }
+
+ if (p_dst_texture->shared_fallback->raw_reinterpretation) {
+ // If one of the textures is a main texture and they have a reinterpret buffer, we prefer using that as it's guaranteed to be big enough to hold
+ // anything and it's how the shared textures that don't use slices are created.
+ bool src_has_buffer = p_src_texture->shared_fallback->buffer.id != 0;
+ bool dst_has_buffer = p_dst_texture->shared_fallback->buffer.id != 0;
+ bool from_src = p_src_texture->owner.is_null() && src_has_buffer;
+ bool from_dst = p_dst_texture->owner.is_null() && dst_has_buffer;
+ if (!from_src && !from_dst) {
+ // If neither texture passed the condition, we just pick whichever texture has a reinterpretation buffer.
+ from_src = src_has_buffer;
+ from_dst = dst_has_buffer;
+ }
+
+ // Pick the buffer and tracker to use from the right texture.
+ RDD::BufferID shared_buffer;
+ RDG::ResourceTracker *shared_buffer_tracker = nullptr;
+ if (from_src) {
+ shared_buffer = p_src_texture->shared_fallback->buffer;
+ shared_buffer_tracker = p_src_texture->shared_fallback->buffer_tracker;
+ } else if (from_dst) {
+ shared_buffer = p_dst_texture->shared_fallback->buffer;
+ shared_buffer_tracker = p_dst_texture->shared_fallback->buffer_tracker;
+ } else {
+ DEV_ASSERT(false && "This path should not be reachable.");
+ }
+
+ // FIXME: When using reinterpretation buffers, the only texture aspect supported is color. Depth or stencil contents won't get copied.
+ RDD::BufferTextureCopyRegion get_data_region;
+ RDG::RecordedBufferToTextureCopy update_copy;
+ RDD::TextureCopyableLayout first_copyable_layout;
+ RDD::TextureCopyableLayout copyable_layout;
+ RDD::TextureSubresource texture_subresource;
+ texture_subresource.aspect = RDD::TEXTURE_ASPECT_COLOR;
+ texture_subresource.layer = 0;
+ texture_subresource.mipmap = 0;
+ driver->texture_get_copyable_layout(p_dst_texture->shared_fallback->texture, texture_subresource, &first_copyable_layout);
+
+ // Copying each mipmap from main texture to a buffer and then to the slice texture.
+ thread_local LocalVector<RDD::BufferTextureCopyRegion> get_data_vector;
+ thread_local LocalVector<RDG::RecordedBufferToTextureCopy> update_vector;
+ get_data_vector.clear();
+ update_vector.clear();
+ for (uint32_t i = 0; i < p_dst_texture->mipmaps; i++) {
+ driver->texture_get_copyable_layout(p_dst_texture->shared_fallback->texture, texture_subresource, &copyable_layout);
+
+ uint32_t mipmap = p_dst_texture->base_mipmap + i;
+ get_data_region.buffer_offset = copyable_layout.offset - first_copyable_layout.offset;
+ get_data_region.texture_subresources.aspect = RDD::TEXTURE_ASPECT_COLOR_BIT;
+ get_data_region.texture_subresources.base_layer = p_dst_texture->base_layer;
+ get_data_region.texture_subresources.mipmap = mipmap;
+ get_data_region.texture_subresources.layer_count = p_dst_texture->layers;
+ get_data_region.texture_region_size.x = MAX(1U, p_src_texture->width >> mipmap);
+ get_data_region.texture_region_size.y = MAX(1U, p_src_texture->height >> mipmap);
+ get_data_region.texture_region_size.z = MAX(1U, p_src_texture->depth >> mipmap);
+ get_data_vector.push_back(get_data_region);
+
+ update_copy.from_buffer = shared_buffer;
+ update_copy.region.buffer_offset = get_data_region.buffer_offset;
+ update_copy.region.texture_subresources.aspect = RDD::TEXTURE_ASPECT_COLOR_BIT;
+ update_copy.region.texture_subresources.base_layer = texture_subresource.layer;
+ update_copy.region.texture_subresources.mipmap = texture_subresource.mipmap;
+ update_copy.region.texture_subresources.layer_count = get_data_region.texture_subresources.layer_count;
+ update_copy.region.texture_region_size.x = get_data_region.texture_region_size.x;
+ update_copy.region.texture_region_size.y = get_data_region.texture_region_size.y;
+ update_copy.region.texture_region_size.z = get_data_region.texture_region_size.z;
+ update_vector.push_back(update_copy);
+
+ texture_subresource.mipmap++;
+ }
+
+ draw_graph.add_texture_get_data(p_src_texture->driver_id, p_src_texture->draw_tracker, shared_buffer, get_data_vector, shared_buffer_tracker);
+ draw_graph.add_texture_update(p_dst_texture->shared_fallback->texture, p_dst_texture->shared_fallback->texture_tracker, update_vector, shared_buffer_tracker);
+ } else {
+ // Raw reinterpretation is not required. Use a regular texture copy.
+ RDD::TextureCopyRegion copy_region;
+ copy_region.src_subresources.aspect = p_src_texture->read_aspect_flags;
+ copy_region.src_subresources.base_layer = p_dst_texture->base_layer;
+ copy_region.src_subresources.layer_count = p_dst_texture->layers;
+ copy_region.dst_subresources.aspect = p_dst_texture->read_aspect_flags;
+ copy_region.dst_subresources.base_layer = 0;
+ copy_region.dst_subresources.layer_count = copy_region.src_subresources.layer_count;
+
+ // Copying each mipmap from main texture to to the slice texture.
+ thread_local LocalVector<RDD::TextureCopyRegion> region_vector;
+ region_vector.clear();
+ for (uint32_t i = 0; i < p_dst_texture->mipmaps; i++) {
+ uint32_t mipmap = p_dst_texture->base_mipmap + i;
+ copy_region.src_subresources.mipmap = mipmap;
+ copy_region.dst_subresources.mipmap = i;
+ copy_region.size.x = MAX(1U, p_src_texture->width >> mipmap);
+ copy_region.size.y = MAX(1U, p_src_texture->height >> mipmap);
+ copy_region.size.z = MAX(1U, p_src_texture->depth >> mipmap);
+ region_vector.push_back(copy_region);
+ }
+
+ draw_graph.add_texture_copy(p_src_texture->driver_id, p_src_texture->draw_tracker, p_dst_texture->shared_fallback->texture, p_dst_texture->shared_fallback->texture_tracker, region_vector);
+ }
+}
+
+void RenderingDevice::_texture_create_reinterpret_buffer(Texture *p_texture) {
+ uint64_t row_pitch_step = driver->api_trait_get(RDD::API_TRAIT_TEXTURE_DATA_ROW_PITCH_STEP);
+ uint64_t transfer_alignment = driver->api_trait_get(RDD::API_TRAIT_TEXTURE_TRANSFER_ALIGNMENT);
+ uint32_t pixel_bytes = get_image_format_pixel_size(p_texture->format);
+ uint32_t row_pitch = STEPIFY(p_texture->width * pixel_bytes, row_pitch_step);
+ uint64_t buffer_size = STEPIFY(pixel_bytes * row_pitch * p_texture->height * p_texture->depth, transfer_alignment);
+ p_texture->shared_fallback->buffer = driver->buffer_create(buffer_size, RDD::BUFFER_USAGE_TRANSFER_FROM_BIT | RDD::BUFFER_USAGE_TRANSFER_TO_BIT, RDD::MEMORY_ALLOCATION_TYPE_GPU);
+ buffer_memory += driver->buffer_get_allocation_size(p_texture->shared_fallback->buffer);
+
+ RDG::ResourceTracker *tracker = RDG::resource_tracker_create();
+ tracker->buffer_driver_id = p_texture->shared_fallback->buffer;
+ p_texture->shared_fallback->buffer_tracker = tracker;
+}
+
Vector<uint8_t> RenderingDevice::_texture_get_data(Texture *tex, uint32_t p_layer, bool p_2d) {
uint32_t width, height, depth;
uint32_t tight_mip_size = get_image_format_required_size(tex->format, tex->width, tex->height, p_2d ? 1 : tex->depth, tex->mipmaps, &width, &height, &depth);
@@ -1535,6 +1800,9 @@ Error RenderingDevice::texture_copy(RID p_from_texture, RID p_to_texture, const
copy_region.size = p_size;
+ // Indicate the texture will get modified for the shared texture fallback.
+ _texture_update_shared_fallback(p_to_texture, dst_tex, true);
+
// The textures must be mutable to be used in the copy operation.
bool src_made_mutable = _texture_make_mutable(src_tex, p_from_texture);
bool dst_made_mutable = _texture_make_mutable(dst_tex, p_to_texture);
@@ -1578,6 +1846,9 @@ Error RenderingDevice::texture_resolve_multisample(RID p_from_texture, RID p_to_
ERR_FAIL_COND_V_MSG(src_tex->read_aspect_flags != dst_tex->read_aspect_flags, ERR_INVALID_PARAMETER,
"Source and destination texture must be of the same type (color or depth).");
+ // Indicate the texture will get modified for the shared texture fallback.
+ _texture_update_shared_fallback(p_to_texture, dst_tex, true);
+
// The textures must be mutable to be used in the resolve operation.
bool src_made_mutable = _texture_make_mutable(src_tex, p_from_texture);
bool dst_made_mutable = _texture_make_mutable(dst_tex, p_to_texture);
@@ -1620,6 +1891,9 @@ Error RenderingDevice::texture_clear(RID p_texture, const Color &p_color, uint32
range.base_layer = src_tex->base_layer + p_base_layer;
range.layer_count = p_layers;
+ // Indicate the texture will get modified for the shared texture fallback.
+ _texture_update_shared_fallback(p_texture, src_tex, true);
+
if (_texture_make_mutable(src_tex, p_texture)) {
// The texture must be mutable to be used as a clear destination.
draw_graph.add_synchronization();
@@ -2526,6 +2800,14 @@ RID RenderingDevice::uniform_buffer_create(uint32_t p_size_bytes, const Vector<u
return id;
}
+void RenderingDevice::_uniform_set_update_shared(UniformSet *p_uniform_set) {
+ for (UniformSet::SharedTexture shared : p_uniform_set->shared_textures_to_update) {
+ Texture *texture = texture_owner.get_or_null(shared.texture);
+ ERR_CONTINUE(texture == nullptr);
+ _texture_update_shared_fallback(shared.texture, texture, shared.writing);
+ }
+}
+
RID RenderingDevice::uniform_set_create(const Vector<Uniform> &p_uniforms, RID p_shader, uint32_t p_shader_set) {
_THREAD_SAFE_METHOD_
@@ -2554,6 +2836,7 @@ RID RenderingDevice::uniform_set_create(const Vector<Uniform> &p_uniforms, RID p
Vector<RDG::ResourceTracker *> draw_trackers;
Vector<RDG::ResourceUsage> draw_trackers_usage;
HashMap<RID, RDG::ResourceUsage> untracked_usage;
+ Vector<UniformSet::SharedTexture> shared_textures_to_update;
for (uint32_t i = 0; i < set_uniform_count; i++) {
const ShaderUniform &set_uniform = set_uniforms[i];
@@ -2619,8 +2902,16 @@ RID RenderingDevice::uniform_set_create(const Vector<Uniform> &p_uniforms, RID p
attachable_textures.push_back(attachable_texture);
}
- if (texture->draw_tracker != nullptr) {
- draw_trackers.push_back(texture->draw_tracker);
+ RDD::TextureID driver_id = texture->driver_id;
+ RDG::ResourceTracker *tracker = texture->draw_tracker;
+ if (texture->shared_fallback != nullptr && texture->shared_fallback->texture.id != 0) {
+ driver_id = texture->shared_fallback->texture;
+ tracker = texture->shared_fallback->texture_tracker;
+ shared_textures_to_update.push_back({ false, texture_id });
+ }
+
+ if (tracker != nullptr) {
+ draw_trackers.push_back(tracker);
draw_trackers_usage.push_back(RDG::RESOURCE_USAGE_TEXTURE_SAMPLE);
} else {
untracked_usage[texture_id] = RDG::RESOURCE_USAGE_TEXTURE_SAMPLE;
@@ -2629,7 +2920,7 @@ RID RenderingDevice::uniform_set_create(const Vector<Uniform> &p_uniforms, RID p
DEV_ASSERT(!texture->owner.is_valid() || texture_owner.get_or_null(texture->owner));
driver_uniform.ids.push_back(*sampler_driver_id);
- driver_uniform.ids.push_back(texture->driver_id);
+ driver_uniform.ids.push_back(driver_id);
}
} break;
case UNIFORM_TYPE_TEXTURE: {
@@ -2656,8 +2947,16 @@ RID RenderingDevice::uniform_set_create(const Vector<Uniform> &p_uniforms, RID p
attachable_textures.push_back(attachable_texture);
}
- if (texture->draw_tracker != nullptr) {
- draw_trackers.push_back(texture->draw_tracker);
+ RDD::TextureID driver_id = texture->driver_id;
+ RDG::ResourceTracker *tracker = texture->draw_tracker;
+ if (texture->shared_fallback != nullptr && texture->shared_fallback->texture.id != 0) {
+ driver_id = texture->shared_fallback->texture;
+ tracker = texture->shared_fallback->texture_tracker;
+ shared_textures_to_update.push_back({ false, texture_id });
+ }
+
+ if (tracker != nullptr) {
+ draw_trackers.push_back(tracker);
draw_trackers_usage.push_back(RDG::RESOURCE_USAGE_TEXTURE_SAMPLE);
} else {
untracked_usage[texture_id] = RDG::RESOURCE_USAGE_TEXTURE_SAMPLE;
@@ -2665,7 +2964,7 @@ RID RenderingDevice::uniform_set_create(const Vector<Uniform> &p_uniforms, RID p
DEV_ASSERT(!texture->owner.is_valid() || texture_owner.get_or_null(texture->owner));
- driver_uniform.ids.push_back(texture->driver_id);
+ driver_uniform.ids.push_back(driver_id);
}
} break;
case UNIFORM_TYPE_IMAGE: {
@@ -2687,6 +2986,10 @@ RID RenderingDevice::uniform_set_create(const Vector<Uniform> &p_uniforms, RID p
ERR_FAIL_COND_V_MSG(!(texture->usage_flags & TEXTURE_USAGE_STORAGE_BIT), RID(),
"Image (binding: " + itos(uniform.binding) + ", index " + itos(j) + ") needs the TEXTURE_USAGE_STORAGE_BIT usage flag set in order to be used as uniform.");
+ if (texture->owner.is_null() && texture->shared_fallback != nullptr) {
+ shared_textures_to_update.push_back({ true, texture_id });
+ }
+
if (_texture_make_mutable(texture, texture_id)) {
// The texture must be mutable as a layout transition will be required.
draw_graph.add_synchronization();
@@ -2872,6 +3175,7 @@ RID RenderingDevice::uniform_set_create(const Vector<Uniform> &p_uniforms, RID p
uniform_set.draw_trackers = draw_trackers;
uniform_set.draw_trackers_usage = draw_trackers_usage;
uniform_set.untracked_usage = untracked_usage;
+ uniform_set.shared_textures_to_update = shared_textures_to_update;
uniform_set.shader_set = p_shader_set;
uniform_set.shader_id = p_shader;
@@ -3347,12 +3651,16 @@ Error RenderingDevice::_draw_list_render_pass_begin(Framebuffer *p_framebuffer,
for (int i = 0; i < p_framebuffer->texture_ids.size(); i++) {
RDD::RenderPassClearValue clear_value;
- Texture *texture = texture_owner.get_or_null(p_framebuffer->texture_ids[i]);
+ RID texture_rid = p_framebuffer->texture_ids[i];
+ Texture *texture = texture_owner.get_or_null(texture_rid);
if (!texture) {
color_index++;
continue;
}
+ // Indicate the texture will get modified for the shared texture fallback.
+ _texture_update_shared_fallback(texture_rid, texture, true);
+
if (texture->usage_flags & TEXTURE_USAGE_COLOR_ATTACHMENT_BIT) {
if (color_index < p_clear_colors.size()) {
ERR_FAIL_INDEX_V(color_index, p_clear_colors.size(), ERR_BUG); // A bug.
@@ -3816,6 +4124,8 @@ void RenderingDevice::draw_list_draw(DrawListID p_list, bool p_use_indices, uint
draw_graph.add_draw_list_bind_uniform_set(dl->state.pipeline_shader_driver_id, dl->state.sets[i].uniform_set_driver_id, i);
UniformSet *uniform_set = uniform_set_owner.get_or_null(dl->state.sets[i].uniform_set);
+ _uniform_set_update_shared(uniform_set);
+
draw_graph.add_draw_list_usages(uniform_set->draw_trackers, uniform_set->draw_trackers_usage);
dl->state.sets[i].bound = true;
@@ -4222,6 +4532,8 @@ void RenderingDevice::compute_list_dispatch(ComputeListID p_list, uint32_t p_x_g
draw_graph.add_compute_list_bind_uniform_set(cl->state.pipeline_shader_driver_id, cl->state.sets[i].uniform_set_driver_id, i);
UniformSet *uniform_set = uniform_set_owner.get_or_null(cl->state.sets[i].uniform_set);
+ _uniform_set_update_shared(uniform_set);
+
draw_graph.add_compute_list_usages(uniform_set->draw_trackers, uniform_set->draw_trackers_usage);
cl->state.sets[i].bound = true;
@@ -4329,6 +4641,8 @@ void RenderingDevice::compute_list_dispatch_indirect(ComputeListID p_list, RID p
draw_graph.add_compute_list_bind_uniform_set(cl->state.pipeline_shader_driver_id, cl->state.sets[i].uniform_set_driver_id, i);
UniformSet *uniform_set = uniform_set_owner.get_or_null(cl->state.sets[i].uniform_set);
+ _uniform_set_update_shared(uniform_set);
+
draw_graph.add_compute_list_usages(uniform_set->draw_trackers, uniform_set->draw_trackers_usage);
cl->state.sets[i].bound = true;
@@ -4420,6 +4734,7 @@ bool RenderingDevice::_texture_make_mutable(Texture *p_texture, RID p_texture_id
draw_tracker->parent = owner_texture->draw_tracker;
draw_tracker->texture_driver_id = p_texture->driver_id;
draw_tracker->texture_subresources = p_texture->barrier_range();
+ draw_tracker->texture_usage = p_texture->usage_flags;
draw_tracker->texture_slice_or_dirty_rect = p_texture->slice_rect;
owner_texture->slice_trackers[p_texture->slice_rect] = draw_tracker;
}
@@ -4441,6 +4756,7 @@ bool RenderingDevice::_texture_make_mutable(Texture *p_texture, RID p_texture_id
p_texture->draw_tracker = RDG::resource_tracker_create();
p_texture->draw_tracker->texture_driver_id = p_texture->driver_id;
p_texture->draw_tracker->texture_subresources = p_texture->barrier_range();
+ p_texture->draw_tracker->texture_usage = p_texture->usage_flags;
p_texture->draw_tracker->reference_count = 1;
if (p_texture_id.is_valid()) {
@@ -4837,6 +5153,8 @@ void RenderingDevice::_free_pending_resources(int p_frame) {
WARN_PRINT("Deleted a texture while it was bound.");
}
+ _texture_free_shared_fallback(texture);
+
texture_memory -= driver->texture_get_allocation_size(texture->driver_id);
driver->texture_free(texture->driver_id);
diff --git a/servers/rendering/rendering_device.h b/servers/rendering/rendering_device.h
index d0fa4ab1fa..38ffd5d23d 100644
--- a/servers/rendering/rendering_device.h
+++ b/servers/rendering/rendering_device.h
@@ -207,6 +207,15 @@ public:
// for a framebuffer to render into it.
struct Texture {
+ struct SharedFallback {
+ uint32_t revision = 1;
+ RDD::TextureID texture;
+ RDG::ResourceTracker *texture_tracker = nullptr;
+ RDD::BufferID buffer;
+ RDG::ResourceTracker *buffer_tracker = nullptr;
+ bool raw_reinterpretation = false;
+ };
+
RDD::TextureID driver_id;
TextureType type = TEXTURE_TYPE_MAX;
@@ -235,6 +244,7 @@ public:
RDG::ResourceTracker *draw_tracker = nullptr;
HashMap<Rect2i, RDG::ResourceTracker *> slice_trackers;
+ SharedFallback *shared_fallback = nullptr;
RDD::TextureSubresourceRange barrier_range() const {
RDD::TextureSubresourceRange r;
@@ -245,6 +255,22 @@ public:
r.layer_count = layers;
return r;
}
+
+ TextureFormat texture_format() const {
+ TextureFormat tf;
+ tf.format = format;
+ tf.width = width;
+ tf.height = height;
+ tf.depth = depth;
+ tf.array_layers = layers;
+ tf.mipmaps = mipmaps;
+ tf.texture_type = type;
+ tf.samples = samples;
+ tf.usage_bits = usage_flags;
+ tf.shareable_formats = allowed_shared_formats;
+ tf.is_resolve_buffer = is_resolve_buffer;
+ return tf;
+ }
};
RID_Owner<Texture> texture_owner;
@@ -252,6 +278,11 @@ public:
Vector<uint8_t> _texture_get_data(Texture *tex, uint32_t p_layer, bool p_2d = false);
Error _texture_update(RID p_texture, uint32_t p_layer, const Vector<uint8_t> &p_data, bool p_use_setup_queue, bool p_validate_can_update);
+ void _texture_check_shared_fallback(Texture *p_texture);
+ void _texture_update_shared_fallback(RID p_texture_rid, Texture *p_texture, bool p_for_writing);
+ void _texture_free_shared_fallback(Texture *p_texture);
+ void _texture_copy_shared(RID p_src_texture_rid, Texture *p_src_texture, RID p_dst_texture_rid, Texture *p_dst_texture);
+ void _texture_create_reinterpret_buffer(Texture *p_texture);
public:
struct TextureView {
@@ -916,16 +947,24 @@ private:
RID texture;
};
+ struct SharedTexture {
+ uint32_t writing = 0;
+ RID texture;
+ };
+
LocalVector<AttachableTexture> attachable_textures; // Used for validation.
Vector<RDG::ResourceTracker *> draw_trackers;
Vector<RDG::ResourceUsage> draw_trackers_usage;
HashMap<RID, RDG::ResourceUsage> untracked_usage;
+ LocalVector<SharedTexture> shared_textures_to_update;
InvalidationCallback invalidated_callback = nullptr;
void *invalidated_callback_userdata = nullptr;
};
RID_Owner<UniformSet> uniform_set_owner;
+ void _uniform_set_update_shared(UniformSet *p_uniform_set);
+
public:
RID uniform_set_create(const Vector<Uniform> &p_uniforms, RID p_shader, uint32_t p_shader_set);
bool uniform_set_is_valid(RID p_uniform_set);
diff --git a/servers/rendering/rendering_device_driver.cpp b/servers/rendering/rendering_device_driver.cpp
index be74467340..3b8e3efeb8 100644
--- a/servers/rendering/rendering_device_driver.cpp
+++ b/servers/rendering/rendering_device_driver.cpp
@@ -372,6 +372,8 @@ uint64_t RenderingDeviceDriver::api_trait_get(ApiTrait p_trait) {
return 1;
case API_TRAIT_SECONDARY_VIEWPORT_SCISSOR:
return 1;
+ case API_TRAIT_CLEARS_WITH_COPY_ENGINE:
+ return true;
default:
ERR_FAIL_V(0);
}
diff --git a/servers/rendering/rendering_device_driver.h b/servers/rendering/rendering_device_driver.h
index f9a861426a..0b5fc51a1d 100644
--- a/servers/rendering/rendering_device_driver.h
+++ b/servers/rendering/rendering_device_driver.h
@@ -220,15 +220,17 @@ public:
enum TextureLayout {
TEXTURE_LAYOUT_UNDEFINED,
- TEXTURE_LAYOUT_GENERAL,
+ TEXTURE_LAYOUT_STORAGE_OPTIMAL,
TEXTURE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
TEXTURE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
TEXTURE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,
TEXTURE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
- TEXTURE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- TEXTURE_LAYOUT_TRANSFER_DST_OPTIMAL,
- TEXTURE_LAYOUT_PREINITIALIZED,
- TEXTURE_LAYOUT_VRS_ATTACHMENT_OPTIMAL = 1000164003,
+ TEXTURE_LAYOUT_COPY_SRC_OPTIMAL,
+ TEXTURE_LAYOUT_COPY_DST_OPTIMAL,
+ TEXTURE_LAYOUT_RESOLVE_SRC_OPTIMAL,
+ TEXTURE_LAYOUT_RESOLVE_DST_OPTIMAL,
+ TEXTURE_LAYOUT_VRS_ATTACHMENT_OPTIMAL,
+ TEXTURE_LAYOUT_MAX
};
enum TextureAspect {
@@ -284,6 +286,7 @@ public:
virtual uint8_t *texture_map(TextureID p_texture, const TextureSubresource &p_subresource) = 0;
virtual void texture_unmap(TextureID p_texture) = 0;
virtual BitField<TextureUsageBits> texture_get_usages_supported_by_format(DataFormat p_format, bool p_cpu_readable) = 0;
+ virtual bool texture_can_make_shared_with_format(TextureID p_texture, DataFormat p_format, bool &r_raw_reinterpretation) = 0;
/*****************/
/**** SAMPLER ****/
@@ -317,10 +320,12 @@ public:
PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT = (1 << 9),
PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT = (1 << 10),
PIPELINE_STAGE_COMPUTE_SHADER_BIT = (1 << 11),
- PIPELINE_STAGE_TRANSFER_BIT = (1 << 12),
+ PIPELINE_STAGE_COPY_BIT = (1 << 12),
PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT = (1 << 13),
+ PIPELINE_STAGE_RESOLVE_BIT = (1 << 14),
PIPELINE_STAGE_ALL_GRAPHICS_BIT = (1 << 15),
PIPELINE_STAGE_ALL_COMMANDS_BIT = (1 << 16),
+ PIPELINE_STAGE_CLEAR_STORAGE_BIT = (1 << 17),
};
enum BarrierAccessBits {
@@ -335,13 +340,16 @@ public:
BARRIER_ACCESS_COLOR_ATTACHMENT_WRITE_BIT = (1 << 8),
BARRIER_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT = (1 << 9),
BARRIER_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT = (1 << 10),
- BARRIER_ACCESS_TRANSFER_READ_BIT = (1 << 11),
- BARRIER_ACCESS_TRANSFER_WRITE_BIT = (1 << 12),
+ BARRIER_ACCESS_COPY_READ_BIT = (1 << 11),
+ BARRIER_ACCESS_COPY_WRITE_BIT = (1 << 12),
BARRIER_ACCESS_HOST_READ_BIT = (1 << 13),
BARRIER_ACCESS_HOST_WRITE_BIT = (1 << 14),
BARRIER_ACCESS_MEMORY_READ_BIT = (1 << 15),
BARRIER_ACCESS_MEMORY_WRITE_BIT = (1 << 16),
BARRIER_ACCESS_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT = (1 << 23),
+ BARRIER_ACCESS_RESOLVE_READ_BIT = (1 << 24),
+ BARRIER_ACCESS_RESOLVE_WRITE_BIT = (1 << 25),
+ BARRIER_ACCESS_STORAGE_CLEAR_BIT = (1 << 27),
};
struct MemoryBarrier {
@@ -735,7 +743,9 @@ public:
API_TRAIT_TEXTURE_TRANSFER_ALIGNMENT,
API_TRAIT_TEXTURE_DATA_ROW_PITCH_STEP,
API_TRAIT_SECONDARY_VIEWPORT_SCISSOR,
+ API_TRAIT_CLEARS_WITH_COPY_ENGINE,
};
+
enum ShaderChangeInvalidation {
SHADER_CHANGE_INVALIDATION_ALL_BOUND_UNIFORM_SETS,
// What Vulkan does.
diff --git a/servers/rendering/rendering_device_graph.cpp b/servers/rendering/rendering_device_graph.cpp
index c7de5c67cb..221ec72e4a 100644
--- a/servers/rendering/rendering_device_graph.cpp
+++ b/servers/rendering/rendering_device_graph.cpp
@@ -36,7 +36,8 @@
#define PRINT_COMMAND_RECORDING 0
RenderingDeviceGraph::RenderingDeviceGraph() {
- // Default initialization.
+ driver_honors_barriers = false;
+ driver_clears_with_copy_engine = false;
}
RenderingDeviceGraph::~RenderingDeviceGraph() {
@@ -44,7 +45,8 @@ RenderingDeviceGraph::~RenderingDeviceGraph() {
bool RenderingDeviceGraph::_is_write_usage(ResourceUsage p_usage) {
switch (p_usage) {
- case RESOURCE_USAGE_TRANSFER_FROM:
+ case RESOURCE_USAGE_COPY_FROM:
+ case RESOURCE_USAGE_RESOLVE_FROM:
case RESOURCE_USAGE_UNIFORM_BUFFER_READ:
case RESOURCE_USAGE_INDIRECT_BUFFER_READ:
case RESOURCE_USAGE_TEXTURE_BUFFER_READ:
@@ -54,7 +56,8 @@ bool RenderingDeviceGraph::_is_write_usage(ResourceUsage p_usage) {
case RESOURCE_USAGE_TEXTURE_SAMPLE:
case RESOURCE_USAGE_STORAGE_IMAGE_READ:
return false;
- case RESOURCE_USAGE_TRANSFER_TO:
+ case RESOURCE_USAGE_COPY_TO:
+ case RESOURCE_USAGE_RESOLVE_TO:
case RESOURCE_USAGE_TEXTURE_BUFFER_READ_WRITE:
case RESOURCE_USAGE_STORAGE_BUFFER_READ_WRITE:
case RESOURCE_USAGE_STORAGE_IMAGE_READ_WRITE:
@@ -69,15 +72,19 @@ bool RenderingDeviceGraph::_is_write_usage(ResourceUsage p_usage) {
RDD::TextureLayout RenderingDeviceGraph::_usage_to_image_layout(ResourceUsage p_usage) {
switch (p_usage) {
- case RESOURCE_USAGE_TRANSFER_FROM:
- return RDD::TEXTURE_LAYOUT_TRANSFER_SRC_OPTIMAL;
- case RESOURCE_USAGE_TRANSFER_TO:
- return RDD::TEXTURE_LAYOUT_TRANSFER_DST_OPTIMAL;
+ case RESOURCE_USAGE_COPY_FROM:
+ return RDD::TEXTURE_LAYOUT_COPY_SRC_OPTIMAL;
+ case RESOURCE_USAGE_COPY_TO:
+ return RDD::TEXTURE_LAYOUT_COPY_DST_OPTIMAL;
+ case RESOURCE_USAGE_RESOLVE_FROM:
+ return RDD::TEXTURE_LAYOUT_RESOLVE_SRC_OPTIMAL;
+ case RESOURCE_USAGE_RESOLVE_TO:
+ return RDD::TEXTURE_LAYOUT_RESOLVE_DST_OPTIMAL;
case RESOURCE_USAGE_TEXTURE_SAMPLE:
return RDD::TEXTURE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
case RESOURCE_USAGE_STORAGE_IMAGE_READ:
case RESOURCE_USAGE_STORAGE_IMAGE_READ_WRITE:
- return RDD::TEXTURE_LAYOUT_GENERAL;
+ return RDD::TEXTURE_LAYOUT_STORAGE_OPTIMAL;
case RESOURCE_USAGE_ATTACHMENT_COLOR_READ_WRITE:
return RDD::TEXTURE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
case RESOURCE_USAGE_ATTACHMENT_DEPTH_STENCIL_READ_WRITE:
@@ -97,10 +104,14 @@ RDD::BarrierAccessBits RenderingDeviceGraph::_usage_to_access_bits(ResourceUsage
switch (p_usage) {
case RESOURCE_USAGE_NONE:
return RDD::BarrierAccessBits(0);
- case RESOURCE_USAGE_TRANSFER_FROM:
- return RDD::BARRIER_ACCESS_TRANSFER_READ_BIT;
- case RESOURCE_USAGE_TRANSFER_TO:
- return RDD::BARRIER_ACCESS_TRANSFER_WRITE_BIT;
+ case RESOURCE_USAGE_COPY_FROM:
+ return RDD::BARRIER_ACCESS_COPY_READ_BIT;
+ case RESOURCE_USAGE_COPY_TO:
+ return RDD::BARRIER_ACCESS_COPY_WRITE_BIT;
+ case RESOURCE_USAGE_RESOLVE_FROM:
+ return RDD::BARRIER_ACCESS_RESOLVE_READ_BIT;
+ case RESOURCE_USAGE_RESOLVE_TO:
+ return RDD::BARRIER_ACCESS_RESOLVE_WRITE_BIT;
case RESOURCE_USAGE_UNIFORM_BUFFER_READ:
return RDD::BARRIER_ACCESS_UNIFORM_READ_BIT;
case RESOURCE_USAGE_INDIRECT_BUFFER_READ:
@@ -818,26 +829,27 @@ void RenderingDeviceGraph::_run_render_commands(int32_t p_level, const RecordedC
} break;
case RecordedCommand::TYPE_TEXTURE_CLEAR: {
const RecordedTextureClearCommand *texture_clear_command = reinterpret_cast<const RecordedTextureClearCommand *>(command);
- driver->command_clear_color_texture(r_command_buffer, texture_clear_command->texture, RDD::TEXTURE_LAYOUT_TRANSFER_DST_OPTIMAL, texture_clear_command->color, texture_clear_command->range);
+ driver->command_clear_color_texture(r_command_buffer, texture_clear_command->texture, RDD::TEXTURE_LAYOUT_COPY_DST_OPTIMAL, texture_clear_command->color, texture_clear_command->range);
} break;
case RecordedCommand::TYPE_TEXTURE_COPY: {
const RecordedTextureCopyCommand *texture_copy_command = reinterpret_cast<const RecordedTextureCopyCommand *>(command);
- driver->command_copy_texture(r_command_buffer, texture_copy_command->from_texture, RDD::TEXTURE_LAYOUT_TRANSFER_SRC_OPTIMAL, texture_copy_command->to_texture, RDD::TEXTURE_LAYOUT_TRANSFER_DST_OPTIMAL, texture_copy_command->region);
+ const VectorView<RDD::TextureCopyRegion> command_texture_copy_regions_view(texture_copy_command->texture_copy_regions(), texture_copy_command->texture_copy_regions_count);
+ driver->command_copy_texture(r_command_buffer, texture_copy_command->from_texture, RDD::TEXTURE_LAYOUT_COPY_SRC_OPTIMAL, texture_copy_command->to_texture, RDD::TEXTURE_LAYOUT_COPY_DST_OPTIMAL, command_texture_copy_regions_view);
} break;
case RecordedCommand::TYPE_TEXTURE_GET_DATA: {
const RecordedTextureGetDataCommand *texture_get_data_command = reinterpret_cast<const RecordedTextureGetDataCommand *>(command);
const VectorView<RDD::BufferTextureCopyRegion> command_buffer_texture_copy_regions_view(texture_get_data_command->buffer_texture_copy_regions(), texture_get_data_command->buffer_texture_copy_regions_count);
- driver->command_copy_texture_to_buffer(r_command_buffer, texture_get_data_command->from_texture, RDD::TEXTURE_LAYOUT_TRANSFER_SRC_OPTIMAL, texture_get_data_command->to_buffer, command_buffer_texture_copy_regions_view);
+ driver->command_copy_texture_to_buffer(r_command_buffer, texture_get_data_command->from_texture, RDD::TEXTURE_LAYOUT_COPY_SRC_OPTIMAL, texture_get_data_command->to_buffer, command_buffer_texture_copy_regions_view);
} break;
case RecordedCommand::TYPE_TEXTURE_RESOLVE: {
const RecordedTextureResolveCommand *texture_resolve_command = reinterpret_cast<const RecordedTextureResolveCommand *>(command);
- driver->command_resolve_texture(r_command_buffer, texture_resolve_command->from_texture, RDD::TEXTURE_LAYOUT_TRANSFER_SRC_OPTIMAL, texture_resolve_command->src_layer, texture_resolve_command->src_mipmap, texture_resolve_command->to_texture, RDD::TEXTURE_LAYOUT_TRANSFER_DST_OPTIMAL, texture_resolve_command->dst_layer, texture_resolve_command->dst_mipmap);
+ driver->command_resolve_texture(r_command_buffer, texture_resolve_command->from_texture, RDD::TEXTURE_LAYOUT_RESOLVE_SRC_OPTIMAL, texture_resolve_command->src_layer, texture_resolve_command->src_mipmap, texture_resolve_command->to_texture, RDD::TEXTURE_LAYOUT_RESOLVE_DST_OPTIMAL, texture_resolve_command->dst_layer, texture_resolve_command->dst_mipmap);
} break;
case RecordedCommand::TYPE_TEXTURE_UPDATE: {
const RecordedTextureUpdateCommand *texture_update_command = reinterpret_cast<const RecordedTextureUpdateCommand *>(command);
const RecordedBufferToTextureCopy *command_buffer_to_texture_copies = texture_update_command->buffer_to_texture_copies();
for (uint32_t j = 0; j < texture_update_command->buffer_to_texture_copies_count; j++) {
- driver->command_copy_buffer_to_texture(r_command_buffer, command_buffer_to_texture_copies[j].from_buffer, texture_update_command->to_texture, RDD::TEXTURE_LAYOUT_TRANSFER_DST_OPTIMAL, command_buffer_to_texture_copies[j].region);
+ driver->command_copy_buffer_to_texture(r_command_buffer, command_buffer_to_texture_copies[j].from_buffer, texture_update_command->to_texture, RDD::TEXTURE_LAYOUT_COPY_DST_OPTIMAL, command_buffer_to_texture_copies[j].region);
}
} break;
case RecordedCommand::TYPE_CAPTURE_TIMESTAMP: {
@@ -1271,6 +1283,7 @@ void RenderingDeviceGraph::initialize(RDD *p_driver, RenderingContextDriver::Dev
}
driver_honors_barriers = driver->api_trait_get(RDD::API_TRAIT_HONORS_PIPELINE_BARRIERS);
+ driver_clears_with_copy_engine = driver->api_trait_get(RDD::API_TRAIT_CLEARS_WITH_COPY_ENGINE);
}
void RenderingDeviceGraph::finalize() {
@@ -1321,12 +1334,12 @@ void RenderingDeviceGraph::add_buffer_clear(RDD::BufferID p_dst, ResourceTracker
int32_t command_index;
RecordedBufferClearCommand *command = static_cast<RecordedBufferClearCommand *>(_allocate_command(sizeof(RecordedBufferClearCommand), command_index));
command->type = RecordedCommand::TYPE_BUFFER_CLEAR;
- command->self_stages = RDD::PIPELINE_STAGE_TRANSFER_BIT;
+ command->self_stages = RDD::PIPELINE_STAGE_COPY_BIT;
command->buffer = p_dst;
command->offset = p_offset;
command->size = p_size;
- ResourceUsage usage = RESOURCE_USAGE_TRANSFER_TO;
+ ResourceUsage usage = RESOURCE_USAGE_COPY_TO;
_add_command_to_graph(&p_dst_tracker, &usage, 1, command_index, command);
}
@@ -1337,13 +1350,13 @@ void RenderingDeviceGraph::add_buffer_copy(RDD::BufferID p_src, ResourceTracker
int32_t command_index;
RecordedBufferCopyCommand *command = static_cast<RecordedBufferCopyCommand *>(_allocate_command(sizeof(RecordedBufferCopyCommand), command_index));
command->type = RecordedCommand::TYPE_BUFFER_COPY;
- command->self_stages = RDD::PIPELINE_STAGE_TRANSFER_BIT;
+ command->self_stages = RDD::PIPELINE_STAGE_COPY_BIT;
command->source = p_src;
command->destination = p_dst;
command->region = p_region;
ResourceTracker *trackers[2] = { p_dst_tracker, p_src_tracker };
- ResourceUsage usages[2] = { RESOURCE_USAGE_TRANSFER_TO, RESOURCE_USAGE_TRANSFER_FROM };
+ ResourceUsage usages[2] = { RESOURCE_USAGE_COPY_TO, RESOURCE_USAGE_COPY_FROM };
_add_command_to_graph(trackers, usages, p_src_tracker != nullptr ? 2 : 1, command_index, command);
}
@@ -1352,13 +1365,13 @@ void RenderingDeviceGraph::add_buffer_get_data(RDD::BufferID p_src, ResourceTrac
int32_t command_index;
RecordedBufferGetDataCommand *command = static_cast<RecordedBufferGetDataCommand *>(_allocate_command(sizeof(RecordedBufferGetDataCommand), command_index));
command->type = RecordedCommand::TYPE_BUFFER_GET_DATA;
- command->self_stages = RDD::PIPELINE_STAGE_TRANSFER_BIT;
+ command->self_stages = RDD::PIPELINE_STAGE_COPY_BIT;
command->source = p_src;
command->destination = p_dst;
command->region = p_region;
if (p_src_tracker != nullptr) {
- ResourceUsage usage = RESOURCE_USAGE_TRANSFER_FROM;
+ ResourceUsage usage = RESOURCE_USAGE_COPY_FROM;
_add_command_to_graph(&p_src_tracker, &usage, 1, command_index, command);
} else {
_add_command_to_graph(nullptr, nullptr, 0, command_index, command);
@@ -1373,7 +1386,7 @@ void RenderingDeviceGraph::add_buffer_update(RDD::BufferID p_dst, ResourceTracke
int32_t command_index;
RecordedBufferUpdateCommand *command = static_cast<RecordedBufferUpdateCommand *>(_allocate_command(command_size, command_index));
command->type = RecordedCommand::TYPE_BUFFER_UPDATE;
- command->self_stages = RDD::PIPELINE_STAGE_TRANSFER_BIT;
+ command->self_stages = RDD::PIPELINE_STAGE_COPY_BIT;
command->destination = p_dst;
command->buffer_copies_count = p_buffer_copies.size();
@@ -1382,7 +1395,7 @@ void RenderingDeviceGraph::add_buffer_update(RDD::BufferID p_dst, ResourceTracke
buffer_copies[i] = p_buffer_copies[i];
}
- ResourceUsage buffer_usage = RESOURCE_USAGE_TRANSFER_TO;
+ ResourceUsage buffer_usage = RESOURCE_USAGE_COPY_TO;
_add_command_to_graph(&p_dst_tracker, &buffer_usage, 1, command_index, command);
}
@@ -1710,40 +1723,60 @@ void RenderingDeviceGraph::add_texture_clear(RDD::TextureID p_dst, ResourceTrack
int32_t command_index;
RecordedTextureClearCommand *command = static_cast<RecordedTextureClearCommand *>(_allocate_command(sizeof(RecordedTextureClearCommand), command_index));
command->type = RecordedCommand::TYPE_TEXTURE_CLEAR;
- command->self_stages = RDD::PIPELINE_STAGE_TRANSFER_BIT;
command->texture = p_dst;
command->color = p_color;
command->range = p_range;
- ResourceUsage usage = RESOURCE_USAGE_TRANSFER_TO;
+ ResourceUsage usage;
+ if (driver_clears_with_copy_engine) {
+ command->self_stages = RDD::PIPELINE_STAGE_COPY_BIT;
+ usage = RESOURCE_USAGE_COPY_TO;
+ } else {
+ // If the driver is uncapable of using the copy engine for clearing the image (e.g. D3D12), we must either transition the
+ // resource to a render target or a storage image as that's the only two ways it can perform the operation.
+ if (p_dst_tracker->texture_usage & RDD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT) {
+ command->self_stages = RDD::PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
+ usage = RESOURCE_USAGE_ATTACHMENT_COLOR_READ_WRITE;
+ } else {
+ command->self_stages = RDD::PIPELINE_STAGE_CLEAR_STORAGE_BIT;
+ usage = RESOURCE_USAGE_STORAGE_IMAGE_READ_WRITE;
+ }
+ }
+
_add_command_to_graph(&p_dst_tracker, &usage, 1, command_index, command);
}
-void RenderingDeviceGraph::add_texture_copy(RDD::TextureID p_src, ResourceTracker *p_src_tracker, RDD::TextureID p_dst, ResourceTracker *p_dst_tracker, RDD::TextureCopyRegion p_region) {
+void RenderingDeviceGraph::add_texture_copy(RDD::TextureID p_src, ResourceTracker *p_src_tracker, RDD::TextureID p_dst, ResourceTracker *p_dst_tracker, VectorView<RDD::TextureCopyRegion> p_texture_copy_regions) {
DEV_ASSERT(p_src_tracker != nullptr);
DEV_ASSERT(p_dst_tracker != nullptr);
int32_t command_index;
- RecordedTextureCopyCommand *command = static_cast<RecordedTextureCopyCommand *>(_allocate_command(sizeof(RecordedTextureCopyCommand), command_index));
+ uint64_t command_size = sizeof(RecordedTextureCopyCommand) + p_texture_copy_regions.size() * sizeof(RDD::TextureCopyRegion);
+ RecordedTextureCopyCommand *command = static_cast<RecordedTextureCopyCommand *>(_allocate_command(command_size, command_index));
command->type = RecordedCommand::TYPE_TEXTURE_COPY;
- command->self_stages = RDD::PIPELINE_STAGE_TRANSFER_BIT;
+ command->self_stages = RDD::PIPELINE_STAGE_COPY_BIT;
command->from_texture = p_src;
command->to_texture = p_dst;
- command->region = p_region;
+ command->texture_copy_regions_count = p_texture_copy_regions.size();
+
+ RDD::TextureCopyRegion *texture_copy_regions = command->texture_copy_regions();
+ for (uint32_t i = 0; i < command->texture_copy_regions_count; i++) {
+ texture_copy_regions[i] = p_texture_copy_regions[i];
+ }
ResourceTracker *trackers[2] = { p_dst_tracker, p_src_tracker };
- ResourceUsage usages[2] = { RESOURCE_USAGE_TRANSFER_TO, RESOURCE_USAGE_TRANSFER_FROM };
+ ResourceUsage usages[2] = { RESOURCE_USAGE_COPY_TO, RESOURCE_USAGE_COPY_FROM };
_add_command_to_graph(trackers, usages, 2, command_index, command);
}
-void RenderingDeviceGraph::add_texture_get_data(RDD::TextureID p_src, ResourceTracker *p_src_tracker, RDD::BufferID p_dst, VectorView<RDD::BufferTextureCopyRegion> p_buffer_texture_copy_regions) {
+void RenderingDeviceGraph::add_texture_get_data(RDD::TextureID p_src, ResourceTracker *p_src_tracker, RDD::BufferID p_dst, VectorView<RDD::BufferTextureCopyRegion> p_buffer_texture_copy_regions, ResourceTracker *p_dst_tracker) {
DEV_ASSERT(p_src_tracker != nullptr);
int32_t command_index;
uint64_t command_size = sizeof(RecordedTextureGetDataCommand) + p_buffer_texture_copy_regions.size() * sizeof(RDD::BufferTextureCopyRegion);
RecordedTextureGetDataCommand *command = static_cast<RecordedTextureGetDataCommand *>(_allocate_command(command_size, command_index));
command->type = RecordedCommand::TYPE_TEXTURE_GET_DATA;
- command->self_stages = RDD::PIPELINE_STAGE_TRANSFER_BIT;
+ command->self_stages = RDD::PIPELINE_STAGE_COPY_BIT;
command->from_texture = p_src;
command->to_buffer = p_dst;
command->buffer_texture_copy_regions_count = p_buffer_texture_copy_regions.size();
@@ -1753,8 +1786,15 @@ void RenderingDeviceGraph::add_texture_get_data(RDD::TextureID p_src, ResourceTr
buffer_texture_copy_regions[i] = p_buffer_texture_copy_regions[i];
}
- ResourceUsage usage = RESOURCE_USAGE_TRANSFER_FROM;
- _add_command_to_graph(&p_src_tracker, &usage, 1, command_index, command);
+ if (p_dst_tracker != nullptr) {
+ // Add the optional destination tracker if it was provided.
+ ResourceTracker *trackers[2] = { p_dst_tracker, p_src_tracker };
+ ResourceUsage usages[2] = { RESOURCE_USAGE_COPY_TO, RESOURCE_USAGE_COPY_FROM };
+ _add_command_to_graph(trackers, usages, 2, command_index, command);
+ } else {
+ ResourceUsage usage = RESOURCE_USAGE_COPY_FROM;
+ _add_command_to_graph(&p_src_tracker, &usage, 1, command_index, command);
+ }
}
void RenderingDeviceGraph::add_texture_resolve(RDD::TextureID p_src, ResourceTracker *p_src_tracker, RDD::TextureID p_dst, ResourceTracker *p_dst_tracker, uint32_t p_src_layer, uint32_t p_src_mipmap, uint32_t p_dst_layer, uint32_t p_dst_mipmap) {
@@ -1764,7 +1804,7 @@ void RenderingDeviceGraph::add_texture_resolve(RDD::TextureID p_src, ResourceTra
int32_t command_index;
RecordedTextureResolveCommand *command = static_cast<RecordedTextureResolveCommand *>(_allocate_command(sizeof(RecordedTextureResolveCommand), command_index));
command->type = RecordedCommand::TYPE_TEXTURE_RESOLVE;
- command->self_stages = RDD::PIPELINE_STAGE_TRANSFER_BIT;
+ command->self_stages = RDD::PIPELINE_STAGE_RESOLVE_BIT;
command->from_texture = p_src;
command->to_texture = p_dst;
command->src_layer = p_src_layer;
@@ -1773,18 +1813,18 @@ void RenderingDeviceGraph::add_texture_resolve(RDD::TextureID p_src, ResourceTra
command->dst_mipmap = p_dst_mipmap;
ResourceTracker *trackers[2] = { p_dst_tracker, p_src_tracker };
- ResourceUsage usages[2] = { RESOURCE_USAGE_TRANSFER_TO, RESOURCE_USAGE_TRANSFER_FROM };
+ ResourceUsage usages[2] = { RESOURCE_USAGE_RESOLVE_TO, RESOURCE_USAGE_RESOLVE_FROM };
_add_command_to_graph(trackers, usages, 2, command_index, command);
}
-void RenderingDeviceGraph::add_texture_update(RDD::TextureID p_dst, ResourceTracker *p_dst_tracker, VectorView<RecordedBufferToTextureCopy> p_buffer_copies) {
+void RenderingDeviceGraph::add_texture_update(RDD::TextureID p_dst, ResourceTracker *p_dst_tracker, VectorView<RecordedBufferToTextureCopy> p_buffer_copies, VectorView<ResourceTracker *> p_buffer_trackers) {
DEV_ASSERT(p_dst_tracker != nullptr);
int32_t command_index;
uint64_t command_size = sizeof(RecordedTextureUpdateCommand) + p_buffer_copies.size() * sizeof(RecordedBufferToTextureCopy);
RecordedTextureUpdateCommand *command = static_cast<RecordedTextureUpdateCommand *>(_allocate_command(command_size, command_index));
command->type = RecordedCommand::TYPE_TEXTURE_UPDATE;
- command->self_stages = RDD::PIPELINE_STAGE_TRANSFER_BIT;
+ command->self_stages = RDD::PIPELINE_STAGE_COPY_BIT;
command->to_texture = p_dst;
command->buffer_to_texture_copies_count = p_buffer_copies.size();
@@ -1793,8 +1833,25 @@ void RenderingDeviceGraph::add_texture_update(RDD::TextureID p_dst, ResourceTrac
buffer_to_texture_copies[i] = p_buffer_copies[i];
}
- ResourceUsage usage = RESOURCE_USAGE_TRANSFER_TO;
- _add_command_to_graph(&p_dst_tracker, &usage, 1, command_index, command);
+ if (p_buffer_trackers.size() > 0) {
+ // Add the optional buffer trackers if they were provided.
+ thread_local LocalVector<ResourceTracker *> trackers;
+ thread_local LocalVector<ResourceUsage> usages;
+ trackers.clear();
+ usages.clear();
+ for (uint32_t i = 0; i < p_buffer_trackers.size(); i++) {
+ trackers.push_back(p_buffer_trackers[i]);
+ usages.push_back(RESOURCE_USAGE_COPY_FROM);
+ }
+
+ trackers.push_back(p_dst_tracker);
+ usages.push_back(RESOURCE_USAGE_COPY_TO);
+
+ _add_command_to_graph(trackers.ptr(), usages.ptr(), trackers.size(), command_index, command);
+ } else {
+ ResourceUsage usage = RESOURCE_USAGE_COPY_TO;
+ _add_command_to_graph(&p_dst_tracker, &usage, 1, command_index, command);
+ }
}
void RenderingDeviceGraph::add_capture_timestamp(RDD::QueryPoolID p_query_pool, uint32_t p_index) {
diff --git a/servers/rendering/rendering_device_graph.h b/servers/rendering/rendering_device_graph.h
index a96382e0cc..baa15f63f6 100644
--- a/servers/rendering/rendering_device_graph.h
+++ b/servers/rendering/rendering_device_graph.h
@@ -129,8 +129,10 @@ public:
enum ResourceUsage {
RESOURCE_USAGE_NONE,
- RESOURCE_USAGE_TRANSFER_FROM,
- RESOURCE_USAGE_TRANSFER_TO,
+ RESOURCE_USAGE_COPY_FROM,
+ RESOURCE_USAGE_COPY_TO,
+ RESOURCE_USAGE_RESOLVE_FROM,
+ RESOURCE_USAGE_RESOLVE_TO,
RESOURCE_USAGE_UNIFORM_BUFFER_READ,
RESOURCE_USAGE_INDIRECT_BUFFER_READ,
RESOURCE_USAGE_TEXTURE_BUFFER_READ,
@@ -161,6 +163,7 @@ public:
RDD::BufferID buffer_driver_id;
RDD::TextureID texture_driver_id;
RDD::TextureSubresourceRange texture_subresources;
+ uint32_t texture_usage = 0;
int32_t texture_slice_command_index = -1;
ResourceTracker *parent = nullptr;
ResourceTracker *dirty_shared_list = nullptr;
@@ -337,7 +340,15 @@ private:
struct RecordedTextureCopyCommand : RecordedCommand {
RDD::TextureID from_texture;
RDD::TextureID to_texture;
- RDD::TextureCopyRegion region;
+ uint32_t texture_copy_regions_count = 0;
+
+ _FORCE_INLINE_ RDD::TextureCopyRegion *texture_copy_regions() {
+ return reinterpret_cast<RDD::TextureCopyRegion *>(&this[1]);
+ }
+
+ _FORCE_INLINE_ const RDD::TextureCopyRegion *texture_copy_regions() const {
+ return reinterpret_cast<const RDD::TextureCopyRegion *>(&this[1]);
+ }
};
struct RecordedTextureGetDataCommand : RecordedCommand {
@@ -596,7 +607,8 @@ private:
int32_t command_synchronization_index = -1;
bool command_synchronization_pending = false;
BarrierGroup barrier_group;
- bool driver_honors_barriers = false;
+ bool driver_honors_barriers : 1;
+ bool driver_clears_with_copy_engine : 1;
WorkaroundsState workarounds_state;
TightLocalVector<Frame> frames;
uint32_t frame = 0;
@@ -672,10 +684,10 @@ public:
void add_draw_list_usages(VectorView<ResourceTracker *> p_trackers, VectorView<ResourceUsage> p_usages);
void add_draw_list_end();
void add_texture_clear(RDD::TextureID p_dst, ResourceTracker *p_dst_tracker, const Color &p_color, const RDD::TextureSubresourceRange &p_range);
- void add_texture_copy(RDD::TextureID p_src, ResourceTracker *p_src_tracker, RDD::TextureID p_dst, ResourceTracker *p_dst_tracker, RDD::TextureCopyRegion p_region);
- void add_texture_get_data(RDD::TextureID p_src, ResourceTracker *p_src_tracker, RDD::BufferID p_dst, VectorView<RDD::BufferTextureCopyRegion> p_buffer_texture_copy_regions);
+ void add_texture_copy(RDD::TextureID p_src, ResourceTracker *p_src_tracker, RDD::TextureID p_dst, ResourceTracker *p_dst_tracker, VectorView<RDD::TextureCopyRegion> p_texture_copy_regions);
+ void add_texture_get_data(RDD::TextureID p_src, ResourceTracker *p_src_tracker, RDD::BufferID p_dst, VectorView<RDD::BufferTextureCopyRegion> p_buffer_texture_copy_regions, ResourceTracker *p_dst_tracker = nullptr);
void add_texture_resolve(RDD::TextureID p_src, ResourceTracker *p_src_tracker, RDD::TextureID p_dst, ResourceTracker *p_dst_tracker, uint32_t p_src_layer, uint32_t p_src_mipmap, uint32_t p_dst_layer, uint32_t p_dst_mipmap);
- void add_texture_update(RDD::TextureID p_dst, ResourceTracker *p_dst_tracker, VectorView<RecordedBufferToTextureCopy> p_buffer_copies);
+ void add_texture_update(RDD::TextureID p_dst, ResourceTracker *p_dst_tracker, VectorView<RecordedBufferToTextureCopy> p_buffer_copies, VectorView<ResourceTracker *> p_buffer_trackers = VectorView<ResourceTracker *>());
void add_capture_timestamp(RDD::QueryPoolID p_query_pool, uint32_t p_index);
void add_synchronization();
void begin_label(const String &p_label_name, const Color &p_color);
diff --git a/servers/rendering/shader_language.cpp b/servers/rendering/shader_language.cpp
index 1a4c8ea742..9aa54d0bb7 100644
--- a/servers/rendering/shader_language.cpp
+++ b/servers/rendering/shader_language.cpp
@@ -3067,6 +3067,8 @@ const ShaderLanguage::BuiltinFuncDef ShaderLanguage::builtin_func_defs[] = {
{ nullptr, TYPE_VOID, { TYPE_VOID }, { "" }, TAG_GLOBAL, false }
};
+HashSet<StringName> global_func_set;
+
const ShaderLanguage::BuiltinFuncOutArgs ShaderLanguage::builtin_func_out_args[] = {
{ "modf", { 1, -1 } },
{ "umulExtended", { 2, 3 } },
@@ -9211,7 +9213,7 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f
return ERR_PARSE_ERROR;
}
- if (shader->structs.has(name) || _find_identifier(nullptr, false, constants, name) || has_builtin(p_functions, name)) {
+ if (shader->structs.has(name) || _find_identifier(nullptr, false, constants, name) || has_builtin(p_functions, name, !is_constant)) {
_set_redefinition_error(String(name));
return ERR_PARSE_ERROR;
}
@@ -9831,7 +9833,11 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f
return OK;
}
-bool ShaderLanguage::has_builtin(const HashMap<StringName, ShaderLanguage::FunctionInfo> &p_functions, const StringName &p_name) {
+bool ShaderLanguage::has_builtin(const HashMap<StringName, ShaderLanguage::FunctionInfo> &p_functions, const StringName &p_name, bool p_check_global_funcs) {
+ if (p_check_global_funcs && global_func_set.has(p_name)) {
+ return true;
+ }
+
for (const KeyValue<StringName, ShaderLanguage::FunctionInfo> &E : p_functions) {
if (E.value.built_ins.has(p_name)) {
return true;
@@ -10701,6 +10707,18 @@ ShaderLanguage::ShaderLanguage() {
nodes = nullptr;
completion_class = TAG_GLOBAL;
+ int idx = 0;
+ while (builtin_func_defs[idx].name) {
+ if (builtin_func_defs[idx].tag == SubClassTag::TAG_GLOBAL) {
+ const StringName &name = StringName(builtin_func_defs[idx].name);
+
+ if (!global_func_set.has(name)) {
+ global_func_set.insert(name);
+ }
+ }
+ idx++;
+ }
+
#ifdef DEBUG_ENABLED
warnings_check_map.insert(ShaderWarning::UNUSED_CONSTANT, &used_constants);
warnings_check_map.insert(ShaderWarning::UNUSED_FUNCTION, &used_functions);
diff --git a/servers/rendering/shader_language.h b/servers/rendering/shader_language.h
index 38f304ff31..5615d7f457 100644
--- a/servers/rendering/shader_language.h
+++ b/servers/rendering/shader_language.h
@@ -884,7 +884,7 @@ public:
bool can_discard = false;
bool main_function = false;
};
- static bool has_builtin(const HashMap<StringName, ShaderLanguage::FunctionInfo> &p_functions, const StringName &p_name);
+ static bool has_builtin(const HashMap<StringName, ShaderLanguage::FunctionInfo> &p_functions, const StringName &p_name, bool p_check_global_funcs = false);
typedef DataType (*GlobalShaderUniformGetTypeFunc)(const StringName &p_name);
diff --git a/thirdparty/thorvg/inc/config.h b/thirdparty/thorvg/inc/config.h
index 3ae166cf22..9c83f25c79 100644
--- a/thirdparty/thorvg/inc/config.h
+++ b/thirdparty/thorvg/inc/config.h
@@ -13,5 +13,5 @@
// For internal debugging:
//#define THORVG_LOG_ENABLED
-#define THORVG_VERSION_STRING "0.13.3"
+#define THORVG_VERSION_STRING "0.13.5"
#endif
diff --git a/thirdparty/thorvg/inc/thorvg.h b/thirdparty/thorvg/inc/thorvg.h
index 93ce18197e..f7396050d7 100644
--- a/thirdparty/thorvg/inc/thorvg.h
+++ b/thirdparty/thorvg/inc/thorvg.h
@@ -650,6 +650,30 @@ public:
virtual Result draw() noexcept;
/**
+ * @brief Sets the drawing region in the canvas.
+ *
+ * This function defines the rectangular area of the canvas that will be used for drawing operations.
+ * The specified viewport is used to clip the rendering output to the boundaries of the rectangle.
+ *
+ * @param[in] x The x-coordinate of the upper-left corner of the rectangle.
+ * @param[in] y The y-coordinate of the upper-left corner of the rectangle.
+ * @param[in] w The width of the rectangle.
+ * @param[in] h The height of the rectangle.
+ *
+ * @retval Result::Success when succeed, Result::InsufficientCondition otherwise.
+ *
+ * @see SwCanvas::target()
+ * @see GlCanvas::target()
+ * @see WgCanvas::target()
+ *
+ * @warning It's not allowed to change the viewport during Canvas::push() - Canvas::sync() or Canvas::update() - Canvas::sync().
+ *
+ * @note When resetting the target, the viewport will also be reset to the target size.
+ * @note Experimental API
+ */
+ virtual Result viewport(int32_t x, int32_t y, int32_t w, int32_t h) noexcept;
+
+ /**
* @brief Guarantees that drawing task is finished.
*
* The Canvas rendering can be performed asynchronously. To make sure that rendering is finished,
@@ -1660,7 +1684,9 @@ public:
* @retval Result::InvalidArguments In case no valid pointer is provided or the width, or the height or the stride is zero.
* @retval Result::NonSupport In case the software engine is not supported.
*
- * @warning Do not access @p buffer during Canvas::draw() - Canvas::sync(). It should not be accessed while TVG is writing on it.
+ * @warning Do not access @p buffer during Canvas::push() - Canvas::sync(). It should not be accessed while the engine is writing on it.
+ *
+ * @see Canvas::viewport()
*/
Result target(uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t h, Colorspace cs) noexcept;
@@ -1726,6 +1752,8 @@ public:
* @warning This API is experimental and not officially supported. It may be modified or removed in future versions.
* @warning Drawing on the main surface is currently not permitted. If the identifier (@p id) is set to @c 0, the operation will be aborted.
*
+ * @see Canvas::viewport()
+ *
* @note Currently, this only allows the GL_RGBA8 color space format.
* @note Experimental API
*/
@@ -1764,6 +1792,7 @@ public:
* @warning Please do not use it, this API is not official one. It could be modified in the next version.
*
* @note Experimental API
+ * @see Canvas::viewport()
*/
Result target(void* window, uint32_t w, uint32_t h) noexcept;
@@ -1856,6 +1885,7 @@ public:
*
* @note For efficiency, ThorVG ignores updates to the new frame value if the difference from the current frame value
* is less than 0.001. In such cases, it returns @c Result::InsufficientCondition.
+ * Values less than 0.001 may be disregarded and may not be accurately retained by the Animation.
*
* @see totalFrame()
*
diff --git a/thirdparty/thorvg/src/common/tvgMath.h b/thirdparty/thorvg/src/common/tvgMath.h
index 60ea1d21b0..5c2966956a 100644
--- a/thirdparty/thorvg/src/common/tvgMath.h
+++ b/thirdparty/thorvg/src/common/tvgMath.h
@@ -31,6 +31,7 @@
#define MATH_PI 3.14159265358979323846f
#define MATH_PI2 1.57079632679489661923f
+#define FLOAT_EPSILON 1.0e-06f //1.192092896e-07f
#define PATH_KAPPA 0.552284f
#define mathMin(x, y) (((x) < (y)) ? (x) : (y))
@@ -58,13 +59,19 @@ static inline float mathRad2Deg(float radian)
static inline bool mathZero(float a)
{
- return (fabsf(a) < FLT_EPSILON) ? true : false;
+ return (fabsf(a) <= FLOAT_EPSILON) ? true : false;
+}
+
+
+static inline bool mathZero(const Point& p)
+{
+ return mathZero(p.x) && mathZero(p.y);
}
static inline bool mathEqual(float a, float b)
{
- return (fabsf(a - b) < FLT_EPSILON);
+ return mathZero(a - b);
}
@@ -82,14 +89,14 @@ static inline bool mathEqual(const Matrix& a, const Matrix& b)
static inline bool mathRightAngle(const Matrix* m)
{
auto radian = fabsf(atan2f(m->e21, m->e11));
- if (radian < FLT_EPSILON || mathEqual(radian, MATH_PI2) || mathEqual(radian, MATH_PI)) return true;
+ if (radian < FLOAT_EPSILON || mathEqual(radian, MATH_PI2) || mathEqual(radian, MATH_PI)) return true;
return false;
}
static inline bool mathSkewed(const Matrix* m)
{
- return (fabsf(m->e21 + m->e12) > FLT_EPSILON);
+ return !mathZero(m->e21 + m->e12);
}
@@ -169,6 +176,12 @@ static inline float mathLength(const Point* a, const Point* b)
}
+static inline float mathLength(const Point& a)
+{
+ return sqrtf(a.x * a.x + a.y * a.y);
+}
+
+
static inline Point operator-(const Point& lhs, const Point& rhs)
{
return {lhs.x - rhs.x, lhs.y - rhs.y};
diff --git a/thirdparty/thorvg/src/loaders/svg/tvgSvgLoader.cpp b/thirdparty/thorvg/src/loaders/svg/tvgSvgLoader.cpp
index 7706051e3b..0a47112084 100644
--- a/thirdparty/thorvg/src/loaders/svg/tvgSvgLoader.cpp
+++ b/thirdparty/thorvg/src/loaders/svg/tvgSvgLoader.cpp
@@ -709,7 +709,7 @@ static bool _toColor(const char* str, uint8_t* r, uint8_t* g, uint8_t* b, char**
*ref = _idFromUrl((const char*)(str + 3));
return true;
} else if (len >= 10 && (str[0] == 'h' || str[0] == 'H') && (str[1] == 's' || str[1] == 'S') && (str[2] == 'l' || str[2] == 'L') && str[3] == '(' && str[len - 1] == ')') {
- float_t th, ts, tb;
+ float th, ts, tb;
const char *content, *hue, *satuation, *brightness;
content = str + 4;
content = _skipSpace(content, nullptr);
@@ -988,7 +988,7 @@ static bool _attrParseSvgNode(void* data, const char* key, const char* value)
} else if (!strcmp(key, "style")) {
return simpleXmlParseW3CAttribute(value, strlen(value), _parseStyleAttr, loader);
#ifdef THORVG_LOG_ENABLED
- } else if ((!strcmp(key, "x") || !strcmp(key, "y")) && fabsf(strToFloat(value, nullptr)) > FLT_EPSILON) {
+ } else if ((!strcmp(key, "x") || !strcmp(key, "y")) && fabsf(strToFloat(value, nullptr)) > FLOAT_EPSILON) {
TVGLOG("SVG", "Unsupported attributes used [Elements type: Svg][Attribute: %s][Value: %s]", key, value);
#endif
} else {
@@ -1824,8 +1824,8 @@ static bool _attrParseRectNode(void* data, const char* key, const char* value)
if (!strncmp(rectTags[i].tag, "rx", sz)) rect->hasRx = true;
if (!strncmp(rectTags[i].tag, "ry", sz)) rect->hasRy = true;
- if ((rect->rx >= FLT_EPSILON) && (rect->ry < FLT_EPSILON) && rect->hasRx && !rect->hasRy) rect->ry = rect->rx;
- if ((rect->ry >= FLT_EPSILON) && (rect->rx < FLT_EPSILON) && !rect->hasRx && rect->hasRy) rect->rx = rect->ry;
+ if ((rect->rx >= FLOAT_EPSILON) && (rect->ry < FLOAT_EPSILON) && rect->hasRx && !rect->hasRy) rect->ry = rect->rx;
+ if ((rect->ry >= FLOAT_EPSILON) && (rect->rx < FLOAT_EPSILON) && !rect->hasRx && rect->hasRy) rect->rx = rect->ry;
return ret;
}
}
@@ -3708,7 +3708,7 @@ SvgLoader::~SvgLoader()
void SvgLoader::run(unsigned tid)
{
//According to the SVG standard the value of the width/height of the viewbox set to 0 disables rendering
- if ((viewFlag & SvgViewFlag::Viewbox) && (fabsf(vw) <= FLT_EPSILON || fabsf(vh) <= FLT_EPSILON)) {
+ if ((viewFlag & SvgViewFlag::Viewbox) && (fabsf(vw) <= FLOAT_EPSILON || fabsf(vh) <= FLOAT_EPSILON)) {
TVGLOG("SVG", "The <viewBox> width and/or height set to 0 - rendering disabled.");
root = Scene::gen().release();
return;
diff --git a/thirdparty/thorvg/src/loaders/svg/tvgXmlParser.h b/thirdparty/thorvg/src/loaders/svg/tvgXmlParser.h
index 30ca23b565..4151fbcdb3 100644
--- a/thirdparty/thorvg/src/loaders/svg/tvgXmlParser.h
+++ b/thirdparty/thorvg/src/loaders/svg/tvgXmlParser.h
@@ -25,9 +25,9 @@
#include "tvgSvgLoaderCommon.h"
-#define NUMBER_OF_XML_ENTITIES 8
-const char* const xmlEntity[] = {"&quot;", "&nbsp;", "&apos;", "&amp;", "&lt;", "&gt;", "&#035;", "&#039;"};
-const int xmlEntityLength[] = {6, 6, 6, 5, 4, 4, 6, 6};
+#define NUMBER_OF_XML_ENTITIES 9
+const char* const xmlEntity[] = {"&#10;", "&quot;", "&nbsp;", "&apos;", "&amp;", "&lt;", "&gt;", "&#035;", "&#039;"};
+const int xmlEntityLength[] = {5, 6, 6, 6, 5, 4, 4, 6, 6};
enum class SimpleXMLType
{
diff --git a/thirdparty/thorvg/src/renderer/sw_engine/tvgSwFill.cpp b/thirdparty/thorvg/src/renderer/sw_engine/tvgSwFill.cpp
index 60763068d4..3d582d291c 100644
--- a/thirdparty/thorvg/src/renderer/sw_engine/tvgSwFill.cpp
+++ b/thirdparty/thorvg/src/renderer/sw_engine/tvgSwFill.cpp
@@ -140,7 +140,7 @@ bool _prepareLinear(SwFill* fill, const LinearGradient* linear, const Matrix* tr
fill->linear.dy = y2 - y1;
fill->linear.len = fill->linear.dx * fill->linear.dx + fill->linear.dy * fill->linear.dy;
- if (fill->linear.len < FLT_EPSILON) return true;
+ if (fill->linear.len < FLOAT_EPSILON) return true;
fill->linear.dx /= fill->linear.len;
fill->linear.dy /= fill->linear.len;
@@ -182,7 +182,7 @@ bool _prepareRadial(SwFill* fill, const RadialGradient* radial, const Matrix* tr
auto fy = P(radial)->fy;
auto fr = P(radial)->fr;
- if (r < FLT_EPSILON) return true;
+ if (r < FLOAT_EPSILON) return true;
fill->radial.dr = r - fr;
fill->radial.dx = cx - fx;
diff --git a/thirdparty/thorvg/src/renderer/sw_engine/tvgSwRaster.cpp b/thirdparty/thorvg/src/renderer/sw_engine/tvgSwRaster.cpp
index 4e0020ee52..04f36c727f 100644
--- a/thirdparty/thorvg/src/renderer/sw_engine/tvgSwRaster.cpp
+++ b/thirdparty/thorvg/src/renderer/sw_engine/tvgSwRaster.cpp
@@ -1553,7 +1553,7 @@ static bool _rasterSolidGradientRect(SwSurface* surface, const SwBBox& region, c
static bool _rasterLinearGradientRect(SwSurface* surface, const SwBBox& region, const SwFill* fill)
{
- if (fill->linear.len < FLT_EPSILON) return false;
+ if (fill->linear.len < FLOAT_EPSILON) return false;
if (_compositing(surface)) {
if (_matting(surface)) return _rasterGradientMattedRect<FillLinear>(surface, region, fill);
diff --git a/thirdparty/thorvg/src/renderer/sw_engine/tvgSwRenderer.cpp b/thirdparty/thorvg/src/renderer/sw_engine/tvgSwRenderer.cpp
index 3387905761..0b2940c32d 100644
--- a/thirdparty/thorvg/src/renderer/sw_engine/tvgSwRenderer.cpp
+++ b/thirdparty/thorvg/src/renderer/sw_engine/tvgSwRenderer.cpp
@@ -434,10 +434,6 @@ bool SwRenderer::target(pixel_t* data, uint32_t stride, uint32_t w, uint32_t h,
surface->channelSize = CHANNEL_SIZE(cs);
surface->premultiplied = true;
- vport.x = vport.y = 0;
- vport.w = surface->w;
- vport.h = surface->h;
-
return rasterCompositor(surface);
}
@@ -607,6 +603,12 @@ bool SwRenderer::mempool(bool shared)
}
+const Surface* SwRenderer::mainSurface()
+{
+ return surface;
+}
+
+
Compositor* SwRenderer::target(const RenderRegion& region, ColorSpace cs)
{
auto x = region.x;
diff --git a/thirdparty/thorvg/src/renderer/sw_engine/tvgSwRenderer.h b/thirdparty/thorvg/src/renderer/sw_engine/tvgSwRenderer.h
index 02359e4a39..57be558988 100644
--- a/thirdparty/thorvg/src/renderer/sw_engine/tvgSwRenderer.h
+++ b/thirdparty/thorvg/src/renderer/sw_engine/tvgSwRenderer.h
@@ -49,6 +49,7 @@ public:
bool viewport(const RenderRegion& vp) override;
bool blend(BlendMethod method) override;
ColorSpace colorSpace() override;
+ const Surface* mainSurface() override;
bool clear() override;
bool sync() override;
diff --git a/thirdparty/thorvg/src/renderer/sw_engine/tvgSwShape.cpp b/thirdparty/thorvg/src/renderer/sw_engine/tvgSwShape.cpp
index e38f13db25..b9327374b6 100644
--- a/thirdparty/thorvg/src/renderer/sw_engine/tvgSwShape.cpp
+++ b/thirdparty/thorvg/src/renderer/sw_engine/tvgSwShape.cpp
@@ -124,7 +124,7 @@ static void _dashLineTo(SwDashStroke& dash, const Point* to, const Matrix* trans
len -= dash.curLen;
lineSplitAt(cur, dash.curLen, left, right);
if (!dash.curOpGap) {
- if (dash.move || dash.pattern[dash.curIdx] - dash.curLen < FLT_EPSILON) {
+ if (dash.move || dash.pattern[dash.curIdx] - dash.curLen < FLOAT_EPSILON) {
_outlineMoveTo(*dash.outline, &left.pt1, transform);
dash.move = false;
}
@@ -185,7 +185,7 @@ static void _dashCubicTo(SwDashStroke& dash, const Point* ctrl1, const Point* ct
len -= dash.curLen;
bezSplitAt(cur, dash.curLen, left, right);
if (!dash.curOpGap) {
- if (dash.move || dash.pattern[dash.curIdx] - dash.curLen < FLT_EPSILON) {
+ if (dash.move || dash.pattern[dash.curIdx] - dash.curLen < FLOAT_EPSILON) {
_outlineMoveTo(*dash.outline, &left.start, transform);
dash.move = false;
}
diff --git a/thirdparty/thorvg/src/renderer/tvgCanvas.cpp b/thirdparty/thorvg/src/renderer/tvgCanvas.cpp
index 11d6b778f7..1a36e41e78 100644
--- a/thirdparty/thorvg/src/renderer/tvgCanvas.cpp
+++ b/thirdparty/thorvg/src/renderer/tvgCanvas.cpp
@@ -81,6 +81,12 @@ Result Canvas::update(Paint* paint) noexcept
}
+Result Canvas::viewport(int32_t x, int32_t y, int32_t w, int32_t h) noexcept
+{
+ return pImpl->viewport(x, y, w, h);
+}
+
+
Result Canvas::sync() noexcept
{
return pImpl->sync();
diff --git a/thirdparty/thorvg/src/renderer/tvgCanvas.h b/thirdparty/thorvg/src/renderer/tvgCanvas.h
index a1556702b1..a4b866eacb 100644
--- a/thirdparty/thorvg/src/renderer/tvgCanvas.h
+++ b/thirdparty/thorvg/src/renderer/tvgCanvas.h
@@ -28,10 +28,14 @@
struct Canvas::Impl
{
+ enum Status : uint8_t {Synced = 0, Updating, Drawing};
+
list<Paint*> paints;
RenderMethod* renderer;
+ RenderRegion vport = {0, 0, INT32_MAX, INT32_MAX};
+ Status status = Status::Synced;
+
bool refresh = false; //if all paints should be updated by force.
- bool drawing = false; //on drawing condition?
Impl(RenderMethod* pRenderer) : renderer(pRenderer)
{
@@ -41,14 +45,12 @@ struct Canvas::Impl
~Impl()
{
//make it sure any deffered jobs
- if (renderer) {
- renderer->sync();
- renderer->clear();
- }
+ renderer->sync();
+ renderer->clear();
clearPaints();
- if (renderer && (renderer->unref() == 0)) delete(renderer);
+ if (renderer->unref() == 0) delete(renderer);
}
void clearPaints()
@@ -62,7 +64,7 @@ struct Canvas::Impl
Result push(unique_ptr<Paint> paint)
{
//You can not push paints during rendering.
- if (drawing) return Result::InsufficientCondition;
+ if (status == Status::Drawing) return Result::InsufficientCondition;
auto p = paint.release();
if (!p) return Result::MemoryCorruption;
@@ -75,12 +77,12 @@ struct Canvas::Impl
Result clear(bool free)
{
//Clear render target before drawing
- if (!renderer || !renderer->clear()) return Result::InsufficientCondition;
+ if (!renderer->clear()) return Result::InsufficientCondition;
//Free paints
if (free) clearPaints();
- drawing = false;
+ status = Status::Synced;
return Result::Success;
}
@@ -92,7 +94,7 @@ struct Canvas::Impl
Result update(Paint* paint, bool force)
{
- if (paints.empty() || drawing || !renderer) return Result::InsufficientCondition;
+ if (paints.empty() || status == Status::Drawing) return Result::InsufficientCondition;
Array<RenderData> clips;
auto flag = RenderUpdateFlag::None;
@@ -106,12 +108,13 @@ struct Canvas::Impl
}
refresh = false;
}
+ status = Status::Updating;
return Result::Success;
}
Result draw()
{
- if (drawing || paints.empty() || !renderer || !renderer->preRender()) return Result::InsufficientCondition;
+ if (status == Status::Drawing || paints.empty() || !renderer->preRender()) return Result::InsufficientCondition;
bool rendered = false;
for (auto paint : paints) {
@@ -120,22 +123,37 @@ struct Canvas::Impl
if (!rendered || !renderer->postRender()) return Result::InsufficientCondition;
- drawing = true;
-
+ status = Status::Drawing;
return Result::Success;
}
Result sync()
{
- if (!drawing) return Result::InsufficientCondition;
+ if (status == Status::Synced) return Result::InsufficientCondition;
if (renderer->sync()) {
- drawing = false;
+ status = Status::Synced;
return Result::Success;
}
return Result::InsufficientCondition;
}
+
+ Result viewport(int32_t x, int32_t y, int32_t w, int32_t h)
+ {
+ if (status != Status::Synced) return Result::InsufficientCondition;
+ RenderRegion val = {x, y, w, h};
+ //intersect if the target buffer is already set.
+ auto surface = renderer->mainSurface();
+ if (surface && surface->w > 0 && surface->h > 0) {
+ val.intersect({0, 0, (int32_t)surface->w, (int32_t)surface->h});
+ }
+ if (vport == val) return Result::Success;
+ renderer->viewport(val);
+ vport = val;
+ needRefresh();
+ return Result::Success;
+ }
};
#endif /* _TVG_CANVAS_H_ */
diff --git a/thirdparty/thorvg/src/renderer/tvgGlCanvas.cpp b/thirdparty/thorvg/src/renderer/tvgGlCanvas.cpp
index 940e6682f8..211dbb589c 100644
--- a/thirdparty/thorvg/src/renderer/tvgGlCanvas.cpp
+++ b/thirdparty/thorvg/src/renderer/tvgGlCanvas.cpp
@@ -68,6 +68,8 @@ Result GlCanvas::target(int32_t id, uint32_t w, uint32_t h) noexcept
if (!renderer) return Result::MemoryCorruption;
if (!renderer->target(id, w, h)) return Result::Unknown;
+ Canvas::pImpl->vport = {0, 0, (int32_t)w, (int32_t)h};
+ renderer->viewport(Canvas::pImpl->vport);
//Paints must be updated again with this new target.
Canvas::pImpl->needRefresh();
diff --git a/thirdparty/thorvg/src/renderer/tvgPicture.cpp b/thirdparty/thorvg/src/renderer/tvgPicture.cpp
index cfa1bccd08..5bd55a3f7b 100644
--- a/thirdparty/thorvg/src/renderer/tvgPicture.cpp
+++ b/thirdparty/thorvg/src/renderer/tvgPicture.cpp
@@ -29,7 +29,9 @@
RenderUpdateFlag Picture::Impl::load()
{
if (loader) {
- if (!paint) {
+ if (paint) {
+ loader->sync();
+ } else {
paint = loader->paint();
if (paint) {
if (w != loader->w || h != loader->h) {
@@ -42,8 +44,7 @@ RenderUpdateFlag Picture::Impl::load()
}
return RenderUpdateFlag::None;
}
- } else loader->sync();
-
+ }
if (!surface) {
if ((surface = loader->bitmap())) {
return RenderUpdateFlag::Image;
diff --git a/thirdparty/thorvg/src/renderer/tvgRender.cpp b/thirdparty/thorvg/src/renderer/tvgRender.cpp
index bdfb9f322e..14f77571fb 100644
--- a/thirdparty/thorvg/src/renderer/tvgRender.cpp
+++ b/thirdparty/thorvg/src/renderer/tvgRender.cpp
@@ -60,3 +60,35 @@ RenderTransform::RenderTransform(const RenderTransform* lhs, const RenderTransfo
else if (rhs) m = rhs->m;
else mathIdentity(&m);
}
+
+
+void RenderRegion::intersect(const RenderRegion& rhs)
+{
+ auto x1 = x + w;
+ auto y1 = y + h;
+ auto x2 = rhs.x + rhs.w;
+ auto y2 = rhs.y + rhs.h;
+
+ x = (x > rhs.x) ? x : rhs.x;
+ y = (y > rhs.y) ? y : rhs.y;
+ w = ((x1 < x2) ? x1 : x2) - x;
+ h = ((y1 < y2) ? y1 : y2) - y;
+
+ if (w < 0) w = 0;
+ if (h < 0) h = 0;
+}
+
+
+void RenderRegion::add(const RenderRegion& rhs)
+{
+ if (rhs.x < x) {
+ w += (x - rhs.x);
+ x = rhs.x;
+ }
+ if (rhs.y < y) {
+ h += (y - rhs.y);
+ y = rhs.y;
+ }
+ if (rhs.x + rhs.w > x + w) w = (rhs.x + rhs.w) - x;
+ if (rhs.y + rhs.h > y + h) h = (rhs.y + rhs.h) - y;
+}
diff --git a/thirdparty/thorvg/src/renderer/tvgRender.h b/thirdparty/thorvg/src/renderer/tvgRender.h
index 4f54f2fe6b..6ea516c2f9 100644
--- a/thirdparty/thorvg/src/renderer/tvgRender.h
+++ b/thirdparty/thorvg/src/renderer/tvgRender.h
@@ -100,34 +100,13 @@ struct RenderRegion
{
int32_t x, y, w, h;
- void intersect(const RenderRegion& rhs)
- {
- auto x1 = x + w;
- auto y1 = y + h;
- auto x2 = rhs.x + rhs.w;
- auto y2 = rhs.y + rhs.h;
-
- x = (x > rhs.x) ? x : rhs.x;
- y = (y > rhs.y) ? y : rhs.y;
- w = ((x1 < x2) ? x1 : x2) - x;
- h = ((y1 < y2) ? y1 : y2) - y;
-
- if (w < 0) w = 0;
- if (h < 0) h = 0;
- }
+ void intersect(const RenderRegion& rhs);
+ void add(const RenderRegion& rhs);
- void add(const RenderRegion& rhs)
+ bool operator==(const RenderRegion& rhs)
{
- if (rhs.x < x) {
- w += (x - rhs.x);
- x = rhs.x;
- }
- if (rhs.y < y) {
- h += (y - rhs.y);
- y = rhs.y;
- }
- if (rhs.x + rhs.w > x + w) w = (rhs.x + rhs.w) - x;
- if (rhs.y + rhs.h > y + h) h = (rhs.y + rhs.h) - y;
+ if (x == rhs.x && y == rhs.y && w == rhs.w && h == rhs.h) return true;
+ return false;
}
};
@@ -293,6 +272,7 @@ public:
virtual bool viewport(const RenderRegion& vp) = 0;
virtual bool blend(BlendMethod method) = 0;
virtual ColorSpace colorSpace() = 0;
+ virtual const Surface* mainSurface() = 0;
virtual bool clear() = 0;
virtual bool sync() = 0;
diff --git a/thirdparty/thorvg/src/renderer/tvgShape.h b/thirdparty/thorvg/src/renderer/tvgShape.h
index 813cf9e2e3..55335214be 100644
--- a/thirdparty/thorvg/src/renderer/tvgShape.h
+++ b/thirdparty/thorvg/src/renderer/tvgShape.h
@@ -67,7 +67,7 @@ struct Shape::Impl
if (opacity == 0) return false;
//Shape composition is only necessary when stroking & fill are valid.
- if (!rs.stroke || rs.stroke->width < FLT_EPSILON || (!rs.stroke->fill && rs.stroke->color[3] == 0)) return false;
+ if (!rs.stroke || rs.stroke->width < FLOAT_EPSILON || (!rs.stroke->fill && rs.stroke->color[3] == 0)) return false;
if (!rs.fill && rs.color[3] == 0) return false;
//translucent fill & stroke
@@ -301,7 +301,7 @@ struct Shape::Impl
}
for (uint32_t i = 0; i < cnt; i++) {
- if (pattern[i] < FLT_EPSILON) return Result::InvalidArguments;
+ if (pattern[i] < FLOAT_EPSILON) return Result::InvalidArguments;
}
//Reset dash
diff --git a/thirdparty/thorvg/src/renderer/tvgSwCanvas.cpp b/thirdparty/thorvg/src/renderer/tvgSwCanvas.cpp
index d154a600d5..52d85d8320 100644
--- a/thirdparty/thorvg/src/renderer/tvgSwCanvas.cpp
+++ b/thirdparty/thorvg/src/renderer/tvgSwCanvas.cpp
@@ -87,6 +87,8 @@ Result SwCanvas::target(uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t
if (!renderer) return Result::MemoryCorruption;
if (!renderer->target(buffer, stride, w, h, static_cast<ColorSpace>(cs))) return Result::InvalidArguments;
+ Canvas::pImpl->vport = {0, 0, (int32_t)w, (int32_t)h};
+ renderer->viewport(Canvas::pImpl->vport);
//Paints must be updated again with this new target.
Canvas::pImpl->needRefresh();
diff --git a/thirdparty/thorvg/src/renderer/tvgWgCanvas.cpp b/thirdparty/thorvg/src/renderer/tvgWgCanvas.cpp
index 5205df1737..7db77f6d0c 100644
--- a/thirdparty/thorvg/src/renderer/tvgWgCanvas.cpp
+++ b/thirdparty/thorvg/src/renderer/tvgWgCanvas.cpp
@@ -63,6 +63,8 @@ Result WgCanvas::target(void* window, uint32_t w, uint32_t h) noexcept
if (!renderer) return Result::MemoryCorruption;
if (!renderer->target(window, w, h)) return Result::Unknown;
+ Canvas::pImpl->vport = {0, 0, (int32_t)w, (int32_t)h};
+ renderer->viewport(Canvas::pImpl->vport);
//Paints must be updated again with this new target.
Canvas::pImpl->needRefresh();
diff --git a/thirdparty/thorvg/update-thorvg.sh b/thirdparty/thorvg/update-thorvg.sh
index 796060d3fb..cd1aeadec0 100755
--- a/thirdparty/thorvg/update-thorvg.sh
+++ b/thirdparty/thorvg/update-thorvg.sh
@@ -1,6 +1,6 @@
#!/bin/bash -e
-VERSION=0.13.3
+VERSION=0.13.5
cd thirdparty/thorvg/ || true
rm -rf AUTHORS LICENSE inc/ src/ *.zip *.tar.gz tmp/