Initial Grease Pencil 3.0 stage #106848
|
@ -645,15 +645,15 @@ if(WIN32)
|
|||
endif()
|
||||
|
||||
# Compiler tool-chain.
|
||||
if(UNIX AND NOT APPLE)
|
||||
if(UNIX)
|
||||
if(CMAKE_COMPILER_IS_GNUCC)
|
||||
option(WITH_LINKER_GOLD "Use ld.gold linker which is usually faster than ld.bfd" ON)
|
||||
mark_as_advanced(WITH_LINKER_GOLD)
|
||||
option(WITH_LINKER_LLD "Use ld.lld linker which is usually faster than ld.gold" OFF)
|
||||
mark_as_advanced(WITH_LINKER_LLD)
|
||||
endif()
|
||||
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||
option(WITH_LINKER_MOLD "Use ld.mold linker which is usually faster than ld.gold & ld.lld." OFF)
|
||||
option(WITH_LINKER_LLD "Use ld.lld linker which is usually faster than ld.gold" OFF)
|
||||
mark_as_advanced(WITH_LINKER_LLD)
|
||||
option(WITH_LINKER_MOLD "Use ld.mold linker which is usually faster than ld.gold & ld.lld. Needs \"sold\" subscription on macOS." OFF)
|
||||
mark_as_advanced(WITH_LINKER_MOLD)
|
||||
endif()
|
||||
endif()
|
||||
|
|
|
@ -451,6 +451,31 @@ if(WITH_COMPILER_CCACHE)
|
|||
endif()
|
||||
endif()
|
||||
|
||||
unset(_custom_LINKER_FUSE_FLAG)
|
||||
if(WITH_LINKER_LLD)
|
||||
find_program(LLD_PROGRAM ld.lld)
|
||||
if(LLD_PROGRAM)
|
||||
set(_custom_LINKER_FUSE_FLAG "-fuse-ld=lld")
|
||||
else()
|
||||
message(WARNING "LLD linker NOT found, disabling WITH_LINKER_LLD")
|
||||
set(WITH_LINKER_LLD OFF)
|
||||
endif()
|
||||
endif()
|
||||
if(WITH_LINKER_MOLD)
|
||||
find_program(MOLD_PROGRAM mold)
|
||||
if(MOLD_PROGRAM)
|
||||
set(_custom_LINKER_FUSE_FLAG "-fuse-ld=mold")
|
||||
else()
|
||||
message(WARNING "Mold linker NOT found, disabling WITH_LINKER_MOLD")
|
||||
set(WITH_LINKER_MOLD OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(_custom_LINKER_FUSE_FLAG)
|
||||
add_link_options(${_custom_LINKER_FUSE_FLAG})
|
||||
endif()
|
||||
|
||||
|
||||
if(WITH_COMPILER_ASAN)
|
||||
list(APPEND PLATFORM_BUNDLED_LIBRARIES ${COMPILER_ASAN_LIBRARY})
|
||||
endif()
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
from __future__ import annotations
|
||||
|
||||
import bpy
|
||||
from bpy.app.translations import contexts as i18n_contexts
|
||||
from bpy_extras.node_utils import find_node_input
|
||||
from bl_ui.utils import PresetPanel
|
||||
|
||||
|
@ -318,7 +319,7 @@ class CYCLES_RENDER_PT_sampling_path_guiding(CyclesButtonsPanel, Panel):
|
|||
|
||||
col = layout.column(align=True)
|
||||
col.prop(cscene, "use_surface_guiding", text="Surface")
|
||||
col.prop(cscene, "use_volume_guiding", text="Volume")
|
||||
col.prop(cscene, "use_volume_guiding", text="Volume", text_ctxt=i18n_contexts.id_id)
|
||||
|
||||
|
||||
class CYCLES_RENDER_PT_sampling_path_guiding_debug(CyclesDebugButtonsPanel, Panel):
|
||||
|
@ -530,7 +531,7 @@ class CYCLES_RENDER_PT_light_paths_max_bounces(CyclesButtonsPanel, Panel):
|
|||
col.prop(cscene, "diffuse_bounces", text="Diffuse")
|
||||
col.prop(cscene, "glossy_bounces", text="Glossy")
|
||||
col.prop(cscene, "transmission_bounces", text="Transmission")
|
||||
col.prop(cscene, "volume_bounces", text="Volume")
|
||||
col.prop(cscene, "volume_bounces", text="Volume", text_ctxt=i18n_contexts.id_id)
|
||||
|
||||
col = layout.column(align=True)
|
||||
col.prop(cscene, "transparent_max_bounces", text="Transparent")
|
||||
|
@ -980,7 +981,7 @@ class CYCLES_RENDER_PT_passes_light(CyclesButtonsPanel, Panel):
|
|||
col.prop(view_layer, "use_pass_transmission_indirect", text="Indirect")
|
||||
col.prop(view_layer, "use_pass_transmission_color", text="Color")
|
||||
|
||||
col = layout.column(heading="Volume", align=True)
|
||||
col = layout.column(heading="Volume", heading_ctxt=i18n_contexts.id_id, align=True)
|
||||
col.prop(cycles_view_layer, "use_pass_volume_direct", text="Direct")
|
||||
col.prop(cycles_view_layer, "use_pass_volume_indirect", text="Indirect")
|
||||
|
||||
|
@ -1577,6 +1578,7 @@ class CYCLES_WORLD_PT_surface(CyclesButtonsPanel, Panel):
|
|||
|
||||
class CYCLES_WORLD_PT_volume(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Volume"
|
||||
bl_translation_context = i18n_contexts.id_id
|
||||
bl_context = "world"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
|
||||
|
@ -1696,6 +1698,7 @@ class CYCLES_WORLD_PT_settings_surface(CyclesButtonsPanel, Panel):
|
|||
|
||||
class CYCLES_WORLD_PT_settings_volume(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Volume"
|
||||
bl_translation_context = i18n_contexts.id_id
|
||||
bl_parent_id = "CYCLES_WORLD_PT_settings"
|
||||
bl_context = "world"
|
||||
|
||||
|
@ -1791,6 +1794,7 @@ class CYCLES_MATERIAL_PT_surface(CyclesButtonsPanel, Panel):
|
|||
|
||||
class CYCLES_MATERIAL_PT_volume(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Volume"
|
||||
bl_translation_context = i18n_contexts.id_id
|
||||
bl_context = "material"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
|
||||
|
@ -1874,6 +1878,7 @@ class CYCLES_MATERIAL_PT_settings_surface(CyclesButtonsPanel, Panel):
|
|||
|
||||
class CYCLES_MATERIAL_PT_settings_volume(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Volume"
|
||||
bl_translation_context = i18n_contexts.id_id
|
||||
bl_parent_id = "CYCLES_MATERIAL_PT_settings"
|
||||
bl_context = "material"
|
||||
|
||||
|
|
|
@ -355,7 +355,7 @@ def script_paths(*, subdir=None, user_pref=True, check_all=False, use_user=True)
|
|||
|
||||
:arg subdir: Optional subdir.
|
||||
:type subdir: string
|
||||
:arg user_pref: Include the user preference script path.
|
||||
:arg user_pref: Include the user preference script paths.
|
||||
:type user_pref: bool
|
||||
:arg check_all: Include local, user and system paths rather just the paths Blender uses.
|
||||
:type check_all: bool
|
||||
|
@ -387,6 +387,9 @@ def script_paths(*, subdir=None, user_pref=True, check_all=False, use_user=True)
|
|||
if use_user:
|
||||
base_paths.append(path_user)
|
||||
|
||||
if user_pref:
|
||||
base_paths.extend(script_paths_pref())
|
||||
|
||||
scripts = []
|
||||
for path in base_paths:
|
||||
if not path:
|
||||
|
|
|
@ -1,10 +1,49 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
__all__ = (
|
||||
"connect_virtual_socket",
|
||||
"find_node_input",
|
||||
)
|
||||
|
||||
|
||||
def connect_sockets(input, output):
|
||||
"""
|
||||
Connect sockets in a node tree.
|
||||
|
||||
This is useful because the links created through the normal Python API are
|
||||
invalid when one of the sockets is a virtual socket (grayed out sockets in
|
||||
Group Input and Group Output nodes).
|
||||
|
||||
It replaces node_tree.links.new(input, output)
|
||||
"""
|
||||
import bpy
|
||||
|
||||
# Swap sockets if they are not passed in the proper order
|
||||
if input.is_output and not output.is_output:
|
||||
input, output = output, input
|
||||
|
||||
input_node = output.node
|
||||
output_node = input.node
|
||||
|
||||
if input_node.id_data is not output_node.id_data:
|
||||
print("Sockets do not belong to the same node tree")
|
||||
return
|
||||
|
||||
if type(input) == type(output) == bpy.types.NodeSocketVirtual:
|
||||
print("Cannot connect two virtual sockets together")
|
||||
return
|
||||
|
||||
if output_node.type == 'GROUP_OUTPUT' and type(input) == bpy.types.NodeSocketVirtual:
|
||||
output_node.id_data.outputs.new(type(output).__name__, output.name)
|
||||
input = output_node.inputs[-2]
|
||||
|
||||
if input_node.type == 'GROUP_INPUT' and type(output) == bpy.types.NodeSocketVirtual:
|
||||
output_node.id_data.inputs.new(type(input).__name__, input.name)
|
||||
output = input_node.outputs[-2]
|
||||
|
||||
return input_node.id_data.links.new(input, output)
|
||||
|
||||
|
||||
# XXX Names are not unique. Returns the first match.
|
||||
def find_node_input(node, name):
|
||||
for input in node.inputs:
|
||||
|
|
|
@ -580,7 +580,6 @@ class Mesh(bpy_types.ID):
|
|||
vertex_indices = tuple(chain.from_iterable(faces))
|
||||
loop_starts = tuple(islice(chain([0], accumulate(face_lengths)), faces_len))
|
||||
|
||||
self.polygons.foreach_set("loop_total", face_lengths)
|
||||
self.polygons.foreach_set("loop_start", loop_starts)
|
||||
self.polygons.foreach_set("vertices", vertex_indices)
|
||||
|
||||
|
|
|
@ -242,7 +242,6 @@ class AddTorus(Operator, object_utils.AddObjectHelper):
|
|||
|
||||
mesh.vertices.foreach_set("co", verts_loc)
|
||||
mesh.polygons.foreach_set("loop_start", range(0, nbr_loops, 4))
|
||||
mesh.polygons.foreach_set("loop_total", (4,) * nbr_polys)
|
||||
mesh.loops.foreach_set("vertex_index", faces)
|
||||
|
||||
if self.generate_uvs:
|
||||
|
|
|
@ -868,7 +868,6 @@ class CLIP_OT_setup_tracking_scene(Operator):
|
|||
mesh.polygons.add(nbr_polys)
|
||||
|
||||
mesh.polygons.foreach_set("loop_start", range(0, nbr_loops, 4))
|
||||
mesh.polygons.foreach_set("loop_total", (4,) * nbr_polys)
|
||||
mesh.loops.foreach_set("vertex_index", faces)
|
||||
|
||||
mesh.update()
|
||||
|
|
|
@ -618,7 +618,6 @@ class MakeDupliFace(Operator):
|
|||
mesh.vertices.foreach_set("co", face_verts)
|
||||
mesh.loops.foreach_set("vertex_index", faces)
|
||||
mesh.polygons.foreach_set("loop_start", range(0, nbr_faces * 4, 4))
|
||||
mesh.polygons.foreach_set("loop_total", (4,) * nbr_faces)
|
||||
mesh.update() # generates edge data
|
||||
|
||||
ob_new = bpy.data.objects.new(mesh.name, mesh)
|
||||
|
|
|
@ -592,6 +592,7 @@ class NODE_MT_category_GEO_VECTOR(Menu):
|
|||
class NODE_MT_category_GEO_VOLUME(Menu):
|
||||
bl_idname = "NODE_MT_category_GEO_VOLUME"
|
||||
bl_label = "Volume"
|
||||
bl_translation_context = i18n_contexts.id_id
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
import bpy
|
||||
from bpy.types import Panel
|
||||
from bpy.app.translations import contexts as i18n_contexts
|
||||
from rna_prop_ui import PropertyPanel
|
||||
from bl_ui.utils import PresetPanel
|
||||
|
||||
|
@ -67,6 +68,7 @@ class DATA_PT_context_camera(CameraButtonsPanel, Panel):
|
|||
|
||||
class DATA_PT_lens(CameraButtonsPanel, Panel):
|
||||
bl_label = "Lens"
|
||||
bl_translation_context = i18n_contexts.id_camera
|
||||
COMPAT_ENGINES = {
|
||||
'BLENDER_RENDER',
|
||||
'BLENDER_EEVEE',
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
from bpy.types import Panel
|
||||
from bpy.app.translations import contexts as i18n_contexts
|
||||
|
||||
|
||||
class DataButtonsPanel:
|
||||
|
@ -15,6 +16,7 @@ class DataButtonsPanel:
|
|||
|
||||
class DATA_PT_empty(DataButtonsPanel, Panel):
|
||||
bl_label = "Empty"
|
||||
bl_translation_context = i18n_contexts.id_id
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
import bpy
|
||||
from bpy.app.translations import contexts as i18n_contexts
|
||||
from bpy.types import Panel
|
||||
from rna_prop_ui import PropertyPanel
|
||||
|
||||
|
@ -89,7 +90,7 @@ class DATA_PT_EEVEE_light(DataButtonsPanel, Panel):
|
|||
|
||||
col.prop(light, "diffuse_factor", text="Diffuse")
|
||||
col.prop(light, "specular_factor", text="Specular")
|
||||
col.prop(light, "volume_factor", text="Volume")
|
||||
col.prop(light, "volume_factor", text="Volume", text_ctxt=i18n_contexts.id_id)
|
||||
|
||||
col.separator()
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
import bpy
|
||||
from bpy.types import Menu, Panel, UIList
|
||||
from bpy.app.translations import contexts as i18n_contexts
|
||||
from rna_prop_ui import PropertyPanel
|
||||
from bpy_extras.node_utils import find_node_input
|
||||
|
||||
|
@ -176,6 +177,7 @@ class EEVEE_MATERIAL_PT_surface(MaterialButtonsPanel, Panel):
|
|||
|
||||
class EEVEE_MATERIAL_PT_volume(MaterialButtonsPanel, Panel):
|
||||
bl_label = "Volume"
|
||||
bl_translation_context = i18n_contexts.id_id
|
||||
bl_context = "material"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
COMPAT_ENGINES = {'BLENDER_EEVEE'}
|
||||
|
|
|
@ -164,8 +164,8 @@ class RENDER_PT_time_stretching(RenderOutputButtonsPanel, Panel):
|
|||
rd = context.scene.render
|
||||
|
||||
col = layout.column(align=True)
|
||||
col.prop(rd, "frame_map_old", text="Old")
|
||||
col.prop(rd, "frame_map_new", text="New")
|
||||
col.prop(rd, "frame_map_old", text="Old", text_ctxt=i18n_contexts.time)
|
||||
col.prop(rd, "frame_map_new", text="New", text_ctxt=i18n_contexts.time)
|
||||
|
||||
|
||||
class RENDER_PT_post_processing(RenderOutputButtonsPanel, Panel):
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
from bpy.types import Menu, Panel, UIList, ViewLayer
|
||||
from bpy.app.translations import contexts as i18n_contexts
|
||||
|
||||
from rna_prop_ui import PropertyPanel
|
||||
|
||||
|
@ -140,7 +141,7 @@ class VIEWLAYER_PT_eevee_layer_passes_light(ViewLayerButtonsPanel, Panel):
|
|||
col.prop(view_layer, "use_pass_glossy_direct", text="Light")
|
||||
col.prop(view_layer, "use_pass_glossy_color", text="Color")
|
||||
|
||||
col = layout.column(heading="Volume", align=True)
|
||||
col = layout.column(heading="Volume", heading_ctxt=i18n_contexts.id_id, align=True)
|
||||
col.prop(view_layer_eevee, "use_pass_volume_direct", text="Light")
|
||||
|
||||
col = layout.column(heading="Other", align=True)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
import bpy
|
||||
from bpy.types import Panel
|
||||
from bpy.app.translations import contexts as i18n_contexts
|
||||
from rna_prop_ui import PropertyPanel
|
||||
from bpy_extras.node_utils import find_node_input
|
||||
|
||||
|
@ -115,6 +116,7 @@ class EEVEE_WORLD_PT_surface(WorldButtonsPanel, Panel):
|
|||
|
||||
class EEVEE_WORLD_PT_volume(WorldButtonsPanel, Panel):
|
||||
bl_label = "Volume"
|
||||
bl_translation_context = i18n_contexts.id_id
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
COMPAT_ENGINES = {'BLENDER_EEVEE'}
|
||||
|
||||
|
|
|
@ -890,6 +890,7 @@ class CLIP_PT_tracking_lens(Panel):
|
|||
bl_region_type = 'UI'
|
||||
bl_category = "Track"
|
||||
bl_label = "Lens"
|
||||
bl_translation_context = i18n_contexts.id_camera
|
||||
bl_parent_id = 'CLIP_PT_tracking_camera'
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
|
||||
|
|
|
@ -1762,7 +1762,7 @@ class SEQUENCER_PT_scene(SequencerButtonsPanel, Panel):
|
|||
sub.use_property_decorate = True
|
||||
split = sub.split(factor=0.4, align=True)
|
||||
split.alignment = 'RIGHT'
|
||||
split.label(text="Volume")
|
||||
split.label(text="Volume", text_ctxt=i18n_contexts.id_sound)
|
||||
split.prop(scene, "audio_volume", text="")
|
||||
sub.use_property_decorate = False
|
||||
|
||||
|
@ -1993,7 +1993,7 @@ class SEQUENCER_PT_adjust_sound(SequencerButtonsPanel, Panel):
|
|||
|
||||
split = col.split(factor=0.4)
|
||||
split.alignment = 'RIGHT'
|
||||
split.label(text="Volume")
|
||||
split.label(text="Volume", text_ctxt=i18n_contexts.id_sound)
|
||||
split.prop(strip, "volume", text="")
|
||||
|
||||
audio_channels = context.scene.render.ffmpeg.audio_channels
|
||||
|
|
|
@ -66,12 +66,12 @@ class TEXT_HT_footer(Header):
|
|||
if text.filepath:
|
||||
if text.is_dirty:
|
||||
row.label(
|
||||
text=iface_("File: *%s (unsaved)" % text.filepath),
|
||||
text=iface_("File: *%s (unsaved)") % text.filepath,
|
||||
translate=False,
|
||||
)
|
||||
else:
|
||||
row.label(
|
||||
text=iface_("File: %s" % text.filepath),
|
||||
text=iface_("File: %s") % text.filepath,
|
||||
translate=False,
|
||||
)
|
||||
else:
|
||||
|
|
|
@ -418,7 +418,7 @@ class USERPREF_PT_edit_objects_duplicate_data(EditingPanel, CenterAlignMixIn, Pa
|
|||
col.prop(edit, "use_duplicate_surface", text="Surface")
|
||||
col.prop(edit, "use_duplicate_text", text="Text")
|
||||
# col.prop(edit, "use_duplicate_texture", text="Texture") # Not implemented.
|
||||
col.prop(edit, "use_duplicate_volume", text="Volume")
|
||||
col.prop(edit, "use_duplicate_volume", text="Volume", text_ctxt=i18n_contexts.id_id)
|
||||
|
||||
|
||||
class USERPREF_PT_edit_cursor(EditingPanel, CenterAlignMixIn, Panel):
|
||||
|
@ -1951,7 +1951,7 @@ class USERPREF_PT_addons(AddOnPanel, Panel):
|
|||
|
||||
addon_user_dirs = tuple(
|
||||
p for p in (
|
||||
*[os.path.join(pref_p, "addons") for pref_p in bpy.utils.script_path_user()],
|
||||
*[os.path.join(pref_p, "addons") for pref_p in bpy.utils.script_paths_pref()],
|
||||
bpy.utils.user_resource('SCRIPTS', path="addons"),
|
||||
)
|
||||
if p
|
||||
|
|
|
@ -2310,7 +2310,7 @@ class VIEW3D_MT_add(Menu):
|
|||
layout.operator("object.text_add", text="Text", icon='OUTLINER_OB_FONT')
|
||||
if context.preferences.experimental.use_new_point_cloud_type:
|
||||
layout.operator("object.pointcloud_add", text="Point Cloud", icon='OUTLINER_OB_POINTCLOUD')
|
||||
layout.menu("VIEW3D_MT_volume_add", text="Volume", icon='OUTLINER_OB_VOLUME')
|
||||
layout.menu("VIEW3D_MT_volume_add", text="Volume", text_ctxt=i18n_contexts.id_id, icon='OUTLINER_OB_VOLUME')
|
||||
layout.operator_menu_enum("object.gpencil_add", "type", text="Grease Pencil", icon='OUTLINER_OB_GREASEPENCIL')
|
||||
|
||||
layout.separator()
|
||||
|
|
|
@ -2137,9 +2137,9 @@ static const char *get_obdata_defname(int type)
|
|||
case OB_POINTCLOUD:
|
||||
return DATA_("PointCloud");
|
||||
case OB_VOLUME:
|
||||
return DATA_("Volume");
|
||||
return CTX_DATA_(BLT_I18NCONTEXT_ID_ID, "Volume");
|
||||
case OB_EMPTY:
|
||||
return DATA_("Empty");
|
||||
return CTX_DATA_(BLT_I18NCONTEXT_ID_ID, "Empty");
|
||||
case OB_GPENCIL_LEGACY:
|
||||
return DATA_("GPencil");
|
||||
case OB_LIGHTPROBE:
|
||||
|
@ -2148,7 +2148,7 @@ static const char *get_obdata_defname(int type)
|
|||
return DATA_("GreasePencil");
|
||||
default:
|
||||
CLOG_ERROR(&LOG, "Internal error, bad type: %d", type);
|
||||
return DATA_("Empty");
|
||||
return CTX_DATA_(BLT_I18NCONTEXT_ID_ID, "Empty");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -82,55 +82,55 @@ const char *BLT_translate_do_new_dataname(const char *msgctxt, const char *msgid
|
|||
#define BLT_I18NCONTEXT_ID_ACTION "Action"
|
||||
#define BLT_I18NCONTEXT_ID_ARMATURE "Armature"
|
||||
#define BLT_I18NCONTEXT_ID_BRUSH "Brush"
|
||||
#define BLT_I18NCONTEXT_ID_CAMERA "Camera"
|
||||
#define BLT_I18NCONTEXT_ID_CACHEFILE "CacheFile"
|
||||
#define BLT_I18NCONTEXT_ID_CAMERA "Camera"
|
||||
#define BLT_I18NCONTEXT_ID_COLLECTION "Collection"
|
||||
#define BLT_I18NCONTEXT_ID_CURVES "Curves"
|
||||
#define BLT_I18NCONTEXT_ID_CURVE_LEGACY "Curve"
|
||||
#define BLT_I18NCONTEXT_ID_FREESTYLELINESTYLE "FreestyleLineStyle"
|
||||
#define BLT_I18NCONTEXT_ID_GPENCIL "GPencil"
|
||||
#define BLT_I18NCONTEXT_ID_CURVES "Curves"
|
||||
#define BLT_I18NCONTEXT_ID_ID "ID"
|
||||
#define BLT_I18NCONTEXT_ID_IMAGE "Image"
|
||||
// #define BLT_I18NCONTEXT_ID_IPO "Ipo" /* DEPRECATED */
|
||||
#define BLT_I18NCONTEXT_ID_SHAPEKEY "Key"
|
||||
#define BLT_I18NCONTEXT_ID_SIMULATION "Simulation"
|
||||
#define BLT_I18NCONTEXT_ID_LIGHT "Light"
|
||||
#define BLT_I18NCONTEXT_ID_LIBRARY "Library"
|
||||
#define BLT_I18NCONTEXT_ID_LATTICE "Lattice"
|
||||
#define BLT_I18NCONTEXT_ID_LIBRARY "Library"
|
||||
#define BLT_I18NCONTEXT_ID_LIGHT "Light"
|
||||
#define BLT_I18NCONTEXT_ID_LIGHTPROBE "LightProbe"
|
||||
#define BLT_I18NCONTEXT_ID_MASK "Mask"
|
||||
#define BLT_I18NCONTEXT_ID_MATERIAL "Material"
|
||||
#define BLT_I18NCONTEXT_ID_METABALL "Metaball"
|
||||
#define BLT_I18NCONTEXT_ID_MESH "Mesh"
|
||||
#define BLT_I18NCONTEXT_ID_METABALL "Metaball"
|
||||
#define BLT_I18NCONTEXT_ID_MOVIECLIP "MovieClip"
|
||||
#define BLT_I18NCONTEXT_ID_NODETREE "NodeTree"
|
||||
#define BLT_I18NCONTEXT_ID_OBJECT "Object"
|
||||
#define BLT_I18NCONTEXT_ID_PAINTCURVE "PaintCurve"
|
||||
#define BLT_I18NCONTEXT_ID_PALETTE "Palette"
|
||||
#define BLT_I18NCONTEXT_ID_PARTICLESETTINGS "ParticleSettings"
|
||||
#define BLT_I18NCONTEXT_ID_POINTCLOUD "PointCloud"
|
||||
#define BLT_I18NCONTEXT_ID_LIGHTPROBE "LightProbe"
|
||||
#define BLT_I18NCONTEXT_ID_SCENE "Scene"
|
||||
#define BLT_I18NCONTEXT_ID_SCREEN "Screen"
|
||||
#define BLT_I18NCONTEXT_ID_SEQUENCE "Sequence"
|
||||
#define BLT_I18NCONTEXT_ID_SPEAKER "Speaker"
|
||||
#define BLT_I18NCONTEXT_ID_SHAPEKEY "Key"
|
||||
#define BLT_I18NCONTEXT_ID_SIMULATION "Simulation"
|
||||
#define BLT_I18NCONTEXT_ID_SOUND "Sound"
|
||||
#define BLT_I18NCONTEXT_ID_TEXTURE "Texture"
|
||||
#define BLT_I18NCONTEXT_ID_SPEAKER "Speaker"
|
||||
#define BLT_I18NCONTEXT_ID_TEXT "Text"
|
||||
#define BLT_I18NCONTEXT_ID_TEXTURE "Texture"
|
||||
#define BLT_I18NCONTEXT_ID_VFONT "VFont"
|
||||
#define BLT_I18NCONTEXT_ID_VOLUME "Volume"
|
||||
#define BLT_I18NCONTEXT_ID_WORLD "World"
|
||||
#define BLT_I18NCONTEXT_ID_WORKSPACE "WorkSpace"
|
||||
#define BLT_I18NCONTEXT_ID_WINDOWMANAGER "WindowManager"
|
||||
#define BLT_I18NCONTEXT_ID_MOVIECLIP "MovieClip"
|
||||
#define BLT_I18NCONTEXT_ID_MASK "Mask"
|
||||
#define BLT_I18NCONTEXT_ID_WORKSPACE "WorkSpace"
|
||||
#define BLT_I18NCONTEXT_ID_WORLD "World"
|
||||
|
||||
/* Editors-types contexts. */
|
||||
#define BLT_I18NCONTEXT_EDITOR_VIEW3D "View3D"
|
||||
#define BLT_I18NCONTEXT_EDITOR_FILEBROWSER "File browser"
|
||||
#define BLT_I18NCONTEXT_EDITOR_VIEW3D "View3D"
|
||||
|
||||
/* Generic contexts. */
|
||||
#define BLT_I18NCONTEXT_VIRTUAL_REALITY "Virtual reality"
|
||||
#define BLT_I18NCONTEXT_CONSTRAINT "Constraint"
|
||||
#define BLT_I18NCONTEXT_COLOR "Color"
|
||||
#define BLT_I18NCONTEXT_AMOUNT "Amount"
|
||||
#define BLT_I18NCONTEXT_COLOR "Color"
|
||||
#define BLT_I18NCONTEXT_CONSTRAINT "Constraint"
|
||||
#define BLT_I18NCONTEXT_TIME "Time"
|
||||
#define BLT_I18NCONTEXT_UNIT "Unit"
|
||||
|
||||
/* Helper for bpy.app.i18n object... */
|
||||
|
@ -155,25 +155,25 @@ typedef struct {
|
|||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_ACTION, "id_action"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_ARMATURE, "id_armature"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_BRUSH, "id_brush"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_CAMERA, "id_camera"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_CACHEFILE, "id_cachefile"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_CAMERA, "id_camera"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_COLLECTION, "id_collection"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_CURVES, "id_curves"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_CURVE_LEGACY, "id_curve"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_FREESTYLELINESTYLE, "id_fs_linestyle"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_GPENCIL, "id_gpencil"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_CURVES, "id_curves"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_ID, "id_id"), \
|
||||
BLT_I18NCONTEXTS_ITEM( \
|
||||
BLT_I18NCONTEXT_ID_IMAGE, \
|
||||
"id_image"), /* BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_IPO, "id_ipo"), */ \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_SHAPEKEY, "id_shapekey"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_LIGHT, "id_light"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_LIBRARY, "id_library"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_LATTICE, "id_lattice"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_LIBRARY, "id_library"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_LIGHT, "id_light"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_LIGHTPROBE, "id_lightprobe"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_MASK, "id_mask"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_MATERIAL, "id_material"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_METABALL, "id_metaball"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_MESH, "id_mesh"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_METABALL, "id_metaball"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_MOVIECLIP, "id_movieclip"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_NODETREE, "id_nodetree"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_OBJECT, "id_object"), \
|
||||
|
@ -181,26 +181,26 @@ typedef struct {
|
|||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_PALETTE, "id_palette"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_PARTICLESETTINGS, "id_particlesettings"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_POINTCLOUD, "id_pointcloud"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_LIGHTPROBE, "id_lightprobe"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_SCENE, "id_scene"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_SCREEN, "id_screen"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_SEQUENCE, "id_sequence"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_SHAPEKEY, "id_shapekey"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_SIMULATION, "id_simulation"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_SPEAKER, "id_speaker"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_SOUND, "id_sound"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_TEXTURE, "id_texture"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_SPEAKER, "id_speaker"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_TEXT, "id_text"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_TEXTURE, "id_texture"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_VFONT, "id_vfont"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_VOLUME, "id_volume"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_WORLD, "id_world"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_WORKSPACE, "id_workspace"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_WINDOWMANAGER, "id_windowmanager"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_EDITOR_VIEW3D, "editor_view3d"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_WORKSPACE, "id_workspace"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_ID_WORLD, "id_world"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_EDITOR_FILEBROWSER, "editor_filebrowser"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_VIRTUAL_REALITY, "virtual_reality"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_CONSTRAINT, "constraint"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_COLOR, "color"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_EDITOR_VIEW3D, "editor_view3d"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_AMOUNT, "amount"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_COLOR, "color"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_CONSTRAINT, "constraint"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_TIME, "time"), \
|
||||
BLT_I18NCONTEXTS_ITEM(BLT_I18NCONTEXT_UNIT, "unit"), \
|
||||
{ \
|
||||
NULL, NULL, NULL \
|
||||
|
|
|
@ -1052,7 +1052,7 @@ static void create_inspection_string_for_geometry_socket(std::stringstream &ss,
|
|||
break;
|
||||
}
|
||||
case GEO_COMPONENT_TYPE_VOLUME: {
|
||||
ss << TIP_("Volume");
|
||||
ss << CTX_TIP_(BLT_I18NCONTEXT_ID_ID, "Volume");
|
||||
break;
|
||||
}
|
||||
case GEO_COMPONENT_TYPE_EDIT: {
|
||||
|
|
|
@ -2168,39 +2168,18 @@ static void outliner_do_data_operation(
|
|||
});
|
||||
}
|
||||
|
||||
static Base *outliner_batch_delete_hierarchy(
|
||||
ReportList *reports, Main *bmain, ViewLayer *view_layer, Scene *scene, Base *base)
|
||||
static void outliner_batch_delete_object_tag(ReportList *reports,
|
||||
Main *bmain,
|
||||
Scene *scene,
|
||||
Object *object)
|
||||
{
|
||||
Base *child_base, *base_next;
|
||||
Object *object, *parent;
|
||||
|
||||
if (!base) {
|
||||
return nullptr;
|
||||
}
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
object = base->object;
|
||||
for (child_base = static_cast<Base *>(BKE_view_layer_object_bases_get(view_layer)->first);
|
||||
child_base;
|
||||
child_base = base_next) {
|
||||
base_next = child_base->next;
|
||||
for (parent = child_base->object->parent; parent && (parent != object);
|
||||
parent = parent->parent) {
|
||||
/* pass */
|
||||
}
|
||||
if (parent) {
|
||||
base_next = outliner_batch_delete_hierarchy(reports, bmain, view_layer, scene, child_base);
|
||||
}
|
||||
}
|
||||
|
||||
base_next = base->next;
|
||||
|
||||
if (object->id.tag & LIB_TAG_INDIRECT) {
|
||||
BKE_reportf(reports,
|
||||
RPT_WARNING,
|
||||
"Cannot delete indirectly linked object '%s'",
|
||||
base->object->id.name + 2);
|
||||
return base_next;
|
||||
BKE_reportf(
|
||||
reports, RPT_WARNING, "Cannot delete indirectly linked object '%s'", object->id.name + 2);
|
||||
BLI_assert((object->id.tag & LIB_TAG_DOIT) == 0);
|
||||
}
|
||||
/* FIXME: This code checking object usercount won't work as expected if a same object belongs to
|
||||
* more than one collection in the scene. */
|
||||
if (ID_REAL_USERS(object) <= 1 && ID_EXTRA_USERS(object) == 0 &&
|
||||
BKE_library_ID_is_indirectly_used(bmain, object)) {
|
||||
BKE_reportf(reports,
|
||||
|
@ -2209,41 +2188,105 @@ static Base *outliner_batch_delete_hierarchy(
|
|||
"one user",
|
||||
object->id.name + 2,
|
||||
scene->id.name + 2);
|
||||
return base_next;
|
||||
BLI_assert((object->id.tag & LIB_TAG_DOIT) == 0);
|
||||
}
|
||||
|
||||
DEG_id_tag_update_ex(bmain, &object->id, ID_RECALC_BASE_FLAGS);
|
||||
BKE_scene_collections_object_remove(bmain, scene, object, false);
|
||||
|
||||
if (object->id.us == 0) {
|
||||
object->id.tag |= LIB_TAG_DOIT;
|
||||
}
|
||||
|
||||
return base_next;
|
||||
object->id.tag |= LIB_TAG_DOIT;
|
||||
}
|
||||
|
||||
static void object_batch_delete_hierarchy_fn(bContext *C,
|
||||
ReportList *reports,
|
||||
Scene *scene,
|
||||
Object *ob)
|
||||
static void outliner_batch_delete_object_hierarchy_tag(
|
||||
ReportList *reports, Main *bmain, ViewLayer *view_layer, Scene *scene, Base *base)
|
||||
{
|
||||
Object *object = base->object;
|
||||
BLI_assert(object != nullptr);
|
||||
|
||||
outliner_batch_delete_object_tag(reports, bmain, scene, object);
|
||||
|
||||
/* Even though the object itself may not be deletable, some of its children may still be
|
||||
* deletable. */
|
||||
for (Base *base_iter = static_cast<Base *>(BKE_view_layer_object_bases_get(view_layer)->first);
|
||||
base_iter != nullptr;
|
||||
base_iter = base_iter->next) {
|
||||
Object *parent_ob_iter;
|
||||
for (parent_ob_iter = base_iter->object->parent;
|
||||
(parent_ob_iter != nullptr && parent_ob_iter != object &&
|
||||
(parent_ob_iter->id.tag & LIB_TAG_DOIT) == 0);
|
||||
parent_ob_iter = parent_ob_iter->parent) {
|
||||
/* pass */
|
||||
}
|
||||
if (parent_ob_iter != nullptr) {
|
||||
/* There is one or more parents to current iterated object that also need to be deleted,
|
||||
* process the parenting chain again to tag them as such.
|
||||
*
|
||||
* NOTE: Since objects that cannot be deleted are not tagged, the relevant 'parenting'
|
||||
* branches may be looped over more than once. Would not expect this to be a real issue in
|
||||
* practice though. */
|
||||
for (parent_ob_iter = base_iter->object;
|
||||
(parent_ob_iter != nullptr && parent_ob_iter != object &&
|
||||
(parent_ob_iter->id.tag & LIB_TAG_DOIT) == 0);
|
||||
parent_ob_iter = parent_ob_iter->parent) {
|
||||
outliner_batch_delete_object_tag(reports, bmain, scene, parent_ob_iter);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void object_batch_delete_hierarchy_tag_fn(bContext *C,
|
||||
ReportList *reports,
|
||||
Scene *scene,
|
||||
Object *ob)
|
||||
{
|
||||
if (ob->id.tag & LIB_TAG_DOIT) {
|
||||
/* Object has already been processed and tagged for removal as part of another parenting
|
||||
* hierarchy. */
|
||||
#ifndef NDEBUG
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
BLI_assert(BKE_view_layer_base_find(view_layer, ob) == nullptr);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
Object *obedit = CTX_data_edit_object(C);
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_base_find(view_layer, ob);
|
||||
|
||||
if (base) {
|
||||
/* Check also library later. */
|
||||
for (; obedit && (obedit != base->object); obedit = obedit->parent) {
|
||||
/* pass */
|
||||
}
|
||||
if (obedit == base->object) {
|
||||
ED_object_editmode_exit(C, EM_FREEDATA);
|
||||
if (base == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Exit Edit mode if the active object or one of its children are being edited. */
|
||||
for (; obedit && (obedit != base->object); obedit = obedit->parent) {
|
||||
/* pass */
|
||||
}
|
||||
if (obedit == base->object) {
|
||||
ED_object_editmode_exit(C, EM_FREEDATA);
|
||||
}
|
||||
|
||||
Main *bmain = CTX_data_main(C);
|
||||
outliner_batch_delete_object_hierarchy_tag(reports, bmain, view_layer, scene, base);
|
||||
}
|
||||
|
||||
static void outliner_batch_delete_object_hierarchy(Main *bmain, Scene *scene)
|
||||
{
|
||||
LISTBASE_FOREACH (Object *, ob_iter, &bmain->objects) {
|
||||
if ((ob_iter->id.tag & LIB_TAG_DOIT) == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
outliner_batch_delete_hierarchy(reports, CTX_data_main(C), view_layer, scene, base);
|
||||
BKE_scene_collections_object_remove(bmain, scene, ob_iter, false);
|
||||
|
||||
/* Check on all objects tagged for deletion, these that are still in use (e.g. in collections
|
||||
* from another scene) should not be deleted. They also need to be tagged for depsgraph update.
|
||||
*/
|
||||
if (ob_iter->id.us != 0) {
|
||||
ob_iter->id.tag &= ~LIB_TAG_DOIT;
|
||||
DEG_id_tag_update_ex(bmain, &ob_iter->id, ID_RECALC_BASE_FLAGS);
|
||||
}
|
||||
}
|
||||
|
||||
BKE_id_multi_tagged_delete(bmain);
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
@ -2476,10 +2519,17 @@ static int outliner_delete_exec(bContext *C, wmOperator *op)
|
|||
if (delete_hierarchy) {
|
||||
BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, false);
|
||||
|
||||
outliner_do_object_delete(
|
||||
C, op->reports, scene, object_delete_data.objects_set, object_batch_delete_hierarchy_fn);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
|
||||
BKE_id_multi_tagged_delete(bmain);
|
||||
/* #object_batch_delete_hierarchy_fn callback will only remove objects from collections and tag
|
||||
* them for deletion. */
|
||||
outliner_do_object_delete(C,
|
||||
op->reports,
|
||||
scene,
|
||||
object_delete_data.objects_set,
|
||||
object_batch_delete_hierarchy_tag_fn);
|
||||
|
||||
outliner_batch_delete_object_hierarchy(bmain, scene);
|
||||
}
|
||||
else {
|
||||
outliner_do_object_delete(
|
||||
|
|
|
@ -5014,7 +5014,7 @@ static void def_vector_math(StructRNA *srna)
|
|||
RNA_def_property_enum_sdna(prop, NULL, "custom1");
|
||||
RNA_def_property_enum_items(prop, rna_enum_node_vec_math_items);
|
||||
RNA_def_property_ui_text(prop, "Operation", "");
|
||||
RNA_def_struct_translation_context(srna, BLT_I18NCONTEXT_ID_NODETREE);
|
||||
RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_ID_NODETREE);
|
||||
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_ShaderNode_socket_update");
|
||||
}
|
||||
|
||||
|
|
|
@ -215,6 +215,7 @@ static void rna_def_text(BlenderRNA *brna)
|
|||
prop = RNA_def_property(srna, "is_modified", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
||||
RNA_def_property_boolean_funcs(prop, "rna_Text_modified_get", NULL);
|
||||
RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_ID_TEXT);
|
||||
RNA_def_property_ui_text(
|
||||
prop, "Modified", "Text file on disk is different than the one in memory");
|
||||
|
||||
|
|
|
@ -2312,6 +2312,7 @@ static void rna_def_userdef_theme_space_view3d(BlenderRNA *brna)
|
|||
prop = RNA_def_property(srna, "empty", PROP_FLOAT, PROP_COLOR_GAMMA);
|
||||
RNA_def_property_array(prop, 3);
|
||||
RNA_def_property_ui_text(prop, "Empty", "");
|
||||
RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_ID_ID);
|
||||
RNA_def_property_update(prop, 0, "rna_userdef_theme_update");
|
||||
|
||||
prop = RNA_def_property(srna, "light", PROP_FLOAT, PROP_COLOR_GAMMA);
|
||||
|
|
|
@ -169,7 +169,7 @@ static void panel_draw(const bContext * /*C*/, Panel *panel)
|
|||
|
||||
uiItemR(col, ptr, "mirror_object", 0, nullptr, ICON_NONE);
|
||||
|
||||
uiItemR(col, ptr, "use_clip", 0, IFACE_("Clipping"), ICON_NONE);
|
||||
uiItemR(col, ptr, "use_clip", 0, CTX_IFACE_(BLT_I18NCONTEXT_ID_MESH, "Clipping"), ICON_NONE);
|
||||
|
||||
row = uiLayoutRowWithHeading(col, true, IFACE_("Merge"));
|
||||
uiItemR(row, ptr, "use_mirror_merge", 0, "", ICON_NONE);
|
||||
|
|
|
@ -32,7 +32,8 @@ static void cmp_node_huesatval_declare(NodeDeclarationBuilder &b)
|
|||
.max(2.0f)
|
||||
.subtype(PROP_FACTOR)
|
||||
.compositor_domain_priority(2);
|
||||
b.add_input<decl::Float>(N_("Value"))
|
||||
b.add_input<decl::Float>(CTX_N_(BLT_I18NCONTEXT_COLOR, "Value"))
|
||||
.translation_context(BLT_I18NCONTEXT_COLOR)
|
||||
.default_value(1.0f)
|
||||
.min(0.0f)
|
||||
.max(2.0f)
|
||||
|
|
|
@ -7,7 +7,8 @@ namespace blender::nodes::node_fn_input_special_characters_cc {
|
|||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_output<decl::String>(N_("Line Break"));
|
||||
b.add_output<decl::String>(N_("Tab"));
|
||||
b.add_output<decl::String>(CTX_N_(BLT_I18NCONTEXT_ID_TEXT, "Tab"))
|
||||
.translation_context(BLT_I18NCONTEXT_ID_TEXT);
|
||||
}
|
||||
|
||||
class MF_SpecialCharacters : public mf::MultiFunction {
|
||||
|
|
|
@ -25,7 +25,9 @@ NODE_STORAGE_FUNCS(NodeGeometryDistributePointsInVolume)
|
|||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Volume")).supported_type(GEO_COMPONENT_TYPE_VOLUME);
|
||||
b.add_input<decl::Geometry>(CTX_N_(BLT_I18NCONTEXT_ID_ID, "Volume"))
|
||||
.supported_type(GEO_COMPONENT_TYPE_VOLUME)
|
||||
.translation_context(BLT_I18NCONTEXT_ID_ID);
|
||||
b.add_input<decl::Float>(N_("Density"))
|
||||
.default_value(1.0f)
|
||||
.min(0.0f)
|
||||
|
|
|
@ -5,13 +5,16 @@
|
|||
|
||||
#include "BKE_mesh.hh"
|
||||
|
||||
#include "BLT_translation.h"
|
||||
|
||||
#include "node_geometry_util.hh"
|
||||
|
||||
namespace blender::nodes::node_geo_input_mesh_face_area_cc {
|
||||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_output<decl::Float>(N_("Area"))
|
||||
b.add_output<decl::Float>(CTX_N_(BLT_I18NCONTEXT_AMOUNT, "Area"))
|
||||
.translation_context(BLT_I18NCONTEXT_AMOUNT)
|
||||
.field_source()
|
||||
.description(N_("The surface area of each of the mesh's faces"));
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@ static void node_declare(NodeDeclarationBuilder &b)
|
|||
{
|
||||
b.add_input<decl::Geometry>(N_("Geometry")).supported_type(GEO_COMPONENT_TYPE_MESH);
|
||||
b.add_input<decl::Material>(N_("Old"));
|
||||
b.add_input<decl::Material>(N_("New"));
|
||||
b.add_input<decl::Material>(N_("New")).translation_context(BLT_I18NCONTEXT_ID_MATERIAL);
|
||||
b.add_output<decl::Geometry>(N_("Geometry")).propagate_all();
|
||||
}
|
||||
|
||||
|
|
|
@ -22,10 +22,13 @@ namespace blender::nodes::node_geo_mean_filter_sdf_volume_cc {
|
|||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Volume")).supported_type(GEO_COMPONENT_TYPE_VOLUME);
|
||||
b.add_input<decl::Geometry>(CTX_N_(BLT_I18NCONTEXT_ID_ID, "Volume"))
|
||||
.supported_type(GEO_COMPONENT_TYPE_VOLUME)
|
||||
.translation_context(BLT_I18NCONTEXT_ID_ID);
|
||||
b.add_input<decl::Int>(N_("Iterations")).min(1).max(256).default_value(1);
|
||||
b.add_input<decl::Int>(N_("Width")).min(0).default_value(1);
|
||||
b.add_output<decl::Geometry>(N_("Volume"));
|
||||
b.add_output<decl::Geometry>(CTX_N_(BLT_I18NCONTEXT_ID_ID, "Volume"))
|
||||
.translation_context(BLT_I18NCONTEXT_ID_ID);
|
||||
}
|
||||
|
||||
static void search_node_add_ops(GatherAddNodeSearchParams ¶ms)
|
||||
|
|
|
@ -39,7 +39,8 @@ static void node_declare(NodeDeclarationBuilder &b)
|
|||
.default_value(3.0f)
|
||||
.min(1.01f)
|
||||
.max(10.0f);
|
||||
b.add_output<decl::Geometry>(N_("Volume"));
|
||||
b.add_output<decl::Geometry>(CTX_N_(BLT_I18NCONTEXT_ID_ID, "Volume"))
|
||||
.translation_context(BLT_I18NCONTEXT_ID_ID);
|
||||
}
|
||||
|
||||
static void search_node_add_ops(GatherAddNodeSearchParams ¶ms)
|
||||
|
|
|
@ -47,7 +47,8 @@ static void node_declare(NodeDeclarationBuilder &b)
|
|||
b.add_input<decl::Bool>(N_("Fill Volume"))
|
||||
.default_value(true)
|
||||
.description(N_("Initialize the density grid in every cell inside the enclosed volume"));
|
||||
b.add_output<decl::Geometry>(N_("Volume"));
|
||||
b.add_output<decl::Geometry>(CTX_N_(BLT_I18NCONTEXT_ID_ID, "Volume"))
|
||||
.translation_context(BLT_I18NCONTEXT_ID_ID);
|
||||
}
|
||||
|
||||
static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr)
|
||||
|
|
|
@ -22,9 +22,12 @@ namespace blender::nodes::node_geo_offset_sdf_volume_cc {
|
|||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Volume")).supported_type(GEO_COMPONENT_TYPE_VOLUME);
|
||||
b.add_input<decl::Geometry>(CTX_N_(BLT_I18NCONTEXT_ID_ID, "Volume"))
|
||||
.supported_type(GEO_COMPONENT_TYPE_VOLUME)
|
||||
.translation_context(BLT_I18NCONTEXT_ID_ID);
|
||||
b.add_input<decl::Float>(N_("Distance")).default_value(0.1f).subtype(PROP_DISTANCE);
|
||||
b.add_output<decl::Geometry>(N_("Volume"));
|
||||
b.add_output<decl::Geometry>(CTX_N_(BLT_I18NCONTEXT_ID_ID, "Volume"))
|
||||
.translation_context(BLT_I18NCONTEXT_ID_ID);
|
||||
}
|
||||
|
||||
static void search_node_add_ops(GatherAddNodeSearchParams ¶ms)
|
||||
|
|
|
@ -39,7 +39,8 @@ static void node_declare(NodeDeclarationBuilder &b)
|
|||
.min(0.0f)
|
||||
.subtype(PROP_DISTANCE)
|
||||
.field_on_all();
|
||||
b.add_output<decl::Geometry>(N_("Volume"));
|
||||
b.add_output<decl::Geometry>(CTX_N_(BLT_I18NCONTEXT_ID_ID, "Volume"))
|
||||
.translation_context(BLT_I18NCONTEXT_ID_ID);
|
||||
}
|
||||
|
||||
static void search_node_add_ops(GatherAddNodeSearchParams ¶ms)
|
||||
|
|
|
@ -161,7 +161,8 @@ static void node_declare(NodeDeclarationBuilder &b)
|
|||
.min(0.0f)
|
||||
.subtype(PROP_DISTANCE)
|
||||
.field_on_all();
|
||||
b.add_output<decl::Geometry>(N_("Volume"));
|
||||
b.add_output<decl::Geometry>(CTX_N_(BLT_I18NCONTEXT_ID_ID, "Volume"))
|
||||
.translation_context(BLT_I18NCONTEXT_ID_ID);
|
||||
}
|
||||
|
||||
static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr)
|
||||
|
|
|
@ -25,7 +25,8 @@ static void node_declare(NodeDeclarationBuilder &b)
|
|||
.default_value(3.0f)
|
||||
.min(1.01f)
|
||||
.max(10.0f);
|
||||
b.add_output<decl::Geometry>(N_("Volume"));
|
||||
b.add_output<decl::Geometry>(CTX_N_(BLT_I18NCONTEXT_ID_ID, "Volume"))
|
||||
.translation_context(BLT_I18NCONTEXT_ID_ID);
|
||||
}
|
||||
|
||||
static void search_node_add_ops(GatherAddNodeSearchParams ¶ms)
|
||||
|
|
|
@ -10,7 +10,9 @@ static void node_declare(NodeDeclarationBuilder &b)
|
|||
b.add_output<decl::Geometry>(N_("Mesh")).propagate_all();
|
||||
b.add_output<decl::Geometry>(N_("Point Cloud")).propagate_all();
|
||||
b.add_output<decl::Geometry>(N_("Curve")).propagate_all();
|
||||
b.add_output<decl::Geometry>(N_("Volume")).propagate_all();
|
||||
b.add_output<decl::Geometry>(CTX_N_(BLT_I18NCONTEXT_ID_ID, "Volume"))
|
||||
.translation_context(BLT_I18NCONTEXT_ID_ID)
|
||||
.propagate_all();
|
||||
b.add_output<decl::Geometry>(N_("Instances")).propagate_all();
|
||||
}
|
||||
|
||||
|
|
|
@ -49,7 +49,8 @@ static void node_declare(NodeDeclarationBuilder &b)
|
|||
.default_value(32)
|
||||
.min(2);
|
||||
|
||||
b.add_output<decl::Geometry>(N_("Volume"));
|
||||
b.add_output<decl::Geometry>(CTX_N_(BLT_I18NCONTEXT_ID_ID, "Volume"))
|
||||
.translation_context(BLT_I18NCONTEXT_ID_ID);
|
||||
}
|
||||
|
||||
static float map(const float x,
|
||||
|
|
|
@ -27,7 +27,9 @@ NODE_STORAGE_FUNCS(NodeGeometryVolumeToMesh)
|
|||
|
||||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Geometry>(N_("Volume")).supported_type(GEO_COMPONENT_TYPE_VOLUME);
|
||||
b.add_input<decl::Geometry>(CTX_N_(BLT_I18NCONTEXT_ID_ID, "Volume"))
|
||||
.translation_context(BLT_I18NCONTEXT_ID_ID)
|
||||
.supported_type(GEO_COMPONENT_TYPE_VOLUME);
|
||||
b.add_input<decl::Float>(N_("Voxel Size"))
|
||||
.default_value(0.3f)
|
||||
.min(0.01f)
|
||||
|
|
|
@ -114,7 +114,7 @@ void GeoNodeExecParams::check_input_geometry_set(StringRef identifier,
|
|||
break;
|
||||
}
|
||||
case GEO_COMPONENT_TYPE_VOLUME: {
|
||||
message += TIP_("Volume");
|
||||
message += CTX_TIP_(BLT_I18NCONTEXT_ID_ID, "Volume");
|
||||
break;
|
||||
}
|
||||
case GEO_COMPONENT_TYPE_CURVE: {
|
||||
|
|
|
@ -13,7 +13,11 @@ static void node_declare(NodeDeclarationBuilder &b)
|
|||
{
|
||||
b.add_input<decl::Float>(N_("Hue")).default_value(0.5f).min(0.0f).max(1.0f);
|
||||
b.add_input<decl::Float>(N_("Saturation")).default_value(1.0f).min(0.0f).max(2.0f);
|
||||
b.add_input<decl::Float>(N_("Value")).default_value(1.0f).min(0.0f).max(2.0f);
|
||||
b.add_input<decl::Float>(CTX_N_(BLT_I18NCONTEXT_COLOR, "Value"))
|
||||
.default_value(1.0f)
|
||||
.min(0.0f)
|
||||
.max(2.0f)
|
||||
.translation_context(BLT_I18NCONTEXT_COLOR);
|
||||
b.add_input<decl::Float>(N_("Fac")).default_value(1.0f).min(0.0f).max(1.0f).subtype(PROP_FACTOR);
|
||||
b.add_input<decl::Color>(N_("Color")).default_value({0.8f, 0.8f, 0.8f, 1.0f});
|
||||
b.add_output<decl::Color>(N_("Color"));
|
||||
|
|
|
@ -10,7 +10,8 @@ namespace blender::nodes::node_shader_output_material_cc {
|
|||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Shader>(N_("Surface"));
|
||||
b.add_input<decl::Shader>(N_("Volume"));
|
||||
b.add_input<decl::Shader>(CTX_N_(BLT_I18NCONTEXT_ID_ID, "Volume"))
|
||||
.translation_context(BLT_I18NCONTEXT_ID_ID);
|
||||
b.add_input<decl::Vector>(N_("Displacement")).hide_value();
|
||||
b.add_input<decl::Float>(N_("Thickness")).hide_value().unavailable(); /* Not used for now. */
|
||||
}
|
||||
|
|
|
@ -8,7 +8,8 @@ namespace blender::nodes::node_shader_output_world_cc {
|
|||
static void node_declare(NodeDeclarationBuilder &b)
|
||||
{
|
||||
b.add_input<decl::Shader>(N_("Surface"));
|
||||
b.add_input<decl::Shader>(N_("Volume"));
|
||||
b.add_input<decl::Shader>(CTX_N_(BLT_I18NCONTEXT_ID_ID, "Volume"))
|
||||
.translation_context(BLT_I18NCONTEXT_ID_ID);
|
||||
}
|
||||
|
||||
static int node_shader_gpu_output_world(GPUMaterial *mat,
|
||||
|
|
|
@ -10,7 +10,8 @@ static void node_declare(NodeDeclarationBuilder &b)
|
|||
b.add_input<decl::Color>(N_("Color")).default_value({0.8f, 0.8f, 0.8f, 1.0f});
|
||||
b.add_input<decl::Float>(N_("Density")).default_value(1.0f).min(0.0f).max(1000.0f);
|
||||
b.add_input<decl::Float>(N_("Weight")).unavailable();
|
||||
b.add_output<decl::Shader>(N_("Volume"));
|
||||
b.add_output<decl::Shader>(CTX_N_(BLT_I18NCONTEXT_ID_ID, "Volume"))
|
||||
.translation_context(BLT_I18NCONTEXT_ID_ID);
|
||||
}
|
||||
|
||||
static int node_shader_gpu_volume_absorption(GPUMaterial *mat,
|
||||
|
|
|
@ -30,7 +30,8 @@ static void node_declare(NodeDeclarationBuilder &b)
|
|||
b.add_input<decl::Float>(N_("Temperature")).default_value(1000.0f).min(0.0f).max(6500.0f);
|
||||
b.add_input<decl::String>(N_("Temperature Attribute"));
|
||||
b.add_input<decl::Float>(N_("Weight")).unavailable();
|
||||
b.add_output<decl::Shader>(N_("Volume"));
|
||||
b.add_output<decl::Shader>(CTX_N_(BLT_I18NCONTEXT_ID_ID, "Volume"))
|
||||
.translation_context(BLT_I18NCONTEXT_ID_ID);
|
||||
}
|
||||
|
||||
static void node_shader_init_volume_principled(bNodeTree * /*ntree*/, bNode *node)
|
||||
|
|
|
@ -15,7 +15,8 @@ static void node_declare(NodeDeclarationBuilder &b)
|
|||
.max(1.0f)
|
||||
.subtype(PROP_FACTOR);
|
||||
b.add_input<decl::Float>(N_("Weight")).unavailable();
|
||||
b.add_output<decl::Shader>(N_("Volume"));
|
||||
b.add_output<decl::Shader>(CTX_N_(BLT_I18NCONTEXT_ID_ID, "Volume"))
|
||||
.translation_context(BLT_I18NCONTEXT_ID_ID);
|
||||
}
|
||||
|
||||
static int node_shader_gpu_volume_scatter(GPUMaterial *mat,
|
||||
|
|
|
@ -1099,7 +1099,8 @@ const char *WM_key_event_string(const short type, const bool compact)
|
|||
return IFACE_("OS");
|
||||
} break;
|
||||
case EVT_TABKEY:
|
||||
return key_event_glyph_or_text(font_id, IFACE_("Tab"), "\xe2\xad\xbe");
|
||||
return key_event_glyph_or_text(
|
||||
font_id, CTX_N_(BLT_I18NCONTEXT_UI_EVENTS, "Tab"), "\xe2\xad\xbe");
|
||||
case EVT_BACKSPACEKEY:
|
||||
return key_event_glyph_or_text(font_id, IFACE_("Bksp"), "\xe2\x8c\xab");
|
||||
case EVT_ESCKEY:
|
||||
|
|
Loading…
Reference in New Issue