From a280e8a68c15ee3ec0978fb594b29d083fd2bcd6 Mon Sep 17 00:00:00 2001 From: Martijn Versteegh Date: Wed, 5 Jul 2023 20:06:18 +0200 Subject: [PATCH 001/115] Fix #107416: Check length of Property Collection before type In edit mode the uv map data length gets set to zero. The specialized MLoopUV code used to have a check to detect this when trying to access the UVs using foreach_get/set . Add this check for the Attribute code path as well. Pull Request: https://projects.blender.org/blender/blender/pulls/109179 --- source/blender/python/intern/bpy_rna.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 81e8809167f..2086a79df9e 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -5287,10 +5287,8 @@ static int foreach_parse_args(BPy_PropertyRNA *self, int *r_attr_tot, bool *r_attr_signed) { -#if 0 int array_tot; int target_tot; -#endif *r_size = *r_attr_tot = 0; *r_attr_signed = false; @@ -5312,6 +5310,19 @@ static int foreach_parse_args(BPy_PropertyRNA *self, *r_tot = PySequence_Size(*r_seq); if (*r_tot > 0) { + if (RNA_property_type(self->prop) == PROP_COLLECTION) { + array_tot = RNA_property_collection_length(&self->ptr, self->prop); + } + else { + array_tot = RNA_property_array_length(&self->ptr, self->prop); + } + if (array_tot == 0) { + PyErr_Format(PyExc_TypeError, + "foreach_get(attr, sequence) sequence length mismatch given %d, needed 0", + *r_tot); + return -1; + } + if (!foreach_attr_type(self, *r_attr, r_raw_type, r_attr_tot, r_attr_signed)) { PyErr_Format(PyExc_AttributeError, "foreach_get/set '%.200s.%200s[...]' elements have no attribute '%.200s'", @@ -5322,19 +5333,10 @@ static int foreach_parse_args(BPy_PropertyRNA *self, } *r_size = RNA_raw_type_sizeof(*r_raw_type); -#if 0 /* Works fine, but not strictly needed. \ - * we could allow RNA_property_collection_raw_* to do the checks */ if ((*r_attr_tot) < 1) { *r_attr_tot = 1; } - if (RNA_property_type(self->prop) == PROP_COLLECTION) { - array_tot = RNA_property_collection_length(&self->ptr, self->prop); - } - else { - array_tot = RNA_property_array_length(&self->ptr, self->prop); - } - target_tot = array_tot * (*r_attr_tot); /* rna_access.cc - rna_raw_access(...) uses this same method. */ @@ -5345,7 +5347,6 @@ static int foreach_parse_args(BPy_PropertyRNA *self, target_tot); return -1; } -#endif } /* Check 'r_attr_tot' otherwise we don't know if any values were set. -- 2.30.2 From 4c6653274c95d1350770105f18d5bcda592fb6e1 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 5 Jul 2023 19:53:32 +0200 Subject: [PATCH 002/115] Fix full frame compositor crash when Image node can't load image Ref #109168 --- .../compositor/operations/COM_MultilayerImageOperation.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/source/blender/compositor/operations/COM_MultilayerImageOperation.cc b/source/blender/compositor/operations/COM_MultilayerImageOperation.cc index 18fe706dc0c..30631a95b10 100644 --- a/source/blender/compositor/operations/COM_MultilayerImageOperation.cc +++ b/source/blender/compositor/operations/COM_MultilayerImageOperation.cc @@ -40,7 +40,12 @@ void MultilayerBaseOperation::update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span /*inputs*/) { - output->copy_from(buffer_, area); + if (buffer_) { + output->copy_from(buffer_, area); + } + else { + output->clear(); + } } std::unique_ptr MultilayerColorOperation::get_meta_data() -- 2.30.2 From 2b4666b17bd2f7bac84601b73db0921a7d92ec82 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Wed, 5 Jul 2023 15:39:27 -0400 Subject: [PATCH 003/115] Geometry Nodes: Fill new quad poly offsets in parallel Add an offset indices utility to do fill constant size new offsets in parallel, which was already done in the duplicate elements node. For example, filling poly offsets for a new part of a mesh that is only quads. In the extrude node this was single-threaded before, so the new poly offsets is about 10x faster, saving about 10 out of 157 ms when extruding 2 million faces. --- source/blender/blenkernel/intern/mesh_remesh_voxel.cc | 11 +++++------ source/blender/blenlib/BLI_offset_indices.hh | 3 +++ source/blender/blenlib/intern/offset_indices.cc | 9 +++++++++ .../geometry/nodes/node_geo_duplicate_elements.cc | 10 ++-------- .../nodes/geometry/nodes/node_geo_extrude_mesh.cc | 9 +++------ 5 files changed, 22 insertions(+), 20 deletions(-) diff --git a/source/blender/blenkernel/intern/mesh_remesh_voxel.cc b/source/blender/blenkernel/intern/mesh_remesh_voxel.cc index 377d7db183d..14c2ba22f66 100644 --- a/source/blender/blenkernel/intern/mesh_remesh_voxel.cc +++ b/source/blender/blenkernel/intern/mesh_remesh_voxel.cc @@ -125,8 +125,7 @@ static Mesh *remesh_quadriflow(const Mesh *input_mesh, MutableSpan poly_offsets = mesh->poly_offsets_for_write(); MutableSpan corner_verts = mesh->corner_verts_for_write(); - poly_offsets.fill(4); - blender::offset_indices::accumulate_counts_to_offsets(poly_offsets); + blender::offset_indices::fill_constant_group_size(4, 0, poly_offsets); mesh->vert_positions_for_write().copy_from( Span(reinterpret_cast(qrd.out_verts), qrd.out_totverts)); @@ -230,10 +229,11 @@ static Mesh *remesh_voxel_volume_to_mesh(const openvdb::FloatGrid::Ptr level_set MutableSpan poly_offsets = mesh->poly_offsets_for_write(); MutableSpan mesh_corner_verts = mesh->corner_verts_for_write(); + const int triangle_loop_start = quads.size() * 4; if (!poly_offsets.is_empty()) { - poly_offsets.take_front(quads.size()).fill(4); - poly_offsets.drop_front(quads.size()).fill(3); - blender::offset_indices::accumulate_counts_to_offsets(poly_offsets); + blender::offset_indices::fill_constant_group_size(4, 0, poly_offsets.take_front(quads.size())); + blender::offset_indices::fill_constant_group_size( + 3, triangle_loop_start, poly_offsets.drop_front(quads.size())); } for (const int i : vert_positions.index_range()) { @@ -248,7 +248,6 @@ static Mesh *remesh_voxel_volume_to_mesh(const openvdb::FloatGrid::Ptr level_set mesh_corner_verts[loopstart + 3] = quads[i][1]; } - const int triangle_loop_start = quads.size() * 4; for (const int i : IndexRange(tris.size())) { const int loopstart = triangle_loop_start + i * 3; mesh_corner_verts[loopstart] = tris[i][2]; diff --git a/source/blender/blenlib/BLI_offset_indices.hh b/source/blender/blenlib/BLI_offset_indices.hh index 5ef29727613..b1533e8f05e 100644 --- a/source/blender/blenlib/BLI_offset_indices.hh +++ b/source/blender/blenlib/BLI_offset_indices.hh @@ -140,6 +140,9 @@ template struct GroupedSpan { OffsetIndices accumulate_counts_to_offsets(MutableSpan counts_to_offsets, int start_offset = 0); +/** Create offsets where every group has the same size. */ +void fill_constant_group_size(int size, int start_offset, MutableSpan offsets); + /** Copy the number of indices in every group in the mask to the corresponding index. */ void copy_group_sizes(OffsetIndices offsets, const IndexMask &mask, MutableSpan sizes); diff --git a/source/blender/blenlib/intern/offset_indices.cc b/source/blender/blenlib/intern/offset_indices.cc index 546281f455e..4445dfabd9f 100644 --- a/source/blender/blenlib/intern/offset_indices.cc +++ b/source/blender/blenlib/intern/offset_indices.cc @@ -22,6 +22,15 @@ OffsetIndices accumulate_counts_to_offsets(MutableSpan counts_to_offse return OffsetIndices(counts_to_offsets); } +void fill_constant_group_size(const int size, const int start_offset, MutableSpan offsets) +{ + threading::parallel_for(offsets.index_range(), 1024, [&](const IndexRange range) { + for (const int64_t i : range) { + offsets[i] = size * i + start_offset; + } + }); +} + void copy_group_sizes(const OffsetIndices offsets, const IndexMask &mask, MutableSpan sizes) diff --git a/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc b/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc index c3b78112a34..5933c42e22c 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc @@ -68,14 +68,8 @@ static OffsetIndices accumulate_counts_to_offsets(const IndexMask &selectio Array &r_offset_data) { r_offset_data.reinitialize(selection.size() + 1); - if (counts.is_single()) { - const int count = counts.get_internal_single(); - threading::parallel_for(selection.index_range(), 1024, [&](const IndexRange range) { - for (const int64_t i : range) { - r_offset_data[i] = count * i; - } - }); - r_offset_data.last() = count * selection.size(); + if (const std::optional count = counts.get_if_single()) { + offset_indices::fill_constant_group_size(*count, 0, r_offset_data); } else { array_utils::gather(counts, selection, r_offset_data.as_mutable_span().drop_back(1), 1024); diff --git a/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc b/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc index 745875da6bc..456f9a9e96a 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc @@ -487,8 +487,7 @@ static void extrude_mesh_edges(Mesh &mesh, MutableSpan corner_edges = mesh.corner_edges_for_write(); MutableSpan new_corner_edges = corner_edges.slice(new_loop_range); - new_poly_offsets.fill(4); - offset_indices::accumulate_counts_to_offsets(new_poly_offsets, orig_loop_size); + offset_indices::fill_constant_group_size(4, orig_loop_size, new_poly_offsets); const OffsetIndices polys = mesh.polys(); for (const int i : connect_edges.index_range()) { @@ -848,8 +847,7 @@ static void extrude_mesh_face_regions(Mesh &mesh, /* Initialize the new side polygons. */ if (!new_poly_offsets.is_empty()) { - new_poly_offsets.fill(4); - offset_indices::accumulate_counts_to_offsets(new_poly_offsets, orig_loop_size); + offset_indices::fill_constant_group_size(4, orig_loop_size, new_poly_offsets); } const OffsetIndices polys = mesh.polys(); @@ -1169,8 +1167,7 @@ static void extrude_individual_mesh_faces( MutableSpan corner_verts = mesh.corner_verts_for_write(); MutableSpan corner_edges = mesh.corner_edges_for_write(); - new_poly_offsets.fill(4); - offset_indices::accumulate_counts_to_offsets(new_poly_offsets, orig_loop_size); + offset_indices::fill_constant_group_size(4, orig_loop_size, new_poly_offsets); const OffsetIndices polys = mesh.polys(); /* For every selected polygon, change it to use the new extruded vertices and the duplicate -- 2.30.2 From c65fa57b0b6283a35a385b932f84b5f023241360 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Wed, 5 Jul 2023 16:53:22 -0400 Subject: [PATCH 004/115] Fix #109691: Edge crease not handled in complex solidify a8a454287a27d408668f which moved edge creases out of `MEdge` only retrieved the result data array if the mesh had vertex creases. Before the processing always happened though. So process the result creases if the input has edge creases too, and try to retrieve an existing array instead of always adding a new one. --- .../modifiers/intern/MOD_solidify_nonmanifold.cc | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc b/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc index c4f2cbaab59..52da9bbbba4 100644 --- a/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc +++ b/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc @@ -2021,9 +2021,13 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md, const float *vertex_crease = static_cast( CustomData_get_layer_named(&mesh->vdata, CD_PROP_FLOAT, "crease_vert")); float *result_edge_crease = nullptr; - if (vertex_crease) { - result_edge_crease = (float *)CustomData_add_layer_named( - &result->edata, CD_PROP_FLOAT, CD_SET_DEFAULT, result->totedge, "crease_edge"); + if (vertex_crease || orig_edge_crease) { + result_edge_crease = static_cast(CustomData_get_layer_named_for_write( + &result->edata, CD_PROP_FLOAT, "crease_edge", result->totedge)); + if (!result_edge_crease) { + result_edge_crease = (float *)CustomData_add_layer_named( + &result->edata, CD_PROP_FLOAT, CD_SET_DEFAULT, result->totedge, "crease_edge"); + } /* delete all vertex creases in the result if a rim is used. */ if (do_rim) { CustomData_free_layer_named(&result->vdata, "crease_vert", result->totvert); -- 2.30.2 From 6a79639ef71845d99d2e5a6fb3bcea7015550a57 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 6 Jul 2023 10:29:02 +1000 Subject: [PATCH 005/115] Cleanup: use function style casts, remove void function argument Also remove redundant parenthesis. --- source/blender/blenlib/intern/BLI_heap.c | 2 +- .../operations/COM_DespeckleOperation.cc | 4 +-- .../shaders/eevee_lightprobe_eval_lib.glsl | 2 +- .../shaders/eevee_octahedron_lib.glsl | 2 +- .../eevee_reflection_probe_remap_comp.glsl | 2 +- source/blender/draw/intern/draw_cache.c | 8 +++--- .../editors/animation/anim_channels_edit.cc | 2 +- .../blender/editors/animation/anim_filter.cc | 2 +- .../editors/animation/anim_ipo_utils.cc | 2 +- .../blender/editors/animation/anim_markers.cc | 8 +++--- .../editors/animation/anim_motion_paths.cc | 2 +- source/blender/editors/animation/anim_ops.cc | 2 +- source/blender/editors/animation/drivers.cc | 8 +++--- .../blender/editors/animation/fmodifier_ui.cc | 2 +- .../editors/animation/keyframes_general.cc | 6 ++-- .../blender/editors/animation/keyingsets.cc | 2 +- .../blender/editors/armature/armature_add.cc | 2 +- .../blender/editors/armature/armature_edit.cc | 4 +-- .../blender/editors/armature/armature_ops.cc | 4 +-- .../editors/armature/armature_select.cc | 2 +- .../editors/armature/armature_utils.cc | 10 +++---- source/blender/editors/armature/pose_edit.cc | 2 +- .../blender/editors/armature/pose_select.cc | 2 +- source/blender/editors/lattice/lattice_ops.cc | 2 +- source/blender/editors/mesh/editmesh_bevel.cc | 2 +- .../blender/editors/mesh/editmesh_extrude.cc | 6 ++-- source/blender/editors/mesh/editmesh_knife.cc | 28 +++++++++---------- .../mesh/editmesh_preselect_edgering.cc | 10 +++---- .../editors/mesh/editmesh_preselect_elem.cc | 2 +- .../blender/editors/mesh/editmesh_rip_edge.cc | 2 +- .../editors/mesh/editmesh_select_similar.cc | 4 +-- source/blender/editors/mesh/editmesh_utils.cc | 2 +- source/blender/editors/mesh/mesh_ops.cc | 4 +-- source/blender/editors/metaball/mball_edit.cc | 2 +- source/blender/editors/metaball/mball_ops.cc | 4 +-- .../editors/object/object_collection.cc | 2 +- .../editors/object/object_constraint.cc | 4 +-- source/blender/editors/object/object_hook.cc | 8 +++--- source/blender/editors/object/object_ops.cc | 4 +-- .../editors/object/object_relations.cc | 4 +-- source/blender/editors/object/object_utils.cc | 4 +-- source/blender/editors/scene/scene_edit.cc | 2 +- source/blender/ikplugin/intern/ikplugin_api.c | 2 +- source/blender/makesdna/intern/dna_genfile.cc | 10 +++---- source/blender/makesdna/intern/makesdna.cc | 4 +-- source/blender/makesrna/intern/rna_brush.cc | 10 +++---- source/blender/makesrna/intern/rna_camera.cc | 2 +- .../blender/makesrna/intern/rna_fcurve_api.cc | 2 +- .../blender/makesrna/intern/rna_lightprobe.cc | 2 +- .../blender/makesrna/intern/rna_movieclip.cc | 2 +- .../blender/makesrna/intern/rna_particle.cc | 22 +++++++-------- source/blender/makesrna/intern/rna_sound.cc | 2 +- source/blender/makesrna/intern/rna_text.cc | 2 +- .../blender/makesrna/intern/rna_timeline.cc | 2 +- source/blender/makesrna/intern/rna_vfont.cc | 2 +- .../makesrna/intern/rna_workspace_api.cc | 2 +- source/blender/makesrna/intern/rna_world.cc | 2 +- 57 files changed, 123 insertions(+), 123 deletions(-) diff --git a/source/blender/blenlib/intern/BLI_heap.c b/source/blender/blenlib/intern/BLI_heap.c index bbcb3655ac9..d8eb8ca6289 100644 --- a/source/blender/blenlib/intern/BLI_heap.c +++ b/source/blender/blenlib/intern/BLI_heap.c @@ -40,7 +40,7 @@ struct HeapNode_Chunk { * \note keep type in sync with nodes_num in heap_node_alloc_chunk. */ #define HEAP_CHUNK_DEFAULT_NUM \ - ((uint)((MEM_SIZE_OPTIMAL((1 << 16) - sizeof(struct HeapNode_Chunk))) / sizeof(HeapNode))) + (uint)(MEM_SIZE_OPTIMAL((1 << 16) - sizeof(struct HeapNode_Chunk)) / sizeof(HeapNode)) struct Heap { uint size; diff --git a/source/blender/compositor/operations/COM_DespeckleOperation.cc b/source/blender/compositor/operations/COM_DespeckleOperation.cc index 1e1245d23ff..29a147ce4fe 100644 --- a/source/blender/compositor/operations/COM_DespeckleOperation.cc +++ b/source/blender/compositor/operations/COM_DespeckleOperation.cc @@ -61,7 +61,7 @@ void DespeckleOperation::execute_pixel(float output[4], int x, int y, void * /*d input_operation_->read(color_org, x2, y2, nullptr); #define TOT_DIV_ONE 1.0f -#define TOT_DIV_CNR (float)M_SQRT1_2 +#define TOT_DIV_CNR float(M_SQRT1_2) #define WTOT (TOT_DIV_ONE * 4 + TOT_DIV_CNR * 4) @@ -177,7 +177,7 @@ void DespeckleOperation::update_memory_buffer_partial(MemoryBuffer *output, const float *in1 = nullptr; #define TOT_DIV_ONE 1.0f -#define TOT_DIV_CNR (float)M_SQRT1_2 +#define TOT_DIV_CNR float(M_SQRT1_2) #define WTOT (TOT_DIV_ONE * 4 + TOT_DIV_CNR * 4) diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_eval_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_eval_lib.glsl index 76b3547d7ac..0e9d3f5f2c3 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_eval_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_eval_lib.glsl @@ -76,4 +76,4 @@ void lightprobe_eval(ClosureDiffuse diffuse, SphericalHarmonicL1 irradiance = lightprobe_irradiance_sample(irradiance_atlas_tx, P); out_diffuse += spherical_harmonics_evaluate_lambert(diffuse.N, irradiance); -} \ No newline at end of file +} diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_octahedron_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_octahedron_lib.glsl index 0559dad064e..1393ef0a250 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_octahedron_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_octahedron_lib.glsl @@ -30,4 +30,4 @@ vec3 octahedral_uv_to_direction(vec2 co) } return v; -} \ No newline at end of file +} diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_remap_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_remap_comp.glsl index 8ba491152be..fae4bf5df1f 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_remap_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_remap_comp.glsl @@ -16,4 +16,4 @@ void main() vec4 col = textureLod(cubemap_tx, R, 0.0); imageStore(octahedral_img, octahedral_coord, col); -} \ No newline at end of file +} diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c index 5080e8ce53b..8a369a25c73 100644 --- a/source/blender/draw/intern/draw_cache.c +++ b/source/blender/draw/intern/draw_cache.c @@ -2466,7 +2466,7 @@ static float x_axis_name[4][2] = { {-0.9f * S_X, 1.0f * S_Y}, {1.0f * S_X, -1.0f * S_Y}, }; -#define X_LEN (ARRAY_SIZE(x_axis_name)) +#define X_LEN ARRAY_SIZE(x_axis_name) #undef S_X #undef S_Y @@ -2480,7 +2480,7 @@ static float y_axis_name[6][2] = { {0.0f * S_X, -0.1f * S_Y}, {0.0f * S_X, -1.0f * S_Y}, }; -#define Y_LEN (ARRAY_SIZE(y_axis_name)) +#define Y_LEN ARRAY_SIZE(y_axis_name) #undef S_X #undef S_Y @@ -2498,7 +2498,7 @@ static float z_axis_name[10][2] = { {-1.00f * S_X, -1.00f * S_Y}, {1.00f * S_X, -1.00f * S_Y}, }; -#define Z_LEN (ARRAY_SIZE(z_axis_name)) +#define Z_LEN ARRAY_SIZE(z_axis_name) #undef S_X #undef S_Y @@ -2525,7 +2525,7 @@ static float axis_marker[8][2] = { {-S_X, 0.0f} #endif }; -#define MARKER_LEN (ARRAY_SIZE(axis_marker)) +#define MARKER_LEN ARRAY_SIZE(axis_marker) #define MARKER_FILL_LAYER 6 #undef S_X #undef S_Y diff --git a/source/blender/editors/animation/anim_channels_edit.cc b/source/blender/editors/animation/anim_channels_edit.cc index 39f91fad969..79cea5e753d 100644 --- a/source/blender/editors/animation/anim_channels_edit.cc +++ b/source/blender/editors/animation/anim_channels_edit.cc @@ -4219,7 +4219,7 @@ static void ANIM_OT_channel_view_pick(wmOperatorType *ot) /** \name Operator Registration * \{ */ -void ED_operatortypes_animchannels(void) +void ED_operatortypes_animchannels() { WM_operatortype_append(ANIM_OT_channels_select_all); WM_operatortype_append(ANIM_OT_channels_select_box); diff --git a/source/blender/editors/animation/anim_filter.cc b/source/blender/editors/animation/anim_filter.cc index 89a7db5920f..09004341c1e 100644 --- a/source/blender/editors/animation/anim_filter.cc +++ b/source/blender/editors/animation/anim_filter.cc @@ -1474,7 +1474,7 @@ static size_t animfilter_action(bAnimContext *ac, /* un-grouped F-Curves (only if we're not only considering those channels in the active group) */ if (!(filter_mode & ANIMFILTER_ACTGROUPED)) { - FCurve *firstfcu = (lastchan) ? (lastchan->next) : static_cast((act->curves.first)); + FCurve *firstfcu = (lastchan) ? (lastchan->next) : static_cast(act->curves.first); items += animfilter_fcurves( anim_data, ads, firstfcu, ANIMTYPE_FCURVE, filter_mode, nullptr, owner_id, &act->id); } diff --git a/source/blender/editors/animation/anim_ipo_utils.cc b/source/blender/editors/animation/anim_ipo_utils.cc index 7c2b911312f..4d5de5df22d 100644 --- a/source/blender/editors/animation/anim_ipo_utils.cc +++ b/source/blender/editors/animation/anim_ipo_utils.cc @@ -237,7 +237,7 @@ void getcolor_fcurve_rainbow(int cur, int tot, float out[3]) * However, only a range of 0.3 to 1.0 is really usable to avoid clashing * with some other stuff */ - fac = ((float)cur / (float)tot) * 0.7f; + fac = (float(cur) / float(tot)) * 0.7f; /* the base color can get offset a bit so that the colors aren't so identical */ hsv[0] += fac * HSV_BANDWIDTH; diff --git a/source/blender/editors/animation/anim_markers.cc b/source/blender/editors/animation/anim_markers.cc index e58c876c4df..66e0aa70857 100644 --- a/source/blender/editors/animation/anim_markers.cc +++ b/source/blender/editors/animation/anim_markers.cc @@ -1028,7 +1028,7 @@ static int ed_marker_move_modal(bContext *C, wmOperator *op, const wmEvent *even value = TIME2FRA(value); } - RNA_int_set(op->ptr, "frames", (int)value); + RNA_int_set(op->ptr, "frames", int(value)); ed_marker_move_apply(C, op); ed_marker_move_update_header(C, op); } @@ -1078,7 +1078,7 @@ static int ed_marker_move_modal(bContext *C, wmOperator *op, const wmEvent *even 0.1 * FPS, 0); - RNA_int_set(op->ptr, "frames", (int)fac); + RNA_int_set(op->ptr, "frames", int(fac)); ed_marker_move_apply(C, op); ed_marker_move_update_header(C, op); } @@ -1094,7 +1094,7 @@ static int ed_marker_move_modal(bContext *C, wmOperator *op, const wmEvent *even value = TIME2FRA(value); } - RNA_int_set(op->ptr, "frames", (int)value); + RNA_int_set(op->ptr, "frames", int(value)); ed_marker_move_apply(C, op); ed_marker_move_update_header(C, op); } @@ -1897,7 +1897,7 @@ static void MARKER_OT_camera_bind(wmOperatorType *ot) /** \name Registration * \{ */ -void ED_operatortypes_marker(void) +void ED_operatortypes_marker() { WM_operatortype_append(MARKER_OT_add); WM_operatortype_append(MARKER_OT_move); diff --git a/source/blender/editors/animation/anim_motion_paths.cc b/source/blender/editors/animation/anim_motion_paths.cc index 0059c1584a0..96b172e4a9e 100644 --- a/source/blender/editors/animation/anim_motion_paths.cc +++ b/source/blender/editors/animation/anim_motion_paths.cc @@ -173,7 +173,7 @@ static void motionpaths_calc_bake_targets(ListBase *targets, int cframe) copy_v3_v3(mpv->co, ob_eval->object_to_world[3]); } - float mframe = (float)(cframe); + float mframe = float(cframe); /* Tag if it's a keyframe */ if (ED_keylist_find_exact(mpt->keylist, mframe)) { diff --git a/source/blender/editors/animation/anim_ops.cc b/source/blender/editors/animation/anim_ops.cc index 99331255e39..a4e6ac5ac0d 100644 --- a/source/blender/editors/animation/anim_ops.cc +++ b/source/blender/editors/animation/anim_ops.cc @@ -653,7 +653,7 @@ static void ANIM_OT_previewrange_clear(wmOperatorType *ot) /** \name Registration * \{ */ -void ED_operatortypes_anim(void) +void ED_operatortypes_anim() { /* Animation Editors only -------------------------- */ WM_operatortype_append(ANIM_OT_change_frame); diff --git a/source/blender/editors/animation/drivers.cc b/source/blender/editors/animation/drivers.cc index 4c21d5f20f2..7fa23da5c5a 100644 --- a/source/blender/editors/animation/drivers.cc +++ b/source/blender/editors/animation/drivers.cc @@ -573,7 +573,7 @@ bool ANIM_remove_driver( /* Copy/Paste Buffer for Driver Data... */ static FCurve *channeldriver_copypaste_buf = nullptr; -void ANIM_drivers_copybuf_free(void) +void ANIM_drivers_copybuf_free() { /* free the buffer F-Curve if it exists, as if it were just another F-Curve */ if (channeldriver_copypaste_buf) { @@ -582,7 +582,7 @@ void ANIM_drivers_copybuf_free(void) channeldriver_copypaste_buf = nullptr; } -bool ANIM_driver_can_paste(void) +bool ANIM_driver_can_paste() { return (channeldriver_copypaste_buf != nullptr); } @@ -694,7 +694,7 @@ bool ANIM_paste_driver( /* Copy/Paste Buffer for Driver Variables... */ static ListBase driver_vars_copybuf = {nullptr, nullptr}; -void ANIM_driver_vars_copybuf_free(void) +void ANIM_driver_vars_copybuf_free() { /* Free the driver variables kept in the buffer */ if (driver_vars_copybuf.first) { @@ -710,7 +710,7 @@ void ANIM_driver_vars_copybuf_free(void) BLI_listbase_clear(&driver_vars_copybuf); } -bool ANIM_driver_vars_can_paste(void) +bool ANIM_driver_vars_can_paste() { return (BLI_listbase_is_empty(&driver_vars_copybuf) == false); } diff --git a/source/blender/editors/animation/fmodifier_ui.cc b/source/blender/editors/animation/fmodifier_ui.cc index 8e4d3d6d9f8..752ac4ae5d1 100644 --- a/source/blender/editors/animation/fmodifier_ui.cc +++ b/source/blender/editors/animation/fmodifier_ui.cc @@ -950,7 +950,7 @@ static ListBase fmodifier_copypaste_buf = {nullptr, nullptr}; /* ---------- */ -void ANIM_fmodifiers_copybuf_free(void) +void ANIM_fmodifiers_copybuf_free() { /* just free the whole buffer */ free_fmodifiers(&fmodifier_copypaste_buf); diff --git a/source/blender/editors/animation/keyframes_general.cc b/source/blender/editors/animation/keyframes_general.cc index 38f41b7518c..17c9990d8e9 100644 --- a/source/blender/editors/animation/keyframes_general.cc +++ b/source/blender/editors/animation/keyframes_general.cc @@ -397,7 +397,7 @@ void ED_ANIM_get_1d_gauss_kernel(const float sigma, const int kernel_size, doubl double sum = 0.0; for (int i = 0; i < kernel_size; i++) { - const double normalized_index = (double)i / (kernel_size - 1); + const double normalized_index = double(i) / (kernel_size - 1); r_kernel[i] = exp(-normalized_index * normalized_index / sigma_sq); if (i == 0) { sum += r_kernel[i]; @@ -433,7 +433,7 @@ void smooth_fcurve_segment(FCurve *fcu, filter_result += samples[sample_index + j] * kernel_value; filter_result += samples[sample_index - j] * kernel_value; } - const float key_y_value = interpf((float)filter_result, samples[sample_index], factor); + const float key_y_value = interpf(float(filter_result), samples[sample_index], factor); BKE_fcurve_keyframe_move_value_with_handles(&fcu->bezt[i], key_y_value); } } @@ -862,7 +862,7 @@ struct tAnimCopybufItem { bool is_bone; /* special flag for armature bones */ }; -void ANIM_fcurves_copybuf_free(void) +void ANIM_fcurves_copybuf_free() { tAnimCopybufItem *aci, *acn; diff --git a/source/blender/editors/animation/keyingsets.cc b/source/blender/editors/animation/keyingsets.cc index 55a5106cfb4..9588151632e 100644 --- a/source/blender/editors/animation/keyingsets.cc +++ b/source/blender/editors/animation/keyingsets.cc @@ -616,7 +616,7 @@ void ANIM_keyingset_info_unregister(Main *bmain, KeyingSetInfo *ksi) BLI_freelinkN(&keyingset_type_infos, ksi); } -void ANIM_keyingset_infos_exit(void) +void ANIM_keyingset_infos_exit() { KeyingSetInfo *ksi, *next; diff --git a/source/blender/editors/armature/armature_add.cc b/source/blender/editors/armature/armature_add.cc index ccd52f82284..990315a51f3 100644 --- a/source/blender/editors/armature/armature_add.cc +++ b/source/blender/editors/armature/armature_add.cc @@ -1269,7 +1269,7 @@ static int armature_symmetrize_exec(bContext *C, wmOperator *op) { if (ebone_iter->temp.ebone) { /* copy all flags except for ... */ - const int flag_copy = ((int)~0) & ~(BONE_SELECTED | BONE_ROOTSEL | BONE_TIPSEL); + const int flag_copy = int(~0) & ~(BONE_SELECTED | BONE_ROOTSEL | BONE_TIPSEL); EditBone *ebone = ebone_iter->temp.ebone; diff --git a/source/blender/editors/armature/armature_edit.cc b/source/blender/editors/armature/armature_edit.cc index 86cfecd5ba0..39ff2ef78f5 100644 --- a/source/blender/editors/armature/armature_edit.cc +++ b/source/blender/editors/armature/armature_edit.cc @@ -136,7 +136,7 @@ void ED_armature_origin_set( add_v3_v3(cent, ebone->tail); } if (total) { - mul_v3_fl(cent, 1.0f / (float)total); + mul_v3_fl(cent, 1.0f / float(total)); } } } @@ -190,7 +190,7 @@ float ED_armature_ebone_roll_to_vector(const EditBone *bone, sub_v3_v3v3(align_axis_proj, align_axis, vec); if (axis_only) { - if (angle_v3v3(align_axis_proj, mat[2]) > (float)(M_PI_2)) { + if (angle_v3v3(align_axis_proj, mat[2]) > float(M_PI_2)) { negate_v3(align_axis_proj); } } diff --git a/source/blender/editors/armature/armature_ops.cc b/source/blender/editors/armature/armature_ops.cc index 304204292ea..509b0331dcf 100644 --- a/source/blender/editors/armature/armature_ops.cc +++ b/source/blender/editors/armature/armature_ops.cc @@ -18,7 +18,7 @@ /* ************************** registration **********************************/ -void ED_operatortypes_armature(void) +void ED_operatortypes_armature() { /* Both operators `ARMATURE_OT_*` and `POSE_OT_*` are registered here. */ @@ -127,7 +127,7 @@ void ED_operatortypes_armature(void) WM_operatortype_append(POSE_OT_blend_to_neighbors); } -void ED_operatormacros_armature(void) +void ED_operatormacros_armature() { wmOperatorType *ot; wmOperatorTypeMacro *otmacro; diff --git a/source/blender/editors/armature/armature_select.cc b/source/blender/editors/armature/armature_select.cc index 02641503a43..52518a43510 100644 --- a/source/blender/editors/armature/armature_select.cc +++ b/source/blender/editors/armature/armature_select.cc @@ -1700,7 +1700,7 @@ static void select_similar_direction(bContext *C, const float thresh) float dir[3]; bone_direction_worldspace_get(ob, ebone, dir); - if (angle_v3v3(dir_act, dir) / (float)M_PI < (thresh + FLT_EPSILON)) { + if (angle_v3v3(dir_act, dir) / float(M_PI) < (thresh + FLT_EPSILON)) { ED_armature_ebone_select_set(ebone, true); changed = true; } diff --git a/source/blender/editors/armature/armature_utils.cc b/source/blender/editors/armature/armature_utils.cc index bdeea017523..b1a208b2c08 100644 --- a/source/blender/editors/armature/armature_utils.cc +++ b/source/blender/editors/armature/armature_utils.cc @@ -638,11 +638,11 @@ static void armature_finalize_restpose(ListBase *bonelist, ListBase *editbonelis mul_m3_m3m3(difmat, imat, postmat); -#if 0 -printf("Bone %s\n", curBone->name); -print_m4("premat", premat); -print_m4("postmat", postmat); -print_m4("difmat", difmat); +#if 0 +printf("Bone %s\n", curBone->name); +print_m4("premat", premat); +print_m4("postmat", postmat); +print_m4("difmat", difmat); printf("Roll = %f\n", RAD2DEGF(-atan2(difmat[2][0], difmat[2][2]))); #endif diff --git a/source/blender/editors/armature/pose_edit.cc b/source/blender/editors/armature/pose_edit.cc index 73e4a13198e..f18beb34970 100644 --- a/source/blender/editors/armature/pose_edit.cc +++ b/source/blender/editors/armature/pose_edit.cc @@ -627,7 +627,7 @@ static int pose_bone_rotmode_exec(bContext *C, wmOperator *op) CTX_DATA_BEGIN_WITH_ID (C, bPoseChannel *, pchan, selected_pose_bones, Object *, ob) { /* use API Method for conversions... */ BKE_rotMode_change_values( - pchan->quat, pchan->eul, pchan->rotAxis, &pchan->rotAngle, pchan->rotmode, (short)mode); + pchan->quat, pchan->eul, pchan->rotAxis, &pchan->rotAngle, pchan->rotmode, short(mode)); /* finally, set the new rotation type */ pchan->rotmode = mode; diff --git a/source/blender/editors/armature/pose_select.cc b/source/blender/editors/armature/pose_select.cc index 7cd391abd84..f0b4de8b7c5 100644 --- a/source/blender/editors/armature/pose_select.cc +++ b/source/blender/editors/armature/pose_select.cc @@ -49,7 +49,7 @@ #include "armature_intern.h" /* utility macros for storing a temp int in the bone (selection flag) */ -#define PBONE_PREV_FLAG_GET(pchan) ((void)0, (POINTER_AS_INT((pchan)->temp))) +#define PBONE_PREV_FLAG_GET(pchan) ((void)0, POINTER_AS_INT((pchan)->temp)) #define PBONE_PREV_FLAG_SET(pchan, val) ((pchan)->temp = POINTER_FROM_INT(val)) /* ***************** Pose Select Utilities ********************* */ diff --git a/source/blender/editors/lattice/lattice_ops.cc b/source/blender/editors/lattice/lattice_ops.cc index 3b4f9d00ace..d6104e027ee 100644 --- a/source/blender/editors/lattice/lattice_ops.cc +++ b/source/blender/editors/lattice/lattice_ops.cc @@ -15,7 +15,7 @@ #include "lattice_intern.h" -void ED_operatortypes_lattice(void) +void ED_operatortypes_lattice() { WM_operatortype_append(LATTICE_OT_select_all); WM_operatortype_append(LATTICE_OT_select_more); diff --git a/source/blender/editors/mesh/editmesh_bevel.cc b/source/blender/editors/mesh/editmesh_bevel.cc index 24ce5879229..54aa4a49f1e 100644 --- a/source/blender/editors/mesh/editmesh_bevel.cc +++ b/source/blender/editors/mesh/editmesh_bevel.cc @@ -582,7 +582,7 @@ static void edbm_bevel_numinput_set_value(wmOperator *op) CLAMP(value, value_clamp_min[vmode], value_clamp_max[vmode]); if (vmode == SEGMENTS_VALUE) { opdata->segments = value; - RNA_int_set(op->ptr, "segments", (int)value); + RNA_int_set(op->ptr, "segments", int(value)); } else { RNA_float_set(op->ptr, value_rna_name[vmode], value); diff --git a/source/blender/editors/mesh/editmesh_extrude.cc b/source/blender/editors/mesh/editmesh_extrude.cc index 1fe4dc0a798..38ee757b0ac 100644 --- a/source/blender/editors/mesh/editmesh_extrude.cc +++ b/source/blender/editors/mesh/editmesh_extrude.cc @@ -740,16 +740,16 @@ static int edbm_dupli_extrude_cursor_invoke(bContext *C, wmOperator *op, const w } } - mul_v3_fl(local_center, 1.0f / (float)local_verts_len); + mul_v3_fl(local_center, 1.0f / float(local_verts_len)); mul_m4_v3(vc.obedit->object_to_world, local_center); - mul_v3_fl(local_center, (float)local_verts_len); + mul_v3_fl(local_center, float(local_verts_len)); add_v3_v3(center, local_center); verts_len += local_verts_len; } if (verts_len != 0) { - mul_v3_fl(center, 1.0f / (float)verts_len); + mul_v3_fl(center, 1.0f / float(verts_len)); } /* Then we process the meshes. */ diff --git a/source/blender/editors/mesh/editmesh_knife.cc b/source/blender/editors/mesh/editmesh_knife.cc index 82d9cdc4687..52431a32e20 100644 --- a/source/blender/editors/mesh/editmesh_knife.cc +++ b/source/blender/editors/mesh/editmesh_knife.cc @@ -644,7 +644,7 @@ static void knifetool_draw_angle(const KnifeTool_OpData *kcd, } else { BKE_unit_value_as_string( - numstr, sizeof(numstr), (double)angle, angle_precision, B_UNIT_ROTATION, unit, false); + numstr, sizeof(numstr), double(angle), angle_precision, B_UNIT_ROTATION, unit, false); } BLF_enable(blf_mono_font, BLF_ROTATION); @@ -2350,10 +2350,10 @@ static void knife_make_cuts(KnifeTool_OpData *kcd, Object *ob) if (!f || kfe->e) { continue; } - list = static_cast(BLI_smallhash_lookup(fhash, (uintptr_t)f)); + list = static_cast(BLI_smallhash_lookup(fhash, uintptr_t(f))); if (!list) { list = knife_empty_list(kcd); - BLI_smallhash_insert(fhash, (uintptr_t)f, list); + BLI_smallhash_insert(fhash, uintptr_t(f), list); } knife_append_list(kcd, list, kfe); } @@ -2372,10 +2372,10 @@ static void knife_make_cuts(KnifeTool_OpData *kcd, Object *ob) if (!e) { continue; } - list = static_cast(BLI_smallhash_lookup(ehash, (uintptr_t)e)); + list = static_cast(BLI_smallhash_lookup(ehash, uintptr_t(e))); if (!list) { list = knife_empty_list(kcd); - BLI_smallhash_insert(ehash, (uintptr_t)e, list); + BLI_smallhash_insert(ehash, uintptr_t(e), list); } /* There can be more than one kfe in kfv's list with same e. */ if (!find_ref(list, kfv)) { @@ -2958,12 +2958,12 @@ static void knife_find_line_hits(KnifeTool_OpData *kcd) continue; } /* For faces, store index of lowest hit looptri in hash. */ - if (BLI_smallhash_haskey(&faces, (uintptr_t)f)) { + if (BLI_smallhash_haskey(&faces, uintptr_t(f))) { continue; } /* Don't care what the value is except that it is non-null, for iterator. */ - BLI_smallhash_insert(&faces, (uintptr_t)f, f); - BLI_smallhash_insert(&fobs, (uintptr_t)f, (void *)(uintptr_t)ob_index); + BLI_smallhash_insert(&faces, uintptr_t(f), f); + BLI_smallhash_insert(&fobs, uintptr_t(f), (void *)uintptr_t(ob_index)); list = knife_get_face_kedges(kcd, ob, ob_index, f); for (ref = static_cast(list->first); ref; ref = ref->next) { @@ -2971,14 +2971,14 @@ static void knife_find_line_hits(KnifeTool_OpData *kcd) if (kfe->is_invalid) { continue; } - if (BLI_smallhash_haskey(&kfes, (uintptr_t)kfe)) { + if (BLI_smallhash_haskey(&kfes, uintptr_t(kfe))) { continue; } - BLI_smallhash_insert(&kfes, (uintptr_t)kfe, kfe); + BLI_smallhash_insert(&kfes, uintptr_t(kfe), kfe); v = kfe->v1; - BLI_smallhash_reinsert(&kfvs, (uintptr_t)v, v); + BLI_smallhash_reinsert(&kfvs, uintptr_t(v), v); v = kfe->v2; - BLI_smallhash_reinsert(&kfvs, (uintptr_t)v, v); + BLI_smallhash_reinsert(&kfvs, uintptr_t(v), v); } } @@ -3141,7 +3141,7 @@ static void knife_find_line_hits(KnifeTool_OpData *kcd) { float p[3], p_cage[3]; - uint ob_index = (uint)(uintptr_t)BLI_smallhash_lookup(&fobs, (uintptr_t)f); + uint ob_index = (uint)(uintptr_t)BLI_smallhash_lookup(&fobs, uintptr_t(f)); ob = kcd->objects[ob_index]; if (use_hit_prev && @@ -3346,7 +3346,7 @@ static float knife_snap_size(KnifeTool_OpData *kcd, float maxsize) kcd, maxsize * 2.0f, kcd->curr.ob, kcd->curr.ob_index, kcd->curr.bmface, kcd->curr.cage); } - return density ? min_ff(maxsize / ((float)density * 0.5f), maxsize) : maxsize; + return density ? min_ff(maxsize / (float(density) * 0.5f), maxsize) : maxsize; } /* Snap to edge when in a constrained mode. diff --git a/source/blender/editors/mesh/editmesh_preselect_edgering.cc b/source/blender/editors/mesh/editmesh_preselect_edgering.cc index 9f3bbe3df33..baa516f0fde 100644 --- a/source/blender/editors/mesh/editmesh_preselect_edgering.cc +++ b/source/blender/editors/mesh/editmesh_preselect_edgering.cc @@ -122,7 +122,7 @@ struct EditMesh_PreSelEdgeRing { int verts_len; }; -struct EditMesh_PreSelEdgeRing *EDBM_preselect_edgering_create(void) +struct EditMesh_PreSelEdgeRing *EDBM_preselect_edgering_create() { struct EditMesh_PreSelEdgeRing *psel = static_cast( MEM_callocN(sizeof(*psel), __func__)); @@ -185,7 +185,7 @@ void EDBM_preselect_edgering_draw(struct EditMesh_PreSelEdgeRing *psel, const fl /* Same size as an edit mode vertex */ immUniform1f("size", 2.0 * U.pixelsize * - max_ff(1.0f, UI_GetThemeValuef(TH_VERTEX_SIZE) * (float)M_SQRT2 / 2.0f)); + max_ff(1.0f, UI_GetThemeValuef(TH_VERTEX_SIZE) * float(M_SQRT2) / 2.0f)); immBegin(GPU_PRIM_POINTS, psel->verts_len); @@ -221,7 +221,7 @@ static void view3d_preselect_mesh_edgering_update_verts_from_edge( edgering_vcos_get_pair(&eed_start->v1, v_cos, coords); for (i = 1; i <= previewlines; i++) { - const float fac = (i / ((float)previewlines + 1)); + const float fac = (i / (float(previewlines) + 1)); interp_v3_v3v3(verts[tot], v_cos[0], v_cos[1], fac); tot++; } @@ -291,7 +291,7 @@ static void view3d_preselect_mesh_edgering_update_edges_from_edge( eve_last = v[0][0]; for (i = 1; i <= previewlines; i++) { - const float fac = (i / ((float)previewlines + 1)); + const float fac = (i / (float(previewlines) + 1)); float v_cos[2][2][3]; edgering_vcos_get(v, v_cos, coords); @@ -318,7 +318,7 @@ static void view3d_preselect_mesh_edgering_update_edges_from_edge( edgering_find_order(eed_last, eed_start, eve_last, v); for (i = 1; i <= previewlines; i++) { - const float fac = (i / ((float)previewlines + 1)); + const float fac = (i / (float(previewlines) + 1)); float v_cos[2][2][3]; if (!v[0][0] || !v[0][1] || !v[1][0] || !v[1][1]) { diff --git a/source/blender/editors/mesh/editmesh_preselect_elem.cc b/source/blender/editors/mesh/editmesh_preselect_elem.cc index 65ffa78f760..fe6e6a3c598 100644 --- a/source/blender/editors/mesh/editmesh_preselect_elem.cc +++ b/source/blender/editors/mesh/editmesh_preselect_elem.cc @@ -83,7 +83,7 @@ eEditMesh_PreSelPreviewAction EDBM_preselect_action_get(struct EditMesh_PreSelEl return psel->preview_action; } -struct EditMesh_PreSelElem *EDBM_preselect_elem_create(void) +struct EditMesh_PreSelElem *EDBM_preselect_elem_create() { struct EditMesh_PreSelElem *psel = static_cast( MEM_callocN(sizeof(*psel), __func__)); diff --git a/source/blender/editors/mesh/editmesh_rip_edge.cc b/source/blender/editors/mesh/editmesh_rip_edge.cc index 394312b8995..0c48e6921d6 100644 --- a/source/blender/editors/mesh/editmesh_rip_edge.cc +++ b/source/blender/editors/mesh/editmesh_rip_edge.cc @@ -81,7 +81,7 @@ static int edbm_rip_edge_invoke(bContext *C, wmOperator * /*op*/, const wmEvent cent_tot += 1; } } - mul_v2_fl(cent_sco, 1.0f / (float)cent_tot); + mul_v2_fl(cent_sco, 1.0f / float(cent_tot)); /* not essential, but gives more expected results with edge selection */ if (bm->totedgesel) { diff --git a/source/blender/editors/mesh/editmesh_select_similar.cc b/source/blender/editors/mesh/editmesh_select_similar.cc index 722e37db3a0..100538c419e 100644 --- a/source/blender/editors/mesh/editmesh_select_similar.cc +++ b/source/blender/editors/mesh/editmesh_select_similar.cc @@ -583,7 +583,7 @@ static int similar_edge_select_exec(bContext *C, wmOperator *op) const int type = RNA_enum_get(op->ptr, "type"); const float thresh = RNA_float_get(op->ptr, "threshold"); - const float thresh_radians = thresh * (float)M_PI + FLT_EPSILON; + const float thresh_radians = thresh * float(M_PI) + FLT_EPSILON; const int compare = RNA_enum_get(op->ptr, "compare"); int tot_edges_selected_all = 0; @@ -961,7 +961,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op) /* get the type from RNA */ const int type = RNA_enum_get(op->ptr, "type"); const float thresh = RNA_float_get(op->ptr, "threshold"); - const float thresh_radians = thresh * (float)M_PI + FLT_EPSILON; + const float thresh_radians = thresh * float(M_PI) + FLT_EPSILON; const int compare = RNA_enum_get(op->ptr, "compare"); int tot_verts_selected_all = 0; diff --git a/source/blender/editors/mesh/editmesh_utils.cc b/source/blender/editors/mesh/editmesh_utils.cc index ddf883d632c..eedf9109b84 100644 --- a/source/blender/editors/mesh/editmesh_utils.cc +++ b/source/blender/editors/mesh/editmesh_utils.cc @@ -615,7 +615,7 @@ int BM_uv_element_get_unique_index(UvElementMap *element_map, UvElement *child) return unique_index[index]; } -#define INVALID_ISLAND (uint(-1)) +#define INVALID_ISLAND uint(-1) static void bm_uv_assign_island(UvElementMap *element_map, UvElement *element, diff --git a/source/blender/editors/mesh/mesh_ops.cc b/source/blender/editors/mesh/mesh_ops.cc index 0c4ea564fc6..78b416f007c 100644 --- a/source/blender/editors/mesh/mesh_ops.cc +++ b/source/blender/editors/mesh/mesh_ops.cc @@ -20,7 +20,7 @@ /**************************** registration **********************************/ -void ED_operatortypes_mesh(void) +void ED_operatortypes_mesh() { WM_operatortype_append(MESH_OT_select_all); WM_operatortype_append(MESH_OT_select_interior_faces); @@ -205,7 +205,7 @@ static int ED_operator_editmesh_face_select(bContext *C) } #endif -void ED_operatormacros_mesh(void) +void ED_operatormacros_mesh() { wmOperatorType *ot; wmOperatorTypeMacro *otmacro; diff --git a/source/blender/editors/metaball/mball_edit.cc b/source/blender/editors/metaball/mball_edit.cc index 9ba181141e8..9662c8b1d83 100644 --- a/source/blender/editors/metaball/mball_edit.cc +++ b/source/blender/editors/metaball/mball_edit.cc @@ -301,7 +301,7 @@ static bool mball_select_similar_type(Object *obedit, BKE_object_rot_to_mat3(obedit, rmat, true); mul_m3_v3(rmat, dir); - float thresh_cos = cosf(thresh * (float)M_PI_2); + float thresh_cos = cosf(thresh * float(M_PI_2)); KDTreeNearest_3d nearest; if (BLI_kdtree_3d_find_nearest(tree_3d, dir, &nearest) != -1) { diff --git a/source/blender/editors/metaball/mball_ops.cc b/source/blender/editors/metaball/mball_ops.cc index 48f4ee6a640..a48f9b11279 100644 --- a/source/blender/editors/metaball/mball_ops.cc +++ b/source/blender/editors/metaball/mball_ops.cc @@ -18,7 +18,7 @@ #include "mball_intern.h" -void ED_operatortypes_metaball(void) +void ED_operatortypes_metaball() { WM_operatortype_append(MBALL_OT_delete_metaelems); WM_operatortype_append(MBALL_OT_duplicate_metaelems); @@ -31,7 +31,7 @@ void ED_operatortypes_metaball(void) WM_operatortype_append(MBALL_OT_select_random_metaelems); } -void ED_operatormacros_metaball(void) +void ED_operatormacros_metaball() { wmOperatorType *ot; wmOperatorTypeMacro *otmacro; diff --git a/source/blender/editors/object/object_collection.cc b/source/blender/editors/object/object_collection.cc index b254963f725..f89640c4856 100644 --- a/source/blender/editors/object/object_collection.cc +++ b/source/blender/editors/object/object_collection.cc @@ -654,4 +654,4 @@ void OBJECT_OT_collection_objects_select(wmOperatorType *ot) /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; -} \ No newline at end of file +} diff --git a/source/blender/editors/object/object_constraint.cc b/source/blender/editors/object/object_constraint.cc index 61ffe5480d9..c02af0ae211 100644 --- a/source/blender/editors/object/object_constraint.cc +++ b/source/blender/editors/object/object_constraint.cc @@ -1130,7 +1130,7 @@ static int followpath_path_animate_exec(bContext *C, wmOperator *op) * y = Ax + B * 1 0 <-- coefficients array indices */ - float A = standardRange / (float)(len); + float A = standardRange / float(len); float B = (float)(-sfra) * A; gen->coefficients[1] = A; @@ -2793,4 +2793,4 @@ void POSE_OT_ik_clear(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/** \} */ \ No newline at end of file +/** \} */ diff --git a/source/blender/editors/object/object_hook.cc b/source/blender/editors/object/object_hook.cc index 17a17be95ae..3d0c0742ed9 100644 --- a/source/blender/editors/object/object_hook.cc +++ b/source/blender/editors/object/object_hook.cc @@ -87,7 +87,7 @@ static int return_editmesh_indexar(BMEditMesh *em, nr++; } - mul_v3_fl(r_cent, 1.0f / (float)indexar_num); + mul_v3_fl(r_cent, 1.0f / float(indexar_num)); return indexar_num; } @@ -120,7 +120,7 @@ static bool return_editmesh_vgroup(Object *obedit, BMEditMesh *em, char *r_name, const ListBase *defbase = BKE_object_defgroup_list(obedit); bDeformGroup *dg = static_cast(BLI_findlink(defbase, defgrp_index)); BLI_strncpy(r_name, dg->name, sizeof(dg->name)); - mul_v3_fl(r_cent, 1.0f / (float)indexar_num); + mul_v3_fl(r_cent, 1.0f / float(indexar_num)); return true; } } @@ -197,7 +197,7 @@ static int return_editlattice_indexar(Lattice *editlatt, nr++; } - mul_v3_fl(r_cent, 1.0f / (float)indexar_num); + mul_v3_fl(r_cent, 1.0f / float(indexar_num)); return indexar_num; } @@ -313,7 +313,7 @@ static int return_editcurve_indexar(Object *obedit, } } - mul_v3_fl(r_cent, 1.0f / (float)indexar_num); + mul_v3_fl(r_cent, 1.0f / float(indexar_num)); return indexar_num; } diff --git a/source/blender/editors/object/object_ops.cc b/source/blender/editors/object/object_ops.cc index 40a73236edd..57ff2ac823d 100644 --- a/source/blender/editors/object/object_ops.cc +++ b/source/blender/editors/object/object_ops.cc @@ -26,7 +26,7 @@ /* ************************** registration **********************************/ -void ED_operatortypes_object(void) +void ED_operatortypes_object() { WM_operatortype_append(OBJECT_OT_location_clear); WM_operatortype_append(OBJECT_OT_rotation_clear); @@ -290,7 +290,7 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_light_linking_unlink_from_collection); } -void ED_operatormacros_object(void) +void ED_operatormacros_object() { wmOperatorType *ot; wmOperatorTypeMacro *otmacro; diff --git a/source/blender/editors/object/object_relations.cc b/source/blender/editors/object/object_relations.cc index c79f060d482..1ce387f6345 100644 --- a/source/blender/editors/object/object_relations.cc +++ b/source/blender/editors/object/object_relations.cc @@ -2048,12 +2048,12 @@ static void single_mat_users( FOREACH_OBJECT_FLAG_BEGIN (scene, view_layer, v3d, flag, ob) { if (BKE_id_is_editable(bmain, &ob->id)) { for (a = 1; a <= ob->totcol; a++) { - ma = BKE_object_material_get(ob, (short)a); + ma = BKE_object_material_get(ob, short(a)); if (single_data_needs_duplication(&ma->id)) { man = (Material *)BKE_id_copy_ex( bmain, &ma->id, nullptr, LIB_ID_COPY_DEFAULT | LIB_ID_COPY_ACTIONS); man->id.us = 0; - BKE_object_material_assign(bmain, ob, man, (short)a, BKE_MAT_ASSIGN_USERPREF); + BKE_object_material_assign(bmain, ob, man, short(a), BKE_MAT_ASSIGN_USERPREF); } } } diff --git a/source/blender/editors/object/object_utils.cc b/source/blender/editors/object/object_utils.cc index f43cab87e96..82bc5006b27 100644 --- a/source/blender/editors/object/object_utils.cc +++ b/source/blender/editors/object/object_utils.cc @@ -161,7 +161,7 @@ struct XFormObjectSkipChild { int mode; }; -struct XFormObjectSkipChild_Container *ED_object_xform_skip_child_container_create(void) +struct XFormObjectSkipChild_Container *ED_object_xform_skip_child_container_create() { struct XFormObjectSkipChild_Container *xcs = static_cast( MEM_callocN(sizeof(*xcs), __func__)); @@ -409,7 +409,7 @@ static void trans_obdata_in_obmode_free_elem(void *xf_p) MEM_freeN(xf); } -struct XFormObjectData_Container *ED_object_data_xform_container_create(void) +struct XFormObjectData_Container *ED_object_data_xform_container_create() { struct XFormObjectData_Container *xds = static_cast( MEM_callocN(sizeof(*xds), __func__)); diff --git a/source/blender/editors/scene/scene_edit.cc b/source/blender/editors/scene/scene_edit.cc index 8074a49b986..e3e5ad25843 100644 --- a/source/blender/editors/scene/scene_edit.cc +++ b/source/blender/editors/scene/scene_edit.cc @@ -428,7 +428,7 @@ static void SCENE_OT_delete(wmOperatorType *ot) /** \name Registration * \{ */ -void ED_operatortypes_scene(void) +void ED_operatortypes_scene() { WM_operatortype_append(SCENE_OT_new); WM_operatortype_append(SCENE_OT_delete); diff --git a/source/blender/ikplugin/intern/ikplugin_api.c b/source/blender/ikplugin/intern/ikplugin_api.c index 307ac8a94a8..83cc32b9161 100644 --- a/source/blender/ikplugin/intern/ikplugin_api.c +++ b/source/blender/ikplugin/intern/ikplugin_api.c @@ -53,7 +53,7 @@ static IKPlugin ikplugin_tab[] = { static IKPlugin *get_plugin(bPose *pose) { - if (!pose || pose->iksolver < 0 || pose->iksolver >= ((ARRAY_SIZE(ikplugin_tab)) - 1)) { + if (!pose || pose->iksolver < 0 || pose->iksolver >= (ARRAY_SIZE(ikplugin_tab) - 1)) { return NULL; } diff --git a/source/blender/makesdna/intern/dna_genfile.cc b/source/blender/makesdna/intern/dna_genfile.cc index 2fa281216f7..d7d19493708 100644 --- a/source/blender/makesdna/intern/dna_genfile.cc +++ b/source/blender/makesdna/intern/dna_genfile.cc @@ -116,7 +116,7 @@ # define MAKE_ID(a, b, c, d) ((int)(a) << 24 | (int)(b) << 16 | (c) << 8 | (d)) #else /* Little Endian */ -# define MAKE_ID(a, b, c, d) ((int)(d) << 24 | (int)(c) << 16 | (b) << 8 | (a)) +# define MAKE_ID(a, b, c, d) (int(d) << 24 | int(c) << 16 | (b) << 8 | (a)) #endif /* ************************* DIV ********************** */ @@ -296,7 +296,7 @@ int DNA_struct_alias_find_nr(const SDNA *sdna, const char *str) BLI_INLINE const char *pad_up_4(const char *ptr) { - return (const char *)((((uintptr_t)ptr) + 3) & ~3); + return (const char *)((uintptr_t(ptr) + 3) & ~3); } /** @@ -563,18 +563,18 @@ SDNA *DNA_sdna_from_data(const void *data, */ static SDNA *g_sdna = nullptr; -void DNA_sdna_current_init(void) +void DNA_sdna_current_init() { g_sdna = DNA_sdna_from_data(DNAstr, DNAlen, false, false, nullptr); } -const SDNA *DNA_sdna_current_get(void) +const SDNA *DNA_sdna_current_get() { BLI_assert(g_sdna != nullptr); return g_sdna; } -void DNA_sdna_current_free(void) +void DNA_sdna_current_free() { DNA_sdna_free(g_sdna); g_sdna = nullptr; diff --git a/source/blender/makesdna/intern/makesdna.cc b/source/blender/makesdna/intern/makesdna.cc index 93f5c60ff8f..f74db1c010f 100644 --- a/source/blender/makesdna/intern/makesdna.cc +++ b/source/blender/makesdna/intern/makesdna.cc @@ -1219,7 +1219,7 @@ static void dna_write(FILE *file, const void *pntr, const int size) } } -void print_struct_sizes(void) +void print_struct_sizes() { int unknown = structs_len; printf("\n\n*** All detected structs:\n"); @@ -1622,7 +1622,7 @@ int main(int argc, char **argv) * * \{ */ -static void UNUSED_FUNCTION(dna_rename_defs_ensure)(void) +static void UNUSED_FUNCTION(dna_rename_defs_ensure)() { #define DNA_STRUCT_RENAME(old, new) (void)sizeof(new); #define DNA_STRUCT_RENAME_ELEM(struct_name, old, new) (void)offsetof(struct_name, new); diff --git a/source/blender/makesrna/intern/rna_brush.cc b/source/blender/makesrna/intern/rna_brush.cc index 73996766aed..651f12086c2 100644 --- a/source/blender/makesrna/intern/rna_brush.cc +++ b/source/blender/makesrna/intern/rna_brush.cc @@ -542,11 +542,11 @@ static bool rna_BrushCapabilitiesSculpt_has_plane_offset_get(PointerRNA *ptr) static bool rna_BrushCapabilitiesSculpt_has_random_texture_angle_get(PointerRNA *ptr) { Brush *br = (Brush *)ptr->data; - return (!ELEM(br->sculpt_tool, - SCULPT_TOOL_GRAB, - SCULPT_TOOL_ROTATE, - SCULPT_TOOL_SNAKE_HOOK, - SCULPT_TOOL_THUMB)); + return !ELEM(br->sculpt_tool, + SCULPT_TOOL_GRAB, + SCULPT_TOOL_ROTATE, + SCULPT_TOOL_SNAKE_HOOK, + SCULPT_TOOL_THUMB); } static bool rna_TextureCapabilities_has_random_texture_angle_get(PointerRNA *ptr) diff --git a/source/blender/makesrna/intern/rna_camera.cc b/source/blender/makesrna/intern/rna_camera.cc index 5983db2edaf..882c3187e20 100644 --- a/source/blender/makesrna/intern/rna_camera.cc +++ b/source/blender/makesrna/intern/rna_camera.cc @@ -857,4 +857,4 @@ void RNA_def_camera(BlenderRNA *brna) RNA_api_camera(srna); } -#endif \ No newline at end of file +#endif diff --git a/source/blender/makesrna/intern/rna_fcurve_api.cc b/source/blender/makesrna/intern/rna_fcurve_api.cc index 1c8d0fabdba..d8628160b91 100644 --- a/source/blender/makesrna/intern/rna_fcurve_api.cc +++ b/source/blender/makesrna/intern/rna_fcurve_api.cc @@ -102,4 +102,4 @@ void RNA_api_drivers(StructRNA * /*srna*/) /* PropertyRNA *parm; */ } -#endif \ No newline at end of file +#endif diff --git a/source/blender/makesrna/intern/rna_lightprobe.cc b/source/blender/makesrna/intern/rna_lightprobe.cc index 87bebcc104f..b3fbe9af979 100644 --- a/source/blender/makesrna/intern/rna_lightprobe.cc +++ b/source/blender/makesrna/intern/rna_lightprobe.cc @@ -229,4 +229,4 @@ void RNA_def_lightprobe(BlenderRNA *brna) rna_def_lightprobe(brna); } -#endif \ No newline at end of file +#endif diff --git a/source/blender/makesrna/intern/rna_movieclip.cc b/source/blender/makesrna/intern/rna_movieclip.cc index a40a4189f11..6704d1f6c14 100644 --- a/source/blender/makesrna/intern/rna_movieclip.cc +++ b/source/blender/makesrna/intern/rna_movieclip.cc @@ -463,4 +463,4 @@ void RNA_def_movieclip(BlenderRNA *brna) rna_def_movieClipScopes(brna); } -#endif \ No newline at end of file +#endif diff --git a/source/blender/makesrna/intern/rna_particle.cc b/source/blender/makesrna/intern/rna_particle.cc index 18f574858cb..899c7452092 100644 --- a/source/blender/makesrna/intern/rna_particle.cc +++ b/source/blender/makesrna/intern/rna_particle.cc @@ -1055,17 +1055,17 @@ static float rna_PartSetting_linelenhead_get(PointerRNA *ptr) static bool rna_PartSettings_is_fluid_get(PointerRNA *ptr) { ParticleSettings *part = static_cast(ptr->data); - return (ELEM(part->type, - PART_FLUID, - PART_FLUID_FLIP, - PART_FLUID_FOAM, - PART_FLUID_SPRAY, - PART_FLUID_BUBBLE, - PART_FLUID_TRACER, - PART_FLUID_SPRAYFOAM, - PART_FLUID_SPRAYBUBBLE, - PART_FLUID_FOAMBUBBLE, - PART_FLUID_SPRAYFOAMBUBBLE)); + return ELEM(part->type, + PART_FLUID, + PART_FLUID_FLIP, + PART_FLUID_FOAM, + PART_FLUID_SPRAY, + PART_FLUID_BUBBLE, + PART_FLUID_TRACER, + PART_FLUID_SPRAYFOAM, + PART_FLUID_SPRAYBUBBLE, + PART_FLUID_FOAMBUBBLE, + PART_FLUID_SPRAYFOAMBUBBLE); } static void rna_ParticleSettings_use_clump_curve_update(Main *bmain, Scene *scene, PointerRNA *ptr) diff --git a/source/blender/makesrna/intern/rna_sound.cc b/source/blender/makesrna/intern/rna_sound.cc index e5f3c37f647..3028de9befc 100644 --- a/source/blender/makesrna/intern/rna_sound.cc +++ b/source/blender/makesrna/intern/rna_sound.cc @@ -108,4 +108,4 @@ void RNA_def_sound(BlenderRNA *brna) rna_def_sound(brna); } -#endif \ No newline at end of file +#endif diff --git a/source/blender/makesrna/intern/rna_text.cc b/source/blender/makesrna/intern/rna_text.cc index a04727dcf23..8e78791d907 100644 --- a/source/blender/makesrna/intern/rna_text.cc +++ b/source/blender/makesrna/intern/rna_text.cc @@ -298,4 +298,4 @@ void RNA_def_text(BlenderRNA *brna) rna_def_text(brna); } -#endif \ No newline at end of file +#endif diff --git a/source/blender/makesrna/intern/rna_timeline.cc b/source/blender/makesrna/intern/rna_timeline.cc index 3bc6eadd2e9..55e8e353c7a 100644 --- a/source/blender/makesrna/intern/rna_timeline.cc +++ b/source/blender/makesrna/intern/rna_timeline.cc @@ -74,4 +74,4 @@ void RNA_def_timeline_marker(BlenderRNA *brna) rna_def_timeline_marker(brna); } -#endif \ No newline at end of file +#endif diff --git a/source/blender/makesrna/intern/rna_vfont.cc b/source/blender/makesrna/intern/rna_vfont.cc index 81c9bcef31d..4b395b5704c 100644 --- a/source/blender/makesrna/intern/rna_vfont.cc +++ b/source/blender/makesrna/intern/rna_vfont.cc @@ -70,4 +70,4 @@ void RNA_def_vfont(BlenderRNA *brna) RNA_api_vfont(srna); } -#endif \ No newline at end of file +#endif diff --git a/source/blender/makesrna/intern/rna_workspace_api.cc b/source/blender/makesrna/intern/rna_workspace_api.cc index b8f3beaddc7..9bf7fd38707 100644 --- a/source/blender/makesrna/intern/rna_workspace_api.cc +++ b/source/blender/makesrna/intern/rna_workspace_api.cc @@ -172,4 +172,4 @@ void RNA_api_workspace_tool(StructRNA *srna) RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_MAIN); } -#endif \ No newline at end of file +#endif diff --git a/source/blender/makesrna/intern/rna_world.cc b/source/blender/makesrna/intern/rna_world.cc index 8de36b6379b..1af4f6068d9 100644 --- a/source/blender/makesrna/intern/rna_world.cc +++ b/source/blender/makesrna/intern/rna_world.cc @@ -267,4 +267,4 @@ void RNA_def_world(BlenderRNA *brna) rna_def_world_mist(brna); } -#endif \ No newline at end of file +#endif -- 2.30.2 From 7b3e1cbb9627031dcad6b986b95d2faec295d950 Mon Sep 17 00:00:00 2001 From: Chris Blackbourn Date: Thu, 6 Jul 2023 14:33:47 +1200 Subject: [PATCH 006/115] Fix #109674: UV: Follow Active Quads uses face selection in 3d editor To ensure consistency between the UV unwrapping operators, the `UV > Follow Active Quads` operator will now use 3D selection when called from the 3D editor, and UV selection when called from the UV editor. --- .../startup/bl_operators/uvcalc_follow_active.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/scripts/startup/bl_operators/uvcalc_follow_active.py b/scripts/startup/bl_operators/uvcalc_follow_active.py index 4bf997fac70..ff6c0017dc9 100644 --- a/scripts/startup/bl_operators/uvcalc_follow_active.py +++ b/scripts/startup/bl_operators/uvcalc_follow_active.py @@ -16,7 +16,7 @@ STATUS_ERR_MISSING_UV_LAYER = (1 << 4) STATUS_ERR_NO_FACES_SELECTED = (1 << 5) -def extend(obj, EXTEND_MODE): +def extend(obj, EXTEND_MODE, use_uv_selection): import bmesh from .uvcalc_transform import is_face_uv_selected @@ -38,7 +38,11 @@ def extend(obj, EXTEND_MODE): uv_act = bm.loops.layers.uv.active # Always use the active UV layer. # Construct a set of selected quads. - faces = {f for f in bm.faces if len(f.verts) == 4 and is_face_uv_selected(f, uv_act, False)} + faces = {f for f in bm.faces if len(f.verts) == 4 and f.select} + if use_uv_selection: + # Filter `faces` to extract only UV selected quads. + faces = {f for f in faces if is_face_uv_selected(f, uv_act, False)} + if not faces: return STATUS_ERR_NO_FACES_SELECTED @@ -214,6 +218,11 @@ def extend(obj, EXTEND_MODE): def main(context, operator): + use_uv_selection = True + view = context.space_data + if context.space_data and context.space_data.type == 'VIEW_3D': + use_uv_selection = False # When called from the 3D editor, UV selection is ignored. + num_meshes = 0 num_errors = 0 status = 0 @@ -222,7 +231,7 @@ def main(context, operator): for ob in ob_list: num_meshes += 1 - ret = extend(ob, operator.properties.mode) + ret = extend(ob, operator.properties.mode, use_uv_selection) if ret != STATUS_OK: num_errors += 1 status |= ret -- 2.30.2 From 5b3ce7b74062e9e6489b32e9f602e988937d8e7e Mon Sep 17 00:00:00 2001 From: Guillermo Venegas Date: Thu, 6 Jul 2023 10:29:02 +1000 Subject: [PATCH 007/115] UI: Improve 3d text selection Improve 3D text selection & feedback when moving the mouse outside of the text. Previously mouse selection only worked if the mouse was over the text, now there is more margin to select characters or lines. Ref !109229 Co-authored-by: Campbell Barton Co-authored-by: Harley Acheson --- source/blender/blenkernel/intern/vfont.c | 200 +++++++++++++++++++---- 1 file changed, 172 insertions(+), 28 deletions(-) diff --git a/source/blender/blenkernel/intern/vfont.c b/source/blender/blenkernel/intern/vfont.c index 05e20d5245c..35cace72fea 100644 --- a/source/blender/blenkernel/intern/vfont.c +++ b/source/blender/blenkernel/intern/vfont.c @@ -790,6 +790,22 @@ static float vfont_descent(const VFontData *vfd) return vfd->em_height - vfont_ascent(vfd); } +/** + * Track additional information when using the cursor to select with multiple text boxes. + * This gives a more predictable result when the user moves the cursor outside the text-box. + */ +typedef struct TextBoxBounds_ForCursor { + /** + * Describes the minimum rectangle that contains all characters in a text-box, + * values are compatible with #TextBox. + */ + rctf bounds; + /** + * The last character in this text box or -1 when unfilled. + */ + int char_index_last; +} TextBoxBounds_ForCursor; + static bool vfont_to_curve(Object *ob, Curve *cu, const eEditFontMode mode, @@ -933,6 +949,23 @@ static bool vfont_to_curve(Object *ob, custrinfo[i].flag &= ~(CU_CHINFO_WRAP | CU_CHINFO_SMALLCAPS_CHECK | CU_CHINFO_OVERFLOW); } + TextBoxBounds_ForCursor *tb_bounds_for_cursor = NULL; + if (cursor_params != NULL) { + if (cu->textoncurve == NULL && (cu->totbox > 1) && (slen > 0)) { + tb_bounds_for_cursor = MEM_malloc_arrayN( + cu->totbox, sizeof(TextBoxBounds_ForCursor), "TextboxBounds_Cursor"); + for (curbox = 0; curbox < cu->totbox; curbox++) { + TextBoxBounds_ForCursor *tb_bounds = &tb_bounds_for_cursor[curbox]; + tb_bounds->char_index_last = -1; + tb_bounds->bounds.xmin = FLT_MAX; + tb_bounds->bounds.xmax = -FLT_MAX; + tb_bounds->bounds.ymin = FLT_MAX; + tb_bounds->bounds.ymax = -FLT_MAX; + } + } + curbox = 0; + } + i = 0; while (i <= slen) { /* Characters in the list */ @@ -1072,6 +1105,10 @@ static bool vfont_to_curve(Object *ob, CLAMP_MIN(maxlen, lineinfo[lnr].x_min); + if (tb_bounds_for_cursor != NULL) { + tb_bounds_for_cursor[curbox].char_index_last = i; + } + if ((tb_scale.h != 0.0f) && (-(yof - tb_scale.y) > (tb_scale.h - linedist) - yof_scale)) { if (cu->totbox > (curbox + 1)) { maxlen = 0; @@ -1331,6 +1368,44 @@ static bool vfont_to_curve(Object *ob, } } } + if (tb_bounds_for_cursor != NULL) { + int char_beg_next = 0; + for (curbox = 0; curbox < cu->totbox; curbox++) { + TextBoxBounds_ForCursor *tb_bounds = &tb_bounds_for_cursor[curbox]; + if (tb_bounds->char_index_last == -1) { + continue; + } + const int char_beg = char_beg_next; + const int char_end = tb_bounds->char_index_last; + + struct TempLineInfo *line_beg = &lineinfo[chartransdata[char_beg].linenr]; + struct TempLineInfo *line_end = &lineinfo[chartransdata[char_end].linenr]; + + int char_idx_offset = char_beg; + + rctf *bounds = &tb_bounds->bounds; + /* In a text-box with no curves, 'yof' only decrements over lines, 'ymax' and 'ymin' + * can be obtained from any character in the first and last line of the text-box. */ + bounds->ymax = chartransdata[char_beg].yof; + bounds->ymin = chartransdata[char_end].yof; + + for (struct TempLineInfo *line = line_beg; line <= line_end; line++) { + const struct CharTrans *first_char_line = &chartransdata[char_idx_offset]; + const struct CharTrans *last_char_line = &chartransdata[char_idx_offset + line->char_nr]; + + bounds->xmin = min_ff(bounds->xmin, first_char_line->xof); + bounds->xmax = max_ff(bounds->xmax, last_char_line->xof); + char_idx_offset += line->char_nr + 1; + } + /* Move the bounds into a space compatible with `cursor_location`. */ + bounds->xmin *= font_size; + bounds->xmax *= font_size; + bounds->ymin *= font_size; + bounds->ymax *= font_size; + + char_beg_next = tb_bounds->char_index_last + 1; + } + } MEM_freeN(lineinfo); MEM_freeN(i_textbox_array); @@ -1748,35 +1823,104 @@ static bool vfont_to_curve(Object *ob, } if (cursor_params) { - cursor_params->r_string_offset = -1; - for (i = 0; i <= slen; i++, ct++) { - info = &custrinfo[i]; - ascii = mem[i]; - if (info->flag & CU_CHINFO_SMALLCAPS_CHECK) { - ascii = towupper(ascii); - } - ct = &chartransdata[i]; - che = find_vfont_char(vfd, ascii); - float charwidth = char_width(cu, che, info); - float charhalf = (charwidth / 2.0f); - if (cursor_params->cursor_location[1] >= (ct->yof - (0.25f * linedist)) * font_size && - cursor_params->cursor_location[1] <= (ct->yof + (0.75f * linedist)) * font_size) - { - /* On this row. */ - if (cursor_params->cursor_location[0] >= (ct->xof * font_size) && - cursor_params->cursor_location[0] <= ((ct->xof + charhalf) * font_size)) - { - /* Left half of character. */ - cursor_params->r_string_offset = i; - } - else if (cursor_params->cursor_location[0] >= ((ct->xof + charhalf) * font_size) && - cursor_params->cursor_location[0] <= ((ct->xof + charwidth) * font_size)) - { - /* Right half of character. */ - cursor_params->r_string_offset = i + 1; - } - } + const float *cursor_location = cursor_params->cursor_location; + /* Erasing all text could give slen = 0 */ + if (slen == 0) { + cursor_params->r_string_offset = -1; } + else if (cu->textoncurve != NULL) { + + int closest_char = -1; + float closest_dist_sq = FLT_MAX; + + for (i = 0; i <= slen; i++) { + const float char_location[2] = { + chartransdata[i].xof * font_size, + chartransdata[i].yof * font_size, + }; + const float test_dist_sq = len_squared_v2v2(cursor_location, char_location); + if (closest_dist_sq > test_dist_sq) { + closest_char = i; + closest_dist_sq = test_dist_sq; + } + } + + cursor_params->r_string_offset = closest_char; + } + else { + /* Find the first box closest to `cursor_location`. */ + int char_beg = 0; + int char_end = slen; + + if (tb_bounds_for_cursor != NULL) { + /* Search for the closest box. */ + int closest_box = -1; + float closest_dist_sq = FLT_MAX; + for (curbox = 0; curbox < cu->totbox; curbox++) { + const TextBoxBounds_ForCursor *tb_bounds = &tb_bounds_for_cursor[curbox]; + if (tb_bounds->char_index_last == -1) { + continue; + } + /* The closest point in the box to the `cursor_location` + * by clamping it to the bounding box. */ + const float cursor_location_clamped[2] = { + clamp_f(cursor_location[0], tb_bounds->bounds.xmin, tb_bounds->bounds.xmax), + clamp_f(cursor_location[1], tb_bounds->bounds.ymin, tb_bounds->bounds.ymax), + }; + + const float test_dist_sq = len_squared_v2v2(cursor_location, cursor_location_clamped); + if (test_dist_sq < closest_dist_sq) { + closest_dist_sq = test_dist_sq; + closest_box = curbox; + } + } + if (closest_box != -1) { + if (closest_box != 0) { + char_beg = tb_bounds_for_cursor[closest_box - 1].char_index_last + 1; + } + char_end = tb_bounds_for_cursor[closest_box].char_index_last; + } + MEM_freeN(tb_bounds_for_cursor); + tb_bounds_for_cursor = NULL; /* Safety only. */ + } + const float interline_offset = ((linedist - 0.5f) / 2.0f) * font_size; + /* Loop until find the line where `cursor_location` is over. */ + for (i = char_beg; i <= char_end; i++) { + if (cursor_location[1] >= ((chartransdata[i].yof * font_size) - interline_offset)) { + break; + } + } + + i = min_ii(i, char_end); + const float char_yof = chartransdata[i].yof; + + /* Loop back until find the first character of the line, this because `cursor_location` can + * be positioned further below the text, so #i can be the last character of the last line. */ + for (; i >= char_beg + 1 && chartransdata[i - 1].yof == char_yof; i--) { + } + /* Loop until find the first character to the right of `cursor_location` + * (using the character midpoint on the x-axis as a reference). */ + for (; i <= char_end && char_yof == chartransdata[i].yof; i++) { + info = &custrinfo[i]; + ascii = info->flag & CU_CHINFO_SMALLCAPS_CHECK ? towupper(mem[i]) : mem[i]; + che = find_vfont_char(vfd, ascii); + const float charwidth = char_width(cu, che, info); + const float charhalf = (charwidth / 2.0f); + if (cursor_location[0] <= ((chartransdata[i].xof + charhalf) * font_size)) { + break; + } + } + i = min_ii(i, char_end); + + /* If there is no character to the right of the cursor we are on the next line, go back to + * the last character of the previous line. */ + if (i > char_beg && chartransdata[i].yof != char_yof) { + i -= 1; + } + cursor_params->r_string_offset = i; + } + /* Must be cleared & freed. */ + BLI_assert(tb_bounds_for_cursor == NULL); } /* Scale to fit only works for single text box layouts. */ -- 2.30.2 From 374935fb56da8ec35b68ade54aaddcc26c5dc264 Mon Sep 17 00:00:00 2001 From: Chris Blackbourn Date: Thu, 6 Jul 2023 16:13:06 +1200 Subject: [PATCH 008/115] Fix #109605: Add correct_aspect to uv align rotation operator The "Align Rotation" operator in the UV editor was producing unexpected results if an image was displayed with non-square aspect ratio. This change adds the "Correct Aspect" option to the operator. --- .../startup/bl_operators/uvcalc_transform.py | 67 ++++++++++++++----- 1 file changed, 49 insertions(+), 18 deletions(-) diff --git a/scripts/startup/bl_operators/uvcalc_transform.py b/scripts/startup/bl_operators/uvcalc_transform.py index 3e0d5c712e7..fef3300bc78 100644 --- a/scripts/startup/bl_operators/uvcalc_transform.py +++ b/scripts/startup/bl_operators/uvcalc_transform.py @@ -113,7 +113,7 @@ def island_uv_bounds_center(island, uv_layer): # ------------------------------------------------------------------------------ # Align UV Rotation Operator -def find_rotation_auto(bm, uv_layer, faces): +def find_rotation_auto(bm, uv_layer, faces, aspect_y): sum_u = 0.0 sum_v = 0.0 for face in faces: @@ -122,7 +122,7 @@ def find_rotation_auto(bm, uv_layer, faces): uv = loop[uv_layer].uv du = uv[0] - prev_uv[0] dv = uv[1] - prev_uv[1] - edge_angle = math.atan2(dv, du) + edge_angle = math.atan2(dv, du * aspect_y) edge_angle *= 4.0 # Wrap 4 times around the circle sum_u += math.cos(edge_angle) sum_v += math.sin(edge_angle) @@ -132,7 +132,7 @@ def find_rotation_auto(bm, uv_layer, faces): return -math.atan2(sum_v, sum_u) / 4.0 -def find_rotation_edge(bm, uv_layer, faces): +def find_rotation_edge(bm, uv_layer, faces, aspect_y): sum_u = 0.0 sum_v = 0.0 for face in faces: @@ -143,7 +143,7 @@ def find_rotation_edge(bm, uv_layer, faces): if prev_select: du = uv[0] - prev_uv[0] dv = uv[1] - prev_uv[1] - edge_angle = math.atan2(dv, du) + edge_angle = math.atan2(dv, du * aspect_y) edge_angle *= 2.0 # Wrap 2 times around the circle sum_u += math.cos(edge_angle) sum_v += math.sin(edge_angle) @@ -159,7 +159,7 @@ def find_rotation_edge(bm, uv_layer, faces): return -math.atan2(sum_v, sum_u) / 2.0 -def find_rotation_geometry(bm, uv_layer, faces, method, axis): +def find_rotation_geometry(bm, uv_layer, faces, method, axis, aspect_y): sum_u_co = Vector((0.0, 0.0, 0.0)) sum_v_co = Vector((0.0, 0.0, 0.0)) for face in faces: @@ -168,6 +168,9 @@ def find_rotation_geometry(bm, uv_layer, faces, method, axis): delta_uv0 = face.loops[fan - 1][uv_layer].uv - face.loops[0][uv_layer].uv delta_uv1 = face.loops[fan][uv_layer].uv - face.loops[0][uv_layer].uv + delta_uv0[0] *= aspect_y + delta_uv1[0] *= aspect_y + mat = Matrix((delta_uv0, delta_uv1)) mat.invert_safe() @@ -190,14 +193,14 @@ def find_rotation_geometry(bm, uv_layer, faces, method, axis): return math.atan2(sum_u_co[axis_index], sum_v_co[axis_index]) -def align_uv_rotation_island(bm, uv_layer, faces, method, axis): +def align_uv_rotation_island(bm, uv_layer, faces, method, axis, aspect_y): angle = 0.0 if method == 'AUTO': - angle = find_rotation_auto(bm, uv_layer, faces) + angle = find_rotation_auto(bm, uv_layer, faces, aspect_y) elif method == 'EDGE': - angle = find_rotation_edge(bm, uv_layer, faces) + angle = find_rotation_edge(bm, uv_layer, faces, aspect_y) elif method == 'GEOMETRY': - angle = find_rotation_geometry(bm, uv_layer, faces, method, axis) + angle = find_rotation_geometry(bm, uv_layer, faces, method, axis, aspect_y) if angle == 0.0: return False # No change. @@ -208,21 +211,21 @@ def align_uv_rotation_island(bm, uv_layer, faces, method, axis): cos_angle = math.cos(angle) sin_angle = math.sin(angle) - delta_u = mid_u - cos_angle * mid_u + sin_angle * mid_v - delta_v = mid_v - sin_angle * mid_u - cos_angle * mid_v + delta_u = mid_u - cos_angle * mid_u + sin_angle / aspect_y * mid_v + delta_v = mid_v - sin_angle * aspect_y * mid_u - cos_angle * mid_v # Apply transform. for face in faces: for loop in face.loops: pre_uv = loop[uv_layer].uv - u = cos_angle * pre_uv[0] - sin_angle * pre_uv[1] + delta_u - v = sin_angle * pre_uv[0] + cos_angle * pre_uv[1] + delta_v + u = cos_angle * pre_uv[0] - sin_angle / aspect_y * pre_uv[1] + delta_u + v = sin_angle * aspect_y * pre_uv[0] + cos_angle * pre_uv[1] + delta_v loop[uv_layer].uv = u, v return True -def align_uv_rotation_bmesh(mesh, bm, method, axis): +def align_uv_rotation_bmesh(mesh, bm, method, axis, aspect_y): import bpy_extras.bmesh_utils uv_layer = bm.loops.layers.uv.active @@ -233,18 +236,39 @@ def align_uv_rotation_bmesh(mesh, bm, method, axis): changed = False for island in islands: if is_island_uv_selected(island, uv_layer, method == 'EDGE'): - if align_uv_rotation_island(bm, uv_layer, island, method, axis): + if align_uv_rotation_island(bm, uv_layer, island, method, axis, aspect_y): changed = True return changed -def align_uv_rotation(context, method, axis): +def get_aspect_y(context): + area = context.area + if not area: + return 1.0 + space_data = context.area.spaces.active + if not space_data: + return 1.0 + if not space_data.image: + return 1.0 + image_width = space_data.image.size[0] + image_height = space_data.image.size[1] + if image_height: + return image_width / image_height + return 1.0 + + +def align_uv_rotation(context, method, axis, correct_aspect): import bmesh + + aspect_y = 1.0 + if correct_aspect: + aspect_y = get_aspect_y(context) + ob_list = context.objects_in_mode_unique_data for ob in ob_list: bm = bmesh.from_edit_mesh(ob.data) if bm.loops.layers.uv: - if align_uv_rotation_bmesh(ob.data, bm, method, axis): + if align_uv_rotation_bmesh(ob.data, bm, method, axis, aspect_y): bmesh.update_edit_mesh(ob.data) return {'FINISHED'} @@ -274,14 +298,21 @@ class AlignUVRotation(Operator): ), ) + correct_aspect: BoolProperty( + name="Correct Aspect", + description="Take image aspect ratio into account", + default=False, + ) + def execute(self, context): - return align_uv_rotation(context, self.method, self.axis) + return align_uv_rotation(context, self.method, self.axis, self.correct_aspect) def draw(self, _context): layout = self.layout layout.prop(self, "method") if self.method == 'GEOMETRY': layout.prop(self, "axis") + layout.prop(self, "correct_aspect") @classmethod def poll(cls, context): -- 2.30.2 From bbb18137ffa78b347c2475c07f88b36a42265b20 Mon Sep 17 00:00:00 2001 From: Damien Picard Date: Tue, 27 Jun 2023 14:49:04 +0200 Subject: [PATCH 009/115] Fix #109114: i18n: FPS not displayed in the viewport in Hindi The FPS in the viewport is displayed in a string of the form "fps: %.2f". The string that stores it is of length 16, which is plenty enough in English. But the translated message in Hindi uses Devanagari, which takes up 4 bytes per char. Because of this, it is too long and there is not enough room for the numbers to actually appear. To solve this, the containing string length was doubled to 32 chars. Pull Request: https://projects.blender.org/blender/blender/pulls/109408 --- source/blender/editors/space_view3d/view3d_draw.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/space_view3d/view3d_draw.cc b/source/blender/editors/space_view3d/view3d_draw.cc index 4bb481ca071..6c6caede924 100644 --- a/source/blender/editors/space_view3d/view3d_draw.cc +++ b/source/blender/editors/space_view3d/view3d_draw.cc @@ -2562,7 +2562,8 @@ void ED_view3d_mats_rv3d_restore(RegionView3D *rv3d, RV3DMatrixStore *rv3dmat_pt void ED_scene_draw_fps(const Scene *scene, int xoffset, int *yoffset) { ScreenFrameRateInfo *fpsi = static_cast(scene->fps_info); - char printable[16]; + /* 8 4-bytes chars (complex writing systems like Devanagari in UTF8 encoding) */ + char printable[32]; if (!fpsi || !fpsi->lredrawtime || !fpsi->redrawtime) { return; -- 2.30.2 From e73273e24b0d814fccadbdea359d992f0643b7c4 Mon Sep 17 00:00:00 2001 From: Pratik Borhade Date: Thu, 6 Jul 2023 10:55:33 +0200 Subject: [PATCH 010/115] Animation: Set hardmin/max for frame start and end of action Currently start and end property of action don't have hardmin/hardmax. This results in an error when exporting action having extreme range values in FBX and gltf formats (#107965). Pull Request: https://projects.blender.org/blender/blender/pulls/107985 --- source/blender/blenkernel/BKE_blender_version.h | 2 +- source/blender/blenkernel/intern/action.c | 4 ++-- source/blender/blenloader/intern/versioning_400.cc | 6 ++++++ source/blender/makesrna/intern/rna_action.cc | 4 ++-- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index c171a7e82b9..96edba09c31 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -27,7 +27,7 @@ extern "C" { /* Blender file format version. */ #define BLENDER_FILE_VERSION BLENDER_VERSION -#define BLENDER_FILE_SUBVERSION 7 +#define BLENDER_FILE_SUBVERSION 8 /* Minimum Blender version that supports reading file written with the current * version. Older Blender versions will test this and show a warning if the file diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c index 63d830420d7..ca558d328bf 100644 --- a/source/blender/blenkernel/intern/action.c +++ b/source/blender/blenkernel/intern/action.c @@ -1470,8 +1470,8 @@ void calc_action_range(const bAction *act, float *start, float *end, short incl_ max += 1.0f; } - *start = min; - *end = max; + *start = max_ff(min, MINAFRAMEF); + *end = min_ff(max, MAXFRAMEF); } else { *start = 0.0f; diff --git a/source/blender/blenloader/intern/versioning_400.cc b/source/blender/blenloader/intern/versioning_400.cc index 75f9f9e29c0..7a9b0ffdb09 100644 --- a/source/blender/blenloader/intern/versioning_400.cc +++ b/source/blender/blenloader/intern/versioning_400.cc @@ -258,6 +258,12 @@ void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain) } } + if (!MAIN_VERSION_ATLEAST(bmain, 400, 8)) { + LISTBASE_FOREACH (bAction *, act, &bmain->actions) { + act->frame_start = max_ff(act->frame_start, MINAFRAMEF); + act->frame_end = min_ff(act->frame_end, MAXFRAMEF); + } + } /** * Versioning code until next subversion bump goes here. * diff --git a/source/blender/makesrna/intern/rna_action.cc b/source/blender/makesrna/intern/rna_action.cc index 8bd8bea4cea..e7c751714aa 100644 --- a/source/blender/makesrna/intern/rna_action.cc +++ b/source/blender/makesrna/intern/rna_action.cc @@ -921,7 +921,7 @@ static void rna_def_action(BlenderRNA *brna) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_float_sdna(prop, nullptr, "frame_start"); RNA_def_property_float_funcs(prop, nullptr, "rna_Action_start_frame_set", nullptr); - RNA_def_property_ui_range(prop, MINFRAME, MAXFRAME, 100, 2); + RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF); RNA_def_property_ui_text( prop, "Start Frame", "The start frame of the manually set intended playback range"); RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, nullptr); @@ -930,7 +930,7 @@ static void rna_def_action(BlenderRNA *brna) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_float_sdna(prop, nullptr, "frame_end"); RNA_def_property_float_funcs(prop, nullptr, "rna_Action_end_frame_set", nullptr); - RNA_def_property_ui_range(prop, MINFRAME, MAXFRAME, 100, 2); + RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF); RNA_def_property_ui_text( prop, "End Frame", "The end frame of the manually set intended playback range"); RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, nullptr); -- 2.30.2 From 899f2bbe320d708b99156eb5614d79aaa3a51a6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Tue, 4 Jul 2023 16:23:35 +0200 Subject: [PATCH 011/115] Refactor: Animation, prevent incrementing null pointer Only do `next++` if `next` is a non-`NULL` pointer. This doesn't change the functionality of the code, but it does prevent a sanitizer warning. No functional changes. --- source/blender/blenkernel/intern/curve.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/intern/curve.cc b/source/blender/blenkernel/intern/curve.cc index 0bf482812cb..3ab5dddd68d 100644 --- a/source/blender/blenkernel/intern/curve.cc +++ b/source/blender/blenkernel/intern/curve.cc @@ -3386,7 +3386,7 @@ static void calchandlesNurb_intern(Nurb *nu, eBezTriple_Flag handle_sel_flag, bo next = nullptr; } } - else { + else if (next != nullptr) { next++; } -- 2.30.2 From 6ad87a5f65d820f0ac902eda69876ec6a7318806 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Tue, 4 Jul 2023 16:24:38 +0200 Subject: [PATCH 012/115] Anim: remove trailing period from description Remove the trailing period from the 'Disable constraint without moving' operator. No functional changes. --- scripts/startup/bl_operators/constraint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/startup/bl_operators/constraint.py b/scripts/startup/bl_operators/constraint.py index 4ee22e46c34..357b39b6449 100644 --- a/scripts/startup/bl_operators/constraint.py +++ b/scripts/startup/bl_operators/constraint.py @@ -84,7 +84,7 @@ class CONSTRAINT_OT_disable_keep_transform(Operator): return constraint and constraint.influence > 0.0 def execute(self, context): - """Disable constraint while maintaining the visual transform.""" + """Disable constraint while maintaining the visual transform""" # This works most of the time, but when there are multiple constraints active # there could still be one that overrides the visual transform. -- 2.30.2 From 4731beec990eed289ac13b108ac300a1c842b468 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Thu, 6 Jul 2023 13:04:18 +0200 Subject: [PATCH 013/115] Cleanup: Remove unused code in GHOST_ContextCGL GHOST_ContextCGL used an incorrect compiler directive. When reading the comment we could also remove it. In order to do the right thing (fixing directive vs removing code) we opened this pull request to ask feedback. Pull Request: https://projects.blender.org/blender/blender/pulls/109686 --- intern/ghost/intern/GHOST_ContextCGL.mm | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/intern/ghost/intern/GHOST_ContextCGL.mm b/intern/ghost/intern/GHOST_ContextCGL.mm index 539dc95cf35..effde93fa81 100644 --- a/intern/ghost/intern/GHOST_ContextCGL.mm +++ b/intern/ghost/intern/GHOST_ContextCGL.mm @@ -892,29 +892,6 @@ void GHOST_ContextCGL::initClear() glClearColor(0.294, 0.294, 0.294, 0.000); glClear(GL_COLOR_BUFFER_BIT); glClearColor(0.000, 0.000, 0.000, 0.000); -#endif - } - else { -#if WITH_METAL - // TODO (mg_gpusw_apple) this path is never taken, this is legacy left from inital integration - // of metal and gl, the whole file should be cleaned up and stripped of the legacy path - id cmdBuffer = [s_sharedMetalCommandQueue commandBuffer]; - MTLRenderPassDescriptor *passDescriptor = [MTLRenderPassDescriptor renderPassDescriptor]; - { - auto attachment = [passDescriptor.colorAttachments objectAtIndexedSubscript:0]; - attachment.texture = m_defaultFramebufferMetalTexture[current_swapchain_index].texture; - attachment.loadAction = MTLLoadActionClear; - attachment.clearColor = MTLClearColorMake(0.294, 0.294, 0.294, 1.000); - attachment.storeAction = MTLStoreActionStore; - } - - // encoding - { - id enc = [cmdBuffer - renderCommandEncoderWithDescriptor:passDescriptor]; - [enc endEncoding]; - } - [cmdBuffer commit]; #endif } } -- 2.30.2 From 74772c69208039e5bdee80491ff9c039d7cef6e5 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Thu, 6 Jul 2023 15:05:33 +0200 Subject: [PATCH 014/115] Fix #109565: Array modifier changes the Root vertex of Skin modifier The merging behavior of the Array, Mirror, Screw modifiers has changed since 4369627e71. Before, only the customdata of the destination vertex was kept. Source vertices were completely removed. With 4369627e71, all vertices in the merge group (whether source or destination) now have their customdata interpolated. But this can cause problems for example with the root vertex customdata of the skin modifier, where if only one of the vertices of the group of vertices has this flag, the resulting one will also have it. This commit restores the behavior for the vertices customdata and does not interpolate it if `do_mix_vert_data` is false. Pull Request: https://projects.blender.org/blender/blender/pulls/109627 --- .../geometry/GEO_mesh_merge_by_distance.hh | 9 ++- .../geometry/intern/mesh_merge_by_distance.cc | 74 +++++++++++-------- source/blender/modifiers/intern/MOD_array.cc | 2 +- source/blender/modifiers/intern/MOD_mirror.cc | 2 +- source/blender/modifiers/intern/MOD_screw.cc | 3 +- 5 files changed, 57 insertions(+), 33 deletions(-) diff --git a/source/blender/geometry/GEO_mesh_merge_by_distance.hh b/source/blender/geometry/GEO_mesh_merge_by_distance.hh index 503bd2fc07d..ba77d18f0e3 100644 --- a/source/blender/geometry/GEO_mesh_merge_by_distance.hh +++ b/source/blender/geometry/GEO_mesh_merge_by_distance.hh @@ -52,7 +52,14 @@ std::optional mesh_merge_by_distance_connected(const Mesh &mesh, * this is not supported and will likely generate corrupted geometry. * * \param vert_dest_map_len: The number of non '-1' values in `vert_dest_map`. (not the size) + * \param do_mix_vert_data: If true, the groups of vertices in the `vert_dest_map_len`, defined by + * source vertices with the same target plus the target vertex, will have their custom data + * interpolated into the resulting vertex. If false, only the custom data of the target vertex will + * remain. */ -Mesh *mesh_merge_verts(const Mesh &mesh, MutableSpan vert_dest_map, int vert_dest_map_len); +Mesh *mesh_merge_verts(const Mesh &mesh, + MutableSpan vert_dest_map, + int vert_dest_map_len, + const bool do_mix_vert_data); } // namespace blender::geometry diff --git a/source/blender/geometry/intern/mesh_merge_by_distance.cc b/source/blender/geometry/intern/mesh_merge_by_distance.cc index 1c771567bda..963561d9682 100644 --- a/source/blender/geometry/intern/mesh_merge_by_distance.cc +++ b/source/blender/geometry/intern/mesh_merge_by_distance.cc @@ -87,6 +87,7 @@ struct WeldPoly { struct WeldMesh { /* Group of vertices to be merged. */ + Array vert_group_map; /* Maps the vertex group offset from the target vert index. */ Array vert_groups_offs; Array vert_groups_buffer; @@ -356,14 +357,15 @@ static Vector weld_vert_ctx_alloc_and_setup(MutableSpan vert_dest_map, static void weld_vert_groups_setup(Span wvert, Span vert_dest_map, const int vert_kill_len, - MutableSpan r_vert_groups_map, + Array &r_vert_groups_map, Array &r_vert_groups_buffer, Array &r_vert_groups_offs) { + r_vert_groups_map.reinitialize(vert_dest_map.size()); r_vert_groups_map.fill(OUT_OF_CONTEXT); - const int vert_groups_len = wvert.size() - vert_kill_len; /* Add +1 to allow calculation of the length of the last group. */ + const int vert_groups_len = wvert.size() - vert_kill_len; r_vert_groups_offs.reinitialize(vert_groups_len + 1); r_vert_groups_offs.fill(0); @@ -1374,7 +1376,7 @@ static void weld_poly_find_doubles(const Span corner_verts, static void weld_mesh_context_create(const Mesh &mesh, MutableSpan vert_dest_map, const int vert_kill_len, - MutableSpan r_vert_group_map, + const bool do_vert_group, WeldMesh *r_weld_mesh) { const Span edges = mesh.edges(); @@ -1417,12 +1419,14 @@ static void weld_mesh_context_create(const Mesh &mesh, edges.size(), r_weld_mesh); - weld_vert_groups_setup(wvert, - vert_dest_map, - vert_kill_len, - r_vert_group_map, - r_weld_mesh->vert_groups_buffer, - r_weld_mesh->vert_groups_offs); + if (do_vert_group) { + weld_vert_groups_setup(wvert, + vert_dest_map, + vert_kill_len, + r_weld_mesh->vert_group_map, + r_weld_mesh->vert_groups_buffer, + r_weld_mesh->vert_groups_offs); + } weld_edge_groups_setup(edges.size(), r_weld_mesh->edge_kill_len, @@ -1545,7 +1549,8 @@ static void customdata_weld( static Mesh *create_merged_mesh(const Mesh &mesh, MutableSpan vert_dest_map, - const int removed_vertex_count) + const int removed_vertex_count, + const bool do_mix_vert_data) { #ifdef USE_WELD_DEBUG_TIME SCOPED_TIMER(__func__); @@ -1557,10 +1562,9 @@ static Mesh *create_merged_mesh(const Mesh &mesh, const int totvert = mesh.totvert; const int totedge = mesh.totedge; - Array vert_group_map(totvert); - WeldMesh weld_mesh; - weld_mesh_context_create(mesh, vert_dest_map, removed_vertex_count, vert_group_map, &weld_mesh); + weld_mesh_context_create( + mesh, vert_dest_map, removed_vertex_count, do_mix_vert_data, &weld_mesh); const int result_nverts = totvert - weld_mesh.vert_kill_len; const int result_nedges = totedge - weld_mesh.edge_kill_len; @@ -1576,15 +1580,23 @@ static Mesh *create_merged_mesh(const Mesh &mesh, /* Vertices. */ - /* Be careful when setting values to this array as it uses the same buffer as #vert_group_map. - * This map will be used to adjust edges and loops to point to new vertex indices. */ - MutableSpan vert_final_map = vert_group_map; + MutableSpan vert_final_map; + Array vert_final_map_local; + if (!weld_mesh.vert_group_map.is_empty()) { + /* Be careful when setting values to this array as it uses the same buffer as #vert_group_map. + * This map will be used to adjust edges and loops to point to new vertex indices. */ + vert_final_map = weld_mesh.vert_group_map; + } + else { + vert_final_map_local.reinitialize(totvert); + vert_final_map = vert_final_map_local; + } int dest_index = 0; for (int i = 0; i < totvert; i++) { int source_index = i; int count = 0; - while (i < totvert && vert_group_map[i] == OUT_OF_CONTEXT) { + while (i < totvert && vert_dest_map[i] == OUT_OF_CONTEXT) { vert_final_map[i] = dest_index + count; count++; i++; @@ -1596,15 +1608,16 @@ static Mesh *create_merged_mesh(const Mesh &mesh, if (i == totvert) { break; } - if (vert_group_map[i] != ELEM_MERGED) { - int *src_indices; - int count; - { - int *wgroup = &weld_mesh.vert_groups_offs[vert_group_map[i]]; - src_indices = &weld_mesh.vert_groups_buffer[*wgroup]; - count = *(wgroup + 1) - *wgroup; + if (vert_dest_map[i] == i) { + if (do_mix_vert_data) { + int *group_offs = &weld_mesh.vert_groups_offs[weld_mesh.vert_group_map[i]]; + int *src_indices = &weld_mesh.vert_groups_buffer[*group_offs]; + int count = *(group_offs + 1) - *group_offs; + customdata_weld(&mesh.vdata, &result->vdata, src_indices, count, dest_index); + } + else { + CustomData_copy_data(&mesh.vdata, &result->vdata, i, dest_index, 1); } - customdata_weld(&mesh.vdata, &result->vdata, src_indices, count, dest_index); vert_final_map[i] = dest_index; dest_index++; } @@ -1770,7 +1783,7 @@ std::optional mesh_merge_by_distance_all(const Mesh &mesh, return std::nullopt; } - return create_merged_mesh(mesh, vert_dest_map, vert_kill_len); + return create_merged_mesh(mesh, vert_dest_map, vert_kill_len, true); } struct WeldVertexCluster { @@ -1869,12 +1882,15 @@ std::optional mesh_merge_by_distance_connected(const Mesh &mesh, } } - return create_merged_mesh(mesh, vert_dest_map, vert_kill_len); + return create_merged_mesh(mesh, vert_dest_map, vert_kill_len, true); } -Mesh *mesh_merge_verts(const Mesh &mesh, MutableSpan vert_dest_map, int vert_dest_map_len) +Mesh *mesh_merge_verts(const Mesh &mesh, + MutableSpan vert_dest_map, + int vert_dest_map_len, + const bool do_mix_vert_data) { - return create_merged_mesh(mesh, vert_dest_map, vert_dest_map_len); + return create_merged_mesh(mesh, vert_dest_map, vert_dest_map_len, do_mix_vert_data); } /** \} */ diff --git a/source/blender/modifiers/intern/MOD_array.cc b/source/blender/modifiers/intern/MOD_array.cc index bfc076b2da2..de5a1dd3e8c 100644 --- a/source/blender/modifiers/intern/MOD_array.cc +++ b/source/blender/modifiers/intern/MOD_array.cc @@ -826,7 +826,7 @@ static Mesh *arrayModifier_doArray(ArrayModifierData *amd, if (tot_doubles > 0) { Mesh *tmp = result; result = geometry::mesh_merge_verts( - *tmp, MutableSpan{full_doubles_map, result->totvert}, tot_doubles); + *tmp, MutableSpan{full_doubles_map, result->totvert}, tot_doubles, false); BKE_id_free(nullptr, tmp); } MEM_freeN(full_doubles_map); diff --git a/source/blender/modifiers/intern/MOD_mirror.cc b/source/blender/modifiers/intern/MOD_mirror.cc index 4c3e37b9a53..5b09a89958e 100644 --- a/source/blender/modifiers/intern/MOD_mirror.cc +++ b/source/blender/modifiers/intern/MOD_mirror.cc @@ -87,7 +87,7 @@ static Mesh *mirror_apply_on_axis(MirrorModifierData *mmd, if (vert_merge_map_len) { Mesh *tmp = result; result = geometry::mesh_merge_verts( - *tmp, MutableSpan{vert_merge_map, result->totvert}, vert_merge_map_len); + *tmp, MutableSpan{vert_merge_map, result->totvert}, vert_merge_map_len, false); BKE_id_free(nullptr, tmp); } MEM_freeN(vert_merge_map); diff --git a/source/blender/modifiers/intern/MOD_screw.cc b/source/blender/modifiers/intern/MOD_screw.cc index cecfd043af9..13bdc1ab80c 100644 --- a/source/blender/modifiers/intern/MOD_screw.cc +++ b/source/blender/modifiers/intern/MOD_screw.cc @@ -180,7 +180,8 @@ static Mesh *mesh_remove_doubles_on_axis(Mesh *result, * Therefore the duplicate polygon test can be skipped. */ result = geometry::mesh_merge_verts(*tmp, MutableSpan{full_doubles_map, result->totvert}, - int(tot_doubles * (step_tot - 1))); + int(tot_doubles * (step_tot - 1)), + false); BKE_id_free(nullptr, tmp); MEM_freeN(full_doubles_map); -- 2.30.2 From d7794f3540cc9837173ed375ea5db4651c1c24df Mon Sep 17 00:00:00 2001 From: "Werner, Stefan" Date: Mon, 5 Jun 2023 11:49:17 +0200 Subject: [PATCH 015/115] Cycles: Fixed SYCL build with newer compilers --- intern/cycles/util/math.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/intern/cycles/util/math.h b/intern/cycles/util/math.h index 99415d2ee9b..289bd5d4baf 100644 --- a/intern/cycles/util/math.h +++ b/intern/cycles/util/math.h @@ -101,7 +101,6 @@ using std::isfinite; using std::isnan; using std::sqrt; # else -using sycl::sqrt; # define isfinite(x) sycl::isfinite((x)) # define isnan(x) sycl::isnan((x)) # endif @@ -795,7 +794,10 @@ ccl_device float bits_to_01(uint bits) #if !defined(__KERNEL_GPU__) # if defined(__GNUC__) -# define popcount(x) __builtin_popcount(x) +ccl_device_inline uint popcount(uint x) +{ + return __builtin_popcount(x); +} # else ccl_device_inline uint popcount(uint x) { -- 2.30.2 From 7befc403869494a131c15edbd05ba81c83379f44 Mon Sep 17 00:00:00 2001 From: "Werner, Stefan" Date: Mon, 5 Jun 2023 11:23:16 +0200 Subject: [PATCH 016/115] Cycles: Use sycl::bitcast in oneAPI backend Using sycl::bitcast instead of union hack --- intern/cycles/kernel/device/oneapi/compat.h | 17 +++++++++++++++++ intern/cycles/util/math.h | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/intern/cycles/kernel/device/oneapi/compat.h b/intern/cycles/kernel/device/oneapi/compat.h index 2b6e909ea0c..d3c9134095e 100644 --- a/intern/cycles/kernel/device/oneapi/compat.h +++ b/intern/cycles/kernel/device/oneapi/compat.h @@ -188,6 +188,23 @@ using uchar = unsigned char; using sycl::half; /* math functions */ +ccl_device_forceinline float __uint_as_float(uint x) +{ + return sycl::bit_cast(x); +} +ccl_device_forceinline uint __float_as_uint(float x) +{ + return sycl::bit_cast(x); +} +ccl_device_forceinline float __int_as_float(int x) +{ + return sycl::bit_cast(x); +} +ccl_device_forceinline int __float_as_int(float x) +{ + return sycl::bit_cast(x); +} + #define fabsf(x) sycl::fabs((x)) #define copysignf(x, y) sycl::copysign((x), (y)) #define asinf(x) sycl::asin((x)) diff --git a/intern/cycles/util/math.h b/intern/cycles/util/math.h index 289bd5d4baf..56b16058620 100644 --- a/intern/cycles/util/math.h +++ b/intern/cycles/util/math.h @@ -206,7 +206,7 @@ ccl_device_inline float max4(float a, float b, float c, float d) return max(max(a, b), max(c, d)); } -#if !defined(__KERNEL_METAL__) +#if !defined(__KERNEL_METAL__) && !defined(__KERNEL_ONEAPI__) /* Int/Float conversion */ ccl_device_inline int as_int(uint i) -- 2.30.2 From 71273df2d5f5d05d8906202f4218768e7dba88ca Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Thu, 6 Jul 2023 17:00:44 +0200 Subject: [PATCH 017/115] UI: Draw hierarchy lines for tree-views Hierarchy lines (like we also have in the Outliner) make it easier to visually parse the hierarchy, and avoid confusion about nesting level. Especially when some items have icons and/or collapse chevrons and some not (thus different levels of visual indentation). They were planned for #93582 and #107881, also see https://code.blender.org/2023/05/the-next-big-step-grease-pencil-3-0/#layer-groups. The drawing is implemented as a general tree-view feature, so all tree-views with collapsable items (which excludes the spreadsheet data-set tree view) will get them without further setup. --- .../editors/include/UI_abstract_view.hh | 5 + .../blender/editors/include/UI_tree_view.hh | 13 ++- source/blender/editors/interface/interface.cc | 13 +-- .../editors/interface/interface_intern.hh | 11 +++ .../editors/interface/views/abstract_view.cc | 5 + .../interface/views/abstract_view_item.cc | 15 +++ .../editors/interface/views/interface_view.cc | 7 ++ .../editors/interface/views/tree_view.cc | 98 ++++++++++++++++++- 8 files changed, 151 insertions(+), 16 deletions(-) diff --git a/source/blender/editors/include/UI_abstract_view.hh b/source/blender/editors/include/UI_abstract_view.hh index be22611c2f6..9484d63a71c 100644 --- a/source/blender/editors/include/UI_abstract_view.hh +++ b/source/blender/editors/include/UI_abstract_view.hh @@ -35,6 +35,7 @@ struct bContext; struct uiBlock; +struct uiButViewItem; struct uiLayout; struct uiViewItemHandle; struct ViewLink; @@ -91,6 +92,8 @@ class AbstractView { */ virtual bool begin_filtering(const bContext &C) const; + virtual void draw_overlays(const ARegion ®ion) const; + /** * Makes \a item valid for display in this view. Behavior is undefined for items not registered * with this. @@ -139,6 +142,8 @@ class AbstractViewItem { * If this wasn't done, the behavior of items is undefined. */ AbstractView *view_ = nullptr; + /** Every visible item gets a button of type #UI_BTYPE_VIEW_ITEM during the layout building. */ + uiButViewItem *view_item_but_ = nullptr; bool is_activatable_ = true; bool is_interactive_ = true; bool is_active_ = false; diff --git a/source/blender/editors/include/UI_tree_view.hh b/source/blender/editors/include/UI_tree_view.hh index c9552b9c680..a1768de28e9 100644 --- a/source/blender/editors/include/UI_tree_view.hh +++ b/source/blender/editors/include/UI_tree_view.hh @@ -26,7 +26,6 @@ struct bContext; struct uiBlock; struct uiBut; -struct uiButViewItem; struct uiLayout; namespace blender::ui { @@ -119,6 +118,8 @@ class AbstractTreeView : public AbstractView, public TreeViewItemContainer { public: virtual ~AbstractTreeView() = default; + void draw_overlays(const ARegion ®ion) const override; + void foreach_item(ItemIterFn iter_fn, IterOptions options = IterOptions::None) const; /** Visual feature: Define a number of item rows the view will always show at minimum. If there @@ -143,6 +144,11 @@ class AbstractTreeView : public AbstractView, public TreeViewItemContainer { * the actual state changes are done in a delayed manner through this function. */ void change_state_delayed(); + void draw_hierarchy_lines(const ARegion ®ion) const; + void draw_hierarchy_lines_recursive(const ARegion ®ion, + const TreeViewOrItem &parent, + uint pos) const; + AbstractTreeViewItem *find_last_visible_descendant(const AbstractTreeViewItem &parent) const; }; /** \} */ @@ -170,8 +176,6 @@ class AbstractTreeViewItem : public AbstractViewItem, public TreeViewItemContain protected: /** This label is used as the default way to identifying an item within its parent. */ std::string label_{}; - /** Every visible item gets a button of type #UI_BTYPE_VIEW_ITEM during the layout building. */ - uiButViewItem *view_item_but_ = nullptr; public: virtual ~AbstractTreeViewItem() = default; @@ -247,7 +251,7 @@ class AbstractTreeViewItem : public AbstractViewItem, public TreeViewItemContain void ensure_parents_uncollapsed(); - uiButViewItem *view_item_button(); + uiButViewItem *view_item_button() const; private: static void tree_row_click_fn(struct bContext *, void *, void *); @@ -258,6 +262,7 @@ class AbstractTreeViewItem : public AbstractViewItem, public TreeViewItemContain void change_state_delayed(); void add_treerow_button(uiBlock &block); + int indent_width() const; void add_indent(uiLayout &row) const; void add_collapse_chevron(uiBlock &block) const; void add_rename_button(uiLayout &row); diff --git a/source/blender/editors/interface/interface.cc b/source/blender/editors/interface/interface.cc index 3687450e047..334c745d196 100644 --- a/source/blender/editors/interface/interface.cc +++ b/source/blender/editors/interface/interface.cc @@ -80,10 +80,6 @@ using blender::Vector; /* prototypes. */ -static void ui_but_to_pixelrect(rcti *rect, - const ARegion *region, - uiBlock *block, - const uiBut *but); static void ui_def_but_rna__menu(bContext * /*C*/, uiLayout *layout, void *but_p); static void ui_def_but_rna__panel_type(bContext * /*C*/, uiLayout *layout, void *but_p); static void ui_def_but_rna__menu_type(bContext * /*C*/, uiLayout *layout, void *but_p); @@ -912,6 +908,7 @@ static void ui_but_update_old_active_from_new(uiBut *oldbut, uiBut *but) case UI_BTYPE_VIEW_ITEM: { uiButViewItem *view_item_oldbut = (uiButViewItem *)oldbut; uiButViewItem *view_item_newbut = (uiButViewItem *)but; + ui_view_item_swap_button_pointers(view_item_newbut->view_item, view_item_oldbut->view_item); std::swap(view_item_newbut->view_item, view_item_oldbut->view_item); break; } @@ -2069,11 +2066,7 @@ void ui_fontscale(float *points, float aspect) *points /= aspect; } -/* Project button or block (but==nullptr) to pixels in region-space. */ -static void ui_but_to_pixelrect(rcti *rect, - const ARegion *region, - uiBlock *block, - const uiBut *but) +void ui_but_to_pixelrect(rcti *rect, const ARegion *region, const uiBlock *block, const uiBut *but) { rctf rectf; @@ -2169,6 +2162,8 @@ void UI_block_draw(const bContext *C, uiBlock *block) UI_icon_draw_cache_end(); BLF_batch_draw_end(); + ui_block_views_draw_overlays(region, block); + /* restore matrix */ GPU_matrix_pop_projection(); GPU_matrix_pop(); diff --git a/source/blender/editors/interface/interface_intern.hh b/source/blender/editors/interface/interface_intern.hh index 9e3cf014d60..849f7c434b1 100644 --- a/source/blender/editors/interface/interface_intern.hh +++ b/source/blender/editors/interface/interface_intern.hh @@ -600,6 +600,12 @@ struct uiSafetyRct { void ui_fontscale(float *points, float aspect); +/** Project button or block (but==nullptr) to pixels in region-space. */ +void ui_but_to_pixelrect(rcti *rect, + const ARegion *region, + const uiBlock *block, + const uiBut *but); + void ui_block_to_region_fl(const ARegion *region, const uiBlock *block, float *r_x, float *r_y); void ui_block_to_window_fl(const ARegion *region, const uiBlock *block, float *x, float *y); void ui_block_to_window(const ARegion *region, const uiBlock *block, int *x, int *y); @@ -1461,12 +1467,17 @@ void ui_interface_tag_script_reload_queries(); void ui_block_free_views(uiBlock *block); void ui_block_views_bounds_calc(const uiBlock *block); void ui_block_views_listen(const uiBlock *block, const wmRegionListenerParams *listener_params); +void ui_block_views_draw_overlays(const ARegion *region, const uiBlock *block); uiViewHandle *ui_block_view_find_matching_in_old_block(const uiBlock *new_block, const uiViewHandle *new_view); uiButViewItem *ui_block_view_find_matching_view_item_but_in_old_block( const uiBlock *new_block, const uiViewItemHandle *new_item_handle); +/* abstract_view_item.cc */ + +void ui_view_item_swap_button_pointers(uiViewItemHandle *a_handle, uiViewItemHandle *b_handle); + /* interface_templates.cc */ uiListType *UI_UL_cache_file_layers(); diff --git a/source/blender/editors/interface/views/abstract_view.cc b/source/blender/editors/interface/views/abstract_view.cc index c4e5c426834..85802c1ff67 100644 --- a/source/blender/editors/interface/views/abstract_view.cc +++ b/source/blender/editors/interface/views/abstract_view.cc @@ -83,6 +83,11 @@ bool AbstractView::begin_filtering(const bContext & /*C*/) const return false; } +void AbstractView::draw_overlays(const ARegion & /*region*/) const +{ + /* Nothing by default. */ +} + /** \} */ /* ---------------------------------------------------------------------- */ diff --git a/source/blender/editors/interface/views/abstract_view_item.cc b/source/blender/editors/interface/views/abstract_view_item.cc index 51dbbb56d63..77a2657ba6d 100644 --- a/source/blender/editors/interface/views/abstract_view_item.cc +++ b/source/blender/editors/interface/views/abstract_view_item.cc @@ -286,6 +286,11 @@ class ViewItemAPIWrapper { return a.matches(b); } + static void swap_button_pointers(AbstractViewItem &a, AbstractViewItem &b) + { + std::swap(a.view_item_but_, b.view_item_but_); + } + static bool can_rename(const AbstractViewItem &item) { const AbstractView &view = item.get_view(); @@ -335,6 +340,16 @@ bool UI_view_item_matches(const uiViewItemHandle *a_handle, const uiViewItemHand return ViewItemAPIWrapper::matches(a, b); } +void ui_view_item_swap_button_pointers(uiViewItemHandle *a_handle, uiViewItemHandle *b_handle) +{ + if (!a_handle || !b_handle) { + return; + } + AbstractViewItem &a = reinterpret_cast(*a_handle); + AbstractViewItem &b = reinterpret_cast(*b_handle); + ViewItemAPIWrapper::swap_button_pointers(a, b); +} + bool UI_view_item_can_rename(const uiViewItemHandle *item_handle) { const AbstractViewItem &item = reinterpret_cast(*item_handle); diff --git a/source/blender/editors/interface/views/interface_view.cc b/source/blender/editors/interface/views/interface_view.cc index 3b36966a246..f39ccda55e2 100644 --- a/source/blender/editors/interface/views/interface_view.cc +++ b/source/blender/editors/interface/views/interface_view.cc @@ -142,6 +142,13 @@ void ui_block_views_listen(const uiBlock *block, const wmRegionListenerParams *l } } +void ui_block_views_draw_overlays(const ARegion *region, const uiBlock *block) +{ + LISTBASE_FOREACH (ViewLink *, view_link, &block->views) { + view_link->view->draw_overlays(*region); + } +} + uiViewHandle *UI_region_view_find_at(const ARegion *region, const int xy[2], const int pad) { /* NOTE: Similar to #ui_but_find_mouse_over_ex(). */ diff --git a/source/blender/editors/interface/views/tree_view.cc b/source/blender/editors/interface/views/tree_view.cc index 9e636378c27..0f6ea8859bd 100644 --- a/source/blender/editors/interface/views/tree_view.cc +++ b/source/blender/editors/interface/views/tree_view.cc @@ -13,6 +13,8 @@ #include "BLT_translation.h" +#include "GPU_immediate.h" + #include "interface_intern.hh" #include "UI_interface.h" @@ -81,6 +83,92 @@ void AbstractTreeView::set_min_rows(int min_rows) min_rows_ = min_rows; } +AbstractTreeViewItem *AbstractTreeView::find_last_visible_descendant( + const AbstractTreeViewItem &parent) const +{ + if (parent.is_collapsed()) { + return nullptr; + } + + AbstractTreeViewItem *last_descendant = parent.children_.last().get(); + while (!last_descendant->children_.is_empty() && !last_descendant->is_collapsed()) { + last_descendant = last_descendant->children_.last().get(); + } + + return last_descendant; +} + +void AbstractTreeView::draw_hierarchy_lines_recursive(const ARegion ®ion, + const TreeViewOrItem &parent, + const uint pos) const +{ + for (const auto &item : parent.children_) { + if (!item->is_collapsible() || item->is_collapsed()) { + continue; + } + + draw_hierarchy_lines_recursive(region, *item, pos); + + const AbstractTreeViewItem *first_descendant = item->children_.first().get(); + const AbstractTreeViewItem *last_descendant = find_last_visible_descendant(*item); + if (!first_descendant->view_item_but_ || !last_descendant || !last_descendant->view_item_but_) + { + return; + } + const uiButViewItem &first_child_but = *first_descendant->view_item_button(); + const uiButViewItem &last_child_but = *last_descendant->view_item_button(); + + BLI_assert(first_child_but.block == last_child_but.block); + const uiBlock *block = first_child_but.block; + + rcti first_child_rect; + ui_but_to_pixelrect(&first_child_rect, ®ion, block, &first_child_but); + rcti last_child_rect; + ui_but_to_pixelrect(&last_child_rect, ®ion, block, &last_child_but); + + /* Small vertical padding. */ + const short line_padding = UI_UNIT_Y / 4.0f; + const float x = first_child_rect.xmin + first_descendant->indent_width() - + UI_ICON_SIZE * 0.5f + 2 * UI_SCALE_FAC; + immBegin(GPU_PRIM_LINES, 2); + immVertex2f(pos, x, first_child_rect.ymax - line_padding); + immVertex2f(pos, x, last_child_rect.ymin + line_padding); + immEnd(); + } +} + +void AbstractTreeView::draw_hierarchy_lines(const ARegion ®ion) const +{ + GPUVertFormat *format = immVertexFormat(); + uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); + uchar col[4]; + + immBindBuiltinProgram(GPU_SHADER_3D_LINE_DASHED_UNIFORM_COLOR); + + float viewport_size[4]; + GPU_viewport_size_get_f(viewport_size); + immUniform2f("viewport_size", viewport_size[2] / UI_SCALE_FAC, viewport_size[3] / UI_SCALE_FAC); + immUniform1i("colors_len", 0); /* "simple" mode */ + immUniform1f("dash_width", 8.0f); + /* >= is 1.0 for un-dashed lines. */ + immUniform1f("udash_factor", 1.0f); + UI_GetThemeColorBlend3ubv(TH_BACK, TH_TEXT, 0.4f, col); + col[3] = 255; + immUniformColor4ubv(col); + + GPU_line_width(1.0f); + GPU_blend(GPU_BLEND_ALPHA); + draw_hierarchy_lines_recursive(region, *this, pos); + GPU_blend(GPU_BLEND_NONE); + + immUnbindProgram(); +} + +void AbstractTreeView::draw_overlays(const ARegion ®ion) const +{ + draw_hierarchy_lines(region); +} + void AbstractTreeView::update_children_from_old(const AbstractView &old_view) { const AbstractTreeView &old_tree_view = dynamic_cast(old_view); @@ -162,14 +250,18 @@ void AbstractTreeViewItem::add_treerow_button(uiBlock &block) UI_but_func_set(view_item_but_, tree_row_click_fn, view_item_but_, nullptr); } +int AbstractTreeViewItem::indent_width() const +{ + return count_parents() * UI_ICON_SIZE; +} + void AbstractTreeViewItem::add_indent(uiLayout &row) const { uiBlock *block = uiLayoutGetBlock(&row); uiLayout *subrow = uiLayoutRow(&row, true); uiLayoutSetFixedSize(subrow, true); - const float indent_size = count_parents() * UI_ICON_SIZE; - uiDefBut(block, UI_BTYPE_SEPR, 0, "", 0, 0, indent_size, 0, nullptr, 0.0, 0.0, 0, 0, ""); + uiDefBut(block, UI_BTYPE_SEPR, 0, "", 0, 0, indent_width(), 0, nullptr, 0.0, 0.0, 0, 0, ""); /* Indent items without collapsing icon some more within their parent. Makes it clear that they * are actually nested and not just a row at the same level without a chevron. */ @@ -407,7 +499,7 @@ bool AbstractTreeViewItem::matches(const AbstractViewItem &other) const return true; } -uiButViewItem *AbstractTreeViewItem::view_item_button() +uiButViewItem *AbstractTreeViewItem::view_item_button() const { return view_item_but_; } -- 2.30.2 From c9fbbea261ab235601aa5020d63e80dfc5c51e10 Mon Sep 17 00:00:00 2001 From: Hoshinova Date: Thu, 6 Jul 2023 18:13:22 +0200 Subject: [PATCH 018/115] Cleanup: Assign corresponding expressions to variable params.max_distance Pull Request: https://projects.blender.org/blender/blender/pulls/109328 --- intern/cycles/kernel/osl/shaders/node_fractal_voronoi.h | 7 +++---- intern/cycles/kernel/osl/shaders/node_voronoi_texture.osl | 1 + intern/cycles/kernel/svm/voronoi.h | 8 ++++---- source/blender/blenlib/intern/noise.cc | 7 +++---- .../material/gpu_shader_material_fractal_voronoi.glsl | 7 +++---- .../shaders/material/gpu_shader_material_tex_voronoi.glsl | 4 ++++ .../blender/nodes/shader/nodes/node_shader_tex_voronoi.cc | 8 ++++++++ 7 files changed, 26 insertions(+), 16 deletions(-) diff --git a/intern/cycles/kernel/osl/shaders/node_fractal_voronoi.h b/intern/cycles/kernel/osl/shaders/node_fractal_voronoi.h index 09cc620b4eb..3e539f9deb9 100644 --- a/intern/cycles/kernel/osl/shaders/node_fractal_voronoi.h +++ b/intern/cycles/kernel/osl/shaders/node_fractal_voronoi.h @@ -75,7 +75,7 @@ float fractal_voronoi_distance_to_edge(VoronoiParams params, T coord) \ { \ float amplitude = 1.0; \ - float max_amplitude = 0.5 + 0.5 * params.randomness; \ + float max_amplitude = params.max_distance; \ float scale = 1.0; \ float distance = 8.0; \ \ @@ -89,7 +89,7 @@ break; \ } \ else if (i <= params.detail) { \ - max_amplitude = mix(max_amplitude, (0.5 + 0.5 * params.randomness) / scale, amplitude); \ + max_amplitude = mix(max_amplitude, params.max_distance / scale, amplitude); \ distance = mix(distance, min(distance, octave_distance / scale), amplitude); \ scale *= params.lacunarity; \ amplitude *= params.roughness; \ @@ -97,8 +97,7 @@ else { \ float remainder = params.detail - floor(params.detail); \ if (remainder != 0.0) { \ - float lerp_amplitude = mix( \ - max_amplitude, (0.5 + 0.5 * params.randomness) / scale, amplitude); \ + float lerp_amplitude = mix(max_amplitude, params.max_distance / scale, amplitude); \ max_amplitude = mix(max_amplitude, lerp_amplitude, remainder); \ float lerp_distance = mix(distance, min(distance, octave_distance / scale), amplitude); \ distance = mix(distance, min(distance, lerp_distance), remainder); \ diff --git a/intern/cycles/kernel/osl/shaders/node_voronoi_texture.osl b/intern/cycles/kernel/osl/shaders/node_voronoi_texture.osl index 5069250d897..13585062411 100644 --- a/intern/cycles/kernel/osl/shaders/node_voronoi_texture.osl +++ b/intern/cycles/kernel/osl/shaders/node_voronoi_texture.osl @@ -53,6 +53,7 @@ shader node_voronoi_texture( coord *= Scale; if (feature == "distance_to_edge") { + params.max_distance = 0.5 + 0.5 * params.randomness; if (dimensions == "1D") { Distance = fractal_voronoi_distance_to_edge(params, w); } diff --git a/intern/cycles/kernel/svm/voronoi.h b/intern/cycles/kernel/svm/voronoi.h index 8021bdc4304..cf973e8cc55 100644 --- a/intern/cycles/kernel/svm/voronoi.h +++ b/intern/cycles/kernel/svm/voronoi.h @@ -926,7 +926,7 @@ ccl_device float fractal_voronoi_distance_to_edge(ccl_private const VoronoiParam const T coord) { float amplitude = 1.0f; - float max_amplitude = 0.5f + 0.5f * params.randomness; + float max_amplitude = params.max_distance; float scale = 1.0f; float distance = 8.0f; @@ -941,7 +941,7 @@ ccl_device float fractal_voronoi_distance_to_edge(ccl_private const VoronoiParam break; } else if (i <= params.detail) { - max_amplitude = mix(max_amplitude, (0.5f + 0.5f * params.randomness) / scale, amplitude); + max_amplitude = mix(max_amplitude, params.max_distance / scale, amplitude); distance = mix(distance, min(distance, octave_distance / scale), amplitude); scale *= params.lacunarity; amplitude *= params.roughness; @@ -949,8 +949,7 @@ ccl_device float fractal_voronoi_distance_to_edge(ccl_private const VoronoiParam else { float remainder = params.detail - floorf(params.detail); if (remainder != 0.0f) { - float lerp_amplitude = mix( - max_amplitude, (0.5f + 0.5f * params.randomness) / scale, amplitude); + float lerp_amplitude = mix(max_amplitude, params.max_distance / scale, amplitude); max_amplitude = mix(max_amplitude, lerp_amplitude, remainder); float lerp_distance = mix(distance, min(distance, octave_distance / scale), amplitude); distance = mix(distance, min(distance, lerp_distance), remainder); @@ -1053,6 +1052,7 @@ ccl_device_noinline int svm_node_tex_voronoi(KernelGlobals kg, switch (params.feature) { case NODE_VORONOI_DISTANCE_TO_EDGE: { float distance = 0.0f; + params.max_distance = 0.5f + 0.5f * params.randomness; switch (dimensions) { case 1: distance = fractal_voronoi_distance_to_edge(params, w); diff --git a/source/blender/blenlib/intern/noise.cc b/source/blender/blenlib/intern/noise.cc index 8d1e2e963c7..e88941dfd8f 100644 --- a/source/blender/blenlib/intern/noise.cc +++ b/source/blender/blenlib/intern/noise.cc @@ -2310,7 +2310,7 @@ template float fractal_voronoi_distance_to_edge(const VoronoiParams ¶ms, const T coord) { float amplitude = 1.0f; - float max_amplitude = 0.5f + 0.5f * params.randomness; + float max_amplitude = params.max_distance; float scale = 1.0f; float distance = 8.0f; @@ -2325,7 +2325,7 @@ float fractal_voronoi_distance_to_edge(const VoronoiParams ¶ms, const T coor break; } else if (i <= params.detail) { - max_amplitude = mix(max_amplitude, (0.5f + 0.5f * params.randomness) / scale, amplitude); + max_amplitude = mix(max_amplitude, params.max_distance / scale, amplitude); distance = mix(distance, math::min(distance, octave_distance / scale), amplitude); scale *= params.lacunarity; amplitude *= params.roughness; @@ -2333,8 +2333,7 @@ float fractal_voronoi_distance_to_edge(const VoronoiParams ¶ms, const T coor else { float remainder = params.detail - floorf(params.detail); if (remainder != 0.0f) { - float lerp_amplitude = mix( - max_amplitude, (0.5f + 0.5f * params.randomness) / scale, amplitude); + float lerp_amplitude = mix(max_amplitude, params.max_distance / scale, amplitude); max_amplitude = mix(max_amplitude, lerp_amplitude, remainder); float lerp_distance = mix( distance, math::min(distance, octave_distance / scale), amplitude); diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_fractal_voronoi.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_fractal_voronoi.glsl index b8139dbd5b8..d5c5644dfec 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_fractal_voronoi.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_fractal_voronoi.glsl @@ -69,7 +69,7 @@ float fractal_voronoi_distance_to_edge(VoronoiParams params, T coord) \ { \ float amplitude = 1.0; \ - float max_amplitude = 0.5 + 0.5 * params.randomness; \ + float max_amplitude = params.max_distance; \ float scale = 1.0; \ float distance = 8.0; \ \ @@ -84,7 +84,7 @@ break; \ } \ else if (i <= params.detail) { \ - max_amplitude = mix(max_amplitude, (0.5 + 0.5 * params.randomness) / scale, amplitude); \ + max_amplitude = mix(max_amplitude, params.max_distance / scale, amplitude); \ distance = mix(distance, min(distance, octave_distance / scale), amplitude); \ scale *= params.lacunarity; \ amplitude *= params.roughness; \ @@ -92,8 +92,7 @@ else { \ float remainder = params.detail - floor(params.detail); \ if (remainder != 0.0) { \ - float lerp_amplitude = mix( \ - max_amplitude, (0.5 + 0.5 * params.randomness) / scale, amplitude); \ + float lerp_amplitude = mix(max_amplitude, params.max_distance / scale, amplitude); \ max_amplitude = mix(max_amplitude, lerp_amplitude, remainder); \ float lerp_distance = mix(distance, min(distance, octave_distance / scale), amplitude); \ distance = mix(distance, min(distance, lerp_distance), remainder); \ diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_tex_voronoi.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_tex_voronoi.glsl index a02b91797ff..5e62edb0824 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_tex_voronoi.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_tex_voronoi.glsl @@ -147,6 +147,7 @@ void node_tex_voronoi_distance_to_edge_1d(vec3 coord, w *= scale; + params.max_distance = 0.5 + 0.5 * params.randomness; outDistance = fractal_voronoi_distance_to_edge(params, w); } @@ -292,6 +293,7 @@ void node_tex_voronoi_distance_to_edge_2d(vec3 coord, coord *= scale; + params.max_distance = 0.5 + 0.5 * params.randomness; outDistance = fractal_voronoi_distance_to_edge(params, coord.xy); } @@ -437,6 +439,7 @@ void node_tex_voronoi_distance_to_edge_3d(vec3 coord, coord *= scale; + params.max_distance = 0.5 + 0.5 * params.randomness; outDistance = fractal_voronoi_distance_to_edge(params, coord); } @@ -589,6 +592,7 @@ void node_tex_voronoi_distance_to_edge_4d(vec3 coord, w *= scale; coord *= scale; + params.max_distance = 0.5 + 0.5 * params.randomness; outDistance = fractal_voronoi_distance_to_edge(params, vec4(coord, w)); } diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_voronoi.cc b/source/blender/nodes/shader/nodes/node_shader_tex_voronoi.cc index f6d7b05e1df..4585e9160fe 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_voronoi.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_voronoi.cc @@ -612,6 +612,7 @@ class VoronoiDistToEdgeFunction : public mf::MultiFunction { params.roughness = roughness[i]; params.lacunarity = lacunarity[i]; params.randomness = std::min(std::max(randomness[i], 0.0f), 1.0f); + params.max_distance = 0.5f + 0.5f * params.randomness; r_distance[i] = noise::fractal_voronoi_distance_to_edge(params, w[i] * params.scale); @@ -625,6 +626,7 @@ class VoronoiDistToEdgeFunction : public mf::MultiFunction { params.roughness = roughness[i]; params.lacunarity = lacunarity[i]; params.randomness = std::min(std::max(randomness[i], 0.0f), 1.0f); + params.max_distance = 0.5f + 0.5f * params.randomness; r_distance[i] = noise::fractal_voronoi_distance_to_edge( params, float2{vector[i].x, vector[i].y} * params.scale); @@ -638,6 +640,7 @@ class VoronoiDistToEdgeFunction : public mf::MultiFunction { params.roughness = roughness[i]; params.lacunarity = lacunarity[i]; params.randomness = std::min(std::max(randomness[i], 0.0f), 1.0f); + params.max_distance = 0.5f + 0.5f * params.randomness; r_distance[i] = noise::fractal_voronoi_distance_to_edge( params, vector[i] * params.scale); @@ -651,6 +654,7 @@ class VoronoiDistToEdgeFunction : public mf::MultiFunction { params.roughness = roughness[i]; params.lacunarity = lacunarity[i]; params.randomness = std::min(std::max(randomness[i], 0.0f), 1.0f); + params.max_distance = 0.5f + 0.5f * params.randomness; r_distance[i] = noise::fractal_voronoi_distance_to_edge( params, float4{vector[i].x, vector[i].y, vector[i].z, w[i]} * params.scale); @@ -735,6 +739,7 @@ class VoronoiNSphereFunction : public mf::MultiFunction { mask.foreach_index([&](const int64_t i) { params.scale = scale[i]; params.randomness = std::min(std::max(randomness[i], 0.0f), 1.0f); + r_radius[i] = noise::voronoi_n_sphere_radius(params, w[i] * params.scale); }); break; @@ -743,6 +748,7 @@ class VoronoiNSphereFunction : public mf::MultiFunction { mask.foreach_index([&](const int64_t i) { params.scale = scale[i]; params.randomness = std::min(std::max(randomness[i], 0.0f), 1.0f); + r_radius[i] = noise::voronoi_n_sphere_radius( params, float2{vector[i].x, vector[i].y} * params.scale); }); @@ -752,6 +758,7 @@ class VoronoiNSphereFunction : public mf::MultiFunction { mask.foreach_index([&](const int64_t i) { params.scale = scale[i]; params.randomness = std::min(std::max(randomness[i], 0.0f), 1.0f); + r_radius[i] = noise::voronoi_n_sphere_radius(params, vector[i] * params.scale); }); break; @@ -760,6 +767,7 @@ class VoronoiNSphereFunction : public mf::MultiFunction { mask.foreach_index([&](const int64_t i) { params.scale = scale[i]; params.randomness = std::min(std::max(randomness[i], 0.0f), 1.0f); + r_radius[i] = noise::voronoi_n_sphere_radius( params, float4{vector[i].x, vector[i].y, vector[i].z, w[i]} * params.scale); }); -- 2.30.2 From d9829c2f870ba2f3fe2154253d01cbcbbfad4724 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Thu, 6 Jul 2023 18:21:36 +0200 Subject: [PATCH 019/115] View 3D: Refactor code to split functions and remove duplication No functional changes. Previously, each navigation operation had its own method for restoring the 3D View's state upon cancellation. However, this approach did not provide significant advantages. The number of affected variables was too small to justify considering it for performance optimization, and the cancellation code was duplicated across different operations. To address this, the present commit unifies all restore code into a single function: - `void viewops_data_state_restore(ViewOpsData *vod);` As a result, the `viewmove_apply_reset` function has been removed. Moreover, since the state now has a dedicated restore function, it seemed appropriate to create a function for capturing the state as well. Therefore, the code responsible for capturing the state (previously scattered within `viewops_data_init_navigation`) has been extracted to create the function: - `void viewops_data_state_capture(ViewOpsData *vod);` During this separation process, a potential error in the code was identified, where the state may not be fully restored. Although this issue persists, a comment has been added to clarify this situation. Pull Request: https://projects.blender.org/blender/blender/pulls/109760 --- .../editors/space_view3d/view3d_navigate.cc | 145 +++++++++++++----- .../editors/space_view3d/view3d_navigate.h | 45 +++--- .../space_view3d/view3d_navigate_dolly.c | 4 +- .../space_view3d/view3d_navigate_move.c | 3 +- .../space_view3d/view3d_navigate_roll.c | 4 +- .../space_view3d/view3d_navigate_rotate.c | 16 +- .../space_view3d/view3d_navigate_zoom.c | 11 +- 7 files changed, 134 insertions(+), 94 deletions(-) diff --git a/source/blender/editors/space_view3d/view3d_navigate.cc b/source/blender/editors/space_view3d/view3d_navigate.cc index e50c955a83d..1bcdd2f3f82 100644 --- a/source/blender/editors/space_view3d/view3d_navigate.cc +++ b/source/blender/editors/space_view3d/view3d_navigate.cc @@ -530,6 +530,99 @@ static void viewops_data_init_context(bContext *C, ViewOpsData *vod) vod->rv3d = static_cast(vod->region->regiondata); } +static void viewops_data_state_capture(ViewOpsData *vod) +{ + Depsgraph *depsgraph = vod->depsgraph; + View3D *v3d = vod->v3d; + RegionView3D *rv3d = vod->rv3d; + + /* Set the view from the camera, if view locking is enabled. + * we may want to make this optional but for now its needed always. + * NOTE: This changes the value of `rv3d->dist`. */ + ED_view3d_camera_lock_init(depsgraph, v3d, rv3d); + + copy_v3_v3(vod->init.ofs, rv3d->ofs); + copy_v3_v3(vod->init.ofs_lock, rv3d->ofs_lock); + vod->init.camdx = rv3d->camdx; + vod->init.camdy = rv3d->camdy; + vod->init.camzoom = rv3d->camzoom; + vod->init.dist = rv3d->dist; + copy_qt_qt(vod->init.quat, rv3d->viewquat); + + vod->init.persp = rv3d->persp; + vod->init.view = rv3d->view; + vod->init.view_axis_roll = rv3d->view_axis_roll; +} + +void viewops_data_state_restore(ViewOpsData *vod) +{ + /* DOLLY, MOVE, ROTATE and ZOOM. */ + { + /* For Move this only changes when offset is not locked. */ + /* For Rotate this only changes when rotating around objects or last-brush. */ + /* For Zoom this only changes when zooming to mouse position. */ + /* Note this does not remove auto-keys on locked cameras. */ + copy_v3_v3(vod->rv3d->ofs, vod->init.ofs); + } + + /* MOVE and ZOOM. */ + { + /* For Move this only changes when offset is not locked. */ + /* For Zoom this only changes when zooming to mouse position in camera view. */ + vod->rv3d->camdx = vod->init.camdx; + vod->rv3d->camdy = vod->init.camdy; + } + + /* MOVE. */ + { + if ((vod->rv3d->persp == RV3D_CAMOB) && !ED_view3d_camera_lock_check(vod->v3d, vod->rv3d)) { + // vod->rv3d->camdx = vod->init.camdx; + // vod->rv3d->camdy = vod->init.camdy; + } + else if (ED_view3d_offset_lock_check(vod->v3d, vod->rv3d)) { + copy_v2_v2(vod->rv3d->ofs_lock, vod->init.ofs_lock); + } + else { + // copy_v3_v3(vod->rv3d->ofs, vod->init.ofs); + if (RV3D_LOCK_FLAGS(vod->rv3d) & RV3D_BOXVIEW) { + view3d_boxview_sync(vod->area, vod->region); + } + } + } + + /* ZOOM. */ + { + vod->rv3d->camzoom = vod->init.camzoom; + } + + /* ROTATE and ZOOM. */ + { + /** + * For Rotate this only changes when orbiting from a camera view. + * In this case the `dist` is calculated based on the camera relative to the `ofs`. + */ + /* Note this does not remove auto-keys on locked cameras. */ + vod->rv3d->dist = vod->init.dist; + } + + /* ROLL and ROTATE. */ + { + /* Note this does not remove auto-keys on locked cameras. */ + copy_qt_qt(vod->rv3d->viewquat, vod->init.quat); + } + + /* ROTATE. */ + { + vod->rv3d->persp = vod->init.persp; + vod->rv3d->view = vod->init.view; + vod->rv3d->view_axis_roll = vod->init.view_axis_roll; + } + + /* NOTE: there is no need to restore "last" values (as set by #ED_view3d_lastview_store). */ + + ED_view3d_camera_lock_sync(vod->depsgraph, vod->v3d, vod->rv3d); +} + static void viewops_data_init_navigation(bContext *C, const wmEvent *event, const eV3D_OpMode nav_type, @@ -537,6 +630,8 @@ static void viewops_data_init_navigation(bContext *C, ViewOpsData *vod) { Depsgraph *depsgraph = vod->depsgraph; + ARegion *region = vod->region; + View3D *v3d = vod->v3d; RegionView3D *rv3d = vod->rv3d; eViewOpsFlag viewops_flag = viewops_flag_from_prefs(); @@ -597,7 +692,8 @@ static void viewops_data_init_navigation(bContext *C, vod->use_dyn_ofs = false; } - vod->init.persp = rv3d->persp; + + viewops_data_state_capture(vod); if (viewops_flag & VIEWOPS_FLAG_PERSP_ENSURE) { if (ED_view3d_persp_ensure(depsgraph, vod->v3d, vod->region)) { @@ -607,16 +703,7 @@ static void viewops_data_init_navigation(bContext *C, } } - /* set the view from the camera, if view locking is enabled. - * we may want to make this optional but for now its needed always */ - ED_view3d_camera_lock_init(depsgraph, vod->v3d, vod->rv3d); - vod->init.persp_with_auto_persp_applied = rv3d->persp; - vod->init.view = rv3d->view; - vod->init.view_axis_roll = rv3d->view_axis_roll; - vod->init.dist = rv3d->dist; - vod->init.camzoom = rv3d->camzoom; - copy_qt_qt(vod->init.quat, rv3d->viewquat); copy_v2_v2_int(vod->init.event_xy, event->xy); copy_v2_v2_int(vod->prev.event_xy, event->xy); @@ -630,14 +717,8 @@ static void viewops_data_init_navigation(bContext *C, } vod->init.event_type = event->type; - copy_v3_v3(vod->init.ofs, rv3d->ofs); - copy_qt_qt(vod->curr.viewquat, rv3d->viewquat); - copy_v3_v3(vod->init.ofs_lock, rv3d->ofs_lock); - vod->init.camdx = rv3d->camdx; - vod->init.camdy = rv3d->camdy; - if (viewops_flag & VIEWOPS_FLAG_ORBIT_SELECT) { float ofs[3]; if (view3d_orbit_calc_center(C, ofs) || (vod->use_dyn_ofs == false)) { @@ -675,32 +756,35 @@ static void viewops_data_init_navigation(bContext *C, /* find a new ofs value that is along the view axis * (rather than the mouse location) */ closest_to_line_v3(dvec, vod->dyn_ofs, my_pivot, my_origin); - vod->init.dist = rv3d->dist = len_v3v3(my_pivot, dvec); + rv3d->dist = len_v3v3(my_pivot, dvec); negate_v3_v3(rv3d->ofs, dvec); } else { - const float mval_region_mid[2] = {float(vod->region->winx) / 2.0f, - float(vod->region->winy) / 2.0f}; + const float mval_region_mid[2] = {float(region->winx) / 2.0f, float(region->winy) / 2.0f}; - ED_view3d_win_to_3d(vod->v3d, vod->region, vod->dyn_ofs, mval_region_mid, rv3d->ofs); + ED_view3d_win_to_3d(v3d, region, vod->dyn_ofs, mval_region_mid, rv3d->ofs); negate_v3(rv3d->ofs); } negate_v3(vod->dyn_ofs); + + /* XXX: The initial state captured by `viewops_data_state_capture` is being modified here. + * This causes the state when canceling a navigation operation to not be fully restored. */ + vod->init.dist = rv3d->dist; copy_v3_v3(vod->init.ofs, rv3d->ofs); } } /* For dolly */ const float mval[2] = {float(event->mval[0]), float(event->mval[1])}; - ED_view3d_win_to_vector(vod->region, mval, vod->init.mousevec); + ED_view3d_win_to_vector(region, mval, vod->init.mousevec); { int event_xy_offset[2]; add_v2_v2v2_int(event_xy_offset, event->xy, vod->init.event_xy_offset); /* For rotation with trackball rotation. */ - calctrackballvec(&vod->region->winrct, event_xy_offset, vod->init.trackvec); + calctrackballvec(®ion->winrct, event_xy_offset, vod->init.trackvec); } { @@ -904,23 +988,6 @@ void viewmove_apply(ViewOpsData *vod, int x, int y) ED_region_tag_redraw(vod->region); } -void viewmove_apply_reset(ViewOpsData *vod) -{ - if ((vod->rv3d->persp == RV3D_CAMOB) && !ED_view3d_camera_lock_check(vod->v3d, vod->rv3d)) { - vod->rv3d->camdx = vod->init.camdx; - vod->rv3d->camdy = vod->init.camdy; - } - else if (ED_view3d_offset_lock_check(vod->v3d, vod->rv3d)) { - copy_v2_v2(vod->rv3d->ofs_lock, vod->init.ofs_lock); - } - else { - copy_v3_v3(vod->rv3d->ofs, vod->init.ofs); - if (RV3D_LOCK_FLAGS(vod->rv3d) & RV3D_BOXVIEW) { - view3d_boxview_sync(vod->area, vod->region); - } - } -} - /** \} */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/editors/space_view3d/view3d_navigate.h b/source/blender/editors/space_view3d/view3d_navigate.h index 4dc0b2ee777..4c5383a1e4d 100644 --- a/source/blender/editors/space_view3d/view3d_navigate.h +++ b/source/blender/editors/space_view3d/view3d_navigate.h @@ -113,9 +113,27 @@ typedef struct ViewOpsData { /** Viewport state on initialization, don't change afterwards. */ struct { - float dist; - float camzoom; - float quat[4]; + + /** These variables reflect the same in #RegionView3D. */ + + float ofs[3]; /* DOLLY, MOVE, ROTATE and ZOOM. */ + float ofs_lock[2]; /* MOVE. */ + float camdx, camdy; /* MOVE and ZOOM. */ + float camzoom; /* ZOOM. */ + float dist; /* ROTATE and ZOOM. */ + float quat[4]; /* ROLL and ROTATE. */ + char persp; /* ROTATE. */ + char view; /* ROTATE. */ + char view_axis_roll; /* ROTATE. */ + + /** + * #RegionView3D.persp set after auto-perspective is applied. + * If we want the value before running the operator, add a separate member. + */ + char persp_with_auto_persp_applied; + + /** The ones below are unrelated to the state of the 3D view. */ + /** #wmEvent.xy. */ int event_xy[2]; /** Offset to use when #VIEWOPS_FLAG_USE_MOUSE_INIT is not set. @@ -123,32 +141,15 @@ typedef struct ViewOpsData { int event_xy_offset[2]; /** #wmEvent.type that triggered the operator. */ int event_type; - float ofs[3]; - /** #RegionView3D.ofs_lock */ - float ofs_lock[2]; + /** Initial distance to 'ofs'. */ float zfac; - /** Camera offset. */ - float camdx, camdy; - /** Trackball rotation only. */ float trackvec[3]; /** Dolly only. */ float mousevec[3]; - /** - * #RegionView3D.persp set after auto-perspective is applied. - * If we want the value before running the operator, add a separate member. - */ - char persp_with_auto_persp_applied; - /** #RegionView3D.persp set after before auto-perspective is applied. */ - char persp; - /** #RegionView3D.view */ - char view; - /** #RegionView3D.view_axis_roll */ - char view_axis_roll; - /** Used for roll */ struct Dial *dial; } init; @@ -212,7 +213,6 @@ void view3d_navigate_cancel_fn(struct bContext *C, struct wmOperator *op); void calctrackballvec(const struct rcti *rect, const int event_xy[2], float r_dir[3]); void viewmove_apply(ViewOpsData *vod, int x, int y); -void viewmove_apply_reset(ViewOpsData *vod); void view3d_orbit_apply_dyn_ofs(float r_ofs[3], const float ofs_old[3], const float viewquat_old[4], @@ -235,6 +235,7 @@ ViewOpsData *viewops_data_create(bContext *C, const wmEvent *event, const eV3D_OpMode nav_type, const bool use_cursor_init); +void viewops_data_state_restore(ViewOpsData *vod); void VIEW3D_OT_view_all(struct wmOperatorType *ot); void VIEW3D_OT_view_selected(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_view3d/view3d_navigate_dolly.c b/source/blender/editors/space_view3d/view3d_navigate_dolly.c index 7b4ed2bf755..28853d408fc 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_dolly.c +++ b/source/blender/editors/space_view3d/view3d_navigate_dolly.c @@ -163,9 +163,7 @@ static int viewdolly_modal(bContext *C, wmOperator *op, const wmEvent *event) break; } case VIEW_CANCEL: { - /* Note this does not remove auto-keys on locked cameras. */ - copy_v3_v3(vod->rv3d->ofs, vod->init.ofs); - ED_view3d_camera_lock_sync(vod->depsgraph, vod->v3d, vod->rv3d); + viewops_data_state_restore(vod); ret = OPERATOR_CANCELLED; break; } diff --git a/source/blender/editors/space_view3d/view3d_navigate_move.c b/source/blender/editors/space_view3d/view3d_navigate_move.c index af7a7950146..a4728700339 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_move.c +++ b/source/blender/editors/space_view3d/view3d_navigate_move.c @@ -73,8 +73,7 @@ int viewmove_modal_impl(bContext *C, break; } case VIEW_CANCEL: { - viewmove_apply_reset(vod); - ED_view3d_camera_lock_sync(vod->depsgraph, vod->v3d, vod->rv3d); + viewops_data_state_restore(vod); ret = OPERATOR_CANCELLED; break; } diff --git a/source/blender/editors/space_view3d/view3d_navigate_roll.c b/source/blender/editors/space_view3d/view3d_navigate_roll.c index 84c168c1b42..c5baabe36ac 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_roll.c +++ b/source/blender/editors/space_view3d/view3d_navigate_roll.c @@ -140,9 +140,7 @@ static int viewroll_modal(bContext *C, wmOperator *op, const wmEvent *event) break; } case VIEW_CANCEL: { - /* Note this does not remove auto-keys on locked cameras. */ - copy_qt_qt(vod->rv3d->viewquat, vod->init.quat); - ED_view3d_camera_lock_sync(vod->depsgraph, vod->v3d, vod->rv3d); + viewops_data_state_restore(vod); ret = OPERATOR_CANCELLED; break; } diff --git a/source/blender/editors/space_view3d/view3d_navigate_rotate.c b/source/blender/editors/space_view3d/view3d_navigate_rotate.c index 6f079e9fc81..b7293610961 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_rotate.c +++ b/source/blender/editors/space_view3d/view3d_navigate_rotate.c @@ -317,21 +317,7 @@ int viewrotate_modal_impl(bContext *C, break; } case VIEW_CANCEL: { - /* Note this does not remove auto-keys on locked cameras. */ - copy_qt_qt(vod->rv3d->viewquat, vod->init.quat); - /* The offset may have change when rotating around objects or last-brush. */ - copy_v3_v3(vod->rv3d->ofs, vod->init.ofs); - /* The dist may have changed when orbiting from a camera view. - * In this case the `dist` is calculated based on the camera relative to the `ofs`. */ - vod->rv3d->dist = vod->init.dist; - - vod->rv3d->persp = vod->init.persp; - vod->rv3d->view = vod->init.view; - vod->rv3d->view_axis_roll = vod->init.view_axis_roll; - - /* NOTE: there is no need to restore "last" values (as set by #ED_view3d_lastview_store). */ - - ED_view3d_camera_lock_sync(vod->depsgraph, vod->v3d, vod->rv3d); + viewops_data_state_restore(vod); ret = OPERATOR_CANCELLED; break; } diff --git a/source/blender/editors/space_view3d/view3d_navigate_zoom.c b/source/blender/editors/space_view3d/view3d_navigate_zoom.c index a11fa3e702b..4b942c25930 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_zoom.c +++ b/source/blender/editors/space_view3d/view3d_navigate_zoom.c @@ -369,16 +369,7 @@ int viewzoom_modal_impl(bContext *C, break; } case VIEW_CANCEL: { - /* Note this does not remove auto-keys on locked cameras. */ - vod->rv3d->dist = vod->init.dist; - /* The offset may have change when zooming to mouse position. */ - copy_v3_v3(vod->rv3d->ofs, vod->init.ofs); - vod->rv3d->camzoom = vod->init.camzoom; - /* Zoom to mouse position in camera view changes these values. */ - vod->rv3d->camdx = vod->init.camdx; - vod->rv3d->camdy = vod->init.camdy; - - ED_view3d_camera_lock_sync(vod->depsgraph, vod->v3d, vod->rv3d); + viewops_data_state_restore(vod); ret = OPERATOR_CANCELLED; break; } -- 2.30.2 From af92de664b9d859bfb639504ea6131008c359fa4 Mon Sep 17 00:00:00 2001 From: Almaz-Shinbay Date: Thu, 6 Jul 2023 18:43:58 +0200 Subject: [PATCH 020/115] Outliner: Port bone elements to new tree-element code design No user visible changes expected. Part of #96713, continuation of work started in 249e4df110 and 2e221de4ce. Refer to these for a motivation and design overview. Adds a new class for bone elements. Pull Request: https://projects.blender.org/blender/blender/pulls/109684 --- .../editors/space_outliner/CMakeLists.txt | 2 ++ .../editors/space_outliner/outliner_intern.hh | 6 +++++ .../editors/space_outliner/outliner_tree.cc | 7 +++++ .../space_outliner/tree/tree_element.cc | 6 +++++ .../space_outliner/tree/tree_element_bone.cc | 26 +++++++++++++++++++ .../space_outliner/tree/tree_element_bone.hh | 23 ++++++++++++++++ .../tree/tree_element_id_armature.cc | 6 ++--- 7 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 source/blender/editors/space_outliner/tree/tree_element_bone.cc create mode 100644 source/blender/editors/space_outliner/tree/tree_element_bone.hh diff --git a/source/blender/editors/space_outliner/CMakeLists.txt b/source/blender/editors/space_outliner/CMakeLists.txt index 5885e9e6bef..7467de90295 100644 --- a/source/blender/editors/space_outliner/CMakeLists.txt +++ b/source/blender/editors/space_outliner/CMakeLists.txt @@ -53,6 +53,7 @@ set(SRC tree/tree_display_view_layer.cc tree/tree_element.cc tree/tree_element_anim_data.cc + tree/tree_element_bone.cc tree/tree_element_collection.cc tree/tree_element_driver.cc tree/tree_element_gpencil_layer.cc @@ -82,6 +83,7 @@ set(SRC tree/tree_display.hh tree/tree_element.hh tree/tree_element_anim_data.hh + tree/tree_element_bone.hh tree/tree_element_collection.hh tree/tree_element_driver.hh tree/tree_element_gpencil_layer.hh diff --git a/source/blender/editors/space_outliner/outliner_intern.hh b/source/blender/editors/space_outliner/outliner_intern.hh index a1bf70c9939..0c81fa90ba0 100644 --- a/source/blender/editors/space_outliner/outliner_intern.hh +++ b/source/blender/editors/space_outliner/outliner_intern.hh @@ -18,6 +18,7 @@ /* internal exports only */ struct ARegion; +struct Bone; struct EditBone; struct ID; struct ListBase; @@ -286,6 +287,11 @@ struct IDsSelectedData { struct ListBase selected_array; }; +struct BoneElementCreateData { + ID *armature_id; + Bone *bone; +}; + TreeTraversalAction outliner_collect_selected_collections(TreeElement *te, void *customdata); TreeTraversalAction outliner_collect_selected_objects(TreeElement *te, void *customdata); diff --git a/source/blender/editors/space_outliner/outliner_tree.cc b/source/blender/editors/space_outliner/outliner_tree.cc index 5226c09bf41..80db1324507 100644 --- a/source/blender/editors/space_outliner/outliner_tree.cc +++ b/source/blender/editors/space_outliner/outliner_tree.cc @@ -239,6 +239,9 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner, else if (ELEM(type, TSE_GENERIC_LABEL)) { id = nullptr; } + else if (type == TSE_BONE) { + id = static_cast(idv)->armature_id; + } /* exceptions */ if (ELEM(type, TSE_ID_BASE, TSE_GENERIC_LABEL)) { @@ -294,6 +297,9 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner, else if (ELEM(type, TSE_ID_BASE, TSE_GENERIC_LABEL)) { /* pass */ } + else if (type == TSE_BONE) { + /* pass */ + } else if (type == TSE_SOME_ID) { if (!te->abstract_element) { BLI_assert_msg(0, "Expected this ID type to be ported to new Outliner tree-element design"); @@ -329,6 +335,7 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner, } else if (ELEM(type, TSE_ANIM_DATA, + TSE_BONE, TSE_DRIVER_BASE, TSE_NLA, TSE_NLA_ACTION, diff --git a/source/blender/editors/space_outliner/tree/tree_element.cc b/source/blender/editors/space_outliner/tree/tree_element.cc index b5acd67fdfe..083e27d57c7 100644 --- a/source/blender/editors/space_outliner/tree/tree_element.cc +++ b/source/blender/editors/space_outliner/tree/tree_element.cc @@ -18,6 +18,7 @@ #include "BLT_translation.h" #include "tree_element_anim_data.hh" +#include "tree_element_bone.hh" #include "tree_element_collection.hh" #include "tree_element_driver.hh" #include "tree_element_gpencil_layer.hh" @@ -102,6 +103,11 @@ std::unique_ptr AbstractTreeElement::createFromType(const i case TSE_SEQUENCE_DUP: return std::make_unique(legacy_te, *static_cast(idv)); + case TSE_BONE: { + BoneElementCreateData *bone_data = static_cast(idv); + return std::make_unique( + legacy_te, *bone_data->armature_id, *bone_data->bone); + } default: break; } diff --git a/source/blender/editors/space_outliner/tree/tree_element_bone.cc b/source/blender/editors/space_outliner/tree/tree_element_bone.cc new file mode 100644 index 00000000000..a9117217a92 --- /dev/null +++ b/source/blender/editors/space_outliner/tree/tree_element_bone.cc @@ -0,0 +1,26 @@ +/* SPDX-FileCopyrightText: 2023 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup spoutliner + */ + +#include "DNA_armature_types.h" +#include "DNA_outliner_types.h" + +#include "../outliner_intern.hh" + +#include "tree_element_bone.hh" + +namespace blender::ed::outliner { + +TreeElementBone::TreeElementBone(TreeElement &legacy_te, ID &armature_id, Bone &bone) + : AbstractTreeElement(legacy_te), armature_id_(armature_id), bone_(bone) +{ + BLI_assert(legacy_te.store_elem->type == TSE_BONE); + legacy_te.name = bone.name; + legacy_te.directdata = &bone; +} + +} // namespace blender::ed::outliner diff --git a/source/blender/editors/space_outliner/tree/tree_element_bone.hh b/source/blender/editors/space_outliner/tree/tree_element_bone.hh new file mode 100644 index 00000000000..755a82093f9 --- /dev/null +++ b/source/blender/editors/space_outliner/tree/tree_element_bone.hh @@ -0,0 +1,23 @@ +/* SPDX-FileCopyrightText: 2023 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup spoutliner + */ + +#pragma once + +#include "tree_element.hh" + +namespace blender::ed::outliner { + +class TreeElementBone final : public AbstractTreeElement { + ID &armature_id_; + Bone &bone_; + + public: + TreeElementBone(TreeElement &legacy_te, ID &armature_id, Bone &bone); +}; + +} // namespace blender::ed::outliner diff --git a/source/blender/editors/space_outliner/tree/tree_element_id_armature.cc b/source/blender/editors/space_outliner/tree/tree_element_id_armature.cc index 16ba205ef1c..5974961bde0 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_id_armature.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_id_armature.cc @@ -83,11 +83,11 @@ static void outliner_add_bone(SpaceOutliner *space_outliner, TreeElement *parent, int *a) { - TreeElement *te = outliner_add_element(space_outliner, lb, id, parent, TSE_BONE, *a); + BoneElementCreateData bone_data = {id, curBone}; + + TreeElement *te = outliner_add_element(space_outliner, lb, &bone_data, parent, TSE_BONE, *a); (*a)++; - te->name = curBone->name; - te->directdata = curBone; LISTBASE_FOREACH (Bone *, child_bone, &curBone->childbase) { outliner_add_bone(space_outliner, &te->subtree, id, child_bone, te, a); -- 2.30.2 From 4fb86952ed534d15e766eceb8c4f84dfa30a8c0e Mon Sep 17 00:00:00 2001 From: Joseph Eagar Date: Thu, 6 Jul 2023 10:21:32 -0700 Subject: [PATCH 021/115] Sculpt: Second attempt at fix #109555: Fix floating-point error. --- source/blender/blenkernel/intern/pbvh.cc | 64 +++++++++++++++++------- 1 file changed, 47 insertions(+), 17 deletions(-) diff --git a/source/blender/blenkernel/intern/pbvh.cc b/source/blender/blenkernel/intern/pbvh.cc index a2ff690ba24..f10e4f0e8b7 100644 --- a/source/blender/blenkernel/intern/pbvh.cc +++ b/source/blender/blenkernel/intern/pbvh.cc @@ -42,8 +42,6 @@ #include "pbvh_intern.hh" -#include - using blender::float3; using blender::MutableSpan; using blender::Span; @@ -2691,9 +2689,8 @@ void BKE_pbvh_raycast_project_ray_root( float bb_min_root[3], bb_max_root[3], bb_center[3], bb_diff[3]; IsectRayAABB_Precalc ray; float ray_normal_inv[3]; - const float margin = 1e-3; - float offset = 1.0f + margin; - const float offset_vec[3] = {margin, margin, margin}; + float offset = 1.0f + 1e-3f; + const float offset_vec[3] = {1e-3f, 1e-3f, 1e-3f}; if (original) { BKE_pbvh_node_get_original_BB(pbvh->nodes, bb_min_root, bb_max_root); @@ -2702,6 +2699,40 @@ void BKE_pbvh_raycast_project_ray_root( BKE_pbvh_node_get_BB(pbvh->nodes, bb_min_root, bb_max_root); } + /* Calc rough clipping to avoid overflow later. See #109555. */ + float mat[3][3]; + axis_dominant_v3_to_m3(mat, ray_normal); + float a[3], b[3], min[3] = {FLT_MAX, FLT_MAX, FLT_MAX}, max[3] = {FLT_MIN, FLT_MIN, FLT_MIN}; + + /* Compute AABB bounds rotated along ray_normal.*/ + copy_v3_v3(a, bb_min_root); + copy_v3_v3(b, bb_max_root); + mul_m3_v3(mat, a); + mul_m3_v3(mat, b); + minmax_v3v3_v3(min, max, a); + minmax_v3v3_v3(min, max, b); + + float cent[3], vec[3]; + float ray_start_new[3], ray_end_new[3]; + + float dist = max[2] - min[2]; + + /* Build ray interval from z dimen of bounds. */ + mid_v3_v3v3(cent, bb_min_root, bb_max_root); + madd_v3_v3v3fl(ray_start_new, cent, ray_normal, -dist); + madd_v3_v3v3fl(ray_end_new, cent, ray_normal, dist); + + /* Don't go behind existing ray_start. */ + sub_v3_v3v3(vec, ray_end_new, ray_start); + if (dot_v3v3(vec, ray_normal) > 0.0f) { + copy_v3_v3(ray_end, ray_end_new); + } + + sub_v3_v3v3(vec, ray_start_new, ray_start); + if (dot_v3v3(vec, ray_normal) > 0.0f) { + copy_v3_v3(ray_start, ray_start_new); + } + /* Slightly offset min and max in case we have a zero width node * (due to a plane mesh for instance), or faces very close to the bounding box boundary. */ mid_v3_v3v3(bb_center, bb_max_root, bb_min_root); @@ -2726,18 +2757,17 @@ void BKE_pbvh_raycast_project_ray_root( return; } - if (rootmin_end <= rootmin_start) { - /* Small object sizes can led to floating-point overflow - * when trying to add a reasonably small margin, e.g. 1e-3. - * This happens when initializing rays by the viewport clipping - * bounds, which are then divided by the object's scale. - * So if the clip end if 10000 and we divide by 0.00001 we - * get a really large number that we canned add 1e-3 (0.001) to. - * - * To solve this, we compute a margin using the next possible floating - * point value after ray start. */ - float epsilon = std::nextafterf(rootmin_start, rootmin_start + 1.0f) - rootmin_start; - rootmin_end = rootmin_start + epsilon * 500.0f; + /* Small object sizes or small clip starts can lead to floating-point + * overflow. To solve this, we compute a margin using the next + * possible floating point value after ray start. See #109555. + */ + + float epsilon = (std::nextafter(rootmin_start, rootmin_start + 1000.0f) - rootmin_start) * + +5000.0f; + + if (rootmin_start == rootmin_end) { + rootmin_start -= epsilon; + rootmin_end += epsilon; } madd_v3_v3v3fl(ray_start, ray_start, ray_normal, rootmin_start); -- 2.30.2 From ec30217755f047e6e7db86f15b5b057043d8546f Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Thu, 6 Jul 2023 13:40:33 -0400 Subject: [PATCH 022/115] Cleanup: Simplify access to next face corner in domain interpolation --- .../intern/geometry_component_mesh.cc | 23 ++++++++----------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/source/blender/blenkernel/intern/geometry_component_mesh.cc b/source/blender/blenkernel/intern/geometry_component_mesh.cc index a2b69506a0f..56e313402a5 100644 --- a/source/blender/blenkernel/intern/geometry_component_mesh.cc +++ b/source/blender/blenkernel/intern/geometry_component_mesh.cc @@ -295,13 +295,11 @@ static void adapt_mesh_domain_corner_to_edge_impl(const Mesh &mesh, const IndexRange poly = polys[poly_index]; /* For every edge, mix values from the two adjacent corners (the current and next corner). */ - for (const int i : IndexRange(poly.size())) { - const int next_i = (i + 1) % poly.size(); - const int loop_i = poly.start() + i; - const int next_loop_i = poly.start() + next_i; - const int edge_index = corner_edges[loop_i]; - mixer.mix_in(edge_index, old_values[loop_i]); - mixer.mix_in(edge_index, old_values[next_loop_i]); + for (const int corner : poly) { + const int next_corner = mesh::poly_corner_next(poly, corner); + const int edge_index = corner_edges[corner]; + mixer.mix_in(edge_index, old_values[corner]); + mixer.mix_in(edge_index, old_values[next_corner]); } } @@ -322,13 +320,10 @@ void adapt_mesh_domain_corner_to_edge_impl(const Mesh &mesh, for (const int poly_index : polys.index_range()) { const IndexRange poly = polys[poly_index]; - for (const int i : IndexRange(poly.size())) { - const int next_i = (i + 1) % poly.size(); - const int loop_i = poly[i]; - const int next_loop_i = poly[next_i]; - const int edge_index = corner_edges[loop_i]; - - if (!old_values[loop_i] || !old_values[next_loop_i]) { + for (const int corner : poly) { + const int next_corner = mesh::poly_corner_next(poly, corner); + const int edge_index = corner_edges[corner]; + if (!old_values[corner] || !old_values[next_corner]) { r_values[edge_index] = false; } } -- 2.30.2 From 1beece5f164ab6e8e983a47a07f3eeed9356c66d Mon Sep 17 00:00:00 2001 From: Iliya Katueshenock Date: Thu, 6 Jul 2023 19:43:40 +0200 Subject: [PATCH 023/115] Cleanup: Unused spin lock mutex warning Pull Request: https://projects.blender.org/blender/blender/pulls/109777 --- source/blender/blenlib/intern/threads.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/blenlib/intern/threads.cc b/source/blender/blenlib/intern/threads.cc index 6df4d369ed0..1c78ca4b049 100644 --- a/source/blender/blenlib/intern/threads.cc +++ b/source/blender/blenlib/intern/threads.cc @@ -446,6 +446,7 @@ void BLI_spin_end(SpinLock *spin) BLI_mutex_end(spin); #elif defined(_MSC_VER) /* Nothing to do, spin is a simple integer type. */ + UNUSED_VARS(spin); #else pthread_spin_destroy(spin); #endif -- 2.30.2 From a0846a60c9a10fdf9b4e159900b42e832a22e3fd Mon Sep 17 00:00:00 2001 From: Stefan Werner Date: Thu, 6 Jul 2023 21:50:03 +0200 Subject: [PATCH 024/115] Cycles: Fixed oneAPI build on Windows Turns out uint wasn't defined this early in our kernels on Windows. Using unsigned int instead should fix this. --- intern/cycles/kernel/device/oneapi/compat.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/intern/cycles/kernel/device/oneapi/compat.h b/intern/cycles/kernel/device/oneapi/compat.h index d3c9134095e..1923ca21470 100644 --- a/intern/cycles/kernel/device/oneapi/compat.h +++ b/intern/cycles/kernel/device/oneapi/compat.h @@ -192,9 +192,9 @@ ccl_device_forceinline float __uint_as_float(uint x) { return sycl::bit_cast(x); } -ccl_device_forceinline uint __float_as_uint(float x) +ccl_device_forceinline unsigned int __float_as_uint(float x) { - return sycl::bit_cast(x); + return sycl::bit_cast(x); } ccl_device_forceinline float __int_as_float(int x) { -- 2.30.2 From 235c564aa00c1b9fc39f07eca760d96a3f12a7a7 Mon Sep 17 00:00:00 2001 From: Ray Molenkamp Date: Thu, 6 Jul 2023 14:47:35 -0600 Subject: [PATCH 025/115] Cycles: re-Fixed oneAPI build on Windows fixes one uint missed in a0846a60c9a1 --- intern/cycles/kernel/device/oneapi/compat.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intern/cycles/kernel/device/oneapi/compat.h b/intern/cycles/kernel/device/oneapi/compat.h index 1923ca21470..334ccd43978 100644 --- a/intern/cycles/kernel/device/oneapi/compat.h +++ b/intern/cycles/kernel/device/oneapi/compat.h @@ -188,7 +188,7 @@ using uchar = unsigned char; using sycl::half; /* math functions */ -ccl_device_forceinline float __uint_as_float(uint x) +ccl_device_forceinline float __uint_as_float(unsigned int x) { return sycl::bit_cast(x); } -- 2.30.2 From 827baed610b88734fadff3214f0e4bce0274a726 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Thu, 6 Jul 2023 17:10:06 -0400 Subject: [PATCH 026/115] Mesh: Fix missing multithreading in part of BMesh to Mesh conversion ebe8f8ce719729eef402 and 5669c5a61b2f049ec1b5 added multithreading but a typo meant it wasn't used for half of the process. Fixing that gives a 30% improvement in my tests, from about 80 to 60 ms converting a grid. --- source/blender/bmesh/intern/bmesh_mesh_convert.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/blender/bmesh/intern/bmesh_mesh_convert.cc b/source/blender/bmesh/intern/bmesh_mesh_convert.cc index 0fb8dbc831f..543d185f434 100644 --- a/source/blender/bmesh/intern/bmesh_mesh_convert.cc +++ b/source/blender/bmesh/intern/bmesh_mesh_convert.cc @@ -1432,7 +1432,7 @@ void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *me, const BMeshToMeshParams Array loop_table; Vector loop_layers_not_to_copy; threading::parallel_invoke( - me->totface > 1024, + (me->totpoly + me->totedge) > 1024, [&]() { vert_table.reinitialize(bm->totvert); bm_vert_table_build(*bm, vert_table, need_select_vert, need_hide_vert); @@ -1515,7 +1515,7 @@ void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *me, const BMeshToMeshParams /* Loop over all elements in parallel, copying attributes and building the Mesh topology. */ threading::parallel_invoke( - me->totvert > 1024, + (me->totpoly + me->totedge) > 1024, [&]() { bm_to_mesh_verts(*bm, vert_table, *me, select_vert.span, hide_vert.span); if (me->key) { @@ -1651,7 +1651,7 @@ void BM_mesh_bm_to_me_for_eval(BMesh *bm, Mesh *me, const CustomData_MeshMasks * Array loop_table; Vector loop_layers_not_to_copy; threading::parallel_invoke( - me->totface > 1024, + (me->totpoly + me->totedge) > 1024, [&]() { vert_table.reinitialize(bm->totvert); bm_vert_table_build(*bm, vert_table, need_select_vert, need_hide_vert); @@ -1737,7 +1737,7 @@ void BM_mesh_bm_to_me_for_eval(BMesh *bm, Mesh *me, const CustomData_MeshMasks * /* Loop over all elements in parallel, copying attributes and building the Mesh topology. */ threading::parallel_invoke( - me->totvert > 1024, + (me->totpoly + me->totedge) > 1024, [&]() { bm_to_mesh_verts(*bm, vert_table, *me, select_vert.span, hide_vert.span); }, [&]() { bm_to_mesh_edges(*bm, -- 2.30.2 From 6d608cc6b52444dbc2468464aca361dec7d4cfc2 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 7 Jul 2023 15:03:49 +1000 Subject: [PATCH 027/115] Cleanup: use doxy headers in imbuf --- source/blender/imbuf/intern/IMB_colormanagement_intern.h | 4 ++-- source/blender/imbuf/intern/IMB_indexer.h | 4 ++-- source/blender/imbuf/intern/format_bmp.cc | 4 ++++ source/blender/imbuf/intern/format_dds.cc | 4 +++- source/blender/imbuf/intern/format_dpx.cc | 4 ++++ source/blender/imbuf/intern/format_hdr.cc | 4 ++++ source/blender/imbuf/intern/format_png.cc | 4 ++++ source/blender/imbuf/intern/format_psd.cc | 4 ++++ source/blender/imbuf/intern/format_targa.cc | 4 ++++ source/blender/imbuf/intern/format_tiff.cc | 4 ++++ 10 files changed, 35 insertions(+), 5 deletions(-) diff --git a/source/blender/imbuf/intern/IMB_colormanagement_intern.h b/source/blender/imbuf/intern/IMB_colormanagement_intern.h index a6ca3638cc8..25bca92cf4e 100644 --- a/source/blender/imbuf/intern/IMB_colormanagement_intern.h +++ b/source/blender/imbuf/intern/IMB_colormanagement_intern.h @@ -2,12 +2,12 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ -#pragma once - /** \file * \ingroup imbuf */ +#pragma once + #include "BLI_sys_types.h" #include "DNA_listBase.h" diff --git a/source/blender/imbuf/intern/IMB_indexer.h b/source/blender/imbuf/intern/IMB_indexer.h index ea5308c537e..5b53fe7c4f9 100644 --- a/source/blender/imbuf/intern/IMB_indexer.h +++ b/source/blender/imbuf/intern/IMB_indexer.h @@ -2,12 +2,12 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ -#pragma once - /** \file * \ingroup imbuf */ +#pragma once + #ifdef WIN32 # include #endif diff --git a/source/blender/imbuf/intern/format_bmp.cc b/source/blender/imbuf/intern/format_bmp.cc index 11b61efbcfc..ce32c489621 100644 --- a/source/blender/imbuf/intern/format_bmp.cc +++ b/source/blender/imbuf/intern/format_bmp.cc @@ -2,6 +2,10 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +/** \file + * \ingroup imbuf + */ + #include "oiio/openimageio_support.hh" #include "IMB_filetype.h" diff --git a/source/blender/imbuf/intern/format_dds.cc b/source/blender/imbuf/intern/format_dds.cc index 44c84a8cfe0..9e9591f6b11 100644 --- a/source/blender/imbuf/intern/format_dds.cc +++ b/source/blender/imbuf/intern/format_dds.cc @@ -3,7 +3,9 @@ * * SPDX-License-Identifier: GPL-2.0-or-later AND BSD-3-Clause */ -/** +/** \file + * \ingroup imbuf + * * Some portions of this file are from the Chromium project and have been adapted * for Blender use when flipping DDS images to the OpenGL convention. */ diff --git a/source/blender/imbuf/intern/format_dpx.cc b/source/blender/imbuf/intern/format_dpx.cc index 5ce460d7c5f..a9e4f6dbbba 100644 --- a/source/blender/imbuf/intern/format_dpx.cc +++ b/source/blender/imbuf/intern/format_dpx.cc @@ -2,6 +2,10 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +/** \file + * \ingroup imbuf + */ + #include "oiio/openimageio_support.hh" #include "IMB_colormanagement.h" diff --git a/source/blender/imbuf/intern/format_hdr.cc b/source/blender/imbuf/intern/format_hdr.cc index dbdc5d6c892..43d086daca5 100644 --- a/source/blender/imbuf/intern/format_hdr.cc +++ b/source/blender/imbuf/intern/format_hdr.cc @@ -2,6 +2,10 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +/** \file + * \ingroup imbuf + */ + #include "oiio/openimageio_support.hh" #include "IMB_filetype.h" diff --git a/source/blender/imbuf/intern/format_png.cc b/source/blender/imbuf/intern/format_png.cc index c301ce4ee87..35586fbedc6 100644 --- a/source/blender/imbuf/intern/format_png.cc +++ b/source/blender/imbuf/intern/format_png.cc @@ -2,6 +2,10 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +/** \file + * \ingroup imbuf + */ + #include "oiio/openimageio_support.hh" #include "IMB_colormanagement.h" diff --git a/source/blender/imbuf/intern/format_psd.cc b/source/blender/imbuf/intern/format_psd.cc index 4cb9f5e84c4..7cf3bc4b0bd 100644 --- a/source/blender/imbuf/intern/format_psd.cc +++ b/source/blender/imbuf/intern/format_psd.cc @@ -2,6 +2,10 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +/** \file + * \ingroup imbuf + */ + #include "oiio/openimageio_support.hh" #include "IMB_filetype.h" diff --git a/source/blender/imbuf/intern/format_targa.cc b/source/blender/imbuf/intern/format_targa.cc index 1dd93b0da6d..96666adfd1d 100644 --- a/source/blender/imbuf/intern/format_targa.cc +++ b/source/blender/imbuf/intern/format_targa.cc @@ -2,6 +2,10 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +/** \file + * \ingroup imbuf + */ + #include "oiio/openimageio_support.hh" #include "IMB_filetype.h" diff --git a/source/blender/imbuf/intern/format_tiff.cc b/source/blender/imbuf/intern/format_tiff.cc index a65e093389d..54e0ce69688 100644 --- a/source/blender/imbuf/intern/format_tiff.cc +++ b/source/blender/imbuf/intern/format_tiff.cc @@ -2,6 +2,10 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +/** \file + * \ingroup imbuf + */ + #include "oiio/openimageio_support.hh" #include "IMB_colormanagement.h" -- 2.30.2 From 23acedd4329a9d9825a463e7eb1de1204d1ed78b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 7 Jul 2023 15:11:19 +1000 Subject: [PATCH 028/115] Cleanup: code-comments --- intern/cycles/blender/util.h | 2 +- source/blender/blenkernel/BKE_lib_query.h | 2 +- source/blender/blenkernel/intern/armature.c | 14 ++++++++------ source/blender/blenkernel/intern/constraint.c | 6 +++--- source/blender/blenkernel/intern/ipo.c | 2 +- source/blender/blenkernel/intern/lib_remap.c | 2 +- source/blender/blenkernel/intern/ocean.c | 8 ++++---- source/blender/blenkernel/intern/pbvh.cc | 2 +- source/blender/blenlib/intern/math_interp.c | 2 +- source/blender/bmesh/tools/bmesh_bevel.c | 10 +++++----- .../depsgraph/intern/node/deg_node_operation.h | 2 +- source/blender/draw/intern/draw_manager.c | 2 +- source/blender/editors/animation/keyframing.cc | 2 +- source/blender/editors/armature/armature_add.cc | 8 ++------ .../blender/editors/armature/armature_relations.cc | 2 +- source/blender/editors/armature/armature_utils.cc | 8 ++++---- source/blender/editors/armature/pose_transform.cc | 3 ++- .../blender/editors/gpencil_legacy/gpencil_merge.c | 2 +- source/blender/editors/mesh/editmesh_bevel.cc | 4 ++-- source/blender/editors/mesh/editmesh_extrude.cc | 2 +- source/blender/editors/mesh/editmesh_knife.cc | 2 +- source/blender/editors/object/object_constraint.cc | 2 +- source/blender/editors/object/object_ops.cc | 2 +- source/blender/editors/object/object_relations.cc | 4 ++-- source/blender/editors/object/object_shapekey.cc | 10 ++++++---- source/blender/io/collada/ArmatureExporter.cpp | 2 +- source/blender/makesrna/intern/rna_define.c | 2 +- source/blender/makesrna/intern/rna_image.cc | 2 +- source/blender/makesrna/intern/rna_pose.cc | 2 +- source/blender/modifiers/intern/MOD_normal_edit.cc | 2 +- source/blender/python/intern/bpy_rna.c | 2 +- tools/check_source/check_spelling_c_config.py | 4 ++++ 32 files changed, 63 insertions(+), 58 deletions(-) diff --git a/intern/cycles/blender/util.h b/intern/cycles/blender/util.h index 93b1e500e1a..494a0c8bbcf 100644 --- a/intern/cycles/blender/util.h +++ b/intern/cycles/blender/util.h @@ -89,7 +89,7 @@ static inline BL::Mesh object_to_mesh(BL::BlendData & /*data*/, if (b_ob_info.is_real_object_data()) { if (mesh) { - /* Make a copy to split faces if we use autosmooth, otherwise not needed. + /* Make a copy to split faces if we use auto-smooth, otherwise not needed. * Also in edit mode do we need to make a copy, to ensure data layers like * UV are not empty. */ if (mesh.is_editmode() || diff --git a/source/blender/blenkernel/BKE_lib_query.h b/source/blender/blenkernel/BKE_lib_query.h index dd12b498935..b8000f4912d 100644 --- a/source/blender/blenkernel/BKE_lib_query.h +++ b/source/blender/blenkernel/BKE_lib_query.h @@ -50,7 +50,7 @@ enum { IDWALK_CB_DIRECT_WEAK_LINK = (1 << 3), /** - * That ID is used as mere sub-data by its owner (only case currently: those root nodetrees in + * That ID is used as mere sub-data by its owner (only case currently: those root node-trees in * materials etc., and the Scene's master collections). * This means callback shall not *do* anything, only use this as informative data if it needs it. */ diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index c0b551e684d..c82a8cdd418 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -989,9 +989,10 @@ void BKE_pchan_bbone_spline_params_get(bPoseChannel *pchan, /* Transform previous point inside this bone space. */ if (bone->bbone_prev_type == BBONE_HANDLE_RELATIVE) { - /* Use delta movement (from restpose), and apply this relative to the current bone's head. */ + /* Use delta movement (from rest-pose), + * and apply this relative to the current bone's head. */ if (rest) { - /* In restpose, arm_head == pose_head */ + /* In rest-pose, arm_head == pose_head */ zero_v3(param->prev_h); done = true; } @@ -1043,9 +1044,10 @@ void BKE_pchan_bbone_spline_params_get(bPoseChannel *pchan, /* Transform next point inside this bone space. */ if (bone->bbone_next_type == BBONE_HANDLE_RELATIVE) { - /* Use delta movement (from restpose), and apply this relative to the current bone's tail. */ + /* Use delta movement (from rest-pose), + * and apply this relative to the current bone's tail. */ if (rest) { - /* In restpose, arm_head == pose_head */ + /* In rest-pose, arm_head == pose_head */ copy_v3_fl3(param->next_h, 0.0f, param->length, 0.0); done = true; } @@ -1091,12 +1093,12 @@ void BKE_pchan_bbone_spline_params_get(bPoseChannel *pchan, * - These properties allow users to hand-animate the * bone curve/shape, without having to resort to using * extra bones - * - The "bone" level offsets are for defining the restpose + * - The "bone" level offsets are for defining the rest-pose * shape of the bone (e.g. for curved eyebrows for example). * -> In the viewport, it's needed to define what the rest pose * looks like * -> For "rest == 0", we also still need to have it present - * so that we can "cancel out" this restpose when it comes + * so that we can "cancel out" this rest-pose when it comes * time to deform some geometry, it won't cause double transforms. * - The "pchan" level offsets are the ones that animators actually * end up animating diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c index 33b602bb578..c1cea986886 100644 --- a/source/blender/blenkernel/intern/constraint.c +++ b/source/blender/blenkernel/intern/constraint.c @@ -1439,7 +1439,7 @@ static int followpath_get_tars(bConstraint *con, ListBase *list) bFollowPathConstraint *data = con->data; bConstraintTarget *ct; - /* standard target-getting macro for single-target constraints without subtargets */ + /* Standard target-getting macro for single-target constraints without sub-targets. */ SINGLETARGETNS_GET_TARS(con, data->tar, ct, list); return 1; @@ -3787,7 +3787,7 @@ static int clampto_get_tars(bConstraint *con, ListBase *list) bClampToConstraint *data = con->data; bConstraintTarget *ct; - /* standard target-getting macro for single-target constraints without subtargets */ + /* Standard target-getting macro for single-target constraints without sub-targets. */ SINGLETARGETNS_GET_TARS(con, data->tar, ct, list); return 1; @@ -4609,7 +4609,7 @@ static int splineik_get_tars(bConstraint *con, ListBase *list) bSplineIKConstraint *data = con->data; bConstraintTarget *ct; - /* standard target-getting macro for single-target constraints without subtargets */ + /* Standard target-getting macro for single-target constraints without sub-targets. */ SINGLETARGETNS_GET_TARS(con, data->tar, ct, list); return 1; diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c index 1e656d8b195..c897f919409 100644 --- a/source/blender/blenkernel/intern/ipo.c +++ b/source/blender/blenkernel/intern/ipo.c @@ -1098,7 +1098,7 @@ static char *get_rna_access(ID *id, propname = "eval_time"; break; - /* XXX problematic blocktypes */ + /* XXX problematic block-types. */ case ID_SEQ: /* sequencer strip */ /* SEQ_FAC1: */ switch (adrcode) { diff --git a/source/blender/blenkernel/intern/lib_remap.c b/source/blender/blenkernel/intern/lib_remap.c index a2776bdc8d4..c8e9ecfb794 100644 --- a/source/blender/blenkernel/intern/lib_remap.c +++ b/source/blender/blenkernel/intern/lib_remap.c @@ -185,7 +185,7 @@ static int foreach_libblock_remap_callback(LibraryIDLinkCallbackData *cb_data) IDRemap *id_remap_data = cb_data->user_data; /* Those asserts ensure the general sanity of ID tags regarding 'embedded' ID data (root - * nodetrees and co). */ + * node-trees and co). */ BLI_assert(id_owner == id_remap_data->id_owner); BLI_assert(id_self == id_owner || (id_self->flag & LIB_EMBEDDED_DATA) != 0); diff --git a/source/blender/blenkernel/intern/ocean.c b/source/blender/blenkernel/intern/ocean.c index a1543906445..ba8598f224e 100644 --- a/source/blender/blenkernel/intern/ocean.c +++ b/source/blender/blenkernel/intern/ocean.c @@ -881,22 +881,22 @@ bool BKE_ocean_init(Ocean *o, o->_Lz = 0.001f; } - /* the +ve components and DC */ + /* The +VE components and DC. */ for (i = 0; i <= o->_M / 2; i++) { o->_kx[i] = 2.0f * (float)M_PI * i / o->_Lx; } - /* the -ve components */ + /* The -VE components. */ for (i = o->_M - 1, ii = 0; i > o->_M / 2; i--, ii++) { o->_kx[i] = -2.0f * (float)M_PI * ii / o->_Lx; } - /* the +ve components and DC */ + /* The +VE components and DC. */ for (i = 0; i <= o->_N / 2; i++) { o->_kz[i] = 2.0f * (float)M_PI * i / o->_Lz; } - /* the -ve components */ + /* The -VE components. */ for (i = o->_N - 1, ii = 0; i > o->_N / 2; i--, ii++) { o->_kz[i] = -2.0f * (float)M_PI * ii / o->_Lz; } diff --git a/source/blender/blenkernel/intern/pbvh.cc b/source/blender/blenkernel/intern/pbvh.cc index f10e4f0e8b7..bb02ecc698f 100644 --- a/source/blender/blenkernel/intern/pbvh.cc +++ b/source/blender/blenkernel/intern/pbvh.cc @@ -2717,7 +2717,7 @@ void BKE_pbvh_raycast_project_ray_root( float dist = max[2] - min[2]; - /* Build ray interval from z dimen of bounds. */ + /* Build ray interval from z dimension of bounds. */ mid_v3_v3v3(cent, bb_min_root, bb_max_root); madd_v3_v3v3fl(ray_start_new, cent, ray_normal, -dist); madd_v3_v3v3fl(ray_end_new, cent, ray_normal, dist); diff --git a/source/blender/blenlib/intern/math_interp.c b/source/blender/blenlib/intern/math_interp.c index 017b839ca96..28e14e8e2ef 100644 --- a/source/blender/blenlib/intern/math_interp.c +++ b/source/blender/blenlib/intern/math_interp.c @@ -487,7 +487,7 @@ void BLI_bilinear_interpolation_wrap_char(const uchar *buffer, * by Ned Greene and Paul S. Heckbert (1986) ***************************************************************************/ -/* Table of (exp(ar) - exp(a)) / (1 - exp(a)) for r in range [0, 1] and a = -2 +/* Table of `(exp(ar) - exp(a)) / (1 - exp(a))` for `r` in range [0, 1] and `a = -2`. * used instead of actual gaussian, * otherwise at high texture magnifications circular artifacts are visible. */ #define EWA_MAXIDX 255 diff --git a/source/blender/bmesh/tools/bmesh_bevel.c b/source/blender/bmesh/tools/bmesh_bevel.c index 4103155d84a..558bca92fc9 100644 --- a/source/blender/bmesh/tools/bmesh_bevel.c +++ b/source/blender/bmesh/tools/bmesh_bevel.c @@ -2484,16 +2484,16 @@ static void bevel_harden_normals(BevelParams *bp, BMesh *bm) int cd_clnors_offset = CustomData_get_offset(&bm->ldata, CD_CUSTOMLOOPNORMAL); - /* If there is not already a custom split normal layer then making one (with BM_lnorspace_update) - * will not respect the autosmooth angle between smooth faces. To get that to happen, we have - * to mark the sharpen the edges that are only sharp because of the angle test -- otherwise would - * be smooth. */ + /* If there is not already a custom split normal layer then making one + * (with #BM_lnorspace_update) will not respect the auto-smooth angle between smooth faces. + * To get that to happen, we have to mark the sharpen the edges that are only sharp because + * of the angle test -- otherwise would be smooth. */ if (cd_clnors_offset == -1) { BM_edges_sharp_from_angle_set(bm, bp->smoothresh); bevel_edges_sharp_boundary(bm, bp); } - /* Ensure that bm->lnor_spacearr has properly stored loop normals. + /* Ensure that `bm->lnor_spacearr` has properly stored loop normals. * Side effect: ensures loop indices. */ BM_lnorspace_update(bm); diff --git a/source/blender/depsgraph/intern/node/deg_node_operation.h b/source/blender/depsgraph/intern/node/deg_node_operation.h index d027da8b33f..60681037b95 100644 --- a/source/blender/depsgraph/intern/node/deg_node_operation.h +++ b/source/blender/depsgraph/intern/node/deg_node_operation.h @@ -120,7 +120,7 @@ enum class OperationCode { /* Bone. ---------------------------------------------------------------- */ /* Bone local transforms - entry point */ BONE_LOCAL, - /* Pose-space conversion (includes parent + restpose, */ + /* Pose-space conversion (includes parent + rest-pose. */ BONE_POSE_PARENT, /* Constraints */ BONE_CONSTRAINTS, diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index c7cdb1176f3..e65bd206f91 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -828,7 +828,7 @@ typedef struct IdDdtTemplate { static bool id_type_can_have_drawdata(const short id_type) { /* Only some ID-blocks have this info for now */ - /* TODO: finish adding this for the other blocktypes */ + /* TODO: finish adding this for the other block-types. */ switch (id_type) { /* has DrawData */ case ID_OB: diff --git a/source/blender/editors/animation/keyframing.cc b/source/blender/editors/animation/keyframing.cc index cd52ad34cdc..b8530a89d70 100644 --- a/source/blender/editors/animation/keyframing.cc +++ b/source/blender/editors/animation/keyframing.cc @@ -856,7 +856,7 @@ enum { * This helper function determines if visual-keyframing should be used when * inserting keyframes for the given channel. As visual-keyframing only works * on Object and Pose-Channel blocks, this should only get called for those - * blocktypes, when using "standard" keying but 'Visual Keying' option in Auto-Keying + * block-types, when using "standard" keying but 'Visual Keying' option in Auto-Keying * settings is on. */ static bool visualkey_can_use(PointerRNA *ptr, PropertyRNA *prop) diff --git a/source/blender/editors/armature/armature_add.cc b/source/blender/editors/armature/armature_add.cc index 990315a51f3..770b947605b 100644 --- a/source/blender/editors/armature/armature_add.cc +++ b/source/blender/editors/armature/armature_add.cc @@ -1054,9 +1054,7 @@ static int armature_duplicate_selected_exec(bContext *C, wmOperator *op) ebone->bbone_next = ebone_iter->bbone_next->temp.ebone; } - /* Lets try to fix any constraint subtargets that might - * have been duplicated - */ + /* Lets try to fix any constraint subtargets that might have been duplicated. */ updateDuplicateSubtarget(ebone, arm->edbo, ob, false); } } @@ -1315,9 +1313,7 @@ static int armature_symmetrize_exec(bContext *C, wmOperator *op) ebone->bbone_prev_flag = ebone_iter->bbone_prev_flag; ebone->bbone_next_flag = ebone_iter->bbone_next_flag; - /* Lets try to fix any constraint subtargets that might - * have been duplicated - */ + /* Lets try to fix any constraint sub-targets that might have been duplicated. */ updateDuplicateSubtarget(ebone, arm->edbo, obedit, true); /* Try to update constraint options so that they are mirrored as well * (need to supply bone_iter as well in case we are working with existing bones) */ diff --git a/source/blender/editors/armature/armature_relations.cc b/source/blender/editors/armature/armature_relations.cc index bfa1d0d89d7..4429f166fc0 100644 --- a/source/blender/editors/armature/armature_relations.cc +++ b/source/blender/editors/armature/armature_relations.cc @@ -109,7 +109,7 @@ static void joined_armature_fix_links_constraints(Main *bmain, } } -/* userdata for joined_armature_fix_animdata_cb() */ +/** User-data for #joined_armature_fix_animdata_cb(). */ struct tJoinArmature_AdtFixData { Main *bmain; diff --git a/source/blender/editors/armature/armature_utils.cc b/source/blender/editors/armature/armature_utils.cc index b1a208b2c08..8faed298f66 100644 --- a/source/blender/editors/armature/armature_utils.cc +++ b/source/blender/editors/armature/armature_utils.cc @@ -598,8 +598,8 @@ static void armature_finalize_restpose(ListBase *bonelist, ListBase *editbonelis for (curBone = static_cast(bonelist->first); curBone; curBone = curBone->next) { /* Set bone's local head/tail. - * Note that it's important to use final parent's restpose (arm_mat) here, - * instead of setting those values from editbone's matrix (see #46010). */ + * Note that it's important to use final parent's rest-pose (arm_mat) here, + * instead of setting those values from edit-bone's matrix (see #46010). */ if (curBone->parent) { float parmat_inv[4][4]; @@ -617,7 +617,7 @@ static void armature_finalize_restpose(ListBase *bonelist, ListBase *editbonelis copy_v3_v3(curBone->tail, curBone->arm_tail); } - /* Set local matrix and arm_mat (restpose). + /* Set local matrix and arm_mat (rest-pose). * Do not recurse into children here, armature_finalize_restpose() is already recursive. */ BKE_armature_where_is_bone(curBone, curBone->parent, false); @@ -772,7 +772,7 @@ void ED_armature_from_edit(Main *bmain, bArmature *arm) } } - /* Finalize definition of restpose data (roll, bone_mat, arm_mat, head/tail...). */ + /* Finalize definition of rest-pose data (roll, bone_mat, arm_mat, head/tail...). */ armature_finalize_restpose(&arm->bonebase, arm->edbo); BKE_armature_bone_hash_make(arm); diff --git a/source/blender/editors/armature/pose_transform.cc b/source/blender/editors/armature/pose_transform.cc index c7f430bcee5..0013e063577 100644 --- a/source/blender/editors/armature/pose_transform.cc +++ b/source/blender/editors/armature/pose_transform.cc @@ -503,9 +503,10 @@ void POSE_OT_armature_apply(wmOperatorType *ot) /* -------------------------------------------------------------------- */ /** \name Apply Visual Transform Operator + * + * Set the current pose as the rest-pose. * \{ */ -/* set the current pose as the restpose */ static int pose_visual_transform_apply_exec(bContext *C, wmOperator * /*op*/) { const Scene *scene = CTX_data_scene(C); diff --git a/source/blender/editors/gpencil_legacy/gpencil_merge.c b/source/blender/editors/gpencil_legacy/gpencil_merge.c index 2fc7b9eaada..beac5513149 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_merge.c +++ b/source/blender/editors/gpencil_legacy/gpencil_merge.c @@ -377,7 +377,7 @@ static int gpencil_analyze_strokes(tGPencilPointCache *src_array, for (i = 0; i < totpoints; i++) { sort_pt = &src_array[i]; - /* avoid dups */ + /* Avoid duplicates. */ if (BLI_ghash_haskey(all_strokes, sort_pt->gps)) { continue; } diff --git a/source/blender/editors/mesh/editmesh_bevel.cc b/source/blender/editors/mesh/editmesh_bevel.cc index 54aa4a49f1e..e2d5e29f60c 100644 --- a/source/blender/editors/mesh/editmesh_bevel.cc +++ b/source/blender/editors/mesh/editmesh_bevel.cc @@ -338,7 +338,7 @@ static bool edbm_bevel_calc(wmOperator *op) Mesh *me = static_cast(obedit->data); if (harden_normals && !(me->flag & ME_AUTOSMOOTH)) { - /* harden_normals only has a visible effect if autosmooth is on, so turn it on */ + /* `harden_normals` only has a visible effect if auto-smooth is on, so turn it on. */ me->flag |= ME_AUTOSMOOTH; } @@ -446,7 +446,7 @@ static void edbm_bevel_cancel(bContext *C, wmOperator *op) edbm_bevel_exit(C, op); - /* need to force redisplay or we may still view the modified result */ + /* Need to force re-display or we may still view the modified result. */ ED_region_tag_redraw(CTX_wm_region(C)); } diff --git a/source/blender/editors/mesh/editmesh_extrude.cc b/source/blender/editors/mesh/editmesh_extrude.cc index 38ee757b0ac..72090408922 100644 --- a/source/blender/editors/mesh/editmesh_extrude.cc +++ b/source/blender/editors/mesh/editmesh_extrude.cc @@ -862,7 +862,7 @@ static int edbm_dupli_extrude_cursor_invoke(bContext *C, wmOperator *op, const w EDBM_op_callf( vc.em, op, "rotate verts=%hv cent=%v matrix=%m3", BM_ELEM_SELECT, local_center, mat); - /* also project the source, for retopo workflow */ + /* Also project the source, for retopology workflow. */ if (use_proj) { EDBM_project_snap_verts(C, depsgraph, vc.region, vc.obedit, vc.em); } diff --git a/source/blender/editors/mesh/editmesh_knife.cc b/source/blender/editors/mesh/editmesh_knife.cc index 52431a32e20..f059a1c6c1c 100644 --- a/source/blender/editors/mesh/editmesh_knife.cc +++ b/source/blender/editors/mesh/editmesh_knife.cc @@ -1679,7 +1679,7 @@ static void knife_add_to_vert_edges(KnifeTool_OpData *kcd, KnifeEdge *kfe) knife_append_list(kcd, &kfe->v2->edges, kfe); } -/* Add faces of an edge to a KnifeVert's faces list. No checks for dups. */ +/* Add faces of an edge to a KnifeVert's faces list. No checks for duplicates. */ static void knife_add_edge_faces_to_vert(KnifeTool_OpData *kcd, KnifeVert *kfv, BMEdge *e) { BMIter bmiter; diff --git a/source/blender/editors/object/object_constraint.cc b/source/blender/editors/object/object_constraint.cc index c02af0ae211..c2d36a15ba6 100644 --- a/source/blender/editors/object/object_constraint.cc +++ b/source/blender/editors/object/object_constraint.cc @@ -2423,7 +2423,7 @@ static int constraint_add_exec( int scriptint = 0; /* popup a list of usable scripts */ menustr = buildmenu_pyconstraints(bmain, nullptr, &scriptint); - /* XXX scriptint = pupmenu(menustr); */ + // scriptint = pupmenu(menustr); /* XXX */ MEM_freeN(menustr); /* only add constraint if a script was chosen */ diff --git a/source/blender/editors/object/object_ops.cc b/source/blender/editors/object/object_ops.cc index 57ff2ac823d..edab2e6429f 100644 --- a/source/blender/editors/object/object_ops.cc +++ b/source/blender/editors/object/object_ops.cc @@ -332,7 +332,7 @@ void ED_keymap_object(wmKeyConfig *keyconf) keymap = WM_keymap_ensure(keyconf, "Object Non-modal", 0, 0); /* Object Mode ---------------------------------------------------------------- */ - /* NOTE: this keymap gets disabled in non-objectmode. */ + /* NOTE: this keymap gets disabled in non-object-mode. */ keymap = WM_keymap_ensure(keyconf, "Object Mode", 0, 0); keymap->poll = object_mode_poll; } diff --git a/source/blender/editors/object/object_relations.cc b/source/blender/editors/object/object_relations.cc index 1ce387f6345..758b893e391 100644 --- a/source/blender/editors/object/object_relations.cc +++ b/source/blender/editors/object/object_relations.cc @@ -2199,8 +2199,8 @@ static void make_local_material_tag(Material *ma) ma->id.tag &= ~LIB_TAG_PRE_EXISTING; make_local_animdata_tag(BKE_animdata_from_id(&ma->id)); - /* About nodetrees: root one is made local together with material, * others we keep linked - * for now... */ + /* About node-trees: root one is made local together with material, + * others we keep linked (for now). */ } } diff --git a/source/blender/editors/object/object_shapekey.cc b/source/blender/editors/object/object_shapekey.cc index 348e162e438..7f716e0b5ea 100644 --- a/source/blender/editors/object/object_shapekey.cc +++ b/source/blender/editors/object/object_shapekey.cc @@ -161,10 +161,12 @@ static bool object_shape_key_mirror( /* half but found up odd value */ const int pntsu_half = (lt->pntsu / 2) + (lt->pntsu % 2); - /* currently editmode isn't supported by mesh so - * ignore here for now too */ - - /* if (lt->editlatt) lt = lt->editlatt->latt; */ + /* Currently edit-mode isn't supported by mesh so ignore here for now too. */ +#if 0 + if (lt->editlatt) { + lt = lt->editlatt->latt; + } +#endif for (w = 0; w < lt->pntsw; w++) { for (v = 0; v < lt->pntsv; v++) { diff --git a/source/blender/io/collada/ArmatureExporter.cpp b/source/blender/io/collada/ArmatureExporter.cpp index cd69bd7c9d7..c8405e103d4 100644 --- a/source/blender/io/collada/ArmatureExporter.cpp +++ b/source/blender/io/collada/ArmatureExporter.cpp @@ -259,7 +259,7 @@ void ArmatureExporter::add_bone_transform(Object *ob_arm, Bone *bone, COLLADASW: if (!has_restmat) { - /* Have no restpose matrix stored, try old style <= Blender 2.78 */ + /* Have no rest-pose matrix stored, try old style <= Blender 2.78. */ bc_create_restpose_mat(this->export_settings, bone, bone_rest_mat, bone->arm_mat, true); diff --git a/source/blender/makesrna/intern/rna_define.c b/source/blender/makesrna/intern/rna_define.c index 48586d83b85..2b401ec3234 100644 --- a/source/blender/makesrna/intern/rna_define.c +++ b/source/blender/makesrna/intern/rna_define.c @@ -765,7 +765,7 @@ void RNA_define_fallback_property_update(int noteflag, const char *updatefunc) void RNA_struct_free_extension(StructRNA *srna, ExtensionRNA *rna_ext) { #ifdef RNA_RUNTIME - rna_ext->free(rna_ext->data); /* decref's the PyObject that the srna owns */ + rna_ext->free(rna_ext->data); /* Decrefs the PyObject that the `srna` owns. */ RNA_struct_blender_type_set(srna, NULL); /* FIXME: this gets accessed again. */ /* NULL the srna's value so RNA_struct_free won't complain of a leak */ diff --git a/source/blender/makesrna/intern/rna_image.cc b/source/blender/makesrna/intern/rna_image.cc index 2a4e9f0ecf5..82007630081 100644 --- a/source/blender/makesrna/intern/rna_image.cc +++ b/source/blender/makesrna/intern/rna_image.cc @@ -241,7 +241,7 @@ static void rna_ImageUser_update(Main *bmain, Scene *scene, PointerRNA *ptr) if (id) { if (GS(id->name) == ID_NT) { - /* Special update for nodetrees. */ + /* Special update for node-trees. */ BKE_ntree_update_tag_image_user_changed((bNodeTree *)id, iuser); ED_node_tree_propagate_change(nullptr, bmain, nullptr); } diff --git a/source/blender/makesrna/intern/rna_pose.cc b/source/blender/makesrna/intern/rna_pose.cc index 972b0d02f48..bcac0682cdc 100644 --- a/source/blender/makesrna/intern/rna_pose.cc +++ b/source/blender/makesrna/intern/rna_pose.cc @@ -1117,7 +1117,7 @@ static void rna_def_pose_channel(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Rotation Mode", ""); RNA_def_property_update(prop, NC_OBJECT | ND_POSE, "rna_Pose_update"); - /* Curved bones settings - Applied on top of restpose values */ + /* Curved bones settings - Applied on top of rest-pose values. */ rna_def_bone_curved_common(srna, true, false); /* Custom BBone next/prev sources */ diff --git a/source/blender/modifiers/intern/MOD_normal_edit.cc b/source/blender/modifiers/intern/MOD_normal_edit.cc index 5c68ce3b40b..8cdba660565 100644 --- a/source/blender/modifiers/intern/MOD_normal_edit.cc +++ b/source/blender/modifiers/intern/MOD_normal_edit.cc @@ -486,7 +486,7 @@ static Mesh *normalEditModifier_do(NormalEditModifierData *enmd, (enmd->mix_factor == 1.0f) && (enmd->defgrp_name[0] == '\0') && (enmd->mix_limit == float(M_PI))); - /* Do not run that modifier at all if autosmooth is disabled! */ + /* Do not run that modifier at all if auto-smooth is disabled! */ if (!is_valid_target_with_error(ctx->object, enmd) || mesh->totloop == 0) { return mesh; } diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 2086a79df9e..4c2d6e6ddf1 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -8026,7 +8026,7 @@ static int deferred_register_prop(StructRNA *srna, PyObject *key, PyObject *item Py_DECREF(args_fake); /* Free's py_srna_cobject too. */ } else { - /* _must_ print before decreffing args_fake. */ + /* _must_ print before decrefing args_fake. */ PyErr_Print(); PyErr_Clear(); diff --git a/tools/check_source/check_spelling_c_config.py b/tools/check_source/check_spelling_c_config.py index b8d15b35d8c..63374341c6c 100644 --- a/tools/check_source/check_spelling_c_config.py +++ b/tools/check_source/check_spelling_c_config.py @@ -129,6 +129,7 @@ dict_custom = { "extrema", "fallbacks", "finalizer", + "flippable", "flushable", "formatter", "formatters", @@ -265,6 +266,7 @@ dict_custom = { "recursing", "recursivity", "redefinitions", + "redisplay", "redistributions", "registerable", "reimplement", @@ -300,6 +302,7 @@ dict_custom = { "sidedness", "simplices", "situationally", + "skinnable", "skippable", "sortable", "stepsize", @@ -314,6 +317,7 @@ dict_custom = { "subrange", "subtractive", "superset", + "symmetrizable", "symmetrize", "symmetrized", "targetless", -- 2.30.2 From 40ef6c400b4bab9783097af05ac60fe62b879283 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 7 Jul 2023 15:42:07 +1000 Subject: [PATCH 029/115] Cleanup: utility function to multiple rctf/rcti --- source/blender/blenkernel/intern/camera.c | 5 +---- source/blender/blenkernel/intern/vfont.c | 6 ++---- source/blender/blenlib/BLI_rect.h | 2 ++ source/blender/blenlib/intern/rct.c | 15 +++++++++++++++ 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c index 5488ab82f15..fc62b4b9141 100644 --- a/source/blender/blenkernel/intern/camera.c +++ b/source/blender/blenkernel/intern/camera.c @@ -415,10 +415,7 @@ void BKE_camera_params_compute_viewplane( /* the window matrix is used for clipping, and not changed during OSA steps */ /* using an offset of +0.5 here would give clip errors on edges */ - viewplane.xmin *= pixsize; - viewplane.xmax *= pixsize; - viewplane.ymin *= pixsize; - viewplane.ymax *= pixsize; + BLI_rctf_mul(&viewplane, pixsize); /* Used for rendering (offset by near-clip with perspective views), passed to RE_SetPixelSize. * For viewport drawing 'RegionView3D.pixsize'. */ diff --git a/source/blender/blenkernel/intern/vfont.c b/source/blender/blenkernel/intern/vfont.c index 35cace72fea..8c98564eade 100644 --- a/source/blender/blenkernel/intern/vfont.c +++ b/source/blender/blenkernel/intern/vfont.c @@ -21,6 +21,7 @@ #include "BLI_math.h" #include "BLI_math_base_safe.h" #include "BLI_path_util.h" +#include "BLI_rect.h" #include "BLI_string.h" #include "BLI_string_utf8.h" #include "BLI_threads.h" @@ -1398,10 +1399,7 @@ static bool vfont_to_curve(Object *ob, char_idx_offset += line->char_nr + 1; } /* Move the bounds into a space compatible with `cursor_location`. */ - bounds->xmin *= font_size; - bounds->xmax *= font_size; - bounds->ymin *= font_size; - bounds->ymax *= font_size; + BLI_rctf_mul(bounds, font_size); char_beg_next = tb_bounds->char_index_last + 1; } diff --git a/source/blender/blenlib/BLI_rect.h b/source/blender/blenlib/BLI_rect.h index 8c3df200bd8..0cccdcc7905 100644 --- a/source/blender/blenlib/BLI_rect.h +++ b/source/blender/blenlib/BLI_rect.h @@ -70,6 +70,8 @@ void BLI_rctf_transform_calc_m4_pivot_min(const rctf *dst, const rctf *src, floa void BLI_rctf_translate(struct rctf *rect, float x, float y); void BLI_rcti_translate(struct rcti *rect, int x, int y); +void BLI_rctf_mul(struct rctf *rect, float factor); +void BLI_rcti_mul(struct rcti *rect, int factor); void BLI_rcti_recenter(struct rcti *rect, int x, int y); void BLI_rctf_recenter(struct rctf *rect, float x, float y); void BLI_rcti_resize(struct rcti *rect, int x, int y); diff --git a/source/blender/blenlib/intern/rct.c b/source/blender/blenlib/intern/rct.c index aef289a5718..8611b2c82ce 100644 --- a/source/blender/blenlib/intern/rct.c +++ b/source/blender/blenlib/intern/rct.c @@ -572,6 +572,21 @@ void BLI_rctf_translate(rctf *rect, float x, float y) rect->ymax += y; } +void BLI_rcti_mul(rcti *rect, const int factor) +{ + rect->xmin *= factor; + rect->ymin *= factor; + rect->xmax *= factor; + rect->ymax *= factor; +} +void BLI_rctf_mul(rctf *rect, const float factor) +{ + rect->xmin *= factor; + rect->ymin *= factor; + rect->xmax *= factor; + rect->ymax *= factor; +} + void BLI_rcti_recenter(rcti *rect, int x, int y) { const int dx = x - BLI_rcti_cent_x(rect); -- 2.30.2 From d7cfa51e49799c202120ef4aab5ef1c45cdb0835 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 7 Jul 2023 16:00:50 +1000 Subject: [PATCH 030/115] Cleanup: declare const variables --- intern/ghost/intern/GHOST_DisplayManager.cc | 8 ++++++-- source/blender/blenkernel/intern/curve_deform.c | 2 +- source/blender/blenkernel/intern/lib_query.c | 2 +- source/blender/datatoc/datatoc_icon.c | 2 +- .../blender/editors/space_sequencer/sequencer_scopes.cc | 2 +- source/blender/makesrna/intern/rna_workspace_api.cc | 2 +- source/blender/sequencer/intern/animation.c | 2 +- source/blender/sequencer/intern/sound.c | 2 +- source/blender/sequencer/intern/strip_select.c | 2 +- source/blender/sequencer/intern/strip_transform.c | 6 +++--- 10 files changed, 17 insertions(+), 13 deletions(-) diff --git a/intern/ghost/intern/GHOST_DisplayManager.cc b/intern/ghost/intern/GHOST_DisplayManager.cc index 62a6334b63c..88dd1d8c251 100644 --- a/intern/ghost/intern/GHOST_DisplayManager.cc +++ b/intern/ghost/intern/GHOST_DisplayManager.cc @@ -97,8 +97,12 @@ GHOST_TSuccess GHOST_DisplayManager::findMatch(uint8_t display, GHOST_ASSERT(m_settingsInitialized, "GHOST_DisplayManager::findMatch(): m_settingsInitialized=false"); - int criteria[4] = { - int(setting.xPixels), int(setting.yPixels), int(setting.bpp), int(setting.frequency)}; + const int criteria[4] = { + int(setting.xPixels), + int(setting.yPixels), + int(setting.bpp), + int(setting.frequency), + }; int capabilities[4]; double field, score; double best = 1e12; /* A big number. */ diff --git a/source/blender/blenkernel/intern/curve_deform.c b/source/blender/blenkernel/intern/curve_deform.c index b2e51871122..9caf079b1ed 100644 --- a/source/blender/blenkernel/intern/curve_deform.c +++ b/source/blender/blenkernel/intern/curve_deform.c @@ -62,7 +62,7 @@ static void init_curve_deform(const Object *ob_curve, const Object *ob_target, C static bool calc_curve_deform( const Object *ob_curve, float co[3], const short axis, const CurveDeform *cd, float r_quat[4]) { - Curve *cu = ob_curve->data; + const Curve *cu = ob_curve->data; float fac, loc[4], dir[3], new_quat[4], radius; short index; const bool is_neg_axis = (axis > 2); diff --git a/source/blender/blenkernel/intern/lib_query.c b/source/blender/blenkernel/intern/lib_query.c index fde97ecca5c..1e677e10942 100644 --- a/source/blender/blenkernel/intern/lib_query.c +++ b/source/blender/blenkernel/intern/lib_query.c @@ -722,7 +722,7 @@ static bool lib_query_unused_ids_tag_recurse(Main *bmain, if (ELEM(GS(id->name), ID_IM)) { /* Images which have a 'viewer' source (e.g. render results) should not be considered as * orphaned/unused data. */ - Image *image = (Image *)id; + const Image *image = (Image *)id; if (image->source == IMA_SRC_VIEWER) { id_relations->tags |= MAINIDRELATIONS_ENTRY_TAGS_PROCESSED; return false; diff --git a/source/blender/datatoc/datatoc_icon.c b/source/blender/datatoc/datatoc_icon.c index 74c076f0604..969aac59825 100644 --- a/source/blender/datatoc/datatoc_icon.c +++ b/source/blender/datatoc/datatoc_icon.c @@ -345,7 +345,7 @@ static bool icon_merge(struct IconMergeContext *context, return false; } - struct IconInfo *read_icon_info = icon_merge_context_info_for_icon_head(context, &head); + const struct IconInfo *read_icon_info = icon_merge_context_info_for_icon_head(context, &head); if (read_icon_info != NULL) { printf( "Conflicting icon files %s and %s\n", path_basename(file_src), read_icon_info->file_name); diff --git a/source/blender/editors/space_sequencer/sequencer_scopes.cc b/source/blender/editors/space_sequencer/sequencer_scopes.cc index 0b19188302c..7087f7c1c20 100644 --- a/source/blender/editors/space_sequencer/sequencer_scopes.cc +++ b/source/blender/editors/space_sequencer/sequencer_scopes.cc @@ -429,7 +429,7 @@ static void make_histogram_view_from_ibuf_byte_fn(void *__restrict userdata, const int y, const TaskParallelTLS *__restrict tls) { - MakeHistogramViewData *data = static_cast(userdata); + const MakeHistogramViewData *data = static_cast(userdata); const ImBuf *ibuf = data->ibuf; const uchar *src = ibuf->byte_buffer.data; diff --git a/source/blender/makesrna/intern/rna_workspace_api.cc b/source/blender/makesrna/intern/rna_workspace_api.cc index 9bf7fd38707..f3ab52ffdf8 100644 --- a/source/blender/makesrna/intern/rna_workspace_api.cc +++ b/source/blender/makesrna/intern/rna_workspace_api.cc @@ -122,7 +122,7 @@ void RNA_api_workspace_tool(StructRNA *srna) PropertyRNA *parm; FunctionRNA *func; - static EnumPropertyItem options_items[] = { + static const EnumPropertyItem options_items[] = { {TOOLREF_FLAG_FALLBACK_KEYMAP, "KEYMAP_FALLBACK", 0, "Fallback", ""}, {0, nullptr, 0, nullptr, nullptr}, }; diff --git a/source/blender/sequencer/intern/animation.c b/source/blender/sequencer/intern/animation.c index 141580ecc4a..1cdb187ec12 100644 --- a/source/blender/sequencer/intern/animation.c +++ b/source/blender/sequencer/intern/animation.c @@ -151,7 +151,7 @@ static void seq_animation_duplicate(Scene *scene, Sequence *seq, ListBase *dst, return; } - GSET_FOREACH_BEGIN (FCurve *, fcu, fcurves) { + GSET_FOREACH_BEGIN (const FCurve *, fcu, fcurves) { FCurve *fcu_cpy = BKE_fcurve_copy(fcu); BLI_addtail(dst, fcu_cpy); } diff --git a/source/blender/sequencer/intern/sound.c b/source/blender/sequencer/intern/sound.c index 54a440f1c4e..cc42aa1eb40 100644 --- a/source/blender/sequencer/intern/sound.c +++ b/source/blender/sequencer/intern/sound.c @@ -139,7 +139,7 @@ void SEQ_sound_update(Scene *scene, bSound *sound) float SEQ_sound_pitch_get(const Scene *scene, const Sequence *seq) { - Sequence *meta_parent = seq_sequence_lookup_meta_by_seq(scene, seq); + const Sequence *meta_parent = seq_sequence_lookup_meta_by_seq(scene, seq); if (meta_parent != NULL) { return seq->speed_factor * SEQ_sound_pitch_get(scene, meta_parent); } diff --git a/source/blender/sequencer/intern/strip_select.c b/source/blender/sequencer/intern/strip_select.c index c1a88e4bc46..4a610cedc39 100644 --- a/source/blender/sequencer/intern/strip_select.c +++ b/source/blender/sequencer/intern/strip_select.c @@ -18,7 +18,7 @@ Sequence *SEQ_select_active_get(Scene *scene) { - Editing *ed = SEQ_editing_get(scene); + const Editing *ed = SEQ_editing_get(scene); if (ed == NULL) { return NULL; diff --git a/source/blender/sequencer/intern/strip_transform.c b/source/blender/sequencer/intern/strip_transform.c index 4e96719992d..8131834283d 100644 --- a/source/blender/sequencer/intern/strip_transform.c +++ b/source/blender/sequencer/intern/strip_transform.c @@ -613,7 +613,7 @@ void SEQ_transform_offset_after_frame(Scene *scene, bool SEQ_transform_is_locked(ListBase *channels, Sequence *seq) { - SeqTimelineChannel *channel = SEQ_channel_get_by_index(channels, seq->machine); + const SeqTimelineChannel *channel = SEQ_channel_get_by_index(channels, seq->machine); return seq->flag & SEQ_LOCK || (SEQ_channel_is_locked(channel) && ((seq->flag & SEQ_IGNORE_CHANNEL_LOCK) == 0)); } @@ -636,7 +636,7 @@ void SEQ_image_transform_origin_offset_pixelspace_get(const Scene *scene, float r_origin[2]) { float image_size[2]; - StripElem *strip_elem = seq->strip->stripdata; + const StripElem *strip_elem = seq->strip->stripdata; if (strip_elem == NULL) { image_size[0] = scene->r.xsch; image_size[1] = scene->r.ysch; @@ -663,7 +663,7 @@ static void seq_image_transform_quad_get_ex(const Scene *scene, float r_quad[4][2]) { StripTransform *transform = seq->strip->transform; - StripCrop *crop = seq->strip->crop; + const StripCrop *crop = seq->strip->crop; int image_size[2] = {scene->r.xsch, scene->r.ysch}; if (ELEM(seq->type, SEQ_TYPE_MOVIE, SEQ_TYPE_IMAGE)) { -- 2.30.2 From 915929e42fa6afeb0bd63aba4f3e711445f1a60c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 7 Jul 2023 16:03:47 +1000 Subject: [PATCH 031/115] Cleanup: remove unused ParticlePathModifier struct --- source/blender/blenkernel/intern/particle_child.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/source/blender/blenkernel/intern/particle_child.c b/source/blender/blenkernel/intern/particle_child.c index 714e76b1c94..935bd22aa24 100644 --- a/source/blender/blenkernel/intern/particle_child.c +++ b/source/blender/blenkernel/intern/particle_child.c @@ -55,12 +55,6 @@ static void psys_path_iter_get(ParticlePathIterator *iter, } } -typedef struct ParticlePathModifier { - struct ParticlePathModifier *next, *prev; - - void (*apply)(ParticleCacheKey *keys, int totkeys, ParticleCacheKey *parent_keys); -} ParticlePathModifier; - /* ------------------------------------------------------------------------- */ static void do_kink_spiral_deform(ParticleKey *state, @@ -303,13 +297,11 @@ void psys_apply_child_modifiers(ParticleThreadContext *ctx, const bool draw_col_ma = (part->draw_col == PART_DRAW_COL_MAT); const bool use_length_check = !ELEM(part->kink, PART_KINK_SPIRAL); - // ParticlePathModifier *mod; ParticleCacheKey *key; int totkeys, k; float max_length; - /* TODO: for the future: use true particle modifiers that work on the whole curve. - * `modifiers` & `mod` are unused. */ + /* TODO: for the future: use true particle modifiers that work on the whole curve. */ if (part->kink == PART_KINK_SPIRAL) { do_kink_spiral( -- 2.30.2 From d0a9595c0da71a682f39f2e4a5c0999b4d7a46a2 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 7 Jul 2023 16:27:02 +1000 Subject: [PATCH 032/115] Cleanup: move BLI_vfont to C++ --- source/blender/blenkernel/CMakeLists.txt | 6 +- .../blenkernel/intern/{vfont.c => vfont.cc} | 322 +++++++++--------- ...tdata_freetype.c => vfontdata_freetype.cc} | 48 +-- 3 files changed, 189 insertions(+), 187 deletions(-) rename source/blender/blenkernel/intern/{vfont.c => vfont.cc} (87%) rename source/blender/blenkernel/intern/{vfontdata_freetype.c => vfontdata_freetype.cc} (93%) diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index 7a7d57a24d5..f6538f46542 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -47,7 +47,7 @@ set(INC set(INC_SYS ${ZLIB_INCLUDE_DIRS} - # For `vfontdata_freetype.c`. + # For `vfontdata_freetype.cc`. ${FREETYPE_INCLUDE_DIRS} ) @@ -306,8 +306,8 @@ set(SRC intern/type_conversions.cc intern/undo_system.cc intern/unit.c - intern/vfont.c - intern/vfontdata_freetype.c + intern/vfont.cc + intern/vfontdata_freetype.cc intern/viewer_path.cc intern/volume.cc intern/volume_render.cc diff --git a/source/blender/blenkernel/intern/vfont.c b/source/blender/blenkernel/intern/vfont.cc similarity index 87% rename from source/blender/blenkernel/intern/vfont.c rename to source/blender/blenkernel/intern/vfont.cc index 8c98564eade..ae6a6305beb 100644 --- a/source/blender/blenkernel/intern/vfont.c +++ b/source/blender/blenkernel/intern/vfont.cc @@ -76,10 +76,7 @@ static void vfont_init_data(ID *id) } } -static void vfont_copy_data(Main *UNUSED(bmain), - ID *id_dst, - const ID *UNUSED(id_src), - const int flag) +static void vfont_copy_data(Main * /*bmain*/, ID *id_dst, const ID * /*id_src*/, const int flag) { VFont *vfont_dst = (VFont *)id_dst; @@ -87,7 +84,7 @@ static void vfont_copy_data(Main *UNUSED(bmain), const int flag_subdata = flag | LIB_ID_CREATE_NO_USER_REFCOUNT; /* Just to be sure, should not have any value actually after reading time. */ - vfont_dst->temp_pf = NULL; + vfont_dst->temp_pf = nullptr; if (vfont_dst->packedfile) { vfont_dst->packedfile = BKE_packedfile_duplicate(vfont_dst->packedfile); @@ -106,7 +103,7 @@ static void vfont_free_data(ID *id) if (vfont->packedfile) { BKE_packedfile_free(vfont->packedfile); - vfont->packedfile = NULL; + vfont->packedfile = nullptr; } } @@ -114,7 +111,8 @@ static void vfont_foreach_path(ID *id, BPathForeachPathData *bpath_data) { VFont *vfont = (VFont *)id; - if (vfont->packedfile != NULL && (bpath_data->flag & BKE_BPATH_FOREACH_PATH_SKIP_PACKED) != 0) { + if ((vfont->packedfile != nullptr) && + (bpath_data->flag & BKE_BPATH_FOREACH_PATH_SKIP_PACKED) != 0) { return; } @@ -131,12 +129,12 @@ static void vfont_blend_write(BlendWriter *writer, ID *id, const void *id_addres const bool is_undo = BLO_write_is_undo(writer); /* Clean up, important in undo case to reduce false detection of changed datablocks. */ - vf->data = NULL; - vf->temp_pf = NULL; + vf->data = nullptr; + vf->temp_pf = nullptr; /* Do not store packed files in case this is a library override ID. */ if (ID_IS_OVERRIDE_LIBRARY(vf) && !is_undo) { - vf->packedfile = NULL; + vf->packedfile = nullptr; } /* write LibData */ @@ -150,39 +148,39 @@ static void vfont_blend_write(BlendWriter *writer, ID *id, const void *id_addres static void vfont_blend_read_data(BlendDataReader *reader, ID *id) { VFont *vf = (VFont *)id; - vf->data = NULL; - vf->temp_pf = NULL; + vf->data = nullptr; + vf->temp_pf = nullptr; BKE_packedfile_blend_read(reader, &vf->packedfile); } IDTypeInfo IDType_ID_VF = { - .id_code = ID_VF, - .id_filter = FILTER_ID_VF, - .main_listbase_index = INDEX_ID_VF, - .struct_size = sizeof(VFont), - .name = "Font", - .name_plural = "fonts", - .translation_context = BLT_I18NCONTEXT_ID_VFONT, - .flags = IDTYPE_FLAGS_NO_ANIMDATA | IDTYPE_FLAGS_APPEND_IS_REUSABLE, - .asset_type_info = NULL, + /*id_code*/ ID_VF, + /*id_filter*/ FILTER_ID_VF, + /*main_listbase_index*/ INDEX_ID_VF, + /*struct_size*/ sizeof(VFont), + /*name*/ "Font", + /*name_plural*/ "fonts", + /*translation_context*/ BLT_I18NCONTEXT_ID_VFONT, + /*flags*/ IDTYPE_FLAGS_NO_ANIMDATA | IDTYPE_FLAGS_APPEND_IS_REUSABLE, + /*asset_type_info*/ nullptr, - .init_data = vfont_init_data, - .copy_data = vfont_copy_data, - .free_data = vfont_free_data, - .make_local = NULL, - .foreach_id = NULL, - .foreach_cache = NULL, - .foreach_path = vfont_foreach_path, - .owner_pointer_get = NULL, + /*init_data*/ vfont_init_data, + /*copy_data*/ vfont_copy_data, + /*free_data*/ vfont_free_data, + /*make_local*/ nullptr, + /*foreach_id*/ nullptr, + /*foreach_cache*/ nullptr, + /*foreach_path*/ vfont_foreach_path, + /*owner_pointer_get*/ nullptr, - .blend_write = vfont_blend_write, - .blend_read_data = vfont_blend_read_data, - .blend_read_lib = NULL, - .blend_read_expand = NULL, + /*blend_write*/ vfont_blend_write, + /*blend_read_data*/ vfont_blend_read_data, + /*blend_read_lib*/ nullptr, + /*blend_read_expand*/ nullptr, - .blend_read_undo_preserve = NULL, + /*blend_read_undo_preserve*/ nullptr, - .lib_override_apply_post = NULL, + /*lib_override_apply_post*/ nullptr, }; /***************************** VFont *******************************/ @@ -193,10 +191,10 @@ void BKE_vfont_free_data(VFont *vfont) if (vfont->data->characters) { GHashIterator gh_iter; GHASH_ITER (gh_iter, vfont->data->characters) { - VChar *che = BLI_ghashIterator_getValue(&gh_iter); + VChar *che = static_cast(BLI_ghashIterator_getValue(&gh_iter)); while (che->nurbsbase.first) { - Nurb *nu = che->nurbsbase.first; + Nurb *nu = static_cast(che->nurbsbase.first); if (nu->bezt) { MEM_freeN(nu->bezt); } @@ -206,20 +204,20 @@ void BKE_vfont_free_data(VFont *vfont) MEM_freeN(che); } - BLI_ghash_free(vfont->data->characters, NULL, NULL); + BLI_ghash_free(vfont->data->characters, nullptr, nullptr); } MEM_freeN(vfont->data); - vfont->data = NULL; + vfont->data = nullptr; } if (vfont->temp_pf) { - BKE_packedfile_free(vfont->temp_pf); /* NULL when the font file can't be found on disk */ - vfont->temp_pf = NULL; + BKE_packedfile_free(vfont->temp_pf); /* Null when the font file can't be found on disk. */ + vfont->temp_pf = nullptr; } } -static const void *builtin_font_data = NULL; +static const void *builtin_font_data = nullptr; static int builtin_font_size = 0; bool BKE_vfont_is_builtin(const VFont *vfont) @@ -238,7 +236,7 @@ static PackedFile *get_builtin_packedfile(void) if (!builtin_font_data) { CLOG_ERROR(&LOG, "Internal error, builtin font not loaded"); - return NULL; + return nullptr; } void *mem = MEM_mallocN(builtin_font_size, "vfd_builtin"); @@ -250,8 +248,8 @@ static PackedFile *get_builtin_packedfile(void) static VFontData *vfont_get_data(VFont *vfont) { - if (vfont == NULL) { - return NULL; + if (vfont == nullptr) { + return nullptr; } /* And then set the data */ @@ -278,16 +276,16 @@ static VFontData *vfont_get_data(VFont *vfont) pf = vfont->packedfile; /* We need to copy a tmp font to memory unless it is already there */ - if (vfont->temp_pf == NULL) { + if (vfont->temp_pf == nullptr) { vfont->temp_pf = BKE_packedfile_duplicate(pf); } } else { - pf = BKE_packedfile_new(NULL, vfont->filepath, ID_BLEND_PATH_FROM_GLOBAL(&vfont->id)); + pf = BKE_packedfile_new(nullptr, vfont->filepath, ID_BLEND_PATH_FROM_GLOBAL(&vfont->id)); - if (vfont->temp_pf == NULL) { + if (vfont->temp_pf == nullptr) { vfont->temp_pf = BKE_packedfile_new( - NULL, vfont->filepath, ID_BLEND_PATH_FROM_GLOBAL(&vfont->id)); + nullptr, vfont->filepath, ID_BLEND_PATH_FROM_GLOBAL(&vfont->id)); } } if (!pf) { @@ -318,7 +316,7 @@ static VFontData *vfont_get_data(VFont *vfont) VFont *BKE_vfont_load(Main *bmain, const char *filepath) { char filename[FILE_MAXFILE]; - VFont *vfont = NULL; + VFont *vfont = nullptr; PackedFile *pf; bool is_builtin; @@ -330,7 +328,7 @@ VFont *BKE_vfont_load(Main *bmain, const char *filepath) } else { BLI_path_split_file_part(filepath, filename, sizeof(filename)); - pf = BKE_packedfile_new(NULL, filepath, BKE_main_blendfile_path(bmain)); + pf = BKE_packedfile_new(nullptr, filepath, BKE_main_blendfile_path(bmain)); is_builtin = false; } @@ -341,7 +339,8 @@ VFont *BKE_vfont_load(Main *bmain, const char *filepath) vfd = BKE_vfontdata_from_freetypefont(pf); if (vfd) { /* If there's a font name, use it for the ID name. */ - vfont = BKE_libblock_alloc(bmain, ID_VF, vfd->name[0] ? vfd->name : filename, 0); + vfont = static_cast( + BKE_libblock_alloc(bmain, ID_VF, vfd->name[0] ? vfd->name : filename, 0)); vfont->data = vfd; STRNCPY(vfont->filepath, filepath); @@ -352,7 +351,7 @@ VFont *BKE_vfont_load(Main *bmain, const char *filepath) /* Do not add #FO_BUILTIN_NAME to temporary list-base. */ if (!STREQ(filename, FO_BUILTIN_NAME)) { - vfont->temp_pf = BKE_packedfile_new(NULL, filepath, BKE_main_blendfile_path(bmain)); + vfont->temp_pf = BKE_packedfile_new(nullptr, filepath, BKE_main_blendfile_path(bmain)); } } @@ -367,14 +366,13 @@ VFont *BKE_vfont_load(Main *bmain, const char *filepath) VFont *BKE_vfont_load_exists_ex(Main *bmain, const char *filepath, bool *r_exists) { - VFont *vfont; char filepath_abs[FILE_MAX], filepath_test[FILE_MAX]; STRNCPY(filepath_abs, filepath); BLI_path_abs(filepath_abs, BKE_main_blendfile_path(bmain)); /* first search an identical filepath */ - for (vfont = bmain->fonts.first; vfont; vfont = vfont->id.next) { + LISTBASE_FOREACH (VFont *, vfont, &bmain->fonts) { STRNCPY(filepath_test, vfont->filepath); BLI_path_abs(filepath_test, ID_BLEND_PATH(bmain, &vfont->id)); @@ -395,7 +393,7 @@ VFont *BKE_vfont_load_exists_ex(Main *bmain, const char *filepath, bool *r_exist VFont *BKE_vfont_load_exists(Main *bmain, const char *filepath) { - return BKE_vfont_load_exists_ex(bmain, filepath, NULL); + return BKE_vfont_load_exists_ex(bmain, filepath, nullptr); } static VFont *which_vfont(Curve *cu, CharInfo *info) @@ -414,9 +412,7 @@ static VFont *which_vfont(Curve *cu, CharInfo *info) VFont *BKE_vfont_builtin_get(void) { - VFont *vfont; - - for (vfont = G_MAIN->fonts.first; vfont; vfont = vfont->id.next) { + LISTBASE_FOREACH (VFont *, vfont, &G_MAIN->fonts) { if (BKE_vfont_is_builtin(vfont)) { return vfont; } @@ -424,7 +420,7 @@ VFont *BKE_vfont_builtin_get(void) /* Newly loaded ID's have a user by default, in this case the caller is responsible * for assigning a user, otherwise an additional user would be added, see: #100819. */ - vfont = BKE_vfont_load(G_MAIN, FO_BUILTIN_NAME); + VFont *vfont = BKE_vfont_load(G_MAIN, FO_BUILTIN_NAME); id_us_min(&vfont->id); BLI_assert(vfont->id.us == 0); return vfont; @@ -432,7 +428,7 @@ VFont *BKE_vfont_builtin_get(void) static VChar *find_vfont_char(VFontData *vfd, uint character) { - return BLI_ghash_lookup(vfd->characters, POINTER_FROM_UINT(character)); + return static_cast(BLI_ghash_lookup(vfd->characters, POINTER_FROM_UINT(character))); } static void build_underline(Curve *cu, @@ -449,8 +445,8 @@ static void build_underline(Curve *cu, nu2 = (Nurb *)MEM_callocN(sizeof(Nurb), "underline_nurb"); nu2->resolu = cu->resolu; - nu2->bezt = NULL; - nu2->knotsu = nu2->knotsv = NULL; + nu2->bezt = nullptr; + nu2->knotsu = nu2->knotsv = nullptr; nu2->charidx = charidx + 1000; if (mat_nr > 0) { nu2->mat_nr = mat_nr - 1; @@ -522,9 +518,9 @@ void BKE_vfont_build_char(Curve *cu, VChar *che = find_vfont_char(vfd, character); /* Select the glyph data */ - Nurb *nu1 = NULL; + Nurb *nu1 = nullptr; if (che) { - nu1 = che->nurbsbase.first; + nu1 = static_cast(che->nurbsbase.first); } /* Create the character */ @@ -532,13 +528,13 @@ void BKE_vfont_build_char(Curve *cu, BezTriple *bezt1 = nu1->bezt; if (bezt1) { Nurb *nu2 = (Nurb *)MEM_mallocN(sizeof(Nurb), "duplichar_nurb"); - if (nu2 == NULL) { + if (nu2 == nullptr) { break; } - memcpy(nu2, nu1, sizeof(Nurb)); + *nu2 = blender::dna::shallow_copy(*nu1); nu2->resolu = cu->resolu; - nu2->bp = NULL; - nu2->knotsu = nu2->knotsv = NULL; + nu2->bp = nullptr; + nu2->knotsu = nu2->knotsv = nullptr; nu2->flag = CU_SMOOTH; nu2->charidx = charidx; if (info->mat_nr > 0) { @@ -547,12 +543,12 @@ void BKE_vfont_build_char(Curve *cu, else { nu2->mat_nr = 0; } - /* nu2->trim.first = 0; */ - /* nu2->trim.last = 0; */ + // nu2->trim.first = 0; + // nu2->trim.last = 0; int u = nu2->pntsu; BezTriple *bezt2 = (BezTriple *)MEM_malloc_arrayN(u, sizeof(BezTriple), "duplichar_bezt2"); - if (bezt2 == NULL) { + if (bezt2 == nullptr) { MEM_freeN(nu2); break; } @@ -624,11 +620,11 @@ void BKE_vfont_build_char(Curve *cu, int BKE_vfont_select_get(Object *ob, int *r_start, int *r_end) { - Curve *cu = ob->data; + Curve *cu = static_cast(ob->data); EditFont *ef = cu->editfont; int start, end, direction; - if ((ob->type != OB_FONT) || (ef == NULL)) { + if ((ob->type != OB_FONT) || (ef == nullptr)) { return 0; } @@ -664,7 +660,7 @@ int BKE_vfont_select_get(Object *ob, int *r_start, int *r_end) void BKE_vfont_select_clamp(Object *ob) { - Curve *cu = ob->data; + Curve *cu = static_cast(ob->data); EditFont *ef = cu->editfont; BLI_assert((ob->type == OB_FONT) && ef); @@ -677,7 +673,7 @@ void BKE_vfont_select_clamp(Object *ob) static float char_width(Curve *cu, VChar *che, CharInfo *info) { /* The character wasn't found, probably ascii = 0, then the width shall be 0 as well */ - if (che == NULL) { + if (che == nullptr) { return 0.0f; } if (info->flag & CU_CHINFO_SMALLCAPS_CHECK) { @@ -819,14 +815,14 @@ static bool vfont_to_curve(Object *ob, struct CharTrans **r_chartransdata) { EditFont *ef = cu->editfont; - EditFontSelBox *selboxes = NULL; + EditFontSelBox *selboxes = nullptr; VFont *vfont, *oldvfont; - VFontData *vfd = NULL; - CharInfo *info = NULL, *custrinfo; + VFontData *vfd = nullptr; + CharInfo *info = nullptr, *custrinfo; TextBox tb_scale; bool use_textbox; VChar *che; - struct CharTrans *chartransdata = NULL, *ct; + CharTrans *chartransdata = nullptr, *ct; struct TempLineInfo *lineinfo; float xof, yof, xtrax, linedist; float twidth = 0, maxlen = 0; @@ -834,7 +830,7 @@ static bool vfont_to_curve(Object *ob, int curbox; int selstart = 0, selend = 0; int cnr = 0, lnr = 0, wsnr = 0; - const char32_t *mem = NULL; + const char32_t *mem = nullptr; char32_t ascii; bool ok = false; const float font_size = cu->fsize * iter_data->scale_to_fit; @@ -850,8 +846,8 @@ static bool vfont_to_curve(Object *ob, /* Text at the beginning of the last used text-box (use for y-axis alignment). * We over-allocate by one to simplify logic of getting last char. */ - int *i_textbox_array = MEM_callocN(sizeof(*i_textbox_array) * (cu->totbox + 1), - "TextBox initial char index"); + int *i_textbox_array = static_cast( + MEM_callocN(sizeof(*i_textbox_array) * (cu->totbox + 1), "TextBox initial char index")); #define MARGIN_X_MIN (xof_scale + tb_scale.x) #define MARGIN_Y_MIN (yof_scale + tb_scale.y) @@ -859,15 +855,15 @@ static bool vfont_to_curve(Object *ob, /* NOTE: do calculations including the trailing '\0' of a string * because the cursor can be at that location. */ - BLI_assert(ob == NULL || ob->type == OB_FONT); + BLI_assert(ob == nullptr || ob->type == OB_FONT); /* Set font data */ vfont = cu->vfont; - if (cu->str == NULL) { + if (cu->str == nullptr) { return ok; } - if (vfont == NULL) { + if (vfont == nullptr) { return ok; } @@ -888,15 +884,17 @@ static bool vfont_to_curve(Object *ob, slen = cu->len_char32; /* Create unicode string */ - mem_tmp = MEM_malloc_arrayN((slen + 1), sizeof(*mem_tmp), "convertedmem"); + mem_tmp = static_cast( + MEM_malloc_arrayN((slen + 1), sizeof(*mem_tmp), "convertedmem")); if (!mem_tmp) { return ok; } BLI_str_utf8_as_utf32(mem_tmp, cu->str, slen + 1); - if (cu->strinfo == NULL) { /* old file */ - cu->strinfo = MEM_calloc_arrayN((slen + 4), sizeof(CharInfo), "strinfo compat"); + if (cu->strinfo == nullptr) { /* old file */ + cu->strinfo = static_cast( + MEM_calloc_arrayN((slen + 4), sizeof(CharInfo), "strinfo compat")); } custrinfo = cu->strinfo; if (!custrinfo) { @@ -906,32 +904,36 @@ static bool vfont_to_curve(Object *ob, mem = mem_tmp; } - if (cu->tb == NULL) { - cu->tb = MEM_calloc_arrayN(MAXTEXTBOX, sizeof(TextBox), "TextBox compat"); + if (cu->tb == nullptr) { + cu->tb = static_cast( + MEM_calloc_arrayN(MAXTEXTBOX, sizeof(TextBox), "TextBox compat")); } - if (ef != NULL && ob != NULL) { + if (ef != nullptr && ob != nullptr) { if (ef->selboxes) { MEM_freeN(ef->selboxes); } if (BKE_vfont_select_get(ob, &selstart, &selend)) { ef->selboxes_len = (selend - selstart) + 1; - ef->selboxes = MEM_calloc_arrayN(ef->selboxes_len, sizeof(EditFontSelBox), "font selboxes"); + ef->selboxes = static_cast( + MEM_calloc_arrayN(ef->selboxes_len, sizeof(EditFontSelBox), "font selboxes")); } else { ef->selboxes_len = 0; - ef->selboxes = NULL; + ef->selboxes = nullptr; } selboxes = ef->selboxes; } /* calc offset and rotation of each char */ - ct = chartransdata = MEM_calloc_arrayN((slen + 1), sizeof(struct CharTrans), "buildtext"); + ct = chartransdata = static_cast( + MEM_calloc_arrayN((slen + 1), sizeof(CharTrans), "buildtext")); /* We assume the worst case: 1 character per line (is freed at end anyway) */ - lineinfo = MEM_malloc_arrayN((slen * 2 + 1), sizeof(*lineinfo), "lineinfo"); + lineinfo = static_cast( + MEM_malloc_arrayN((slen * 2 + 1), sizeof(*lineinfo), "lineinfo")); linedist = cu->linedist; @@ -944,17 +946,17 @@ static bool vfont_to_curve(Object *ob, xtrax = 0.5f * cu->spacing - 0.5f; - oldvfont = NULL; + oldvfont = nullptr; for (i = 0; i < slen; i++) { custrinfo[i].flag &= ~(CU_CHINFO_WRAP | CU_CHINFO_SMALLCAPS_CHECK | CU_CHINFO_OVERFLOW); } - TextBoxBounds_ForCursor *tb_bounds_for_cursor = NULL; - if (cursor_params != NULL) { - if (cu->textoncurve == NULL && (cu->totbox > 1) && (slen > 0)) { - tb_bounds_for_cursor = MEM_malloc_arrayN( - cu->totbox, sizeof(TextBoxBounds_ForCursor), "TextboxBounds_Cursor"); + TextBoxBounds_ForCursor *tb_bounds_for_cursor = nullptr; + if (cursor_params != nullptr) { + if (cu->textoncurve == nullptr && (cu->totbox > 1) && (slen > 0)) { + tb_bounds_for_cursor = static_cast( + MEM_malloc_arrayN(cu->totbox, sizeof(TextBoxBounds_ForCursor), "TextboxBounds_Cursor")); for (curbox = 0; curbox < cu->totbox; curbox++) { TextBoxBounds_ForCursor *tb_bounds = &tb_bounds_for_cursor[curbox]; tb_bounds->char_index_last = -1; @@ -981,7 +983,7 @@ static bool vfont_to_curve(Object *ob, vfont = which_vfont(cu, info); - if (vfont == NULL) { + if (vfont == nullptr) { break; } @@ -993,7 +995,7 @@ static bool vfont_to_curve(Object *ob, /* VFont Data for VFont couldn't be found */ if (!vfd) { MEM_freeN(chartransdata); - chartransdata = NULL; + chartransdata = nullptr; MEM_freeN(lineinfo); goto finally; } @@ -1006,21 +1008,21 @@ static bool vfont_to_curve(Object *ob, /* The character wasn't in the current curve base so load it. * But if the font is built-in then do not try loading since * whole font is in the memory already. */ - if (che == NULL && BKE_vfont_is_builtin(vfont) == false) { + if (che == nullptr && BKE_vfont_is_builtin(vfont) == false) { BLI_rw_mutex_lock(&vfont_rwlock, THREAD_LOCK_WRITE); /* Check it once again, char might have been already load * between previous #BLI_rw_mutex_unlock() and this #BLI_rw_mutex_lock(). * * Such a check should not be a bottleneck since it wouldn't * happen often once all the chars are load. */ - if ((che = find_vfont_char(vfd, ascii)) == NULL) { + if ((che = find_vfont_char(vfd, ascii)) == nullptr) { che = BKE_vfontdata_char_from_freetypefont(vfont, ascii); } BLI_rw_mutex_unlock(&vfont_rwlock); } } else { - che = NULL; + che = nullptr; } twidth = char_width(cu, che, info); @@ -1106,7 +1108,7 @@ static bool vfont_to_curve(Object *ob, CLAMP_MIN(maxlen, lineinfo[lnr].x_min); - if (tb_bounds_for_cursor != NULL) { + if (tb_bounds_for_cursor != nullptr) { tb_bounds_for_cursor[curbox].char_index_last = i; } @@ -1153,7 +1155,7 @@ static bool vfont_to_curve(Object *ob, xof = MARGIN_X_MIN + tabfac; } else { - EditFontSelBox *sb = NULL; + EditFontSelBox *sb = nullptr; float wsfac; ct->xof = xof; @@ -1245,7 +1247,7 @@ static bool vfont_to_curve(Object *ob, li->x_min = ((li->x_max - li->x_min) + xof_scale); if (li->char_nr > 1) { - li->x_min /= (float)(li->char_nr - 1); + li->x_min /= float(li->char_nr - 1); } } for (i = 0; i <= slen; i++) { @@ -1273,7 +1275,7 @@ static bool vfont_to_curve(Object *ob, struct TempLineInfo *li; li = &lineinfo[ct->linenr]; - curofs += ((li->x_max - li->x_min) + xof_scale) / (float)li->wspace_nr; + curofs += ((li->x_max - li->x_min) + xof_scale) / float(li->wspace_nr); } ct->xof += curofs; } @@ -1369,7 +1371,7 @@ static bool vfont_to_curve(Object *ob, } } } - if (tb_bounds_for_cursor != NULL) { + if (tb_bounds_for_cursor != nullptr) { int char_beg_next = 0; for (curbox = 0; curbox < cu->totbox; curbox++) { TextBoxBounds_ForCursor *tb_bounds = &tb_bounds_for_cursor[curbox]; @@ -1411,15 +1413,15 @@ static bool vfont_to_curve(Object *ob, /* TEXT ON CURVE */ /* NOTE: Only #OB_CURVES_LEGACY objects could have a path. */ if (cu->textoncurve && cu->textoncurve->type == OB_CURVES_LEGACY) { - BLI_assert(cu->textoncurve->runtime.curve_cache != NULL); - if (cu->textoncurve->runtime.curve_cache != NULL && - cu->textoncurve->runtime.curve_cache->anim_path_accum_length != NULL) + BLI_assert(cu->textoncurve->runtime.curve_cache != nullptr); + if (cu->textoncurve->runtime.curve_cache != nullptr && + cu->textoncurve->runtime.curve_cache->anim_path_accum_length != nullptr) { float distfac, imat[4][4], imat3[3][3], cmat[3][3]; float minx, maxx; float timeofs, sizefac; - if (ob != NULL) { + if (ob != nullptr) { invert_m4_m4(imat, ob->object_to_world); } else { @@ -1503,12 +1505,13 @@ static bool vfont_to_curve(Object *ob, /* Calculate the right loc AND the right rot separately. */ /* `vec` needs 4 items. */ - BKE_where_on_path(cu->textoncurve, ctime, vec, NULL, NULL, NULL, NULL); - BKE_where_on_path(cu->textoncurve, ctime + dtime, NULL, rotvec, NULL, NULL, NULL); + BKE_where_on_path(cu->textoncurve, ctime, vec, nullptr, nullptr, nullptr, nullptr); + BKE_where_on_path( + cu->textoncurve, ctime + dtime, nullptr, rotvec, nullptr, nullptr, nullptr); mul_v3_fl(vec, sizefac); - ct->rot = (float)M_PI - atan2f(rotvec[1], rotvec[0]); + ct->rot = float(M_PI) - atan2f(rotvec[1], rotvec[0]); si = sinf(ct->rot); co = cosf(ct->rot); @@ -1658,7 +1661,7 @@ static bool vfont_to_curve(Object *ob, if (mode == FO_SELCHANGE) { MEM_freeN(chartransdata); - chartransdata = NULL; + chartransdata = nullptr; } else if (mode == FO_EDIT) { /* Make NURBS-data. */ @@ -1666,7 +1669,7 @@ static bool vfont_to_curve(Object *ob, ct = chartransdata; for (i = 0; i < slen; i++) { - uint cha = (uint)mem[i]; + uint cha = uint(mem[i]); info = &(custrinfo[i]); if ((cu->overflow == CU_OVERFLOW_TRUNCATE) && (ob && ob->mode != OB_MODE_EDIT) && @@ -1681,7 +1684,7 @@ static bool vfont_to_curve(Object *ob, /* Only do that check in case we do have an object, otherwise all materials get erased every * time that code is called without an object. */ - if (ob != NULL && (info->mat_nr > (ob->totcol))) { + if (ob != nullptr && (info->mat_nr > (ob->totcol))) { // CLOG_ERROR( // &LOG, "Illegal material index (%d) in text object, setting to 0", info->mat_nr); info->mat_nr = 0; @@ -1826,7 +1829,7 @@ static bool vfont_to_curve(Object *ob, if (slen == 0) { cursor_params->r_string_offset = -1; } - else if (cu->textoncurve != NULL) { + else if (cu->textoncurve != nullptr) { int closest_char = -1; float closest_dist_sq = FLT_MAX; @@ -1850,7 +1853,7 @@ static bool vfont_to_curve(Object *ob, int char_beg = 0; int char_end = slen; - if (tb_bounds_for_cursor != NULL) { + if (tb_bounds_for_cursor != nullptr) { /* Search for the closest box. */ int closest_box = -1; float closest_dist_sq = FLT_MAX; @@ -1879,7 +1882,7 @@ static bool vfont_to_curve(Object *ob, char_end = tb_bounds_for_cursor[closest_box].char_index_last; } MEM_freeN(tb_bounds_for_cursor); - tb_bounds_for_cursor = NULL; /* Safety only. */ + tb_bounds_for_cursor = nullptr; /* Safety only. */ } const float interline_offset = ((linedist - 0.5f) / 2.0f) * font_size; /* Loop until find the line where `cursor_location` is over. */ @@ -1918,21 +1921,21 @@ static bool vfont_to_curve(Object *ob, cursor_params->r_string_offset = i; } /* Must be cleared & freed. */ - BLI_assert(tb_bounds_for_cursor == NULL); + BLI_assert(tb_bounds_for_cursor == nullptr); } /* Scale to fit only works for single text box layouts. */ if (ELEM(iter_data->status, VFONT_TO_CURVE_SCALE_ONCE, VFONT_TO_CURVE_BISECT)) { /* Always cleanup before going to the scale-to-fit repetition. */ - if (r_nubase != NULL) { + if (r_nubase != nullptr) { BKE_nurbList_free(r_nubase); } - if (chartransdata != NULL) { + if (chartransdata != nullptr) { MEM_freeN(chartransdata); } - if (ef == NULL) { + if (ef == nullptr) { MEM_freeN((void *)mem); } return true; @@ -1943,10 +1946,10 @@ finally: if (r_text) { *r_text = mem; *r_text_len = slen; - *r_text_free = (ef == NULL); + *r_text_free = (ef == nullptr); } else { - if (ef == NULL) { + if (ef == nullptr) { MEM_freeN((void *)mem); } } @@ -1981,17 +1984,16 @@ bool BKE_vfont_to_curve_ex(Object *ob, bool *r_text_free, struct CharTrans **r_chartransdata) { - VFontToCurveIter data = { - .iteraction = cu->totbox * FONT_TO_CURVE_SCALE_ITERATIONS, - .scale_to_fit = 1.0f, - .word_wrap = true, - .ok = true, - .status = VFONT_TO_CURVE_INIT, - }; + VFontToCurveIter data = {}; + data.iteraction = cu->totbox * FONT_TO_CURVE_SCALE_ITERATIONS; + data.scale_to_fit = 1.0f; + data.word_wrap = true; + data.ok = true; + data.status = VFONT_TO_CURVE_INIT; do { data.ok &= vfont_to_curve( - ob, cu, mode, &data, NULL, r_nubase, r_text, r_text_len, r_text_free, r_chartransdata); + ob, cu, mode, &data, nullptr, r_nubase, r_text, r_text_len, r_text_free, r_chartransdata); } while (data.ok && ELEM(data.status, VFONT_TO_CURVE_SCALE_ONCE, VFONT_TO_CURVE_BISECT)); return data.ok; @@ -2003,23 +2005,21 @@ int BKE_vfont_cursor_to_text_index(Object *ob, float cursor_location[2]) ListBase *r_nubase = &cu->nurb; /* TODO: iterating to calculate the scale can be avoided. */ + VFontToCurveIter data = {}; + data.iteraction = cu->totbox * FONT_TO_CURVE_SCALE_ITERATIONS; + data.scale_to_fit = 1.0f; + data.word_wrap = true; + data.ok = true; + data.status = VFONT_TO_CURVE_INIT; - VFontToCurveIter data = { - .iteraction = cu->totbox * FONT_TO_CURVE_SCALE_ITERATIONS, - .scale_to_fit = 1.0f, - .word_wrap = true, - .ok = true, - .status = VFONT_TO_CURVE_INIT, - }; - - VFontCursor_Params cursor_params = { - .cursor_location = {cursor_location[0], cursor_location[1]}, - .r_string_offset = -1, - }; + VFontCursor_Params cursor_params = {}; + cursor_params.cursor_location[0] = cursor_location[0]; + cursor_params.cursor_location[1] = cursor_location[1]; + cursor_params.r_string_offset = -1; do { data.ok &= vfont_to_curve( - ob, cu, FO_CURS, &data, &cursor_params, r_nubase, NULL, NULL, NULL, NULL); + ob, cu, FO_CURS, &data, &cursor_params, r_nubase, nullptr, nullptr, nullptr, nullptr); } while (data.ok && ELEM(data.status, VFONT_TO_CURVE_SCALE_ONCE, VFONT_TO_CURVE_BISECT)); return cursor_params.r_string_offset; @@ -2032,14 +2032,16 @@ bool BKE_vfont_to_curve_nubase(Object *ob, const eEditFontMode mode, ListBase *r { BLI_assert(ob->type == OB_FONT); - return BKE_vfont_to_curve_ex(ob, ob->data, mode, r_nubase, NULL, NULL, NULL, NULL); + return BKE_vfont_to_curve_ex( + ob, static_cast(ob->data), mode, r_nubase, nullptr, nullptr, nullptr, nullptr); } bool BKE_vfont_to_curve(Object *ob, const eEditFontMode mode) { - Curve *cu = ob->data; + Curve *cu = static_cast(ob->data); - return BKE_vfont_to_curve_ex(ob, ob->data, mode, &cu->nurb, NULL, NULL, NULL, NULL); + return BKE_vfont_to_curve_ex( + ob, static_cast(ob->data), mode, &cu->nurb, nullptr, nullptr, nullptr, nullptr); } /* -------------------------------------------------------------------- */ @@ -2051,7 +2053,7 @@ static struct { CharInfo *info_buffer; size_t len_utf32; size_t len_utf8; -} g_vfont_clipboard = {NULL}; +} g_vfont_clipboard = {nullptr}; void BKE_vfont_clipboard_free(void) { @@ -2069,13 +2071,13 @@ void BKE_vfont_clipboard_set(const char32_t *text_buf, const CharInfo *info_buf, /* Clean previous buffers. */ BKE_vfont_clipboard_free(); - text = MEM_malloc_arrayN((len + 1), sizeof(*text), __func__); - if (text == NULL) { + text = static_cast(MEM_malloc_arrayN((len + 1), sizeof(*text), __func__)); + if (text == nullptr) { return; } - info = MEM_malloc_arrayN(len, sizeof(CharInfo), __func__); - if (info == NULL) { + info = static_cast(MEM_malloc_arrayN(len, sizeof(CharInfo), __func__)); + if (info == nullptr) { MEM_freeN(text); return; } diff --git a/source/blender/blenkernel/intern/vfontdata_freetype.c b/source/blender/blenkernel/intern/vfontdata_freetype.cc similarity index 93% rename from source/blender/blenkernel/intern/vfontdata_freetype.c rename to source/blender/blenkernel/intern/vfontdata_freetype.cc index c97f12253db..f0d35d5801e 100644 --- a/source/blender/blenkernel/intern/vfontdata_freetype.c +++ b/source/blender/blenkernel/intern/vfontdata_freetype.cc @@ -209,7 +209,7 @@ static VChar *freetypechar_to_vchar(FT_Face face, FT_ULong charcode, const VFont { FT_UInt glyph_index = FT_Get_Char_Index(face, charcode); if (FT_Load_Glyph(face, glyph_index, FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP) != FT_Err_Ok) { - return NULL; + return nullptr; } VChar *che = (VChar *)MEM_callocN(sizeof(VChar), "objfnt_char"); @@ -223,16 +223,16 @@ static VChar *freetypechar_to_vchar(FT_Face face, FT_ULong charcode, const VFont static FT_Face vfont_face_load_from_packed_file(FT_Library library, PackedFile *pf) { - FT_Face face = NULL; - FT_New_Memory_Face(library, pf->data, pf->size, 0, &face); + FT_Face face = nullptr; + FT_New_Memory_Face(library, static_cast(pf->data), pf->size, 0, &face); if (!face) { - return NULL; + return nullptr; } /* Font must contain vectors, not bitmaps. */ if (!(face->face_flags & FT_FACE_FLAG_SCALABLE)) { FT_Done_Face(face); - return NULL; + return nullptr; } /* Select a character map. */ @@ -245,7 +245,7 @@ static FT_Face vfont_face_load_from_packed_file(FT_Library library, PackedFile * } if (err) { FT_Done_Face(face); - return NULL; + return nullptr; } /* Test that we can load glyphs from this font. */ @@ -255,7 +255,7 @@ static FT_Face vfont_face_load_from_packed_file(FT_Library library, PackedFile * FT_Load_Glyph(face, glyph_index, FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP) != FT_Err_Ok) { FT_Done_Face(face); - return NULL; + return nullptr; } return face; @@ -263,19 +263,19 @@ static FT_Face vfont_face_load_from_packed_file(FT_Library library, PackedFile * VFontData *BKE_vfontdata_from_freetypefont(PackedFile *pf) { - FT_Library library = NULL; + FT_Library library = nullptr; if (FT_Init_FreeType(&library) != FT_Err_Ok) { - return NULL; + return nullptr; } FT_Face face = vfont_face_load_from_packed_file(library, pf); if (!face) { FT_Done_FreeType(library); - return NULL; + return nullptr; } /* allocate blender font */ - VFontData *vfd = MEM_callocN(sizeof(*vfd), "FTVFontData"); + VFontData *vfd = static_cast(MEM_callocN(sizeof(*vfd), "FTVFontData")); /* Get the name. */ if (face->family_name) { @@ -290,7 +290,7 @@ VFontData *BKE_vfontdata_from_freetypefont(PackedFile *pf) if (complete_font) { /* We can get descender as well, but we simple store descender in relation to the ascender. * Also note that descender is stored as a negative number. */ - vfd->ascender = (float)face->ascender / (face->ascender - face->descender); + vfd->ascender = float(face->ascender) / (face->ascender - face->descender); } else { vfd->ascender = 0.8f; @@ -299,10 +299,10 @@ VFontData *BKE_vfontdata_from_freetypefont(PackedFile *pf) /* Adjust font size */ if (face->bbox.yMax != face->bbox.yMin) { - vfd->scale = (float)(1.0 / (double)(face->bbox.yMax - face->bbox.yMin)); + vfd->scale = float(1.0 / double(face->bbox.yMax - face->bbox.yMin)); if (complete_font) { - vfd->em_height = (float)(face->ascender - face->descender) / + vfd->em_height = float(face->ascender - face->descender) / (face->bbox.yMax - face->bbox.yMin); } } @@ -332,16 +332,16 @@ VFontData *BKE_vfontdata_from_freetypefont(PackedFile *pf) static void *vfontdata_copy_characters_value_cb(const void *src) { - return BKE_vfontdata_char_copy(src); + return BKE_vfontdata_char_copy(static_cast(src)); } -VFontData *BKE_vfontdata_copy(const VFontData *vfont_src, const int UNUSED(flag)) +VFontData *BKE_vfontdata_copy(const VFontData *vfont_src, const int /*flag*/) { - VFontData *vfont_dst = MEM_dupallocN(vfont_src); + VFontData *vfont_dst = static_cast(MEM_dupallocN(vfont_src)); - if (vfont_src->characters != NULL) { + if (vfont_src->characters != nullptr) { vfont_dst->characters = BLI_ghash_copy( - vfont_src->characters, NULL, vfontdata_copy_characters_value_cb); + vfont_src->characters, nullptr, vfontdata_copy_characters_value_cb); } return vfont_dst; @@ -350,21 +350,21 @@ VFontData *BKE_vfontdata_copy(const VFontData *vfont_src, const int UNUSED(flag) VChar *BKE_vfontdata_char_from_freetypefont(VFont *vfont, ulong character) { if (!vfont) { - return NULL; + return nullptr; } /* Init Freetype */ - FT_Library library = NULL; + FT_Library library = nullptr; FT_Error err = FT_Init_FreeType(&library); if (err) { /* XXX error("Failed to load the Freetype font library"); */ - return NULL; + return nullptr; } FT_Face face = vfont_face_load_from_packed_file(library, vfont->temp_pf); if (!face) { FT_Done_FreeType(library); - return NULL; + return nullptr; } /* Load the character */ @@ -379,7 +379,7 @@ VChar *BKE_vfontdata_char_from_freetypefont(VFont *vfont, ulong character) VChar *BKE_vfontdata_char_copy(const VChar *vchar_src) { - VChar *vchar_dst = MEM_dupallocN(vchar_src); + VChar *vchar_dst = static_cast(MEM_dupallocN(vchar_src)); BLI_listbase_clear(&vchar_dst->nurbsbase); BKE_nurbList_duplicate(&vchar_dst->nurbsbase, &vchar_src->nurbsbase); -- 2.30.2 From 91b27ab637334383b57b8829624c80e0ef0405ac Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 7 Jul 2023 13:07:15 +0200 Subject: [PATCH 033/115] Refactor: Simplify mesh edit mode modifier evaluation Instead of keeping track of a local array of positions in the modifier stack itself, use the existing edit mode SoA "edit cache" which already contains a contiguous array of positions. Combined with positions as a generic attribute, this means the state is contained just in the mesh (and the geometry set) making the code much easier to follow. To do this we make more use of the mesh wrapper system, where we can pass a `Mesh` that's actually stored with a `BMesh` and the extra cached array of positions. This also resolves some confusion-- it was weird to have the mesh wrapper system for this purpose but not use it. Since we always created a wrapped mesh in edit mode, there's no need for `MOD_deform_mesh_eval_get` at all anymore. That function was quite confusing with "eval" in its name when it really retrieved the original mesh. Many deform modifiers had placeholder edit mode evaluation functions. Since these didn't do anything and since the priority is node-based deformation now, I removed these. The case is documented more in the modifier type struct callbacks. Pull Request: https://projects.blender.org/blender/blender/pulls/108637 --- source/blender/blenkernel/BKE_DerivedMesh.h | 2 +- .../blender/blenkernel/BKE_editmesh_cache.h | 2 +- source/blender/blenkernel/BKE_mesh_wrapper.h | 20 +- source/blender/blenkernel/BKE_modifier.h | 10 +- .../blender/blenkernel/intern/DerivedMesh.cc | 180 +++++------------- .../blender/blenkernel/intern/crazyspace.cc | 7 +- source/blender/blenkernel/intern/editmesh.cc | 4 +- .../blender/blenkernel/intern/mesh_normals.cc | 9 +- .../blender/blenkernel/intern/mesh_wrapper.cc | 62 ++++-- .../blender/draw/intern/draw_manager_text.cc | 7 +- .../blender/editors/mesh/editmesh_select.cc | 6 +- .../view3d_gizmo_preselect_type.cc | 6 +- .../blender/modifiers/intern/MOD_armature.cc | 10 +- source/blender/modifiers/intern/MOD_cast.cc | 51 +---- source/blender/modifiers/intern/MOD_cloth.cc | 24 +-- .../blender/modifiers/intern/MOD_collision.cc | 30 +-- .../modifiers/intern/MOD_correctivesmooth.cc | 32 +--- source/blender/modifiers/intern/MOD_curve.cc | 14 +- .../blender/modifiers/intern/MOD_displace.cc | 31 +-- source/blender/modifiers/intern/MOD_hook.cc | 16 +- .../modifiers/intern/MOD_laplaciandeform.cc | 32 +--- .../modifiers/intern/MOD_laplaciansmooth.cc | 40 +--- .../blender/modifiers/intern/MOD_lattice.cc | 17 +- .../blender/modifiers/intern/MOD_meshcache.cc | 41 +--- .../modifiers/intern/MOD_meshdeform.cc | 32 +--- .../modifiers/intern/MOD_particlesystem.cc | 17 +- .../modifiers/intern/MOD_shrinkwrap.cc | 52 +---- .../modifiers/intern/MOD_simpledeform.cc | 42 +--- source/blender/modifiers/intern/MOD_smooth.cc | 34 +--- .../blender/modifiers/intern/MOD_surface.cc | 8 +- .../modifiers/intern/MOD_surfacedeform.cc | 43 +---- source/blender/modifiers/intern/MOD_util.cc | 32 ---- source/blender/modifiers/intern/MOD_util.hh | 8 - source/blender/modifiers/intern/MOD_warp.cc | 42 +--- source/blender/modifiers/intern/MOD_wave.cc | 52 +---- 35 files changed, 203 insertions(+), 812 deletions(-) diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index fe7130cdcb5..2b4960a49de 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -246,7 +246,7 @@ struct Mesh *editbmesh_get_eval_cage_from_orig(struct Depsgraph *depsgraph, struct Object *obedit, const struct CustomData_MeshMasks *dataMask); -float (*editbmesh_vert_coords_alloc(struct BMEditMesh *em, int *r_vert_len))[3]; +float (*editbmesh_vert_coords_alloc(struct BMEditMesh *em))[3]; bool editbmesh_modifier_is_enabled(const struct Scene *scene, const struct Object *ob, struct ModifierData *md, diff --git a/source/blender/blenkernel/BKE_editmesh_cache.h b/source/blender/blenkernel/BKE_editmesh_cache.h index 63db2b5beca..0fb2c3bd503 100644 --- a/source/blender/blenkernel/BKE_editmesh_cache.h +++ b/source/blender/blenkernel/BKE_editmesh_cache.h @@ -16,7 +16,7 @@ struct BMEditMesh; typedef struct EditMeshData { /** when set, \a vertexNos, polyNos are lazy initialized */ - const float (*vertexCos)[3]; + float (*vertexCos)[3]; /** lazy initialize (when \a vertexCos is set) */ float const (*vertexNos)[3]; diff --git a/source/blender/blenkernel/BKE_mesh_wrapper.h b/source/blender/blenkernel/BKE_mesh_wrapper.h index 76ae95285ac..ee2367b816d 100644 --- a/source/blender/blenkernel/BKE_mesh_wrapper.h +++ b/source/blender/blenkernel/BKE_mesh_wrapper.h @@ -15,11 +15,6 @@ struct Mesh; extern "C" { #endif -struct Mesh *BKE_mesh_wrapper_from_editmesh_with_coords( - struct BMEditMesh *em, - const struct CustomData_MeshMasks *cd_mask_extra, - const float (*vert_coords)[3], - const struct Mesh *me_settings); struct Mesh *BKE_mesh_wrapper_from_editmesh(struct BMEditMesh *em, const struct CustomData_MeshMasks *cd_mask_extra, const struct Mesh *me_settings); @@ -31,6 +26,21 @@ int BKE_mesh_wrapper_edge_len(const struct Mesh *me); int BKE_mesh_wrapper_loop_len(const struct Mesh *me); int BKE_mesh_wrapper_poly_len(const struct Mesh *me); +/** + * Return a contiguous array of vertex position values, if available. + * Otherwise, vertex positions are stored in BMesh vertices. + */ +const float (*BKE_mesh_wrapper_vert_coords(const struct Mesh *mesh))[3]; + + +/** + * Return a contiguous array of face normal values, if available. + * Otherwise, normals are stored in BMesh faces. + */ +const float (*BKE_mesh_wrapper_poly_normals(struct Mesh *mesh))[3]; + +void BKE_mesh_wrapper_tag_positions_changed(struct Mesh *mesh); + void BKE_mesh_wrapper_vert_coords_copy(const struct Mesh *me, float (*vert_coords)[3], int vert_coords_len); diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h index 47d8da8d193..9dff8059355 100644 --- a/source/blender/blenkernel/BKE_modifier.h +++ b/source/blender/blenkernel/BKE_modifier.h @@ -187,10 +187,9 @@ typedef struct ModifierTypeInfo { /********************* Deform modifier functions *********************/ /** - * Only for deform types, should apply the deformation - * to the given vertex array. If the deformer requires information from - * the object it can obtain it from the mesh argument if non-NULL, - * and otherwise the ob argument. + * Apply a deformation to the positions in the \a vertexCos array. If the \a mesh argument is + * non-null, if will contain proper (not wrapped) mesh data. The \a vertexCos array may or may + * not be the same as the mesh's position attribute. */ void (*deformVerts)(struct ModifierData *md, const struct ModifierEvalContext *ctx, @@ -208,7 +207,8 @@ typedef struct ModifierTypeInfo { float (*defMats)[3][3], int numVerts); /** - * Like deformVerts but called during editmode (for supporting modifiers) + * Like deformVerts but called during edit-mode if supported. The \a mesh argument might be a + * wrapper around edit BMesh data. */ void (*deformVertsEM)(struct ModifierData *md, const struct ModifierEvalContext *ctx, diff --git a/source/blender/blenkernel/intern/DerivedMesh.cc b/source/blender/blenkernel/intern/DerivedMesh.cc index 18817bdc3ab..7a9955350e1 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.cc +++ b/source/blender/blenkernel/intern/DerivedMesh.cc @@ -1053,15 +1053,13 @@ static void mesh_calc_modifiers(Depsgraph *depsgraph, } } -float (*editbmesh_vert_coords_alloc(BMEditMesh *em, int *r_vert_len))[3] +float (*editbmesh_vert_coords_alloc(BMEditMesh *em))[3] { BMIter iter; BMVert *eve; float(*cos)[3]; int i; - *r_vert_len = em->bm->totvert; - cos = (float(*)[3])MEM_malloc_arrayN(em->bm->totvert, sizeof(float[3]), "vertexcos"); BM_ITER_MESH_INDEX (eve, &iter, em->bm, BM_VERTS_OF_MESH, i) { @@ -1135,6 +1133,21 @@ static void editbmesh_calc_modifier_final_normals_or_defer( editbmesh_calc_modifier_final_normals(mesh_final, final_datamask); } +static float (*mesh_wrapper_vert_coords_ensure_for_write(Mesh *mesh))[3] +{ + switch (mesh->runtime->wrapper_type) { + case ME_WRAPPER_TYPE_BMESH: + if (mesh->runtime->edit_data->vertexCos == nullptr) { + mesh->runtime->edit_data->vertexCos = editbmesh_vert_coords_alloc(mesh->edit_mesh); + } + return mesh->runtime->edit_data->vertexCos; + case ME_WRAPPER_TYPE_MDATA: + case ME_WRAPPER_TYPE_SUBD: + return reinterpret_cast(mesh->vert_positions_for_write().data()); + } + return nullptr; +} + static void editbmesh_calc_modifiers(Depsgraph *depsgraph, const Scene *scene, Object *ob, @@ -1145,21 +1158,11 @@ static void editbmesh_calc_modifiers(Depsgraph *depsgraph, Mesh **r_final, GeometrySet **r_geometry_set) { - /* Input and final mesh. Final mesh is only created the moment the first - * constructive modifier is executed, or a deform modifier needs normals - * or certain data layers. */ Mesh *mesh_input = (Mesh *)ob->data; - Mesh *mesh_final = nullptr; Mesh *mesh_cage = nullptr; /* This geometry set contains the non-mesh data that might be generated by modifiers. */ GeometrySet geometry_set_final; - /* TODO: Remove use of `deformed_verts` in mesh modifier stack - * since mesh positions are now stored in a contiguous array. */ - float(*deformed_verts)[3] = nullptr; - int num_deformed_verts = 0; - bool isPrevDeform = false; - /* Mesh with constructive modifiers but no deformation applied. Tracked * along with final mesh if undeformed / orco coordinates are requested * for texturing. */ @@ -1189,11 +1192,11 @@ static void editbmesh_calc_modifiers(Depsgraph *depsgraph, CDMaskLink *md_datamask = datamasks; CustomData_MeshMasks append_mask = CD_MASK_BAREMESH; - /* Evaluate modifiers up to certain index to get the mesh cage. */ + Mesh *mesh_final = BKE_mesh_wrapper_from_editmesh(em_input, &final_datamask, mesh_input); + int cageIndex = BKE_modifiers_get_cage_index(scene, ob, nullptr, true); if (r_cage && cageIndex == -1) { - mesh_cage = BKE_mesh_wrapper_from_editmesh_with_coords( - em_input, &final_datamask, nullptr, mesh_input); + mesh_cage = mesh_final; } /* The mesh from edit mode should not have any original index layers already, since those @@ -1206,24 +1209,21 @@ static void editbmesh_calc_modifiers(Depsgraph *depsgraph, BKE_modifiers_clear_errors(ob); if (ob->modifier_flag & OB_MODIFIER_FLAG_ADD_REST_POSITION) { - if (mesh_final == nullptr) { - mesh_final = BKE_mesh_from_bmesh_for_eval_nomain(em_input->bm, nullptr, mesh_input); - ASSERT_IS_VALID_MESH(mesh_final); - } + BKE_mesh_wrapper_ensure_mdata(mesh_final); set_rest_position(*mesh_final); } + bool non_deform_modifier_applied = false; for (int i = 0; md; i++, md = md->next, md_datamask = md_datamask->next) { const ModifierTypeInfo *mti = BKE_modifier_get_info((ModifierType)md->type); - - if (!editbmesh_modifier_is_enabled(scene, ob, md, mesh_final != nullptr)) { + if (!editbmesh_modifier_is_enabled(scene, ob, md, non_deform_modifier_applied)) { continue; } blender::bke::ScopedModifierTimer modifier_timer{*md}; /* Add an orco mesh as layer if needed by this modifier. */ - if (mesh_final && mesh_orco && mti->requiredDataMask) { + if (mesh_orco && mti->requiredDataMask) { CustomData_MeshMasks mask = {0}; mti->requiredDataMask(md, &mask); if (mask.vmask & CD_MASK_ORCO) { @@ -1231,61 +1231,41 @@ static void editbmesh_calc_modifiers(Depsgraph *depsgraph, } } - /* How to apply modifier depends on (a) what we already have as - * a result of previous modifiers (could be a mesh or just - * deformed vertices) and (b) what type the modifier is. */ - if (mti->type == eModifierTypeType_OnlyDeform) { - /* No existing verts to deform, need to build them. */ - if (!deformed_verts) { - if (mesh_final) { - /* Deforming a derived mesh, read the vertex locations - * out of the mesh and deform them. Once done with this - * run of deformers verts will be written back. */ - deformed_verts = BKE_mesh_vert_coords_alloc(mesh_final, &num_deformed_verts); - } - else { - deformed_verts = editbmesh_vert_coords_alloc(em_input, &num_deformed_verts); - } - } - else if (isPrevDeform && mti->dependsOnNormals && mti->dependsOnNormals(md)) { - if (mesh_final == nullptr) { - mesh_final = BKE_mesh_from_bmesh_for_eval_nomain(em_input->bm, nullptr, mesh_input); - BKE_mesh_ensure_default_orig_index_customdata(mesh_final); - ASSERT_IS_VALID_MESH(mesh_final); - } - BLI_assert(deformed_verts != nullptr); - BKE_mesh_vert_coords_apply(mesh_final, deformed_verts); + if (mesh_final == mesh_cage) { + /* If the cage mesh has already been assigned, we have passed the cage index in the modifier + * list. If the cage and final meshes are still the same, duplicate the final mesh so the + * cage mesh isn't modified anymore. */ + mesh_final = BKE_mesh_copy_for_eval(mesh_final); + if (mesh_cage->edit_mesh) { + mesh_final->edit_mesh = static_cast(MEM_dupallocN(mesh_cage->edit_mesh)); + mesh_final->edit_mesh->is_shallow_copy = true; + mesh_final->runtime->is_original_bmesh = true; + BKE_mesh_runtime_ensure_edit_data(mesh_final); } + } + if (mti->type == eModifierTypeType_OnlyDeform) { if (mti->deformVertsEM) { - BKE_modifier_deform_vertsEM( - md, &mectx, em_input, mesh_final, deformed_verts, num_deformed_verts); + BKE_modifier_deform_vertsEM(md, + &mectx, + em_input, + mesh_final, + mesh_wrapper_vert_coords_ensure_for_write(mesh_final), + BKE_mesh_wrapper_vert_len(mesh_final)); + BKE_mesh_wrapper_tag_positions_changed(mesh_final); } else { - BKE_modifier_deform_verts(md, &mectx, mesh_final, deformed_verts, num_deformed_verts); + BKE_mesh_wrapper_ensure_mdata(mesh_final); + BKE_modifier_deform_verts(md, + &mectx, + mesh_final, + BKE_mesh_vert_positions_for_write(mesh_final), + mesh_final->totvert); + BKE_mesh_tag_positions_changed(mesh_final); } } else { - /* apply vertex coordinates or build a DerivedMesh as necessary */ - if (mesh_final) { - if (deformed_verts) { - Mesh *mesh_tmp = BKE_mesh_copy_for_eval(mesh_final); - if (mesh_final != mesh_cage) { - BKE_id_free(nullptr, mesh_final); - } - mesh_final = mesh_tmp; - BKE_mesh_vert_coords_apply(mesh_final, deformed_verts); - } - else if (mesh_final == mesh_cage) { - /* 'me' may be changed by this modifier, so we need to copy it. */ - mesh_final = BKE_mesh_copy_for_eval(mesh_final); - } - } - else { - mesh_final = BKE_mesh_wrapper_from_editmesh_with_coords( - em_input, nullptr, deformed_verts, mesh_input); - deformed_verts = nullptr; - } + non_deform_modifier_applied = true; /* create an orco derivedmesh in parallel */ CustomData_MeshMasks mask = md_datamask->mask; @@ -1336,77 +1316,21 @@ static void editbmesh_calc_modifiers(Depsgraph *depsgraph, ASSERT_IS_VALID_MESH(mesh_next); if (mesh_next) { - if (mesh_final && mesh_final != mesh_next) { + if (mesh_final != mesh_next) { BKE_id_free(nullptr, mesh_final); } mesh_final = mesh_next; - - if (deformed_verts) { - MEM_freeN(deformed_verts); - deformed_verts = nullptr; - } } mesh_final->runtime->deformed_only = false; } if (r_cage && i == cageIndex) { - if (mesh_final && deformed_verts) { - mesh_cage = BKE_mesh_copy_for_eval(mesh_final); - BKE_mesh_vert_coords_apply(mesh_cage, deformed_verts); - } - else if (mesh_final) { - mesh_cage = mesh_final; - } - else { - Mesh *me_orig = mesh_input; - /* Modifying the input mesh is weak, however as there can only be one object in edit mode - * even if multiple are sharing the same mesh this should be thread safe. */ - if ((me_orig->id.tag & LIB_TAG_COPIED_ON_WRITE) && (ob->mode & OB_MODE_EDIT)) { - if (!BKE_mesh_runtime_ensure_edit_data(me_orig)) { - BKE_mesh_runtime_reset_edit_data(me_orig); - } - me_orig->runtime->edit_data->vertexCos = (const float(*)[3])MEM_dupallocN( - deformed_verts); - } - mesh_cage = BKE_mesh_wrapper_from_editmesh_with_coords( - em_input, - &final_datamask, - deformed_verts ? (const float(*)[3])MEM_dupallocN(deformed_verts) : nullptr, - mesh_input); - } + mesh_cage = mesh_final; } - - isPrevDeform = (mti->type == eModifierTypeType_OnlyDeform); } BLI_linklist_free((LinkNode *)datamasks, nullptr); - /* Yay, we are done. If we have a DerivedMesh and deformed vertices need - * to apply these back onto the DerivedMesh. If we have no DerivedMesh - * then we need to build one. */ - if (mesh_final) { - if (deformed_verts) { - if (mesh_final == mesh_cage) { - mesh_final = BKE_mesh_copy_for_eval(mesh_final); - } - BKE_mesh_vert_coords_apply(mesh_final, deformed_verts); - } - } - else if (!deformed_verts && mesh_cage) { - /* cage should already have up to date normals */ - mesh_final = mesh_cage; - } - else { - /* this is just a copy of the editmesh, no need to calc normals */ - mesh_final = BKE_mesh_wrapper_from_editmesh_with_coords( - em_input, &final_datamask, deformed_verts, mesh_input); - deformed_verts = nullptr; - } - - if (deformed_verts) { - MEM_freeN(deformed_verts); - } - /* Add orco coordinates to final and deformed mesh if requested. */ if (final_datamask.vmask & CD_MASK_ORCO) { /* FIXME(@ideasman42): avoid the need to convert to mesh data just to add an orco layer. */ diff --git a/source/blender/blenkernel/intern/crazyspace.cc b/source/blender/blenkernel/intern/crazyspace.cc index 3ba3bbf4759..38f6367e7d9 100644 --- a/source/blender/blenkernel/intern/crazyspace.cc +++ b/source/blender/blenkernel/intern/crazyspace.cc @@ -247,7 +247,8 @@ int BKE_crazyspace_get_first_deform_matrices_editbmesh(Depsgraph *depsgraph, ModifierData *md; Mesh *me_input = static_cast(ob->data); Mesh *me = nullptr; - int i, a, modifiers_left_num = 0, verts_num = 0; + int i, a, modifiers_left_num = 0; + const int verts_num = em->bm->totvert; int cageIndex = BKE_modifiers_get_cage_index(scene, ob, nullptr, true); float(*defmats)[3][3] = nullptr, (*deformedVerts)[3] = nullptr; VirtualModifierData virtualModifierData; @@ -276,8 +277,8 @@ int BKE_crazyspace_get_first_deform_matrices_editbmesh(Depsgraph *depsgraph, cd_mask_extra = datamasks->mask; BLI_linklist_free((LinkNode *)datamasks, nullptr); - me = BKE_mesh_wrapper_from_editmesh_with_coords(em, &cd_mask_extra, nullptr, me_input); - deformedVerts = editbmesh_vert_coords_alloc(em, &verts_num); + me = BKE_mesh_wrapper_from_editmesh(em, &cd_mask_extra, me_input); + deformedVerts = editbmesh_vert_coords_alloc(em); defmats = static_cast( MEM_mallocN(sizeof(*defmats) * verts_num, "defmats")); diff --git a/source/blender/blenkernel/intern/editmesh.cc b/source/blender/blenkernel/intern/editmesh.cc index 7359b1394ae..bb88bcd4068 100644 --- a/source/blender/blenkernel/intern/editmesh.cc +++ b/source/blender/blenkernel/intern/editmesh.cc @@ -230,9 +230,9 @@ const float (*BKE_editmesh_vert_coords_when_deformed(Depsgraph *depsgraph, Object *object_eval = DEG_get_evaluated_object(depsgraph, ob); Mesh *editmesh_eval_final = BKE_object_get_editmesh_eval_final(object_eval); - if ((me->runtime->edit_data != nullptr) && (me->runtime->edit_data->vertexCos != nullptr)) { + if (BKE_mesh_wrapper_vert_coords(me) != nullptr) { /* Deformed, and we have deformed coords already. */ - coords = me->runtime->edit_data->vertexCos; + coords = BKE_mesh_wrapper_vert_coords(me); } else if ((editmesh_eval_final != nullptr) && (editmesh_eval_final->runtime->wrapper_type == ME_WRAPPER_TYPE_BMESH)) diff --git a/source/blender/blenkernel/intern/mesh_normals.cc b/source/blender/blenkernel/intern/mesh_normals.cc index 62129e96a6b..99880b18f63 100644 --- a/source/blender/blenkernel/intern/mesh_normals.cc +++ b/source/blender/blenkernel/intern/mesh_normals.cc @@ -366,10 +366,11 @@ void BKE_mesh_ensure_normals_for_display(Mesh *mesh) break; case ME_WRAPPER_TYPE_BMESH: { BMEditMesh *em = mesh->edit_mesh; - EditMeshData *emd = mesh->runtime->edit_data; - if (emd->vertexCos) { - BKE_editmesh_cache_ensure_vert_normals(em, emd); - BKE_editmesh_cache_ensure_poly_normals(em, emd); + if (EditMeshData *emd = mesh->runtime->edit_data) { + if (emd->vertexCos) { + BKE_editmesh_cache_ensure_vert_normals(em, emd); + BKE_editmesh_cache_ensure_poly_normals(em, emd); + } } return; } diff --git a/source/blender/blenkernel/intern/mesh_wrapper.cc b/source/blender/blenkernel/intern/mesh_wrapper.cc index 93576451095..9b99c809c45 100644 --- a/source/blender/blenkernel/intern/mesh_wrapper.cc +++ b/source/blender/blenkernel/intern/mesh_wrapper.cc @@ -34,6 +34,7 @@ #include "BLI_threads.h" #include "BLI_utildefines.h" +#include "BKE_DerivedMesh.h" #include "BKE_editmesh.h" #include "BKE_editmesh_cache.h" #include "BKE_lib_id.h" @@ -52,10 +53,9 @@ using blender::float3; using blender::Span; -Mesh *BKE_mesh_wrapper_from_editmesh_with_coords(BMEditMesh *em, - const CustomData_MeshMasks *cd_mask_extra, - const float (*vert_coords)[3], - const Mesh *me_settings) +Mesh *BKE_mesh_wrapper_from_editmesh(BMEditMesh *em, + const CustomData_MeshMasks *cd_mask_extra, + const Mesh *me_settings) { Mesh *me = static_cast(BKE_id_new_nomain(ID_ME, nullptr)); BKE_mesh_copy_parameters_for_eval(me, me_settings); @@ -85,18 +85,9 @@ Mesh *BKE_mesh_wrapper_from_editmesh_with_coords(BMEditMesh *em, me->totloop = 0; #endif - EditMeshData *edit_data = me->runtime->edit_data; - edit_data->vertexCos = vert_coords; return me; } -Mesh *BKE_mesh_wrapper_from_editmesh(BMEditMesh *em, - const CustomData_MeshMasks *cd_mask_extra, - const Mesh *me_settings) -{ - return BKE_mesh_wrapper_from_editmesh_with_coords(em, cd_mask_extra, nullptr, me_settings); -} - void BKE_mesh_wrapper_ensure_mdata(Mesh *me) { std::lock_guard lock{me->runtime->eval_mutex}; @@ -138,6 +129,8 @@ void BKE_mesh_wrapper_ensure_mdata(Mesh *me) BKE_mesh_vert_coords_apply(me, edit_data->vertexCos); me->runtime->is_original_bmesh = false; } + BKE_mesh_runtime_reset_edit_data(me); + MEM_SAFE_FREE(me->runtime->edit_data); break; } } @@ -176,6 +169,49 @@ bool BKE_mesh_wrapper_minmax(const Mesh *me, float min[3], float max[3]) /** \name Mesh Coordinate Access * \{ */ +const float (*BKE_mesh_wrapper_vert_coords(const Mesh *mesh))[3] +{ + switch (mesh->runtime->wrapper_type) { + case ME_WRAPPER_TYPE_BMESH: + return mesh->runtime->edit_data->vertexCos; + case ME_WRAPPER_TYPE_MDATA: + case ME_WRAPPER_TYPE_SUBD: + return reinterpret_cast(mesh->vert_positions().data()); + } + return nullptr; +} + + +const float (*BKE_mesh_wrapper_poly_normals(Mesh *mesh))[3] +{ + switch (mesh->runtime->wrapper_type) { + case ME_WRAPPER_TYPE_BMESH: + BKE_editmesh_cache_ensure_poly_normals(mesh->edit_mesh, mesh->runtime->edit_data); + return mesh->runtime->edit_data->polyNos; + case ME_WRAPPER_TYPE_MDATA: + case ME_WRAPPER_TYPE_SUBD: + return reinterpret_cast(mesh->poly_normals().data()); + } + return nullptr; +} + +void BKE_mesh_wrapper_tag_positions_changed(Mesh *mesh) +{ + switch (mesh->runtime->wrapper_type) { + case ME_WRAPPER_TYPE_BMESH: + if (mesh->runtime->edit_data) { + MEM_SAFE_FREE(mesh->runtime->edit_data->vertexNos); + MEM_SAFE_FREE(mesh->runtime->edit_data->polyCos); + MEM_SAFE_FREE(mesh->runtime->edit_data->polyNos); + } + break; + case ME_WRAPPER_TYPE_MDATA: + case ME_WRAPPER_TYPE_SUBD: + BKE_mesh_tag_positions_changed(mesh); + break; + } +} + void BKE_mesh_wrapper_vert_coords_copy(const Mesh *me, float (*vert_coords)[3], int vert_coords_len) diff --git a/source/blender/draw/intern/draw_manager_text.cc b/source/blender/draw/intern/draw_manager_text.cc index 3b89cc38ff0..268ed23a84b 100644 --- a/source/blender/draw/intern/draw_manager_text.cc +++ b/source/blender/draw/intern/draw_manager_text.cc @@ -17,6 +17,7 @@ #include "BKE_editmesh_cache.h" #include "BKE_global.h" #include "BKE_mesh.hh" +#include "BKE_mesh_wrapper.h" #include "BKE_unit.h" #include "DNA_mesh_types.h" @@ -236,8 +237,7 @@ void DRW_text_edit_mesh_measure_stats(ARegion *region, float clip_planes[4][4]; /* allow for displaying shape keys and deform mods */ BMIter iter; - const float(*vert_coords)[3] = (me->runtime->edit_data ? me->runtime->edit_data->vertexCos : - nullptr); + const float(*vert_coords)[3] = BKE_mesh_wrapper_vert_coords(me); const bool use_coords = (vert_coords != nullptr); /* when 2 or more edge-info options are enabled, space apart */ @@ -344,8 +344,7 @@ void DRW_text_edit_mesh_measure_stats(ARegion *region, const float(*poly_normals)[3] = nullptr; if (use_coords) { BM_mesh_elem_index_ensure(em->bm, BM_VERT | BM_FACE); - BKE_editmesh_cache_ensure_poly_normals(em, me->runtime->edit_data); - poly_normals = me->runtime->edit_data->polyNos; + poly_normals = BKE_mesh_wrapper_poly_normals(me); } BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) { diff --git a/source/blender/editors/mesh/editmesh_select.cc b/source/blender/editors/mesh/editmesh_select.cc index cf9ce588f4b..065865d6d92 100644 --- a/source/blender/editors/mesh/editmesh_select.cc +++ b/source/blender/editors/mesh/editmesh_select.cc @@ -23,9 +23,9 @@ #include "BKE_customdata.h" #include "BKE_deform.h" #include "BKE_editmesh.h" -#include "BKE_editmesh_cache.h" #include "BKE_layer.h" #include "BKE_mesh.hh" +#include "BKE_mesh_wrapper.h" #include "BKE_report.h" #include "WM_api.h" @@ -1075,8 +1075,8 @@ bool EDBM_unified_findnearest_from_raycast(ViewContext *vc, { Mesh *me_eval = (Mesh *)DEG_get_evaluated_id(vc->depsgraph, static_cast(obedit->data)); - if (me_eval->runtime->edit_data) { - coords = me_eval->runtime->edit_data->vertexCos; + if (BKE_mesh_wrapper_vert_len(me_eval) == bm->totvert) { + coords = BKE_mesh_wrapper_vert_coords(me_eval); } } diff --git a/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.cc b/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.cc index bbe28bfae6e..59dd77da62f 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.cc +++ b/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.cc @@ -21,10 +21,10 @@ #include "BKE_context.h" #include "BKE_editmesh.h" -#include "BKE_editmesh_cache.h" #include "BKE_global.h" #include "BKE_layer.h" #include "BKE_mesh.hh" +#include "BKE_mesh_wrapper.h" #include "DEG_depsgraph.h" #include "DEG_depsgraph_query.h" @@ -240,8 +240,8 @@ static int gizmo_preselect_elem_test_select(bContext *C, wmGizmo *gz, const int Object *ob = gz_ele->bases[gz_ele->base_index]->object; Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); Mesh *me_eval = (Mesh *)DEG_get_evaluated_id(depsgraph, static_cast(ob->data)); - if (me_eval->runtime->edit_data) { - coords = me_eval->runtime->edit_data->vertexCos; + if (BKE_mesh_wrapper_vert_len(me_eval) == bm->totvert) { + coords = BKE_mesh_wrapper_vert_coords(me_eval); } } EDBM_preselect_elem_update_from_single(gz_ele->psel, bm, best.ele, coords); diff --git a/source/blender/modifiers/intern/MOD_armature.cc b/source/blender/modifiers/intern/MOD_armature.cc index 9ab1412a9c6..050e659a798 100644 --- a/source/blender/modifiers/intern/MOD_armature.cc +++ b/source/blender/modifiers/intern/MOD_armature.cc @@ -154,7 +154,7 @@ static void deformVertsEM(ModifierData *md, float (*vertexCos)[3], int verts_num) { - if (mesh != nullptr) { + if (mesh->runtime->wrapper_type == ME_WRAPPER_TYPE_MDATA) { deformVerts(md, ctx, mesh, vertexCos, verts_num); return; } @@ -206,8 +206,6 @@ static void deformMatrices(ModifierData *md, int verts_num) { ArmatureModifierData *amd = (ArmatureModifierData *)md; - Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, nullptr, mesh, nullptr); - BKE_armature_deform_coords_with_mesh(amd->object, ctx->object, vertexCos, @@ -216,11 +214,7 @@ static void deformMatrices(ModifierData *md, amd->deformflag, nullptr, amd->defgrp_name, - mesh_src); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } + mesh); } static void panel_draw(const bContext * /*C*/, Panel *panel) diff --git a/source/blender/modifiers/intern/MOD_cast.cc b/source/blender/modifiers/intern/MOD_cast.cc index 664e14fb373..08b5dfe0da5 100644 --- a/source/blender/modifiers/intern/MOD_cast.cc +++ b/source/blender/modifiers/intern/MOD_cast.cc @@ -462,57 +462,12 @@ static void deformVerts(ModifierData *md, int verts_num) { CastModifierData *cmd = (CastModifierData *)md; - Mesh *mesh_src = nullptr; - - if (ctx->object->type == OB_MESH && cmd->defgrp_name[0] != '\0') { - /* mesh_src is only needed for vgroups. */ - mesh_src = MOD_deform_mesh_eval_get(ctx->object, nullptr, mesh, nullptr); - } if (cmd->type == MOD_CAST_TYPE_CUBOID) { - cuboid_do(cmd, ctx, ctx->object, mesh_src, vertexCos, verts_num); + cuboid_do(cmd, ctx, ctx->object, mesh, vertexCos, verts_num); } else { /* MOD_CAST_TYPE_SPHERE or MOD_CAST_TYPE_CYLINDER */ - sphere_do(cmd, ctx, ctx->object, mesh_src, vertexCos, verts_num); - } - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } -} - -static void deformVertsEM(ModifierData *md, - const ModifierEvalContext *ctx, - BMEditMesh *editData, - Mesh *mesh, - float (*vertexCos)[3], - int verts_num) -{ - CastModifierData *cmd = (CastModifierData *)md; - Mesh *mesh_src = nullptr; - - if (cmd->defgrp_name[0] != '\0') { - mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, nullptr); - } - - if (mesh && BKE_mesh_wrapper_type(mesh) == ME_WRAPPER_TYPE_MDATA) { - BLI_assert(mesh->totvert == verts_num); - } - - /* TODO(@ideasman42): use edit-mode data only (remove this line). */ - if (mesh_src != nullptr) { - BKE_mesh_wrapper_ensure_mdata(mesh_src); - } - - if (cmd->type == MOD_CAST_TYPE_CUBOID) { - cuboid_do(cmd, ctx, ctx->object, mesh_src, vertexCos, verts_num); - } - else { /* MOD_CAST_TYPE_SPHERE or MOD_CAST_TYPE_CYLINDER */ - sphere_do(cmd, ctx, ctx->object, mesh_src, vertexCos, verts_num); - } - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); + sphere_do(cmd, ctx, ctx->object, mesh, vertexCos, verts_num); } } @@ -570,7 +525,7 @@ ModifierTypeInfo modifierType_Cast = { /*deformVerts*/ deformVerts, /*deformMatrices*/ nullptr, - /*deformVertsEM*/ deformVertsEM, + /*deformVertsEM*/ nullptr, /*deformMatricesEM*/ nullptr, /*modifyMesh*/ nullptr, /*modifyGeometrySet*/ nullptr, diff --git a/source/blender/modifiers/intern/MOD_cloth.cc b/source/blender/modifiers/intern/MOD_cloth.cc index 5d0a397bc2c..08fda58829c 100644 --- a/source/blender/modifiers/intern/MOD_cloth.cc +++ b/source/blender/modifiers/intern/MOD_cloth.cc @@ -81,7 +81,6 @@ static void deformVerts(ModifierData *md, float (*vertexCos)[3], int verts_num) { - Mesh *mesh_src; ClothModifierData *clmd = (ClothModifierData *)md; Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); @@ -94,15 +93,6 @@ static void deformVerts(ModifierData *md, } } - if (mesh == nullptr) { - mesh_src = MOD_deform_mesh_eval_get(ctx->object, nullptr, nullptr, nullptr); - } - else { - /* Not possible to use get_mesh() in this case as we'll modify its vertices - * and get_mesh() would return 'mesh' directly. */ - mesh_src = (Mesh *)BKE_id_copy_ex(nullptr, (ID *)mesh, nullptr, LIB_ID_COPY_LOCALIZE); - } - /* TODO(sergey): For now it actually duplicates logic from DerivedMesh.cc * and needs some more generic solution. But starting experimenting with * this so close to the release is not that nice.. @@ -114,22 +104,20 @@ static void deformVerts(ModifierData *md, clmd->sim_parms->shapekey_rest); if (kb && kb->data != nullptr) { float(*layerorco)[3]; - if (!(layerorco = static_cast(CustomData_get_layer_for_write( - &mesh_src->vdata, CD_CLOTH_ORCO, mesh_src->totvert)))) + if (!(layerorco = static_cast( + CustomData_get_layer_for_write(&mesh->vdata, CD_CLOTH_ORCO, mesh->totvert)))) { - layerorco = static_cast(CustomData_add_layer( - &mesh_src->vdata, CD_CLOTH_ORCO, CD_SET_DEFAULT, mesh_src->totvert)); + layerorco = static_cast( + CustomData_add_layer(&mesh->vdata, CD_CLOTH_ORCO, CD_SET_DEFAULT, mesh->totvert)); } memcpy(layerorco, kb->data, sizeof(float[3]) * verts_num); } } - BKE_mesh_vert_coords_apply(mesh_src, vertexCos); + BKE_mesh_vert_coords_apply(mesh, vertexCos); - clothModifier_do(clmd, ctx->depsgraph, scene, ctx->object, mesh_src, vertexCos); - - BKE_id_free(nullptr, mesh_src); + clothModifier_do(clmd, ctx->depsgraph, scene, ctx->object, mesh, vertexCos); } static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) diff --git a/source/blender/modifiers/intern/MOD_collision.cc b/source/blender/modifiers/intern/MOD_collision.cc index 37b1b3ef799..f1e4e5ec665 100644 --- a/source/blender/modifiers/intern/MOD_collision.cc +++ b/source/blender/modifiers/intern/MOD_collision.cc @@ -93,7 +93,6 @@ static void deformVerts(ModifierData *md, int /*verts_num*/) { CollisionModifierData *collmd = (CollisionModifierData *)md; - Mesh *mesh_src; Object *ob = ctx->object; /* If collision is disabled, free the stale data and exit. */ @@ -106,20 +105,11 @@ static void deformVerts(ModifierData *md, return; } - if (mesh == nullptr) { - mesh_src = MOD_deform_mesh_eval_get(ob, nullptr, nullptr, nullptr); - } - else { - /* Not possible to use get_mesh() in this case as we'll modify its vertices - * and get_mesh() would return 'mesh' directly. */ - mesh_src = (Mesh *)BKE_id_copy_ex(nullptr, (ID *)mesh, nullptr, LIB_ID_COPY_LOCALIZE); - } - - if (mesh_src) { + if (mesh) { float current_time = 0; int mvert_num = 0; - BKE_mesh_vert_coords_apply(mesh_src, vertexCos); + BKE_mesh_vert_coords_apply(mesh, vertexCos); current_time = DEG_get_ctime(ctx->depsgraph); @@ -127,7 +117,7 @@ static void deformVerts(ModifierData *md, printf("current_time %f, collmd->time_xnew %f\n", current_time, collmd->time_xnew); } - mvert_num = mesh_src->totvert; + mvert_num = mesh->totvert; if (current_time < collmd->time_xnew) { freeData((ModifierData *)collmd); @@ -145,7 +135,7 @@ static void deformVerts(ModifierData *md, if (collmd->time_xnew == -1000) { /* first time */ - collmd->x = BKE_mesh_vert_coords_alloc(mesh_src, &mvert_num); /* frame start position */ + collmd->x = BKE_mesh_vert_coords_alloc(mesh, &mvert_num); /* frame start position */ for (uint i = 0; i < mvert_num; i++) { /* we save global positions */ @@ -160,12 +150,12 @@ static void deformVerts(ModifierData *md, collmd->mvert_num = mvert_num; { - const MLoopTri *looptri = BKE_mesh_runtime_looptri_ensure(mesh_src); - collmd->tri_num = BKE_mesh_runtime_looptri_len(mesh_src); + const MLoopTri *looptri = BKE_mesh_runtime_looptri_ensure(mesh); + collmd->tri_num = BKE_mesh_runtime_looptri_len(mesh); MVertTri *tri = static_cast( MEM_mallocN(sizeof(*tri) * collmd->tri_num, __func__)); BKE_mesh_runtime_verttri_from_looptri( - tri, mesh_src->corner_verts().data(), looptri, collmd->tri_num); + tri, mesh->corner_verts().data(), looptri, collmd->tri_num); collmd->tri = tri; } @@ -183,7 +173,7 @@ static void deformVerts(ModifierData *md, collmd->xnew = temp; collmd->time_x = collmd->time_xnew; - memcpy(collmd->xnew, mesh_src->vert_positions().data(), mvert_num * sizeof(float[3])); + memcpy(collmd->xnew, mesh->vert_positions().data(), mvert_num * sizeof(float[3])); bool is_static = true; @@ -229,10 +219,6 @@ static void deformVerts(ModifierData *md, freeData((ModifierData *)collmd); } } - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } } static void updateDepsgraph(ModifierData * /*md*/, const ModifierUpdateDepsgraphContext *ctx) diff --git a/source/blender/modifiers/intern/MOD_correctivesmooth.cc b/source/blender/modifiers/intern/MOD_correctivesmooth.cc index 6a01489c891..511c78aca7c 100644 --- a/source/blender/modifiers/intern/MOD_correctivesmooth.cc +++ b/source/blender/modifiers/intern/MOD_correctivesmooth.cc @@ -744,36 +744,8 @@ static void deformVerts(ModifierData *md, float (*vertexCos)[3], int verts_num) { - Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, nullptr, mesh, nullptr); - correctivesmooth_modifier_do( - md, ctx->depsgraph, ctx->object, mesh_src, vertexCos, uint(verts_num), nullptr); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } -} - -static void deformVertsEM(ModifierData *md, - const ModifierEvalContext *ctx, - BMEditMesh *editData, - Mesh *mesh, - float (*vertexCos)[3], - int verts_num) -{ - Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, nullptr); - - /* TODO(@ideasman42): use edit-mode data only (remove this line). */ - if (mesh_src != nullptr) { - BKE_mesh_wrapper_ensure_mdata(mesh_src); - } - - correctivesmooth_modifier_do( - md, ctx->depsgraph, ctx->object, mesh_src, vertexCos, uint(verts_num), editData); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } + md, ctx->depsgraph, ctx->object, mesh, vertexCos, uint(verts_num), nullptr); } static void panel_draw(const bContext * /*C*/, Panel *panel) @@ -860,7 +832,7 @@ ModifierTypeInfo modifierType_CorrectiveSmooth = { /*deformVerts*/ deformVerts, /*deformMatrices*/ nullptr, - /*deformVertsEM*/ deformVertsEM, + /*deformVertsEM*/ nullptr, /*deformMatricesEM*/ nullptr, /*modifyMesh*/ nullptr, /*modifyGeometrySet*/ nullptr, diff --git a/source/blender/modifiers/intern/MOD_curve.cc b/source/blender/modifiers/intern/MOD_curve.cc index 8d17354f675..9bb0bda973a 100644 --- a/source/blender/modifiers/intern/MOD_curve.cc +++ b/source/blender/modifiers/intern/MOD_curve.cc @@ -106,16 +106,10 @@ static void deformVerts(ModifierData *md, int verts_num) { CurveModifierData *cmd = (CurveModifierData *)md; - Mesh *mesh_src = nullptr; - - if (ctx->object->type == OB_MESH && cmd->name[0] != '\0') { - /* mesh_src is only needed for vgroups. */ - mesh_src = MOD_deform_mesh_eval_get(ctx->object, nullptr, mesh, nullptr); - } const MDeformVert *dvert = nullptr; int defgrp_index = -1; - MOD_get_vgroup(ctx->object, mesh_src, cmd->name, &dvert, &defgrp_index); + MOD_get_vgroup(ctx->object, mesh, cmd->name, &dvert, &defgrp_index); /* Silly that defaxis and BKE_curve_deform_coords are off by 1 * but leave for now to save having to call do_versions */ @@ -128,10 +122,6 @@ static void deformVerts(ModifierData *md, defgrp_index, cmd->flag, cmd->defaxis - 1); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } } static void deformVertsEM(ModifierData *md, @@ -141,7 +131,7 @@ static void deformVertsEM(ModifierData *md, float (*vertexCos)[3], int verts_num) { - if (mesh != nullptr) { + if (mesh->runtime->wrapper_type == ME_WRAPPER_TYPE_MDATA) { deformVerts(md, ctx, mesh, vertexCos, verts_num); return; } diff --git a/source/blender/modifiers/intern/MOD_displace.cc b/source/blender/modifiers/intern/MOD_displace.cc index 2981a5f5a7e..62c90ae56d5 100644 --- a/source/blender/modifiers/intern/MOD_displace.cc +++ b/source/blender/modifiers/intern/MOD_displace.cc @@ -372,34 +372,7 @@ static void deformVerts(ModifierData *md, float (*vertexCos)[3], int verts_num) { - Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, nullptr, mesh, nullptr); - - displaceModifier_do((DisplaceModifierData *)md, ctx, mesh_src, vertexCos, verts_num); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } -} - -static void deformVertsEM(ModifierData *md, - const ModifierEvalContext *ctx, - BMEditMesh *editData, - Mesh *mesh, - float (*vertexCos)[3], - int verts_num) -{ - Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, nullptr); - - /* TODO(@ideasman42): use edit-mode data only (remove this line). */ - if (mesh_src != nullptr) { - BKE_mesh_wrapper_ensure_mdata(mesh_src); - } - - displaceModifier_do((DisplaceModifierData *)md, ctx, mesh_src, vertexCos, verts_num); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } + displaceModifier_do((DisplaceModifierData *)md, ctx, mesh, vertexCos, verts_num); } static void panel_draw(const bContext *C, Panel *panel) @@ -485,7 +458,7 @@ ModifierTypeInfo modifierType_Displace = { /*deformVerts*/ deformVerts, /*deformMatrices*/ nullptr, - /*deformVertsEM*/ deformVertsEM, + /*deformVertsEM*/ nullptr, /*deformMatricesEM*/ nullptr, /*modifyMesh*/ nullptr, /*modifyGeometrySet*/ nullptr, diff --git a/source/blender/modifiers/intern/MOD_hook.cc b/source/blender/modifiers/intern/MOD_hook.cc index 62536c408e4..bd143ad49c7 100644 --- a/source/blender/modifiers/intern/MOD_hook.cc +++ b/source/blender/modifiers/intern/MOD_hook.cc @@ -431,13 +431,7 @@ static void deformVerts(ModifierData *md, int verts_num) { HookModifierData *hmd = (HookModifierData *)md; - Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, nullptr, mesh, nullptr); - - deformVerts_do(hmd, ctx, ctx->object, mesh_src, nullptr, vertexCos, verts_num); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } + deformVerts_do(hmd, ctx, ctx->object, mesh, nullptr, vertexCos, verts_num); } static void deformVertsEM(ModifierData *md, @@ -449,7 +443,13 @@ static void deformVertsEM(ModifierData *md, { HookModifierData *hmd = (HookModifierData *)md; - deformVerts_do(hmd, ctx, ctx->object, mesh, mesh ? nullptr : editData, vertexCos, verts_num); + deformVerts_do(hmd, + ctx, + ctx->object, + mesh, + mesh->runtime->wrapper_type == ME_WRAPPER_TYPE_BMESH ? editData : nullptr, + vertexCos, + verts_num); } static void panel_draw(const bContext * /*C*/, Panel *panel) diff --git a/source/blender/modifiers/intern/MOD_laplaciandeform.cc b/source/blender/modifiers/intern/MOD_laplaciandeform.cc index dcbfafef194..238e4db7e2b 100644 --- a/source/blender/modifiers/intern/MOD_laplaciandeform.cc +++ b/source/blender/modifiers/intern/MOD_laplaciandeform.cc @@ -749,36 +749,8 @@ static void deformVerts(ModifierData *md, float (*vertexCos)[3], int verts_num) { - Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, nullptr, mesh, nullptr); - LaplacianDeformModifier_do( - (LaplacianDeformModifierData *)md, ctx->object, mesh_src, vertexCos, verts_num); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } -} - -static void deformVertsEM(ModifierData *md, - const ModifierEvalContext *ctx, - BMEditMesh *editData, - Mesh *mesh, - float (*vertexCos)[3], - int verts_num) -{ - Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, nullptr); - - /* TODO(@ideasman42): use edit-mode data only (remove this line). */ - if (mesh_src != nullptr) { - BKE_mesh_wrapper_ensure_mdata(mesh_src); - } - - LaplacianDeformModifier_do( - (LaplacianDeformModifierData *)md, ctx->object, mesh_src, vertexCos, verts_num); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } + (LaplacianDeformModifierData *)md, ctx->object, mesh, vertexCos, verts_num); } static void freeData(ModifierData *md) @@ -869,7 +841,7 @@ ModifierTypeInfo modifierType_LaplacianDeform = { /*deformVerts*/ deformVerts, /*deformMatrices*/ nullptr, - /*deformVertsEM*/ deformVertsEM, + /*deformVertsEM*/ nullptr, /*deformMatricesEM*/ nullptr, /*modifyMesh*/ nullptr, /*modifyGeometrySet*/ nullptr, diff --git a/source/blender/modifiers/intern/MOD_laplaciansmooth.cc b/source/blender/modifiers/intern/MOD_laplaciansmooth.cc index 8968cabc77f..77ee1fde4cc 100644 --- a/source/blender/modifiers/intern/MOD_laplaciansmooth.cc +++ b/source/blender/modifiers/intern/MOD_laplaciansmooth.cc @@ -508,48 +508,12 @@ static void deformVerts(ModifierData *md, float (*vertexCos)[3], int verts_num) { - Mesh *mesh_src; - if (verts_num == 0) { return; } - mesh_src = MOD_deform_mesh_eval_get(ctx->object, nullptr, mesh, nullptr); - laplaciansmoothModifier_do( - (LaplacianSmoothModifierData *)md, ctx->object, mesh_src, vertexCos, verts_num); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } -} - -static void deformVertsEM(ModifierData *md, - const ModifierEvalContext *ctx, - BMEditMesh *editData, - Mesh *mesh, - float (*vertexCos)[3], - int verts_num) -{ - Mesh *mesh_src; - - if (verts_num == 0) { - return; - } - - mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, nullptr); - - /* TODO(@ideasman42): use edit-mode data only (remove this line). */ - if (mesh_src != nullptr) { - BKE_mesh_wrapper_ensure_mdata(mesh_src); - } - - laplaciansmoothModifier_do( - (LaplacianSmoothModifierData *)md, ctx->object, mesh_src, vertexCos, verts_num); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } + (LaplacianSmoothModifierData *)md, ctx->object, mesh, vertexCos, verts_num); } static void panel_draw(const bContext * /*C*/, Panel *panel) @@ -599,7 +563,7 @@ ModifierTypeInfo modifierType_LaplacianSmooth = { /*deformVerts*/ deformVerts, /*deformMatrices*/ nullptr, - /*deformVertsEM*/ deformVertsEM, + /*deformVertsEM*/ nullptr, /*deformMatricesEM*/ nullptr, /*modifyMesh*/ nullptr, /*modifyGeometrySet*/ nullptr, diff --git a/source/blender/modifiers/intern/MOD_lattice.cc b/source/blender/modifiers/intern/MOD_lattice.cc index f71963a4f86..d1fc857a7db 100644 --- a/source/blender/modifiers/intern/MOD_lattice.cc +++ b/source/blender/modifiers/intern/MOD_lattice.cc @@ -100,22 +100,11 @@ static void deformVerts(ModifierData *md, int verts_num) { LatticeModifierData *lmd = (LatticeModifierData *)md; - Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, nullptr, mesh, nullptr); MOD_previous_vcos_store(md, vertexCos); /* if next modifier needs original vertices */ - BKE_lattice_deform_coords_with_mesh(lmd->object, - ctx->object, - vertexCos, - verts_num, - lmd->flag, - lmd->name, - lmd->strength, - mesh_src); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } + BKE_lattice_deform_coords_with_mesh( + lmd->object, ctx->object, vertexCos, verts_num, lmd->flag, lmd->name, lmd->strength, mesh); } static void deformVertsEM(ModifierData *md, @@ -125,7 +114,7 @@ static void deformVertsEM(ModifierData *md, float (*vertexCos)[3], int verts_num) { - if (mesh != nullptr) { + if (mesh->runtime->wrapper_type == ME_WRAPPER_TYPE_MDATA) { deformVerts(md, ctx, mesh, vertexCos, verts_num); return; } diff --git a/source/blender/modifiers/intern/MOD_meshcache.cc b/source/blender/modifiers/intern/MOD_meshcache.cc index 8dde279505e..ff174352867 100644 --- a/source/blender/modifiers/intern/MOD_meshcache.cc +++ b/source/blender/modifiers/intern/MOD_meshcache.cc @@ -282,44 +282,7 @@ static void deformVerts(ModifierData *md, MeshCacheModifierData *mcmd = (MeshCacheModifierData *)md; Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); - Mesh *mesh_src = nullptr; - - if (ctx->object->type == OB_MESH && mcmd->defgrp_name[0] != '\0') { - /* `mesh_src` is only needed for vertex groups. */ - mesh_src = MOD_deform_mesh_eval_get(ctx->object, nullptr, mesh, nullptr); - } - meshcache_do(mcmd, scene, ctx->object, mesh_src, vertexCos, verts_num); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } -} - -static void deformVertsEM(ModifierData *md, - const ModifierEvalContext *ctx, - BMEditMesh *editData, - Mesh *mesh, - float (*vertexCos)[3], - int verts_num) -{ - MeshCacheModifierData *mcmd = (MeshCacheModifierData *)md; - Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); - - Mesh *mesh_src = nullptr; - - if (ctx->object->type == OB_MESH && mcmd->defgrp_name[0] != '\0') { - /* `mesh_src` is only needed for vertex groups. */ - mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, nullptr); - } - if (mesh_src != nullptr) { - BKE_mesh_wrapper_ensure_mdata(mesh_src); - } - - meshcache_do(mcmd, scene, ctx->object, mesh_src, vertexCos, verts_num); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } + meshcache_do(mcmd, scene, ctx->object, mesh, vertexCos, verts_num); } static void panel_draw(const bContext * /*C*/, Panel *panel) @@ -417,7 +380,7 @@ ModifierTypeInfo modifierType_MeshCache = { /*deformVerts*/ deformVerts, /*deformMatrices*/ nullptr, - /*deformVertsEM*/ deformVertsEM, + /*deformVertsEM*/ nullptr, /*deformMatricesEM*/ nullptr, /*modifyMesh*/ nullptr, /*modifyGeometrySet*/ nullptr, diff --git a/source/blender/modifiers/intern/MOD_meshdeform.cc b/source/blender/modifiers/intern/MOD_meshdeform.cc index 5147f89525c..ffd71a1765f 100644 --- a/source/blender/modifiers/intern/MOD_meshdeform.cc +++ b/source/blender/modifiers/intern/MOD_meshdeform.cc @@ -441,36 +441,8 @@ static void deformVerts(ModifierData *md, float (*vertexCos)[3], int verts_num) { - Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, nullptr, mesh, nullptr); - MOD_previous_vcos_store(md, vertexCos); /* if next modifier needs original vertices */ - - meshdeformModifier_do(md, ctx, mesh_src, vertexCos, verts_num); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } -} - -static void deformVertsEM(ModifierData *md, - const ModifierEvalContext *ctx, - BMEditMesh *editData, - Mesh *mesh, - float (*vertexCos)[3], - int verts_num) -{ - Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, nullptr); - - /* TODO(@ideasman42): use edit-mode data only (remove this line). */ - if (mesh_src != nullptr) { - BKE_mesh_wrapper_ensure_mdata(mesh_src); - } - - meshdeformModifier_do(md, ctx, mesh_src, vertexCos, verts_num); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } + meshdeformModifier_do(md, ctx, mesh, vertexCos, verts_num); } #define MESHDEFORM_MIN_INFLUENCE 0.00001f @@ -658,7 +630,7 @@ ModifierTypeInfo modifierType_MeshDeform = { /*deformVerts*/ deformVerts, /*deformMatrices*/ nullptr, - /*deformVertsEM*/ deformVertsEM, + /*deformVertsEM*/ nullptr, /*deformMatricesEM*/ nullptr, /*modifyMesh*/ nullptr, /*modifyGeometrySet*/ nullptr, diff --git a/source/blender/modifiers/intern/MOD_particlesystem.cc b/source/blender/modifiers/intern/MOD_particlesystem.cc index 011fdb8a89e..6d246a20b09 100644 --- a/source/blender/modifiers/intern/MOD_particlesystem.cc +++ b/source/blender/modifiers/intern/MOD_particlesystem.cc @@ -102,7 +102,6 @@ static void deformVerts(ModifierData *md, float (*vertexCos)[3], int /*verts_num*/) { - Mesh *mesh_src = mesh; ParticleSystemModifierData *psmd = (ParticleSystemModifierData *)md; ParticleSystem *psys = nullptr; @@ -117,14 +116,6 @@ static void deformVerts(ModifierData *md, return; } - if (mesh_src == nullptr) { - mesh_src = MOD_deform_mesh_eval_get(ctx->object, nullptr, nullptr, vertexCos); - if (mesh_src == nullptr) { - return; - } - BKE_mesh_orco_ensure(ctx->object, mesh_src); - } - /* Clear old evaluated mesh. */ bool had_mesh_final = (psmd->mesh_final != nullptr); if (psmd->mesh_final) { @@ -156,7 +147,7 @@ static void deformVerts(ModifierData *md, } /* make new mesh */ - psmd->mesh_final = BKE_mesh_copy_for_eval(mesh_src); + psmd->mesh_final = BKE_mesh_copy_for_eval(mesh); BKE_mesh_vert_coords_apply(psmd->mesh_final, vertexCos); BKE_mesh_tessface_ensure(psmd->mesh_final); @@ -180,7 +171,7 @@ static void deformVerts(ModifierData *md, } } else { - mesh_original = mesh_src; + mesh_original = mesh; } if (mesh_original) { @@ -193,10 +184,6 @@ static void deformVerts(ModifierData *md, BKE_mesh_tessface_ensure(psmd->mesh_original); } - if (!ELEM(mesh_src, nullptr, mesh, psmd->mesh_final)) { - BKE_id_free(nullptr, mesh_src); - } - /* Report change in mesh structure. * This is an unreliable check for the topology check, but allows some * handy configuration like emitting particles from inside particle diff --git a/source/blender/modifiers/intern/MOD_shrinkwrap.cc b/source/blender/modifiers/intern/MOD_shrinkwrap.cc index 2670cfa1d19..b58b064e6f5 100644 --- a/source/blender/modifiers/intern/MOD_shrinkwrap.cc +++ b/source/blender/modifiers/intern/MOD_shrinkwrap.cc @@ -93,59 +93,13 @@ static void deformVerts(ModifierData *md, { ShrinkwrapModifierData *swmd = (ShrinkwrapModifierData *)md; Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); - Mesh *mesh_src = nullptr; - - if (ELEM(ctx->object->type, OB_MESH, OB_LATTICE) || (swmd->shrinkType == MOD_SHRINKWRAP_PROJECT)) - { - /* mesh_src is needed for vgroups, but also used as ShrinkwrapCalcData.vert when projecting. - * Avoid time-consuming mesh conversion for curves when not projecting. */ - mesh_src = MOD_deform_mesh_eval_get(ctx->object, nullptr, mesh, nullptr); - } const MDeformVert *dvert = nullptr; int defgrp_index = -1; - MOD_get_vgroup(ctx->object, mesh_src, swmd->vgroup_name, &dvert, &defgrp_index); + MOD_get_vgroup(ctx->object, mesh, swmd->vgroup_name, &dvert, &defgrp_index); shrinkwrapModifier_deform( - swmd, ctx, scene, ctx->object, mesh_src, dvert, defgrp_index, vertexCos, verts_num); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } -} - -static void deformVertsEM(ModifierData *md, - const ModifierEvalContext *ctx, - BMEditMesh *editData, - Mesh *mesh, - float (*vertexCos)[3], - int verts_num) -{ - ShrinkwrapModifierData *swmd = (ShrinkwrapModifierData *)md; - Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); - Mesh *mesh_src = nullptr; - - if ((swmd->vgroup_name[0] != '\0') || (swmd->shrinkType == MOD_SHRINKWRAP_PROJECT)) { - mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, nullptr); - } - - /* TODO(@ideasman42): use edit-mode data only (remove this line). */ - if (mesh_src != nullptr) { - BKE_mesh_wrapper_ensure_mdata(mesh_src); - } - - const MDeformVert *dvert = nullptr; - int defgrp_index = -1; - if (swmd->vgroup_name[0] != '\0') { - MOD_get_vgroup(ctx->object, mesh_src, swmd->vgroup_name, &dvert, &defgrp_index); - } - - shrinkwrapModifier_deform( - swmd, ctx, scene, ctx->object, mesh_src, dvert, defgrp_index, vertexCos, verts_num); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } + swmd, ctx, scene, ctx->object, mesh, dvert, defgrp_index, vertexCos, verts_num); } static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) @@ -264,7 +218,7 @@ ModifierTypeInfo modifierType_Shrinkwrap = { /*deformVerts*/ deformVerts, /*deformMatrices*/ nullptr, - /*deformVertsEM*/ deformVertsEM, + /*deformVertsEM*/ nullptr, /*deformMatricesEM*/ nullptr, /*modifyMesh*/ nullptr, /*modifyGeometrySet*/ nullptr, diff --git a/source/blender/modifiers/intern/MOD_simpledeform.cc b/source/blender/modifiers/intern/MOD_simpledeform.cc index 81a438b52a4..0daf17195a3 100644 --- a/source/blender/modifiers/intern/MOD_simpledeform.cc +++ b/source/blender/modifiers/intern/MOD_simpledeform.cc @@ -446,45 +446,7 @@ static void deformVerts(ModifierData *md, int verts_num) { SimpleDeformModifierData *sdmd = (SimpleDeformModifierData *)md; - Mesh *mesh_src = nullptr; - - if (ctx->object->type == OB_MESH && sdmd->vgroup_name[0] != '\0') { - /* mesh_src is only needed for vgroups. */ - mesh_src = MOD_deform_mesh_eval_get(ctx->object, nullptr, mesh, nullptr); - } - - SimpleDeformModifier_do(sdmd, ctx, ctx->object, mesh_src, vertexCos, verts_num); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } -} - -static void deformVertsEM(ModifierData *md, - const ModifierEvalContext *ctx, - BMEditMesh *editData, - Mesh *mesh, - float (*vertexCos)[3], - int verts_num) -{ - SimpleDeformModifierData *sdmd = (SimpleDeformModifierData *)md; - Mesh *mesh_src = nullptr; - - if (ctx->object->type == OB_MESH && sdmd->vgroup_name[0] != '\0') { - /* mesh_src is only needed for vgroups. */ - mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, nullptr); - } - - /* TODO(@ideasman42): use edit-mode data only (remove this line). */ - if (mesh_src != nullptr) { - BKE_mesh_wrapper_ensure_mdata(mesh_src); - } - - SimpleDeformModifier_do(sdmd, ctx, ctx->object, mesh_src, vertexCos, verts_num); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } + SimpleDeformModifier_do(sdmd, ctx, ctx->object, mesh, vertexCos, verts_num); } static void panel_draw(const bContext * /*C*/, Panel *panel) @@ -576,7 +538,7 @@ ModifierTypeInfo modifierType_SimpleDeform = { /*deformVerts*/ deformVerts, /*deformMatrices*/ nullptr, - /*deformVertsEM*/ deformVertsEM, + /*deformVertsEM*/ nullptr, /*deformMatricesEM*/ nullptr, /*modifyMesh*/ nullptr, /*modifyGeometrySet*/ nullptr, diff --git a/source/blender/modifiers/intern/MOD_smooth.cc b/source/blender/modifiers/intern/MOD_smooth.cc index c419d2f59c0..293024f6d19 100644 --- a/source/blender/modifiers/intern/MOD_smooth.cc +++ b/source/blender/modifiers/intern/MOD_smooth.cc @@ -183,37 +183,7 @@ static void deformVerts(ModifierData *md, int verts_num) { SmoothModifierData *smd = (SmoothModifierData *)md; - - /* mesh_src is needed for vgroups, and taking edges into account. */ - Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, nullptr, mesh, nullptr); - - smoothModifier_do(smd, ctx->object, mesh_src, vertexCos, verts_num); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } -} - -static void deformVertsEM(ModifierData *md, - const ModifierEvalContext *ctx, - BMEditMesh *editData, - Mesh *mesh, - float (*vertexCos)[3], - int verts_num) -{ - SmoothModifierData *smd = (SmoothModifierData *)md; - - /* mesh_src is needed for vgroups, and taking edges into account. */ - Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, nullptr); - - /* TODO(@ideasman42): use edit-mode data only (remove this line). */ - BKE_mesh_wrapper_ensure_mdata(mesh_src); - - smoothModifier_do(smd, ctx->object, mesh_src, vertexCos, verts_num); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } + smoothModifier_do(smd, ctx->object, mesh, vertexCos, verts_num); } static void panel_draw(const bContext * /*C*/, Panel *panel) @@ -260,7 +230,7 @@ ModifierTypeInfo modifierType_Smooth = { /*deformVerts*/ deformVerts, /*deformMatrices*/ nullptr, - /*deformVertsEM*/ deformVertsEM, + /*deformVertsEM*/ nullptr, /*deformMatricesEM*/ nullptr, /*modifyMesh*/ nullptr, /*modifyGeometrySet*/ nullptr, diff --git a/source/blender/modifiers/intern/MOD_surface.cc b/source/blender/modifiers/intern/MOD_surface.cc index 55c4eeafe62..e17c41942a5 100644 --- a/source/blender/modifiers/intern/MOD_surface.cc +++ b/source/blender/modifiers/intern/MOD_surface.cc @@ -107,13 +107,7 @@ static void deformVerts(ModifierData *md, } if (mesh) { - /* Not possible to use get_mesh() in this case as we'll modify its vertices - * and get_mesh() would return 'mesh' directly. */ - surmd->runtime.mesh = (Mesh *)BKE_id_copy_ex( - nullptr, (ID *)mesh, nullptr, LIB_ID_COPY_LOCALIZE); - } - else { - surmd->runtime.mesh = MOD_deform_mesh_eval_get(ctx->object, nullptr, nullptr, nullptr); + surmd->runtime.mesh = BKE_mesh_copy_for_eval(mesh); } if (!ctx->object->pd) { diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.cc b/source/blender/modifiers/intern/MOD_surfacedeform.cc index f9afcac5324..78ffe49b059 100644 --- a/source/blender/modifiers/intern/MOD_surfacedeform.cc +++ b/source/blender/modifiers/intern/MOD_surfacedeform.cc @@ -1574,46 +1574,7 @@ static void deformVerts(ModifierData *md, float (*vertexCos)[3], int verts_num) { - SurfaceDeformModifierData *smd = (SurfaceDeformModifierData *)md; - Mesh *mesh_src = nullptr; - - if (smd->defgrp_name[0] != '\0') { - /* Only need to use mesh_src when a vgroup is used. */ - mesh_src = MOD_deform_mesh_eval_get(ctx->object, nullptr, mesh, nullptr); - } - - surfacedeformModifier_do(md, ctx, vertexCos, verts_num, ctx->object, mesh_src); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } -} - -static void deformVertsEM(ModifierData *md, - const ModifierEvalContext *ctx, - BMEditMesh *em, - Mesh *mesh, - float (*vertexCos)[3], - int verts_num) -{ - SurfaceDeformModifierData *smd = (SurfaceDeformModifierData *)md; - Mesh *mesh_src = nullptr; - - if (smd->defgrp_name[0] != '\0') { - /* Only need to use mesh_src when a vgroup is used. */ - mesh_src = MOD_deform_mesh_eval_get(ctx->object, em, mesh, nullptr); - } - - /* TODO(@ideasman42): use edit-mode data only (remove this line). */ - if (mesh_src != nullptr) { - BKE_mesh_wrapper_ensure_mdata(mesh_src); - } - - surfacedeformModifier_do(md, ctx, vertexCos, verts_num, ctx->object, mesh_src); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } + surfacedeformModifier_do(md, ctx, vertexCos, verts_num, ctx->object, mesh); } static bool isDisabled(const Scene * /*scene*/, ModifierData *md, bool /*useRenderParams*/) @@ -1759,7 +1720,7 @@ ModifierTypeInfo modifierType_SurfaceDeform = { /*deformVerts*/ deformVerts, /*deformMatrices*/ nullptr, - /*deformVertsEM*/ deformVertsEM, + /*deformVertsEM*/ nullptr, /*deformMatricesEM*/ nullptr, /*modifyMesh*/ nullptr, /*modifyGeometrySet*/ nullptr, diff --git a/source/blender/modifiers/intern/MOD_util.cc b/source/blender/modifiers/intern/MOD_util.cc index aebdd885579..9967789651e 100644 --- a/source/blender/modifiers/intern/MOD_util.cc +++ b/source/blender/modifiers/intern/MOD_util.cc @@ -164,38 +164,6 @@ void MOD_previous_vcos_store(ModifierData *md, const float (*vert_coords)[3]) /* lattice/mesh modifier too */ } -Mesh *MOD_deform_mesh_eval_get(Object *ob, BMEditMesh *em, Mesh *mesh, const float (*vertexCos)[3]) -{ - if (mesh != nullptr) { - /* pass */ - } - else if (ob->type == OB_MESH) { - if (em) { - mesh = BKE_mesh_wrapper_from_editmesh_with_coords( - em, nullptr, vertexCos, static_cast(ob->data)); - } - else { - /* TODO(sybren): after modifier conversion of DM to Mesh is done, check whether - * we really need a copy here. Maybe the CoW ob->data can be directly used. */ - Mesh *mesh_prior_modifiers = BKE_object_get_pre_modified_mesh(ob); - mesh = (Mesh *)BKE_id_copy_ex( - nullptr, &mesh_prior_modifiers->id, nullptr, LIB_ID_COPY_LOCALIZE); - mesh->runtime->deformed_only = true; - } - - if (em != nullptr) { - /* pass */ - } - /* TODO(sybren): after modifier conversion of DM to Mesh is done, check whether - * we really need vertexCos here. */ - else if (vertexCos) { - BKE_mesh_vert_coords_apply(mesh, vertexCos); - } - } - - return mesh; -} - void MOD_get_vgroup(const Object *ob, const Mesh *mesh, const char *name, diff --git a/source/blender/modifiers/intern/MOD_util.hh b/source/blender/modifiers/intern/MOD_util.hh index fde7683afc2..0fd2d1bb0b2 100644 --- a/source/blender/modifiers/intern/MOD_util.hh +++ b/source/blender/modifiers/intern/MOD_util.hh @@ -32,14 +32,6 @@ void MOD_get_texture_coords(MappingInfoModifierData *dmd, void MOD_previous_vcos_store(ModifierData *md, const float (*vert_coords)[3]); -/** - * \returns a mesh if mesh == null, for deforming modifiers that need it. - */ -Mesh *MOD_deform_mesh_eval_get(Object *ob, - BMEditMesh *em, - Mesh *mesh, - const float (*vertexCos)[3]); - void MOD_get_vgroup(const Object *ob, const Mesh *mesh, const char *name, diff --git a/source/blender/modifiers/intern/MOD_warp.cc b/source/blender/modifiers/intern/MOD_warp.cc index 016f6fd7bdb..290766a5828 100644 --- a/source/blender/modifiers/intern/MOD_warp.cc +++ b/source/blender/modifiers/intern/MOD_warp.cc @@ -342,45 +342,7 @@ static void deformVerts(ModifierData *md, int verts_num) { WarpModifierData *wmd = (WarpModifierData *)md; - Mesh *mesh_src = nullptr; - - if (wmd->defgrp_name[0] != '\0' || wmd->texture != nullptr) { - /* mesh_src is only needed for vgroups and textures. */ - mesh_src = MOD_deform_mesh_eval_get(ctx->object, nullptr, mesh, nullptr); - } - - warpModifier_do(wmd, ctx, mesh_src, vertexCos, verts_num); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } -} - -static void deformVertsEM(ModifierData *md, - const ModifierEvalContext *ctx, - BMEditMesh *em, - Mesh *mesh, - float (*vertexCos)[3], - int verts_num) -{ - WarpModifierData *wmd = (WarpModifierData *)md; - Mesh *mesh_src = nullptr; - - if (wmd->defgrp_name[0] != '\0' || wmd->texture != nullptr) { - /* mesh_src is only needed for vgroups and textures. */ - mesh_src = MOD_deform_mesh_eval_get(ctx->object, em, mesh, nullptr); - } - - /* TODO(@ideasman42): use edit-mode data only (remove this line). */ - if (mesh_src != nullptr) { - BKE_mesh_wrapper_ensure_mdata(mesh_src); - } - - warpModifier_do(wmd, ctx, mesh_src, vertexCos, verts_num); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } + warpModifier_do(wmd, ctx, mesh, vertexCos, verts_num); } static void panel_draw(const bContext * /*C*/, Panel *panel) @@ -521,7 +483,7 @@ ModifierTypeInfo modifierType_Warp = { /*deformVerts*/ deformVerts, /*deformMatrices*/ nullptr, - /*deformVertsEM*/ deformVertsEM, + /*deformVertsEM*/ nullptr, /*deformMatricesEM*/ nullptr, /*modifyMesh*/ nullptr, /*modifyGeometrySet*/ nullptr, diff --git a/source/blender/modifiers/intern/MOD_wave.cc b/source/blender/modifiers/intern/MOD_wave.cc index 36654500b6e..1fdee022959 100644 --- a/source/blender/modifiers/intern/MOD_wave.cc +++ b/source/blender/modifiers/intern/MOD_wave.cc @@ -296,55 +296,7 @@ static void deformVerts(ModifierData *md, int verts_num) { WaveModifierData *wmd = (WaveModifierData *)md; - Mesh *mesh_src = nullptr; - - if (wmd->flag & MOD_WAVE_NORM) { - mesh_src = MOD_deform_mesh_eval_get(ctx->object, nullptr, mesh, vertexCos); - } - else if (wmd->texture != nullptr || wmd->defgrp_name[0] != '\0') { - mesh_src = MOD_deform_mesh_eval_get(ctx->object, nullptr, mesh, nullptr); - } - - waveModifier_do(wmd, ctx, ctx->object, mesh_src, vertexCos, verts_num); - - if (!ELEM(mesh_src, nullptr, mesh)) { - BKE_id_free(nullptr, mesh_src); - } -} - -static void deformVertsEM(ModifierData *md, - const ModifierEvalContext *ctx, - BMEditMesh *editData, - Mesh *mesh, - float (*vertexCos)[3], - int verts_num) -{ - WaveModifierData *wmd = (WaveModifierData *)md; - Mesh *mesh_src = nullptr; - - if (wmd->flag & MOD_WAVE_NORM) { - mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, vertexCos); - } - else if (wmd->texture != nullptr || wmd->defgrp_name[0] != '\0') { - mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, nullptr); - } - - /* TODO(@ideasman42): use edit-mode data only (remove this line). */ - if (mesh_src != nullptr) { - BKE_mesh_wrapper_ensure_mdata(mesh_src); - } - - waveModifier_do(wmd, ctx, ctx->object, mesh_src, vertexCos, verts_num); - - if (!ELEM(mesh_src, nullptr, mesh)) { - /* Important not to free `vertexCos` owned by the caller. */ - EditMeshData *edit_data = mesh_src->runtime->edit_data; - if (edit_data->vertexCos == vertexCos) { - edit_data->vertexCos = nullptr; - } - - BKE_id_free(nullptr, mesh_src); - } + waveModifier_do(wmd, ctx, ctx->object, mesh, vertexCos, verts_num); } static void panel_draw(const bContext * /*C*/, Panel *panel) @@ -478,7 +430,7 @@ ModifierTypeInfo modifierType_Wave = { /*deformVerts*/ deformVerts, /*deformMatrices*/ nullptr, - /*deformVertsEM*/ deformVertsEM, + /*deformVertsEM*/ nullptr, /*deformMatricesEM*/ nullptr, /*modifyMesh*/ nullptr, /*modifyGeometrySet*/ nullptr, -- 2.30.2 From 7830d9f21e5acd09400bfe0a70a326cf7be0749b Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 7 Jul 2023 07:10:41 -0400 Subject: [PATCH 034/115] Cleanup: Correct two curves and mesh comments --- source/blender/makesdna/DNA_curves_types.h | 2 +- source/blender/makesdna/DNA_mesh_types.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/source/blender/makesdna/DNA_curves_types.h b/source/blender/makesdna/DNA_curves_types.h index 1972d3536bf..df6d9e5aa35 100644 --- a/source/blender/makesdna/DNA_curves_types.h +++ b/source/blender/makesdna/DNA_curves_types.h @@ -109,7 +109,7 @@ typedef struct CurvesGeometry { * Every curve offset must be at least one larger than the previous. In other words, every curve * must have at least one point. The first value is 0 and the last value is #point_num. * - * This array is shared based on the bke::MeshRuntime::poly_offsets_sharing_info. + * This array is shared based on the bke::CurvesGeometryRuntime::curve_offsets_sharing_info. * Avoid accessing directly when possible. * * \note This is *not* stored as an attribute because its size is one larger than #curve_num. diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h index 28ffcd0993f..15e9784af08 100644 --- a/source/blender/makesdna/DNA_mesh_types.h +++ b/source/blender/makesdna/DNA_mesh_types.h @@ -265,9 +265,9 @@ typedef struct Mesh { * Array of vertices for every face corner, stored in the ".corner_vert" integer attribute. * For example, the vertices in a face can be retrieved with the #slice method: * \code{.cc} - * const Span poly_verts = corner_verts.slice(poly.loopstart, poly.totloop); + * const Span poly_verts = corner_verts.slice(poly); * \endcode - * Such a span can often be passed as an argument in lieu of a polygon and the entire corner + * Such a span can often be passed as an argument in lieu of a polygon or the entire corner * verts array. */ blender::Span corner_verts() const; -- 2.30.2 From ca7f4122da50caeccbbdfc2e55e8d02441657a96 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 7 Jul 2023 07:35:56 -0400 Subject: [PATCH 035/115] Cleanup: Unused variable in mesh writing, C++ casting --- source/blender/blenkernel/intern/mesh.cc | 50 +++++++++++------------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/source/blender/blenkernel/intern/mesh.cc b/source/blender/blenkernel/intern/mesh.cc index 71ce39d84eb..1b13c696d8d 100644 --- a/source/blender/blenkernel/intern/mesh.cc +++ b/source/blender/blenkernel/intern/mesh.cc @@ -78,7 +78,7 @@ static void mesh_tessface_clear_intern(Mesh *mesh, int free_customdata); static void mesh_init_data(ID *id) { - Mesh *mesh = (Mesh *)id; + Mesh *mesh = reinterpret_cast(id); BLI_assert(MEMCMP_STRUCT_AFTER_IS_ZERO(mesh, id)); @@ -97,8 +97,8 @@ static void mesh_init_data(ID *id) static void mesh_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag) { - Mesh *mesh_dst = (Mesh *)id_dst; - const Mesh *mesh_src = (const Mesh *)id_src; + Mesh *mesh_dst = reinterpret_cast(id_dst); + const Mesh *mesh_src = reinterpret_cast(id_src); mesh_dst->runtime = new blender::bke::MeshRuntime(); mesh_dst->runtime->deformed_only = mesh_src->runtime->deformed_only; @@ -197,7 +197,7 @@ void BKE_mesh_free_editmesh(Mesh *mesh) static void mesh_free_data(ID *id) { - Mesh *mesh = (Mesh *)id; + Mesh *mesh = reinterpret_cast(id); BKE_mesh_free_editmesh(mesh); @@ -209,7 +209,7 @@ static void mesh_free_data(ID *id) static void mesh_foreach_id(ID *id, LibraryForeachIDData *data) { - Mesh *mesh = (Mesh *)id; + Mesh *mesh = reinterpret_cast(id); BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, mesh->texcomesh, IDWALK_CB_NEVER_SELF); BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, mesh->key, IDWALK_CB_USER); for (int i = 0; i < mesh->totcol; i++) { @@ -219,7 +219,7 @@ static void mesh_foreach_id(ID *id, LibraryForeachIDData *data) static void mesh_foreach_path(ID *id, BPathForeachPathData *bpath_data) { - Mesh *me = (Mesh *)id; + Mesh *me = reinterpret_cast(id); if (me->ldata.external) { BKE_bpath_foreach_path_fixed_process( bpath_data, me->ldata.external->filepath, sizeof(me->ldata.external->filepath)); @@ -229,16 +229,15 @@ static void mesh_foreach_path(ID *id, BPathForeachPathData *bpath_data) static void mesh_blend_write(BlendWriter *writer, ID *id, const void *id_address) { using namespace blender; - Mesh *mesh = (Mesh *)id; + Mesh *mesh = reinterpret_cast(id); const bool is_undo = BLO_write_is_undo(writer); Vector vert_layers; Vector edge_layers; Vector loop_layers; Vector poly_layers; - blender::ResourceScope temp_arrays_for_legacy_format; - /* cache only - don't write */ + /* Cache only - don't write. */ mesh->mface = nullptr; mesh->totface = 0; memset(&mesh->fdata, 0, sizeof(mesh->fdata)); @@ -270,7 +269,6 @@ static void mesh_blend_write(BlendWriter *writer, ID *id, const void *id_address BLO_write_id_struct(writer, Mesh, id_address, &mesh->id); BKE_id_blend_write(writer, &mesh->id); - /* direct data */ if (mesh->adt) { BKE_animdata_blend_write(writer, mesh->adt); } @@ -286,7 +284,7 @@ static void mesh_blend_write(BlendWriter *writer, ID *id, const void *id_address writer, &mesh->vdata, vert_layers, mesh->totvert, CD_MASK_MESH.vmask, &mesh->id); CustomData_blend_write( writer, &mesh->edata, edge_layers, mesh->totedge, CD_MASK_MESH.emask, &mesh->id); - /* fdata is really a dummy - written so slots align */ + /* `fdata` is cleared above but written so slots align. */ CustomData_blend_write(writer, &mesh->fdata, {}, mesh->totface, CD_MASK_MESH.fmask, &mesh->id); CustomData_blend_write( writer, &mesh->ldata, loop_layers, mesh->totloop, CD_MASK_MESH.lmask, &mesh->id); @@ -300,7 +298,7 @@ static void mesh_blend_write(BlendWriter *writer, ID *id, const void *id_address static void mesh_blend_read_data(BlendDataReader *reader, ID *id) { - Mesh *mesh = (Mesh *)id; + Mesh *mesh = reinterpret_cast(id); BLO_read_pointer_array(reader, (void **)&mesh->mat); /* Deprecated pointers to custom data layers are read here for backward compatibility @@ -315,7 +313,6 @@ static void mesh_blend_read_data(BlendDataReader *reader, ID *id) BLO_read_data_address(reader, &mesh->mselect); - /* animdata */ BLO_read_data_address(reader, &mesh->adt); BKE_animdata_blend_read_data(reader, mesh->adt); @@ -345,7 +342,6 @@ static void mesh_blend_read_data(BlendDataReader *reader, ID *id) mesh->poly_offset_indices); } - /* happens with old files */ if (mesh->mselect == nullptr) { mesh->totselect = 0; } @@ -360,8 +356,8 @@ static void mesh_blend_read_data(BlendDataReader *reader, ID *id) static void mesh_blend_read_lib(BlendLibReader *reader, ID *id) { - Mesh *me = (Mesh *)id; - /* this check added for python created meshes */ + Mesh *me = reinterpret_cast(id); + /* This check added for python created meshes. */ if (me->mat) { for (int i = 0; i < me->totcol; i++) { BLO_read_id_address(reader, id, &me->mat[i]); @@ -378,7 +374,7 @@ static void mesh_blend_read_lib(BlendLibReader *reader, ID *id) static void mesh_read_expand(BlendExpander *expander, ID *id) { - Mesh *me = (Mesh *)id; + Mesh *me = reinterpret_cast(id); for (int a = 0; a < me->totcol; a++) { BLO_expand(expander, me->mat[a]); } @@ -911,9 +907,7 @@ static void mesh_tessface_clear_intern(Mesh *mesh, int free_customdata) Mesh *BKE_mesh_add(Main *bmain, const char *name) { - Mesh *me = (Mesh *)BKE_id_new(bmain, ID_ME, name); - - return me; + return static_cast(BKE_id_new(bmain, ID_ME, name)); } void BKE_mesh_poly_offsets_ensure_alloc(Mesh *mesh) @@ -1045,7 +1039,7 @@ Mesh *BKE_mesh_new_nomain_from_template_ex(const Mesh *me_src, /* Only do tessface if we are creating tessfaces or copying from mesh with only tessfaces. */ const bool do_tessface = (tessface_num || ((me_src->totface != 0) && (me_src->totpoly == 0))); - Mesh *me_dst = (Mesh *)BKE_id_new_nomain(ID_ME, nullptr); + Mesh *me_dst = static_cast(BKE_id_new_nomain(ID_ME, nullptr)); me_dst->mselect = (MSelect *)MEM_dupallocN(me_src->mselect); @@ -1139,7 +1133,7 @@ Mesh *BKE_mesh_from_bmesh_nomain(BMesh *bm, const Mesh *me_settings) { BLI_assert(params->calc_object_remap == false); - Mesh *mesh = (Mesh *)BKE_id_new_nomain(ID_ME, nullptr); + Mesh *mesh = static_cast(BKE_id_new_nomain(ID_ME, nullptr)); BM_mesh_bm_to_me(nullptr, bm, mesh, params); BKE_mesh_copy_parameters_for_eval(mesh, me_settings); return mesh; @@ -1149,7 +1143,7 @@ Mesh *BKE_mesh_from_bmesh_for_eval_nomain(BMesh *bm, const CustomData_MeshMasks *cd_mask_extra, const Mesh *me_settings) { - Mesh *mesh = (Mesh *)BKE_id_new_nomain(ID_ME, nullptr); + Mesh *mesh = static_cast(BKE_id_new_nomain(ID_ME, nullptr)); BM_mesh_bm_to_me_for_eval(bm, mesh, cd_mask_extra); BKE_mesh_copy_parameters_for_eval(mesh, me_settings); return mesh; @@ -1182,7 +1176,7 @@ BoundBox *BKE_mesh_boundbox_get(Object *ob) /* This is Object-level data access, * DO NOT touch to Mesh's bb, would be totally thread-unsafe. */ if (ob->runtime.bb == nullptr || ob->runtime.bb->flag & BOUNDBOX_DIRTY) { - Mesh *me = (Mesh *)ob->data; + Mesh *me = static_cast(ob->data); float min[3], max[3]; INIT_MINMAX(min, max); @@ -1279,7 +1273,7 @@ void BKE_mesh_texspace_get_reference(Mesh *me, float (*BKE_mesh_orco_verts_get(Object *ob))[3] { - Mesh *me = (Mesh *)ob->data; + Mesh *me = static_cast(ob->data); Mesh *tme = me->texcomesh ? me->texcomesh : me; /* Get appropriate vertex coordinates */ @@ -1335,7 +1329,7 @@ Mesh *BKE_mesh_from_object(Object *ob) return nullptr; } if (ob->type == OB_MESH) { - return (Mesh *)ob->data; + return static_cast(ob->data); } return nullptr; @@ -1352,7 +1346,7 @@ void BKE_mesh_assign_object(Main *bmain, Object *ob, Mesh *me) multires_force_sculpt_rebuild(ob); if (ob->type == OB_MESH) { - old = (Mesh *)ob->data; + old = static_cast(ob->data); if (old) { id_us_min(&old->id); } @@ -1841,7 +1835,7 @@ void BKE_mesh_eval_geometry(Depsgraph *depsgraph, Mesh *mesh) mesh->runtime->mesh_eval = nullptr; } if (DEG_is_active(depsgraph)) { - Mesh *mesh_orig = (Mesh *)DEG_get_original_id(&mesh->id); + Mesh *mesh_orig = reinterpret_cast(DEG_get_original_id(&mesh->id)); if (mesh->texspace_flag & ME_TEXSPACE_FLAG_AUTO_EVALUATED) { mesh_orig->texspace_flag |= ME_TEXSPACE_FLAG_AUTO_EVALUATED; copy_v3_v3(mesh_orig->texspace_location, mesh->texspace_location); -- 2.30.2 From 75b42d1d95aaefef77c304b568093f27c1c81cab Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 7 Jul 2023 08:19:52 -0400 Subject: [PATCH 036/115] Cleanup: Move BKE_editmesh_cache.h to C++ See #103343 --- .../blender/blenkernel/BKE_editmesh_cache.h | 40 ------------------- .../blender/blenkernel/BKE_editmesh_cache.hh | 29 ++++++++++++++ source/blender/blenkernel/CMakeLists.txt | 2 +- .../blender/blenkernel/intern/DerivedMesh.cc | 2 +- source/blender/blenkernel/intern/editmesh.cc | 2 +- .../blenkernel/intern/editmesh_cache.cc | 2 +- .../blenkernel/intern/mesh_iterators.cc | 2 +- .../blender/blenkernel/intern/mesh_normals.cc | 2 +- .../blender/blenkernel/intern/mesh_runtime.cc | 2 +- .../blender/blenkernel/intern/mesh_wrapper.cc | 2 +- source/blender/blenkernel/intern/modifier.cc | 2 +- source/blender/blenkernel/intern/object.cc | 2 +- .../blender/blenkernel/intern/object_dupli.cc | 2 +- .../draw_cache_extract_mesh_render_data.cc | 2 +- .../draw/intern/draw_cache_impl_mesh.cc | 2 +- .../blender/draw/intern/draw_manager_text.cc | 2 +- .../intern/mesh_extractors/extract_mesh.hh | 2 +- .../extract_mesh_vbo_mesh_analysis.cc | 2 +- source/blender/modifiers/intern/MOD_wave.cc | 2 +- 19 files changed, 46 insertions(+), 57 deletions(-) delete mode 100644 source/blender/blenkernel/BKE_editmesh_cache.h create mode 100644 source/blender/blenkernel/BKE_editmesh_cache.hh diff --git a/source/blender/blenkernel/BKE_editmesh_cache.h b/source/blender/blenkernel/BKE_editmesh_cache.h deleted file mode 100644 index 0fb2c3bd503..00000000000 --- a/source/blender/blenkernel/BKE_editmesh_cache.h +++ /dev/null @@ -1,40 +0,0 @@ -/* SPDX-FileCopyrightText: 2023 Blender Foundation - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -/** \file - * \ingroup bke - */ - -#ifdef __cplusplus -extern "C" { -#endif - -struct BMEditMesh; - -typedef struct EditMeshData { - /** when set, \a vertexNos, polyNos are lazy initialized */ - float (*vertexCos)[3]; - - /** lazy initialize (when \a vertexCos is set) */ - float const (*vertexNos)[3]; - float const (*polyNos)[3]; - /** also lazy init but don't depend on \a vertexCos */ - const float (*polyCos)[3]; -} EditMeshData; - -void BKE_editmesh_cache_ensure_poly_normals(struct BMEditMesh *em, EditMeshData *emd); -void BKE_editmesh_cache_ensure_vert_normals(struct BMEditMesh *em, EditMeshData *emd); - -void BKE_editmesh_cache_ensure_poly_centers(struct BMEditMesh *em, EditMeshData *emd); - -bool BKE_editmesh_cache_calc_minmax(struct BMEditMesh *em, - EditMeshData *emd, - float min[3], - float max[3]); - -#ifdef __cplusplus -} -#endif diff --git a/source/blender/blenkernel/BKE_editmesh_cache.hh b/source/blender/blenkernel/BKE_editmesh_cache.hh new file mode 100644 index 00000000000..a65794af6ea --- /dev/null +++ b/source/blender/blenkernel/BKE_editmesh_cache.hh @@ -0,0 +1,29 @@ +/* SPDX-FileCopyrightText: 2023 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +/** \file + * \ingroup bke + */ + +struct BMEditMesh; + +struct EditMeshData { + /** when set, \a vertexNos, polyNos are lazy initialized */ + float (*vertexCos)[3]; + + /** lazy initialize (when \a vertexCos is set) */ + float const (*vertexNos)[3]; + float const (*polyNos)[3]; + /** also lazy init but don't depend on \a vertexCos */ + const float (*polyCos)[3]; +}; + +void BKE_editmesh_cache_ensure_poly_normals(BMEditMesh *em, EditMeshData *emd); +void BKE_editmesh_cache_ensure_vert_normals(BMEditMesh *em, EditMeshData *emd); + +void BKE_editmesh_cache_ensure_poly_centers(BMEditMesh *em, EditMeshData *emd); + +bool BKE_editmesh_cache_calc_minmax(BMEditMesh *em, EditMeshData *emd, float min[3], float max[3]); diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index f6538f46542..df30b946cd8 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -379,7 +379,7 @@ set(SRC BKE_editlattice.h BKE_editmesh.h BKE_editmesh_bvh.h - BKE_editmesh_cache.h + BKE_editmesh_cache.hh BKE_editmesh_tangent.h BKE_effect.h BKE_fcurve.h diff --git a/source/blender/blenkernel/intern/DerivedMesh.cc b/source/blender/blenkernel/intern/DerivedMesh.cc index 7a9955350e1..03ea3663d0a 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.cc +++ b/source/blender/blenkernel/intern/DerivedMesh.cc @@ -36,7 +36,7 @@ #include "BKE_colorband.h" #include "BKE_deform.h" #include "BKE_editmesh.h" -#include "BKE_editmesh_cache.h" +#include "BKE_editmesh_cache.hh" #include "BKE_geometry_set.hh" #include "BKE_geometry_set_instances.hh" #include "BKE_key.h" diff --git a/source/blender/blenkernel/intern/editmesh.cc b/source/blender/blenkernel/intern/editmesh.cc index bb88bcd4068..d540faed30d 100644 --- a/source/blender/blenkernel/intern/editmesh.cc +++ b/source/blender/blenkernel/intern/editmesh.cc @@ -18,7 +18,7 @@ #include "BKE_DerivedMesh.h" #include "BKE_customdata.h" #include "BKE_editmesh.h" -#include "BKE_editmesh_cache.h" +#include "BKE_editmesh_cache.hh" #include "BKE_lib_id.h" #include "BKE_mesh.hh" #include "BKE_mesh_iterators.h" diff --git a/source/blender/blenkernel/intern/editmesh_cache.cc b/source/blender/blenkernel/intern/editmesh_cache.cc index 86a7b354c65..555ec29be3b 100644 --- a/source/blender/blenkernel/intern/editmesh_cache.cc +++ b/source/blender/blenkernel/intern/editmesh_cache.cc @@ -17,7 +17,7 @@ #include "DNA_mesh_types.h" #include "BKE_editmesh.h" -#include "BKE_editmesh_cache.h" /* own include */ +#include "BKE_editmesh_cache.hh" /* own include */ /* -------------------------------------------------------------------- */ /** \name Ensure Data (derived from coords) diff --git a/source/blender/blenkernel/intern/mesh_iterators.cc b/source/blender/blenkernel/intern/mesh_iterators.cc index 0ff0d73496c..b36db1abf20 100644 --- a/source/blender/blenkernel/intern/mesh_iterators.cc +++ b/source/blender/blenkernel/intern/mesh_iterators.cc @@ -13,7 +13,7 @@ #include "BKE_customdata.h" #include "BKE_editmesh.h" -#include "BKE_editmesh_cache.h" +#include "BKE_editmesh_cache.hh" #include "BKE_mesh.hh" #include "BKE_mesh_iterators.h" diff --git a/source/blender/blenkernel/intern/mesh_normals.cc b/source/blender/blenkernel/intern/mesh_normals.cc index 99880b18f63..274823b2fbd 100644 --- a/source/blender/blenkernel/intern/mesh_normals.cc +++ b/source/blender/blenkernel/intern/mesh_normals.cc @@ -30,7 +30,7 @@ #include "BKE_attribute.hh" #include "BKE_customdata.h" -#include "BKE_editmesh_cache.h" +#include "BKE_editmesh_cache.hh" #include "BKE_global.h" #include "BKE_mesh.hh" #include "BKE_mesh_mapping.h" diff --git a/source/blender/blenkernel/intern/mesh_runtime.cc b/source/blender/blenkernel/intern/mesh_runtime.cc index 28a372f1329..46ef061fd52 100644 --- a/source/blender/blenkernel/intern/mesh_runtime.cc +++ b/source/blender/blenkernel/intern/mesh_runtime.cc @@ -19,7 +19,7 @@ #include "BLI_timeit.hh" #include "BKE_bvhutils.h" -#include "BKE_editmesh_cache.h" +#include "BKE_editmesh_cache.hh" #include "BKE_lib_id.h" #include "BKE_mesh.hh" #include "BKE_mesh_runtime.h" diff --git a/source/blender/blenkernel/intern/mesh_wrapper.cc b/source/blender/blenkernel/intern/mesh_wrapper.cc index 9b99c809c45..d1e3912ae0d 100644 --- a/source/blender/blenkernel/intern/mesh_wrapper.cc +++ b/source/blender/blenkernel/intern/mesh_wrapper.cc @@ -36,7 +36,7 @@ #include "BKE_DerivedMesh.h" #include "BKE_editmesh.h" -#include "BKE_editmesh_cache.h" +#include "BKE_editmesh_cache.hh" #include "BKE_lib_id.h" #include "BKE_mesh.hh" #include "BKE_mesh_runtime.h" diff --git a/source/blender/blenkernel/intern/modifier.cc b/source/blender/blenkernel/intern/modifier.cc index 94769adc824..68d4c40ceb7 100644 --- a/source/blender/blenkernel/intern/modifier.cc +++ b/source/blender/blenkernel/intern/modifier.cc @@ -47,7 +47,7 @@ #include "BKE_DerivedMesh.h" #include "BKE_appdir.h" #include "BKE_editmesh.h" -#include "BKE_editmesh_cache.h" +#include "BKE_editmesh_cache.hh" #include "BKE_effect.h" #include "BKE_fluid.h" #include "BKE_global.h" diff --git a/source/blender/blenkernel/intern/object.cc b/source/blender/blenkernel/intern/object.cc index b58c4cc3de4..0d3a0219c09 100644 --- a/source/blender/blenkernel/intern/object.cc +++ b/source/blender/blenkernel/intern/object.cc @@ -82,7 +82,7 @@ #include "BKE_displist.h" #include "BKE_duplilist.h" #include "BKE_editmesh.h" -#include "BKE_editmesh_cache.h" +#include "BKE_editmesh_cache.hh" #include "BKE_effect.h" #include "BKE_fcurve.h" #include "BKE_fcurve_driver.h" diff --git a/source/blender/blenkernel/intern/object_dupli.cc b/source/blender/blenkernel/intern/object_dupli.cc index cdd4dc53bcd..5e94534e3ec 100644 --- a/source/blender/blenkernel/intern/object_dupli.cc +++ b/source/blender/blenkernel/intern/object_dupli.cc @@ -37,7 +37,7 @@ #include "BKE_collection.h" #include "BKE_duplilist.h" #include "BKE_editmesh.h" -#include "BKE_editmesh_cache.h" +#include "BKE_editmesh_cache.hh" #include "BKE_geometry_set.hh" #include "BKE_geometry_set_instances.hh" #include "BKE_global.h" diff --git a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc index a094c716965..7dcee1c46dc 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc +++ b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc @@ -17,7 +17,7 @@ #include "BKE_attribute.hh" #include "BKE_editmesh.h" -#include "BKE_editmesh_cache.h" +#include "BKE_editmesh_cache.hh" #include "BKE_mesh.hh" #include "BKE_mesh_runtime.h" diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.cc b/source/blender/draw/intern/draw_cache_impl_mesh.cc index 8b3a06754cb..1d4c52e22e0 100644 --- a/source/blender/draw/intern/draw_cache_impl_mesh.cc +++ b/source/blender/draw/intern/draw_cache_impl_mesh.cc @@ -35,7 +35,7 @@ #include "BKE_customdata.h" #include "BKE_deform.h" #include "BKE_editmesh.h" -#include "BKE_editmesh_cache.h" +#include "BKE_editmesh_cache.hh" #include "BKE_editmesh_tangent.h" #include "BKE_mesh.hh" #include "BKE_mesh_runtime.h" diff --git a/source/blender/draw/intern/draw_manager_text.cc b/source/blender/draw/intern/draw_manager_text.cc index 268ed23a84b..4f407dad9ac 100644 --- a/source/blender/draw/intern/draw_manager_text.cc +++ b/source/blender/draw/intern/draw_manager_text.cc @@ -14,7 +14,7 @@ #include "BLI_string.h" #include "BKE_editmesh.h" -#include "BKE_editmesh_cache.h" +#include "BKE_editmesh_cache.hh" #include "BKE_global.h" #include "BKE_mesh.hh" #include "BKE_mesh_wrapper.h" diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh.hh b/source/blender/draw/intern/mesh_extractors/extract_mesh.hh index 13a75c9a13f..91cdb86c516 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh.hh +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh.hh @@ -19,7 +19,7 @@ #include "BKE_customdata.h" #include "BKE_editmesh.h" -#include "BKE_editmesh_cache.h" +#include "BKE_editmesh_cache.hh" #include "BKE_mesh.h" #include "draw_cache_extract.hh" diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_mesh_analysis.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_mesh_analysis.cc index 72dd2b85a9e..9befff9dca7 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_mesh_analysis.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_mesh_analysis.cc @@ -13,7 +13,7 @@ #include "BKE_bvhutils.h" #include "BKE_editmesh_bvh.h" -#include "BKE_editmesh_cache.h" +#include "BKE_editmesh_cache.hh" #include "extract_mesh.hh" diff --git a/source/blender/modifiers/intern/MOD_wave.cc b/source/blender/modifiers/intern/MOD_wave.cc index 1fdee022959..179d1e280ad 100644 --- a/source/blender/modifiers/intern/MOD_wave.cc +++ b/source/blender/modifiers/intern/MOD_wave.cc @@ -22,7 +22,7 @@ #include "BKE_context.h" #include "BKE_deform.h" #include "BKE_editmesh.h" -#include "BKE_editmesh_cache.h" +#include "BKE_editmesh_cache.hh" #include "BKE_lib_id.h" #include "BKE_lib_query.h" #include "BKE_mesh.hh" -- 2.30.2 From 97634b7f6e09e921cf66af8455dff8a3aa20a047 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 7 Jul 2023 08:50:13 -0400 Subject: [PATCH 037/115] Cleanup: Make format --- source/blender/blenkernel/BKE_mesh_wrapper.h | 1 - source/blender/blenkernel/intern/mesh_wrapper.cc | 1 - 2 files changed, 2 deletions(-) diff --git a/source/blender/blenkernel/BKE_mesh_wrapper.h b/source/blender/blenkernel/BKE_mesh_wrapper.h index ee2367b816d..3f3165a9a34 100644 --- a/source/blender/blenkernel/BKE_mesh_wrapper.h +++ b/source/blender/blenkernel/BKE_mesh_wrapper.h @@ -32,7 +32,6 @@ int BKE_mesh_wrapper_poly_len(const struct Mesh *me); */ const float (*BKE_mesh_wrapper_vert_coords(const struct Mesh *mesh))[3]; - /** * Return a contiguous array of face normal values, if available. * Otherwise, normals are stored in BMesh faces. diff --git a/source/blender/blenkernel/intern/mesh_wrapper.cc b/source/blender/blenkernel/intern/mesh_wrapper.cc index d1e3912ae0d..60cd267c45c 100644 --- a/source/blender/blenkernel/intern/mesh_wrapper.cc +++ b/source/blender/blenkernel/intern/mesh_wrapper.cc @@ -181,7 +181,6 @@ const float (*BKE_mesh_wrapper_vert_coords(const Mesh *mesh))[3] return nullptr; } - const float (*BKE_mesh_wrapper_poly_normals(Mesh *mesh))[3] { switch (mesh->runtime->wrapper_type) { -- 2.30.2 From 6332d1b8a87e72cc3d01e649c75c0eb331497eba Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Fri, 7 Jul 2023 15:05:51 +0200 Subject: [PATCH 038/115] Animation: Improve drawing of locked FCurves Locked `FCurves` had 2 visual issues * the dashing is so short it just creates visual noise * keyframes are drawn in white looking like they are selected This PR changes this by * Increasing the dash width * Keyframes are drawn in black on locked curves * To indicate that they can't be selected, draw them in a X shape * To further reduce visual noise, locked curves no longer draw thicker when selected This is part of the changes discussed in this design task #104867 Pull Request: https://projects.blender.org/blender/blender/pulls/106052 --- .../blender/editors/space_graph/graph_draw.c | 168 +++++++++++------- 1 file changed, 104 insertions(+), 64 deletions(-) diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c index 6c67a7e4ba0..00405a05b75 100644 --- a/source/blender/editors/space_graph/graph_draw.c +++ b/source/blender/editors/space_graph/graph_draw.c @@ -155,7 +155,7 @@ static void set_fcurve_vertex_color(FCurve *fcu, bool sel) } else { /* Curve's points CANNOT BE edited */ - UI_GetThemeColor3fv(sel ? TH_TEXT_HI : TH_TEXT, color); + UI_GetThemeColor3fv(TH_VERTEX, color); } /* Fade the 'intensity' of the vertices based on the selection of the curves too @@ -169,8 +169,30 @@ static void set_fcurve_vertex_color(FCurve *fcu, bool sel) immUniformColor4fv(color); } -static void draw_fcurve_selected_keyframe_vertices( - FCurve *fcu, View2D *v2d, bool edit, bool sel, uint pos) +/* Draw a cross at the given position. Shader must already be bound. + * NOTE: the caller MUST HAVE GL_LINE_SMOOTH & GL_BLEND ENABLED, otherwise the controls don't + * have a consistent appearance (due to off-pixel alignments). + */ +static void draw_cross(float position[2], float scale[2], uint attr_id) +{ + GPU_matrix_push(); + GPU_matrix_translate_2fv(position); + GPU_matrix_scale_2f(1.0f / scale[0], 1.0f / scale[1]); + + /* Draw X shape. */ + const float line_length = 0.7f; + immBegin(GPU_PRIM_LINES, 4); + immVertex2f(attr_id, -line_length, -line_length); + immVertex2f(attr_id, +line_length, +line_length); + + immVertex2f(attr_id, -line_length, +line_length); + immVertex2f(attr_id, +line_length, -line_length); + immEnd(); + + GPU_matrix_pop(); +} + +static void draw_fcurve_selected_keyframe_vertices(FCurve *fcu, View2D *v2d, bool sel, uint pos) { const float fac = 0.05f * BLI_rctf_size_x(&v2d->cur); @@ -185,18 +207,11 @@ static void draw_fcurve_selected_keyframe_vertices( * don't pop in/out due to slight twitches of view size. */ if (IN_RANGE(bezt->vec[1][0], (v2d->cur.xmin - fac), (v2d->cur.xmax + fac))) { - if (edit) { - /* 'Keyframe' vertex only, as handle lines and handles have already been drawn - * - only draw those with correct selection state for the current drawing color - * - - */ - if ((bezt->f2 & SELECT) == sel) { - immVertex2fv(pos, bezt->vec[1]); - } - } - else { - /* no check for selection here, as curve is not editable... */ - /* XXX perhaps we don't want to even draw points? maybe add an option for that later */ + /* 'Keyframe' vertex only, as handle lines and handles have already been drawn + * - only draw those with correct selection state for the current drawing color + * - + */ + if ((bezt->f2 & SELECT) == sel) { immVertex2fv(pos, bezt->vec[1]); } } @@ -205,6 +220,36 @@ static void draw_fcurve_selected_keyframe_vertices( immEnd(); } +static void draw_locked_keyframe_vertices(FCurve *fcu, + View2D *v2d, + const uint attr_id, + const float unit_scale) +{ + const float correction_factor = 0.05f * BLI_rctf_size_x(&v2d->cur); + + /* get view settings */ + const float vertex_size = UI_GetThemeValuef(TH_VERTEX_SIZE); + float scale[2]; + UI_view2d_scale_get(v2d, &scale[0], &scale[1]); + scale[0] /= vertex_size; + /* Dividing by the unit scale is needed to display euler correctly (internally they are radians + * but displayed as degrees) and all curves when normalization is turned on. */ + scale[1] = scale[1] / vertex_size * unit_scale; + + set_fcurve_vertex_color(fcu, false); + + for (int i = 0; i < fcu->totvert; i++) { + BezTriple *bezt = &fcu->bezt[i]; + if (!IN_RANGE(bezt->vec[1][0], + (v2d->cur.xmin - correction_factor), + (v2d->cur.xmax + correction_factor))) { + continue; + } + float position[2] = {bezt->vec[1][0], bezt->vec[1][1]}; + draw_cross(position, scale, attr_id); + } +} + /** * Draw the extra indicator for the active point. */ @@ -232,17 +277,35 @@ static void draw_fcurve_active_vertex(const FCurve *fcu, const View2D *v2d, cons } /* helper func - draw keyframe vertices only for an F-Curve */ -static void draw_fcurve_keyframe_vertices(FCurve *fcu, View2D *v2d, bool edit, uint pos) +static void draw_fcurve_keyframe_vertices( + FCurve *fcu, View2D *v2d, bool edit, const uint pos, const float unit_scale) { - immBindBuiltinProgram(GPU_SHADER_2D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_AA); + if (edit) { + immBindBuiltinProgram(GPU_SHADER_2D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_AA); - immUniform1f("size", UI_GetThemeValuef(TH_VERTEX_SIZE) * UI_SCALE_FAC); + immUniform1f("size", UI_GetThemeValuef(TH_VERTEX_SIZE) * UI_SCALE_FAC); - draw_fcurve_selected_keyframe_vertices(fcu, v2d, edit, false, pos); - draw_fcurve_selected_keyframe_vertices(fcu, v2d, edit, true, pos); - draw_fcurve_active_vertex(fcu, v2d, pos); + draw_fcurve_selected_keyframe_vertices(fcu, v2d, false, pos); + draw_fcurve_selected_keyframe_vertices(fcu, v2d, true, pos); + draw_fcurve_active_vertex(fcu, v2d, pos); - immUnbindProgram(); + immUnbindProgram(); + } + else { + if (U.animation_flag & USER_ANIM_HIGH_QUALITY_DRAWING) { + GPU_line_smooth(true); + } + GPU_blend(GPU_BLEND_ALPHA); + immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); + + draw_locked_keyframe_vertices(fcu, v2d, pos, unit_scale); + + immUnbindProgram(); + GPU_blend(GPU_BLEND_NONE); + if (U.animation_flag & USER_ANIM_HIGH_QUALITY_DRAWING) { + GPU_line_smooth(false); + } + } } /* helper func - draw handle vertices only for an F-Curve (if it is not protected) */ @@ -345,10 +408,8 @@ static void draw_fcurve_handle_vertices(FCurve *fcu, View2D *v2d, bool sel_handl immUnbindProgram(); } -static void draw_fcurve_vertices(ARegion *region, - FCurve *fcu, - bool do_handles, - bool sel_handle_only) +static void draw_fcurve_vertices( + ARegion *region, FCurve *fcu, bool do_handles, bool sel_handle_only, const float unit_scale) { View2D *v2d = ®ion->v2d; @@ -371,7 +432,7 @@ static void draw_fcurve_vertices(ARegion *region, } /* draw keyframes over the handles */ - draw_fcurve_keyframe_vertices(fcu, v2d, !(fcu->flag & FCURVE_PROTECTED), pos); + draw_fcurve_keyframe_vertices(fcu, v2d, !(fcu->flag & FCURVE_PROTECTED), pos, unit_scale); GPU_program_point_size(false); GPU_blend(GPU_BLEND_NONE); @@ -494,40 +555,18 @@ static void draw_fcurve_handles(SpaceGraph *sipo, FCurve *fcu) /* Samples ---------------- */ -/* helper func - draw sample-range marker for an F-Curve as a cross - * NOTE: the caller MUST HAVE GL_LINE_SMOOTH & GL_BLEND ENABLED, otherwise, the controls don't - * have a consistent appearance (due to off-pixel alignments)... - */ -static void draw_fcurve_sample_control( - float x, float y, float xscale, float yscale, float hsize, uint pos) -{ - /* adjust view transform before starting */ - GPU_matrix_push(); - GPU_matrix_translate_2f(x, y); - GPU_matrix_scale_2f(1.0f / xscale * hsize, 1.0f / yscale * hsize); - - /* draw X shape */ - immBegin(GPU_PRIM_LINES, 4); - immVertex2f(pos, -0.7f, -0.7f); - immVertex2f(pos, +0.7f, +0.7f); - - immVertex2f(pos, -0.7f, +0.7f); - immVertex2f(pos, +0.7f, -0.7f); - immEnd(); - - /* restore view transform */ - GPU_matrix_pop(); -} - /* helper func - draw keyframe vertices only for an F-Curve */ -static void draw_fcurve_samples(ARegion *region, FCurve *fcu) +static void draw_fcurve_samples(ARegion *region, FCurve *fcu, const float unit_scale) { FPoint *first, *last; - float hsize, xscale, yscale; + float scale[2]; /* get view settings */ - hsize = UI_GetThemeValuef(TH_VERTEX_SIZE); - UI_view2d_scale_get(®ion->v2d, &xscale, &yscale); + const float hsize = UI_GetThemeValuef(TH_VERTEX_SIZE); + UI_view2d_scale_get(®ion->v2d, &scale[0], &scale[1]); + + scale[0] /= hsize; + scale[1] /= hsize / unit_scale; /* get verts */ first = fcu->fpt; @@ -546,8 +585,8 @@ static void draw_fcurve_samples(ARegion *region, FCurve *fcu) immUniformThemeColor((fcu->flag & FCURVE_SELECTED) ? TH_TEXT_HI : TH_TEXT); - draw_fcurve_sample_control(first->vec[0], first->vec[1], xscale, yscale, hsize, pos); - draw_fcurve_sample_control(last->vec[0], last->vec[1], xscale, yscale, hsize, pos); + draw_cross(first->vec, scale, pos); + draw_cross(last->vec, scale, pos); immUnbindProgram(); @@ -1047,7 +1086,7 @@ static void draw_fcurve(bAnimContext *ac, SpaceGraph *sipo, ARegion *region, bAn { /* set color/drawing style for curve itself */ /* draw active F-Curve thicker than the rest to make it stand out */ - if (fcu->flag & FCURVE_ACTIVE) { + if (fcu->flag & FCURVE_ACTIVE && !BKE_fcurve_is_protected(fcu)) { GPU_line_width(2.5); } else { @@ -1072,8 +1111,8 @@ static void draw_fcurve(bAnimContext *ac, SpaceGraph *sipo, ARegion *region, bAn immUniform2f( "viewport_size", viewport_size[2] / UI_SCALE_FAC, viewport_size[3] / UI_SCALE_FAC); immUniform1i("colors_len", 0); /* Simple dashes. */ - immUniform1f("dash_width", 4.0f); - immUniform1f("udash_factor", 0.5f); + immUniform1f("dash_width", 16.0f * U.scale_factor); + immUniform1f("udash_factor", 0.35f * U.scale_factor); } else { immBindBuiltinProgram(GPU_SHADER_3D_POLYLINE_UNIFORM_COLOR); @@ -1156,7 +1195,7 @@ static void draw_fcurve(bAnimContext *ac, SpaceGraph *sipo, ARegion *region, bAn else if (((fcu->bezt) || (fcu->fpt)) && (fcu->totvert)) { short mapping_flag = ANIM_get_normalization_flags(ac); float offset; - float unit_scale = ANIM_unit_mapping_get_factor( + const float unit_scale = ANIM_unit_mapping_get_factor( ac->scene, ale->id, fcu, mapping_flag, &offset); /* apply unit-scaling to all values via OpenGL */ @@ -1176,11 +1215,12 @@ static void draw_fcurve(bAnimContext *ac, SpaceGraph *sipo, ARegion *region, bAn draw_fcurve_handles(sipo, fcu); } - draw_fcurve_vertices(region, fcu, do_handles, (sipo->flag & SIPO_SELVHANDLESONLY)); + draw_fcurve_vertices( + region, fcu, do_handles, (sipo->flag & SIPO_SELVHANDLESONLY), unit_scale); } else { /* samples: only draw two indicators at either end as indicators */ - draw_fcurve_samples(region, fcu); + draw_fcurve_samples(region, fcu, unit_scale); } GPU_matrix_pop(); -- 2.30.2 From 79b2e8f211249e6527c41596932460be4aef6604 Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Fri, 7 Jul 2023 15:08:40 +0200 Subject: [PATCH 039/115] Animation: Allow setting the slider unit and mode Split off from [#106952: Animation: Butterworth Smoothing filter](https://projects.blender.org/blender/blender/pulls/106952) This patch allows the slider to take a different string than just "%", the use case is on #106952 where we want to display "Hz" instead. Additionally the slider got the ability to set modes, which determine how the factor number is displayed. `SLIDER_MODE_PERCENT` means it will multiply by 100 and display as whole numbers `SLIDER_MODE_FLOAT` means it will display just floats with one digit after the comma Additionally to that, because the slider range is now arbitrary and potentially deals with large numbers, the mouse distance needed to travel from min to max has been normalized to the range. Pull Request: https://projects.blender.org/blender/blender/pulls/109768 --- source/blender/editors/include/ED_util.h | 4 ++ source/blender/editors/util/ed_draw.c | 58 ++++++++++++++++++------ 2 files changed, 49 insertions(+), 13 deletions(-) diff --git a/source/blender/editors/include/ED_util.h b/source/blender/editors/include/ED_util.h index bbeb102c5b2..f06dd6384cc 100644 --- a/source/blender/editors/include/ED_util.h +++ b/source/blender/editors/include/ED_util.h @@ -73,6 +73,7 @@ void ED_region_image_metadata_draw( /* Slider */ struct tSlider; +typedef enum SliderMode { SLIDER_MODE_PERCENT = 0, SLIDER_MODE_FLOAT = 1 } SliderMode; struct tSlider *ED_slider_create(struct bContext *C); /** @@ -106,6 +107,9 @@ void ED_slider_factor_bounds_set(struct tSlider *slider, float lower_bound, floa bool ED_slider_allow_increments_get(struct tSlider *slider); void ED_slider_allow_increments_set(struct tSlider *slider, bool value); +void ED_slider_mode_set(struct tSlider *slider, SliderMode unit); +void ED_slider_unit_set(struct tSlider *slider, const char *unit); + /* ************** XXX OLD CRUFT WARNING ************* */ /** diff --git a/source/blender/editors/util/ed_draw.c b/source/blender/editors/util/ed_draw.c index 985cc4d310d..7b453294a98 100644 --- a/source/blender/editors/util/ed_draw.c +++ b/source/blender/editors/util/ed_draw.c @@ -56,6 +56,7 @@ #define SLIDE_PIXEL_DISTANCE (300.0f * UI_SCALE_FAC) #define OVERSHOOT_RANGE_DELTA 0.2f +#define SLIDER_UNIT_STRING_SIZE 64 typedef struct tSlider { Scene *scene; @@ -79,6 +80,12 @@ typedef struct tSlider { /** Range of the slider without overshoot. */ float factor_bounds[2]; + /* How the factor number is drawn. When drawing percent it is factor*100. */ + SliderMode slider_mode; + + /* What unit to add to the slider. */ + char unit_string[SLIDER_UNIT_STRING_SIZE]; + /** Enable range beyond factor_bounds. * This is set by the code that uses the slider, as not all operations support * extrapolation. */ @@ -328,8 +335,6 @@ static void slider_draw(const bContext *UNUSED(C), ARegion *region, void *arg) } } - char percentage_string[256]; - /* Draw handle indicating current factor. */ const rctf handle_rect = { .xmin = handle_pos_x - (line_width), @@ -339,26 +344,39 @@ static void slider_draw(const bContext *UNUSED(C), ARegion *region, void *arg) }; UI_draw_roundbox_3ub_alpha(&handle_rect, true, 1, color_handle, 255); - SNPRINTF(percentage_string, "%.0f%%", slider->factor * 100); - /* Draw percentage string. */ - float percentage_string_pixel_size[2]; + char factor_string[256]; + switch (slider->slider_mode) { + case SLIDER_MODE_PERCENT: + SNPRINTF(factor_string, "%.0f %s", slider->factor * 100, slider->unit_string); + break; + case SLIDER_MODE_FLOAT: + SNPRINTF(factor_string, "%.1f %s", slider->factor, slider->unit_string); + break; + } + + /* Draw factor string. */ + float factor_string_pixel_size[2]; BLF_width_and_height(fontid, - percentage_string, - sizeof(percentage_string), - &percentage_string_pixel_size[0], - &percentage_string_pixel_size[1]); + factor_string, + sizeof(factor_string), + &factor_string_pixel_size[0], + &factor_string_pixel_size[1]); BLF_position(fontid, - main_line_rect.xmin - 24.0 * U.pixelsize - percentage_string_pixel_size[0] / 2, - (region->winy / 2) - percentage_string_pixel_size[1] / 2, + main_line_rect.xmin - 24.0 * U.pixelsize - factor_string_pixel_size[0] / 2, + (region->winy / 2) - factor_string_pixel_size[1] / 2, 0.0f); - BLF_draw(fontid, percentage_string, sizeof(percentage_string)); + BLF_draw(fontid, factor_string, sizeof(factor_string)); } static void slider_update_factor(tSlider *slider, const wmEvent *event) { - const float factor_delta = (event->xy[0] - slider->last_cursor[0]) / SLIDE_PIXEL_DISTANCE; + /* Normalize so no matter the factor bounds, the mouse distance travelled from min to max is + * constant. */ + const float slider_range = slider->factor_bounds[1] - slider->factor_bounds[0]; + const float factor_delta = (event->xy[0] - slider->last_cursor[0]) / + (SLIDE_PIXEL_DISTANCE / slider_range); /* Reduced factor delta in precision mode (shift held). */ slider->raw_factor += slider->precision ? (factor_delta / 8) : factor_delta; slider->factor = slider->raw_factor; @@ -396,6 +414,10 @@ tSlider *ED_slider_create(bContext *C) slider->factor_bounds[0] = 0; slider->factor_bounds[1] = 1; + slider->unit_string[0] = "%"; + + slider->slider_mode = SLIDER_MODE_PERCENT; + /* Set initial factor. */ slider->raw_factor = 0.5f; slider->factor = 0.5; @@ -554,6 +576,16 @@ void ED_slider_factor_bounds_set(tSlider *slider, slider->factor_bounds[1] = factor_bound_upper; } +void ED_slider_mode_set(tSlider *slider, SliderMode mode) +{ + slider->slider_mode = mode; +} + +void ED_slider_unit_set(tSlider *slider, const char *unit) +{ + BLI_strncpy(slider->unit_string, unit, SLIDER_UNIT_STRING_SIZE); +} + /** \} */ void ED_region_draw_mouse_line_cb(const bContext *C, ARegion *region, void *arg_info) -- 2.30.2 From f0ee4c3ffefbe93f0d1f6b711498ad9434276d0b Mon Sep 17 00:00:00 2001 From: Ray Molenkamp Date: Fri, 7 Jul 2023 15:37:02 +0200 Subject: [PATCH 040/115] Cleanup: Cmake: use alias target for bf_intern_atomic This introduces an alias target `bf::intern::atomic` for `bf_intern_atomic`. This has the following benefits: - Any target name with `::` in it will be recognized as an actual target by cmake, rather than a library name it may not know about. and will be validated by cmake to exist. Which means if you make a typo in the LIB section, CMake will error out telling you it doesn't know about this specific target rather than passing it on to the build system, where you'll either get build or linker errors because of said typo. - Given there is quite a cleanup still to do in the build system, it won't always be obvious which targets have been updated to modern targets and which still need to be done. Having a namespaced target name is a good indicator there. Pull Request: https://projects.blender.org/blender/blender/pulls/109784 --- intern/atomic/CMakeLists.txt | 2 ++ intern/guardedalloc/CMakeLists.txt | 2 +- source/blender/blenkernel/CMakeLists.txt | 2 +- source/blender/blenlib/CMakeLists.txt | 2 +- source/blender/blenlib/tests/performance/CMakeLists.txt | 2 +- source/blender/bmesh/CMakeLists.txt | 2 +- source/blender/compositor/CMakeLists.txt | 2 +- source/blender/depsgraph/CMakeLists.txt | 2 +- source/blender/draw/CMakeLists.txt | 2 +- source/blender/editors/sculpt_paint/CMakeLists.txt | 2 +- source/blender/editors/space_file/CMakeLists.txt | 2 +- source/blender/editors/space_sequencer/CMakeLists.txt | 2 +- source/blender/gpu/CMakeLists.txt | 2 +- source/blender/makesdna/intern/CMakeLists.txt | 4 ++-- source/blender/makesrna/intern/CMakeLists.txt | 2 +- source/blender/render/CMakeLists.txt | 2 +- source/blender/sequencer/CMakeLists.txt | 2 +- 17 files changed, 19 insertions(+), 17 deletions(-) diff --git a/intern/atomic/CMakeLists.txt b/intern/atomic/CMakeLists.txt index 42ab86d1ca5..39f29be97ae 100644 --- a/intern/atomic/CMakeLists.txt +++ b/intern/atomic/CMakeLists.txt @@ -10,7 +10,9 @@ set(INC_SYS ) add_library(bf_intern_atomic INTERFACE) + target_include_directories(bf_intern_atomic INTERFACE .) +add_library(bf::intern::atomic ALIAS bf_intern_atomic) # CMake 3.19+ allows one to populate the interface library with # source files to show in the IDE, for people on older CMake versions diff --git a/intern/guardedalloc/CMakeLists.txt b/intern/guardedalloc/CMakeLists.txt index 7660af2bd5c..f96156e3171 100644 --- a/intern/guardedalloc/CMakeLists.txt +++ b/intern/guardedalloc/CMakeLists.txt @@ -35,7 +35,7 @@ set(SRC ) set(LIB - PRIVATE bf_intern_atomic + PRIVATE bf::intern::atomic ) if(WIN32 AND NOT UNIX) diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index df30b946cd8..4629495d2e6 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -557,7 +557,7 @@ set(LIB bf_shader_fx bf_simulation extern_fmtlib - PRIVATE bf_intern_atomic + PRIVATE bf::intern::atomic # For `vfontdata_freetype.c`. ${FREETYPE_LIBRARIES} ${BROTLI_LIBRARIES} ) diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt index 7ed080d4905..1d6fef955fd 100644 --- a/source/blender/blenlib/CMakeLists.txt +++ b/source/blender/blenlib/CMakeLists.txt @@ -393,7 +393,7 @@ set(LIB bf_intern_eigen bf_intern_guardedalloc extern_wcwidth - PRIVATE bf_intern_atomic + PRIVATE bf::intern::atomic ${ZLIB_LIBRARIES} ${ZSTD_LIBRARIES} ) diff --git a/source/blender/blenlib/tests/performance/CMakeLists.txt b/source/blender/blenlib/tests/performance/CMakeLists.txt index e763f05086c..e3207de027e 100644 --- a/source/blender/blenlib/tests/performance/CMakeLists.txt +++ b/source/blender/blenlib/tests/performance/CMakeLists.txt @@ -16,7 +16,7 @@ set(INC_SYS set(LIB PRIVATE bf_blenlib PRIVATE bf_intern_guardedalloc - PRIVATE bf_intern_atomic + PRIVATE bf::intern::atomic ) blender_add_performancetest_executable(BLI_ghash_performance "BLI_ghash_performance_test.cc" "${INC}" "${INC_SYS}" "${LIB}") diff --git a/source/blender/bmesh/CMakeLists.txt b/source/blender/bmesh/CMakeLists.txt index 4bcbfd974cf..c983443372f 100644 --- a/source/blender/bmesh/CMakeLists.txt +++ b/source/blender/bmesh/CMakeLists.txt @@ -172,7 +172,7 @@ set(LIB bf_blenkernel bf_blenlib extern_rangetree - PRIVATE bf_intern_atomic + PRIVATE bf::intern::atomic ) if(WITH_BULLET) diff --git a/source/blender/compositor/CMakeLists.txt b/source/blender/compositor/CMakeLists.txt index 8976bd846b8..b3d0716e480 100644 --- a/source/blender/compositor/CMakeLists.txt +++ b/source/blender/compositor/CMakeLists.txt @@ -602,7 +602,7 @@ if(WITH_COMPOSITOR_CPU) bf_blenkernel bf_blenlib extern_clew - PRIVATE bf_intern_atomic + PRIVATE bf::intern::atomic ) list(APPEND INC diff --git a/source/blender/depsgraph/CMakeLists.txt b/source/blender/depsgraph/CMakeLists.txt index c14dc661349..e04f235cee6 100644 --- a/source/blender/depsgraph/CMakeLists.txt +++ b/source/blender/depsgraph/CMakeLists.txt @@ -155,7 +155,7 @@ set(SRC set(LIB bf_blenkernel - PRIVATE bf_intern_atomic + PRIVATE bf::intern::atomic ) if(WITH_PYTHON) diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index 38b783f21e9..5fb334aa7dd 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -361,7 +361,7 @@ set(LIB bf_blenlib bf_realtime_compositor bf_windowmanager - PRIVATE bf_intern_atomic + PRIVATE bf::intern::atomic ) set(GLSL_SRC diff --git a/source/blender/editors/sculpt_paint/CMakeLists.txt b/source/blender/editors/sculpt_paint/CMakeLists.txt index 38949215682..1af93781129 100644 --- a/source/blender/editors/sculpt_paint/CMakeLists.txt +++ b/source/blender/editors/sculpt_paint/CMakeLists.txt @@ -97,7 +97,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib - PRIVATE bf_intern_atomic + PRIVATE bf::intern::atomic ) if(WITH_TBB) diff --git a/source/blender/editors/space_file/CMakeLists.txt b/source/blender/editors/space_file/CMakeLists.txt index 76388b6597a..c09f2d698ff 100644 --- a/source/blender/editors/space_file/CMakeLists.txt +++ b/source/blender/editors/space_file/CMakeLists.txt @@ -51,7 +51,7 @@ set(SRC set(LIB bf_blenkernel extern_fmtlib - PRIVATE bf_intern_atomic + PRIVATE bf::intern::atomic ) if(WIN32) diff --git a/source/blender/editors/space_sequencer/CMakeLists.txt b/source/blender/editors/space_sequencer/CMakeLists.txt index 3d1d4f98cac..efdec92d2df 100644 --- a/source/blender/editors/space_sequencer/CMakeLists.txt +++ b/source/blender/editors/space_sequencer/CMakeLists.txt @@ -55,7 +55,7 @@ set(SRC set(LIB bf_editor_interface bf_editor_util - PRIVATE bf_intern_atomic + PRIVATE bf::intern::atomic ) if(WITH_AUDASPACE) diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt index 14953eaa789..a82a1ef9dcf 100644 --- a/source/blender/gpu/CMakeLists.txt +++ b/source/blender/gpu/CMakeLists.txt @@ -326,7 +326,7 @@ set(METAL_SRC ) set(LIB - PRIVATE bf_intern_atomic + PRIVATE bf::intern::atomic ${Epoxy_LIBRARIES} ) diff --git a/source/blender/makesdna/intern/CMakeLists.txt b/source/blender/makesdna/intern/CMakeLists.txt index 3a84bc3c336..c7a195a6704 100644 --- a/source/blender/makesdna/intern/CMakeLists.txt +++ b/source/blender/makesdna/intern/CMakeLists.txt @@ -93,7 +93,7 @@ setup_platform_linker_flags(makesdna) setup_platform_linker_libs(makesdna) blender_target_include_dirs(makesdna ${INC}) blender_target_include_dirs_sys(makesdna ${INC_SYS}) -target_link_libraries(makesdna PRIVATE bf_intern_atomic) +target_link_libraries(makesdna PRIVATE bf::intern::atomic) if(WIN32 AND NOT UNIX) if(DEFINED PTHREADS_LIBRARIES) @@ -160,7 +160,7 @@ set(SRC ) set(LIB - PRIVATE bf_intern_atomic + PRIVATE bf::intern::atomic ) blender_add_lib(bf_dna_blenlib "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt index 2c7fd5590d6..d0b9be2dc01 100644 --- a/source/blender/makesrna/intern/CMakeLists.txt +++ b/source/blender/makesrna/intern/CMakeLists.txt @@ -433,7 +433,7 @@ blender_target_include_dirs(makesrna ${INC}) blender_target_include_dirs_sys(makesrna ${INC_SYS}) target_link_libraries(makesrna PRIVATE bf_dna) -target_link_libraries(makesrna PRIVATE bf_intern_atomic) +target_link_libraries(makesrna PRIVATE bf::intern::atomic) target_link_libraries(makesrna PRIVATE bf_dna_blenlib) if(WIN32 AND NOT UNIX) diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt index e311581030f..4bb69d9df28 100644 --- a/source/blender/render/CMakeLists.txt +++ b/source/blender/render/CMakeLists.txt @@ -61,7 +61,7 @@ set(SRC set(LIB bf_realtime_compositor - PRIVATE bf_intern_atomic + PRIVATE bf::intern::atomic ) if(WITH_PYTHON) diff --git a/source/blender/sequencer/CMakeLists.txt b/source/blender/sequencer/CMakeLists.txt index ae22c484dca..89ad1054f9b 100644 --- a/source/blender/sequencer/CMakeLists.txt +++ b/source/blender/sequencer/CMakeLists.txt @@ -90,7 +90,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib - PRIVATE bf_intern_atomic + PRIVATE bf::intern::atomic ) if(WITH_AUDASPACE) -- 2.30.2 From 17a58f7db004fe3fb2089b6fb62b048e190f12b4 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Fri, 7 Jul 2023 15:37:26 +0200 Subject: [PATCH 041/115] Eevee-next: Reflection Probe Packing All probes (including the world background probe) are stored in a single texture. Each probe can be of any resolution as long as it is a power of 2 and not larger than 2048. So valid options are (2048x2048, 1024x1024, 512x512, etc). Each probe can be stored in their own resolution and can be set by the user. > NOTE: Eventually we would like to add automatic resolution selection. The probes are packed in an 2d texture array with the dimension of 2048*2048. The number of layers depends on the actual needed layers. If more layers are needed the texture will be recreated. This can happen when a new reflection probe is added, or an existing reflection probe is made visible to the scene or its resolution is changed. ### Octahedral mapping Probes are rendered into a cubemap. To reduce memory needs and improve sampling performance the cubemap is stored in octahedral mapping space. This is done in `eevee_reflection_probe_remap_comp.glsl`. The regular octahedral mapping has been extended to fix leakages at the edges of the texture and to be able to be used on an atlas texture and by sampling the texture once. To reduce sampling cost and improve the quality we add an border around the octahedral map and extend the octahedral coordinates. This also allows us to generate lower resolution mipmaps of the atlas texture using 2x2 box filtering from a higher resolution. ### Subdivisions and areas Probes data are stored besides the texture. The data is used to find out where the probe is stored in the texture. It is also used to find free space to store new probes. This approach ensures that we can be flexible at storing probes with different resolutions on the same layer. Lets see an example how that works Code-wise this is implemented by `ProbeLocationFinder`. ProbeLocationFinder can view a texture in a given subdivision level and mark areas that are covered by probes. When finding a free spot it returns the first empty area. **Notes** * Currently the cubemap is rendered with a fixed resolution and mipmaps are generated in order to increase the quality of the atlas. Eventually we should use dynamic resolution and no mipmaps. This will be done as part of the light probe baking change. Pull Request: https://projects.blender.org/blender/blender/pulls/109688 --- .../bl_ui/properties_data_lightprobe.py | 4 + scripts/startup/bl_ui/properties_world.py | 22 + .../blenloader/intern/versioning_400.cc | 14 + .../draw/engines/eevee_next/eevee_defines.hh | 8 + .../draw/engines/eevee_next/eevee_instance.cc | 4 +- .../eevee_next/eevee_reflection_probes.cc | 456 +++++++++++++++++- .../eevee_next/eevee_reflection_probes.hh | 96 +++- .../engines/eevee_next/eevee_shader_shared.hh | 41 ++ .../draw/engines/eevee_next/eevee_sync.cc | 12 + .../draw/engines/eevee_next/eevee_sync.hh | 1 + .../draw/engines/eevee_next/eevee_view.cc | 1 + .../draw/engines/eevee_next/eevee_world.cc | 1 + .../shaders/eevee_deferred_light_frag.glsl | 2 +- .../eevee_lightprobe_irradiance_ray_comp.glsl | 2 +- .../shaders/eevee_octahedron_lib.glsl | 45 ++ .../eevee_reflection_probe_eval_lib.glsl | 66 ++- .../shaders/eevee_reflection_probe_lib.glsl | 14 +- .../eevee_reflection_probe_remap_comp.glsl | 27 +- .../shaders/eevee_surfel_ray_comp.glsl | 2 +- .../infos/eevee_reflection_probe_info.hh | 9 + .../makesdna/DNA_lightprobe_defaults.h | 1 + .../blender/makesdna/DNA_lightprobe_types.h | 15 +- source/blender/makesdna/DNA_world_defaults.h | 2 + source/blender/makesdna/DNA_world_types.h | 8 +- .../blender/makesrna/intern/rna_lightprobe.cc | 16 + source/blender/makesrna/intern/rna_world.cc | 18 + 26 files changed, 842 insertions(+), 45 deletions(-) diff --git a/scripts/startup/bl_ui/properties_data_lightprobe.py b/scripts/startup/bl_ui/properties_data_lightprobe.py index 86fd852ac5b..26c393dd021 100644 --- a/scripts/startup/bl_ui/properties_data_lightprobe.py +++ b/scripts/startup/bl_ui/properties_data_lightprobe.py @@ -111,6 +111,10 @@ class DATA_PT_lightprobe_eevee_next(DataButtonsPanel, Panel): col.prop(probe, "grid_bake_samples") col.prop(probe, "surfel_density") + elif probe.type == 'CUBEMAP': + col = layout.column() + col.prop(probe, "resolution") + elif probe.type == 'PLANAR': # Currently unsupported pass diff --git a/scripts/startup/bl_ui/properties_world.py b/scripts/startup/bl_ui/properties_world.py index 870e208ed4d..7bf68ebcef2 100644 --- a/scripts/startup/bl_ui/properties_world.py +++ b/scripts/startup/bl_ui/properties_world.py @@ -148,6 +148,27 @@ class EEVEE_WORLD_PT_volume(WorldButtonsPanel, Panel): layout.label(text="No output node") +class EEVEE_WORLD_PT_probe(WorldButtonsPanel, Panel): + bl_label = "Probe" + bl_translation_context = i18n_contexts.id_id + bl_options = {'DEFAULT_CLOSED'} + COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'} + + @classmethod + def poll(cls, context): + engine = context.engine + world = context.world + return world and (engine in cls.COMPAT_ENGINES) + + def draw(self, context): + layout = self.layout + + world = context.world + + layout.use_property_split = True + layout.prop(world, "probe_resolution") + + class WORLD_PT_viewport_display(WorldButtonsPanel, Panel): bl_label = "Viewport Display" bl_options = {'DEFAULT_CLOSED'} @@ -169,6 +190,7 @@ classes = ( EEVEE_WORLD_PT_surface, EEVEE_WORLD_PT_volume, EEVEE_WORLD_PT_mist, + EEVEE_WORLD_PT_probe, WORLD_PT_viewport_display, WORLD_PT_custom_props, ) diff --git a/source/blender/blenloader/intern/versioning_400.cc b/source/blender/blenloader/intern/versioning_400.cc index 7a9b0ffdb09..623cc87e347 100644 --- a/source/blender/blenloader/intern/versioning_400.cc +++ b/source/blender/blenloader/intern/versioning_400.cc @@ -14,6 +14,7 @@ #include "DNA_modifier_types.h" #include "DNA_movieclip_types.h" #include "DNA_scene_types.h" +#include "DNA_world_types.h" #include "DNA_genfile.h" @@ -286,6 +287,19 @@ void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain) } } + /* Set default bake resolution. */ + if (!DNA_struct_elem_find(fd->filesdna, "LightProbe", "int", "resolution")) { + LISTBASE_FOREACH (LightProbe *, lightprobe, &bmain->lightprobes) { + lightprobe->resolution = LIGHT_PROBE_RESOLUTION_1024; + } + } + + if (!DNA_struct_elem_find(fd->filesdna, "World", "int", "probe_resolution")) { + LISTBASE_FOREACH (World *, world, &bmain->worlds) { + world->probe_resolution = LIGHT_PROBE_RESOLUTION_1024; + } + } + /* Clear removed "Z Buffer" flag. */ { const int R_IMF_FLAG_ZBUF_LEGACY = 1 << 0; diff --git a/source/blender/draw/engines/eevee_next/eevee_defines.hh b/source/blender/draw/engines/eevee_next/eevee_defines.hh index c9708924de7..41311c921ab 100644 --- a/source/blender/draw/engines/eevee_next/eevee_defines.hh +++ b/source/blender/draw/engines/eevee_next/eevee_defines.hh @@ -27,7 +27,12 @@ #define CULLING_TILE_GROUP_SIZE 256 /* Reflection Probes. */ +#define REFLECTION_PROBES_MAX 256 #define REFLECTION_PROBE_GROUP_SIZE 16 +/* Number of additional pixels on the border of an octahedral map to reserve for fixing seams. + * Border size requires depends on the max number of mipmap levels. */ +#define REFLECTION_PROBE_MIPMAP_LEVELS 5 +#define REFLECTION_PROBE_BORDER_SIZE float(1 << (REFLECTION_PROBE_MIPMAP_LEVELS - 1)) /** * IMPORTANT: Some data packing are tweaked for these values. @@ -133,6 +138,9 @@ #define HIZ_BUF_SLOT 3 #define IRRADIANCE_GRID_BUF_SLOT 4 #define AO_BUF_SLOT 5 +/* SLOT 6 is used by render shaders (Film, DoF and Motion Blur). Need to check if it should be + * assigned a different slot. */ +#define REFLECTION_PROBE_BUF_SLOT 7 /* Only during pre-pass. */ #define VELOCITY_CAMERA_PREV_BUF 3 #define VELOCITY_CAMERA_CURR_BUF 4 diff --git a/source/blender/draw/engines/eevee_next/eevee_instance.cc b/source/blender/draw/engines/eevee_next/eevee_instance.cc index 226ad3a3917..7d95631a127 100644 --- a/source/blender/draw/engines/eevee_next/eevee_instance.cc +++ b/source/blender/draw/engines/eevee_next/eevee_instance.cc @@ -138,6 +138,7 @@ void Instance::begin_sync() shadows.begin_sync(); pipelines.begin_sync(); cryptomatte.begin_sync(); + reflection_probes.begin_sync(); light_probes.begin_sync(); gpencil_engine_enabled = false; @@ -215,7 +216,7 @@ void Instance::object_sync(Object *ob) sync.sync_gpencil(ob, ob_handle, res_handle); break; case OB_LIGHTPROBE: - light_probes.sync_probe(ob, ob_handle); + sync.sync_light_probe(ob, ob_handle); break; default: break; @@ -247,6 +248,7 @@ void Instance::end_sync() cryptomatte.end_sync(); pipelines.end_sync(); light_probes.end_sync(); + reflection_probes.end_sync(); } void Instance::render_sync() diff --git a/source/blender/draw/engines/eevee_next/eevee_reflection_probes.cc b/source/blender/draw/engines/eevee_next/eevee_reflection_probes.cc index 3394d36b782..5c9b7ed1e9e 100644 --- a/source/blender/draw/engines/eevee_next/eevee_reflection_probes.cc +++ b/source/blender/draw/engines/eevee_next/eevee_reflection_probes.cc @@ -5,26 +5,51 @@ #include "eevee_reflection_probes.hh" #include "eevee_instance.hh" +/* Generate dummy light probe texture. + * + * Baking of Light probes aren't implemented yet. For testing purposes this can be enabled to + * generate a dummy texture. + */ +#define GENERATE_DUMMY_LIGHT_PROBE_TEXTURE false + namespace blender::eevee { void ReflectionProbeModule::init() { - if (!initialized_) { - initialized_ = true; + if (probes_.is_empty()) { + ReflectionProbeData init_probe_data = {}; + init_probe_data.layer = -1; + for (int i : IndexRange(REFLECTION_PROBES_MAX)) { + data_buf_[i] = init_probe_data; + } + + /* Initialize the world probe. */ + ReflectionProbeData world_probe_data{}; + world_probe_data.layer = 0; + world_probe_data.layer_subdivision = 0; + world_probe_data.area_index = 0; + world_probe_data.pos = float3(0.0f); + data_buf_[0] = world_probe_data; + + ReflectionProbe world_probe; + world_probe.type = ReflectionProbe::Type::World; + world_probe.do_update_data = true; + world_probe.do_render = true; + world_probe.index = 0; + probes_.add(world_object_key_, world_probe); - const int max_mipmap_levels = log(max_resolution_) + 1; probes_tx_.ensure_2d_array(GPU_RGBA16F, int2(max_resolution_), - max_probes_, + init_num_probes_, GPU_TEXTURE_USAGE_SHADER_WRITE, nullptr, - max_mipmap_levels); + REFLECTION_PROBE_MIPMAP_LEVELS); GPU_texture_mipmap_mode(probes_tx_, true, true); /* Cube-map is half of the resolution of the octahedral map. */ cubemap_tx_.ensure_cube( - GPU_RGBA16F, max_resolution_ / 2, GPU_TEXTURE_USAGE_ATTACHMENT, nullptr, 1); - GPU_texture_mipmap_mode(cubemap_tx_, false, true); + GPU_RGBA16F, max_resolution_ / 2, GPU_TEXTURE_USAGE_ATTACHMENT, nullptr, 9999); + GPU_texture_mipmap_mode(cubemap_tx_, true, true); } { @@ -33,13 +58,428 @@ void ReflectionProbeModule::init() pass.shader_set(instance_.shaders.static_shader_get(REFLECTION_PROBE_REMAP)); pass.bind_texture("cubemap_tx", cubemap_tx_); pass.bind_image("octahedral_img", probes_tx_); - pass.dispatch(int2(ceil_division(max_resolution_, REFLECTION_PROBE_GROUP_SIZE))); + pass.bind_ssbo(REFLECTION_PROBE_BUF_SLOT, data_buf_); + pass.dispatch(&dispatch_probe_pack_); + } +} +void ReflectionProbeModule::begin_sync() +{ + for (ReflectionProbe &reflection_probe : probes_.values()) { + if (reflection_probe.type == ReflectionProbe::Type::Probe) { + reflection_probe.is_probe_used = false; + } } } +int ReflectionProbeModule::needed_layers_get() const +{ + const int max_probe_data_index = reflection_probe_data_index_max(); + int max_layer = 0; + for (const ReflectionProbeData &data : + Span(data_buf_.data(), max_probe_data_index + 1)) + { + max_layer = max_ii(max_layer, data.layer); + } + return max_layer + 1; +} + +void ReflectionProbeModule::sync(const ReflectionProbe &probe) +{ + switch (probe.type) { + case ReflectionProbe::Type::World: { + break; + } + case ReflectionProbe::Type::Probe: { + if (probe.do_render) { + upload_dummy_texture(probe); + } + break; + } + case ReflectionProbe::Type::Unused: { + break; + } + } +} + +static int layer_subdivision_for(const int max_resolution, + const eLightProbeResolution probe_resolution) +{ + int i_probe_resolution = int(probe_resolution); + return max_ii(int(log2(max_resolution)) - i_probe_resolution, 0); +} + +void ReflectionProbeModule::sync_world(::World *world, WorldHandle & /*ob_handle*/) +{ + const ReflectionProbe &probe = probes_.lookup(world_object_key_); + ReflectionProbeData &probe_data = data_buf_[probe.index]; + probe_data.layer_subdivision = layer_subdivision_for( + max_resolution_, static_cast(world->probe_resolution)); +} + +void ReflectionProbeModule::sync_object(Object *ob, ObjectHandle &ob_handle) +{ +#if GENERATE_DUMMY_LIGHT_PROBE_TEXTURE + const ::LightProbe *light_probe = (::LightProbe *)ob->data; + if (light_probe->type != LIGHTPROBE_TYPE_CUBE) { + return; + } + const bool is_dirty = ob_handle.recalc != 0; + int subdivision = layer_subdivision_for( + max_resolution_, static_cast(light_probe->resolution)); + ReflectionProbe &probe = find_or_insert(ob_handle, subdivision); + probe.do_update_data |= is_dirty; + probe.is_probe_used = true; + + ReflectionProbeData &probe_data = data_buf_[probe.index]; + probe_data.pos = float3(float4x4(ob->object_to_world) * float4(0.0, 0.0, 0.0, 1.0)); + probe_data.layer_subdivision = subdivision; +#else + UNUSED_VARS(ob, ob_handle); +#endif +} + +ReflectionProbe &ReflectionProbeModule::find_or_insert(ObjectHandle &ob_handle, + int subdivision_level) +{ + ReflectionProbe &reflection_probe = probes_.lookup_or_add_cb( + ob_handle.object_key.hash_value, [this, subdivision_level]() { + ReflectionProbe probe; + ReflectionProbeData probe_data = find_empty_reflection_probe_data(subdivision_level); + + probe.do_update_data = true; + probe.do_render = true; + probe.type = ReflectionProbe::Type::Probe; + probe.index = reflection_probe_data_index_max() + 1; + + data_buf_[probe.index] = probe_data; + return probe; + }); + + return reflection_probe; +} + +int ReflectionProbeModule::reflection_probe_data_index_max() const +{ + int result = -1; + for (const ReflectionProbe &probe : probes_.values()) { + if (probe.type != ReflectionProbe::Type::Unused) { + result = max_ii(result, probe.index); + } + } + return result; +} + +/** + * Utility class to find a location in the probes_tx_ that can be used to store a new probe in + * a specified subdivision level. + */ +class ProbeLocationFinder { + BitVector<> taken_spots_; + int probes_per_dimension_; + int probes_per_layer_; + int subdivision_level_; + + public: + ProbeLocationFinder(int num_layers, int subdivision_level) + { + subdivision_level_ = subdivision_level; + probes_per_dimension_ = 1 << subdivision_level_; + probes_per_layer_ = probes_per_dimension_ * probes_per_dimension_; + int num_spots = num_layers * probes_per_layer_; + taken_spots_.resize(num_spots, false); + } + + /** + * Mark space to be occupied by the given probe_data. + * + * The input probe data can be stored in a different subdivision level and should be converted to + * the subdivision level what we are looking for. + */ + void mark_space_used(const ReflectionProbeData &probe_data) + { + /* Number of spots that the probe data will occupied in a single dimension. */ + int clamped_subdivision_shift = max_ii(probe_data.layer_subdivision - subdivision_level_, 0); + int spots_per_dimension = 1 << max_ii(subdivision_level_ - probe_data.layer_subdivision, 0); + int probes_per_dimension_in_probe_data = 1 << probe_data.layer_subdivision; + int2 pos_in_probe_data = int2(probe_data.area_index % probes_per_dimension_in_probe_data, + probe_data.area_index / probes_per_dimension_in_probe_data); + int2 pos_in_location_finder = int2(pos_in_probe_data.x >> clamped_subdivision_shift, + pos_in_probe_data.y >> clamped_subdivision_shift); + int layer_offset = probe_data.layer * probes_per_layer_; + for (int y : IndexRange(spots_per_dimension)) { + for (int x : IndexRange(spots_per_dimension)) { + int2 pos = pos_in_location_finder + int2(x, y); + int area_index = pos.x + pos.y * probes_per_dimension_; + taken_spots_[area_index + layer_offset].set(); + } + } + } + + /** + * Get the first free spot. + * + * .x contains the layer the first free spot was detected. + * .y contains the area_index to use. + * + * Asserts when no free spot is found. ProbeLocationFinder should always be initialized with an + * additional layer to make sure that there is always a free spot. + */ + ReflectionProbeData first_free_spot() const + { + ReflectionProbeData result = {}; + result.layer_subdivision = subdivision_level_; + for (int index : taken_spots_.index_range()) { + if (!taken_spots_[index]) { + int layer = index / probes_per_layer_; + int area_index = index % probes_per_layer_; + result.layer = layer; + result.area_index = area_index; + return result; + } + } + + BLI_assert_unreachable(); + return result; + } +}; + +ReflectionProbeData ReflectionProbeModule::find_empty_reflection_probe_data( + int subdivision_level) const +{ + ProbeLocationFinder location_finder(needed_layers_get() + 1, subdivision_level); + for (const ReflectionProbeData &data : + Span(data_buf_.data(), reflection_probe_data_index_max() + 1)) + { + location_finder.mark_space_used(data); + } + return location_finder.first_free_spot(); +} + +void ReflectionProbeModule::end_sync() +{ + remove_unused_probes(); + + int number_layers_needed = needed_layers_get(); + int current_layers = probes_tx_.depth(); + bool resize_layers = current_layers < number_layers_needed; + if (resize_layers) { + /* TODO: Create new texture and copy previous texture so we don't need to rerender all the + * probes.*/ + probes_tx_.ensure_2d_array(GPU_RGBA16F, + int2(max_resolution_), + number_layers_needed, + GPU_TEXTURE_USAGE_SHADER_WRITE, + nullptr, + REFLECTION_PROBE_MIPMAP_LEVELS); + GPU_texture_mipmap_mode(probes_tx_, true, true); + } + + recalc_lod_factors(); + data_buf_.push_update(); + + /* Regenerate mipmaps when a probe texture is updated. It can be postponed when the world probe + * is also updated. In this case it would happen as part of the WorldProbePipeline. */ + bool regenerate_mipmaps = false; + bool regenerate_mipmaps_postponed = false; + + for (ReflectionProbe &probe : probes_.values()) { + if (resize_layers) { + probe.do_update_data = true; + probe.do_render = true; + } + + if (!probe.needs_update()) { + continue; + } + sync(probe); + + switch (probe.type) { + case ReflectionProbe::Type::World: + regenerate_mipmaps_postponed = true; + break; + + case ReflectionProbe::Type::Probe: + regenerate_mipmaps = probe.do_render; + break; + + case ReflectionProbe::Type::Unused: + BLI_assert_unreachable(); + break; + } + probe.do_update_data = false; + probe.do_render = false; + } + + if (regenerate_mipmaps) { + GPU_memory_barrier(GPU_BARRIER_TEXTURE_UPDATE); + if (!regenerate_mipmaps_postponed) { + GPU_texture_update_mipmap_chain(probes_tx_); + } + } +} + +void ReflectionProbeModule::remove_unused_probes() +{ + bool found = false; + do { + found = false; + uint64_t key_to_remove = 0; + for (const Map::Item &item : probes_.items()) { + const ReflectionProbe &probe = item.value; + if (probe.type == ReflectionProbe::Type::Probe && !probe.is_probe_used) { + key_to_remove = item.key; + found = true; + break; + } + } + if (found) { + probes_.remove(key_to_remove); + } + } while (found); +} + +void ReflectionProbeModule::remove_reflection_probe_data(int reflection_probe_data_index) +{ + int max_index = reflection_probe_data_index_max(); + BLI_assert_msg(reflection_probe_data_index <= max_index, + "Trying to remove reflection probes when it isn't part of the reflection probe " + "data. This can also happens when the state is set to " + "ReflectionProbe::Type::UNUSED, before removing the data."); + for (int index = reflection_probe_data_index; index < max_index; index++) { + data_buf_[index] = data_buf_[index + 1]; + } + for (ReflectionProbe &probe : probes_.values()) { + if (probe.index == reflection_probe_data_index) { + probe.index = -1; + } + if (probe.index > reflection_probe_data_index) { + probe.index--; + } + } + data_buf_[max_index].layer = -1; + BLI_assert(reflection_probe_data_index_max() == max_index - 1); +} + +void ReflectionProbeModule::recalc_lod_factors() +{ + for (ReflectionProbeData &probe_data : data_buf_) { + if (probe_data.layer == -1) { + return; + } + + const float bias = 0.0; + const float lod_factor = + bias + + 0.5 * log(float(square_i(probes_tx_.width() >> probe_data.layer_subdivision))) / log(2.0); + probe_data.lod_factor = lod_factor; + } +} + +/* -------------------------------------------------------------------- */ +/** \name Debugging + * + * \{ */ + +void ReflectionProbeModule::debug_print() const +{ + std::ostream &os = std::cout; + for (const ReflectionProbe &probe : probes_.values()) { + os << probe; + + if (probe.index != -1) { + os << data_buf_[probe.index]; + } + } +} + +std::ostream &operator<<(std::ostream &os, const ReflectionProbeData &probe_data) +{ + os << " - layer: " << probe_data.layer; + os << " subdivision: " << probe_data.layer_subdivision; + os << " area: " << probe_data.area_index; + os << "\n"; + + return os; +} + +std::ostream &operator<<(std::ostream &os, const ReflectionProbe &probe) +{ + switch (probe.type) { + case ReflectionProbe::Type::Unused: { + os << "UNUSED\n"; + + break; + } + case ReflectionProbe::Type::World: { + os << "WORLD"; + os << " is_dirty: " << probe.do_update_data; + os << " index: " << probe.index; + os << "\n"; + break; + } + case ReflectionProbe::Type::Probe: { + os << "PROBE"; + os << " is_dirty: " << probe.do_update_data; + os << " is_used: " << probe.is_probe_used; + os << " index: " << probe.index; + os << "\n"; + break; + } + } + return os; +} + +void ReflectionProbeModule::upload_dummy_texture(const ReflectionProbe &probe) +{ + const ReflectionProbeData &probe_data = data_buf_[probe.index]; + const int resolution = max_resolution_ >> probe_data.layer_subdivision; + float4 *data = static_cast( + MEM_mallocN(sizeof(float4) * resolution * resolution, __func__)); + + /* Generate dummy checker pattern. */ + int index = 0; + const int BLOCK_SIZE = max_ii(1024 >> probe_data.layer_subdivision, 1); + for (int y : IndexRange(resolution)) { + for (int x : IndexRange(resolution)) { + int tx = (x / BLOCK_SIZE) & 1; + int ty = (y / BLOCK_SIZE) & 1; + bool solid = (tx + ty) & 1; + if (solid) { + data[index] = float4((probe.index & 1) == 0 ? 0.0f : 1.0f, + (probe.index & 2) == 0 ? 0.0f : 1.0f, + (probe.index & 4) == 0 ? 0.0f : 1.0f, + 1.0f); + } + else { + data[index] = float4(0.0f); + } + + index++; + } + } + + /* Upload the checker pattern. */ + int probes_per_dimension = 1 << probe_data.layer_subdivision; + int2 probe_area_pos(probe_data.area_index % probes_per_dimension, + probe_data.area_index / probes_per_dimension); + int2 pos = probe_area_pos * int2(max_resolution_ / probes_per_dimension); + GPU_texture_update_sub( + probes_tx_, GPU_DATA_FLOAT, data, UNPACK2(pos), probe_data.layer, resolution, resolution, 1); + + MEM_freeN(data); +} + +/** \} */ + void ReflectionProbeModule::remap_to_octahedral_projection() { + const ReflectionProbe &world_probe = probes_.lookup(world_object_key_); + const ReflectionProbeData &probe_data = data_buf_[world_probe.index]; + dispatch_probe_pack_ = int3(int2(ceil_division(max_resolution_ >> probe_data.layer_subdivision, + REFLECTION_PROBE_GROUP_SIZE)), + 1); instance_.manager->submit(remap_ps_); + /* TODO: Performance - Should only update the area that has changed. */ GPU_texture_update_mipmap_chain(probes_tx_); } diff --git a/source/blender/draw/engines/eevee_next/eevee_reflection_probes.hh b/source/blender/draw/engines/eevee_next/eevee_reflection_probes.hh index 22bf88ba31f..018571c38a2 100644 --- a/source/blender/draw/engines/eevee_next/eevee_reflection_probes.hh +++ b/source/blender/draw/engines/eevee_next/eevee_reflection_probes.hh @@ -19,16 +19,58 @@ struct Material; namespace blender::eevee { class Instance; +struct ObjectHandle; +struct WorldHandle; class CaptureView; /* -------------------------------------------------------------------- */ /** \name Reflection Probes * \{ */ +struct ReflectionProbe { + enum Type { Unused, World, Probe }; + + Type type = Type::Unused; + + /* Probe data needs to be updated. */ + bool do_update_data = false; + /* Should the area in the probes_tx_ be updated? */ + bool do_render = false; + + /** + * Probes that aren't used during a draw can be cleared. + * + * Only valid when type == Type::Probe. + */ + bool is_probe_used = false; + + /** + * Index into ReflectionProbeDataBuf. + * -1 = not added yet + */ + int index = -1; + + /** + * Check if the probe needs to be updated during this sample. + */ + bool needs_update() const + { + switch (type) { + case Type::Unused: + return false; + case Type::World: + return do_update_data || do_render; + case Type::Probe: + return (do_update_data || do_render) && is_probe_used; + } + return false; + } +}; + class ReflectionProbeModule { private: - /** The max number of probes to track. */ - static constexpr int max_probes_ = 1; + /** The max number of probes to initially allocate. */ + static constexpr int init_num_probes_ = 1; /** * The maximum resolution of a cube-map side. @@ -37,27 +79,36 @@ class ReflectionProbeModule { */ static constexpr int max_resolution_ = 2048; - Instance &instance_; + static constexpr uint64_t world_object_key_ = 0; - /** Texture containing a cubemap used for updating #probes_tx_. */ + Instance &instance_; + ReflectionProbeDataBuf data_buf_; + Map probes_; + + /** Texture containing a cubemap used as input for updating #probes_tx_. */ Texture cubemap_tx_ = {"Probe.Cubemap"}; /** Probes texture stored in octahedral mapping. */ Texture probes_tx_ = {"Probes"}; PassSimple remap_ps_ = {"Probe.CubemapToOctahedral"}; - bool initialized_ = false; - bool do_world_update_ = false; + int3 dispatch_probe_pack_ = int3(0); + public: ReflectionProbeModule(Instance &instance) : instance_(instance) {} void init(); + void begin_sync(); + void sync_world(::World *world, WorldHandle &ob_handle); + void sync_object(Object *ob, ObjectHandle &ob_handle); + void end_sync(); template void bind_resources(draw::detail::PassBase *pass) { pass->bind_texture(REFLECTION_PROBE_TEX_SLOT, probes_tx_); + pass->bind_ssbo(REFLECTION_PROBE_BUF_SLOT, data_buf_); } void do_world_update_set(bool value) @@ -65,7 +116,36 @@ class ReflectionProbeModule { do_world_update_ = value; } + void debug_print() const; + private: + void sync(const ReflectionProbe &cubemap); + ReflectionProbe &find_or_insert(ObjectHandle &ob_handle, int subdivision_level); + + /** Get the number of layers that is needed to store probes. */ + int needed_layers_get() const; + + void remove_unused_probes(); + void recalc_lod_factors(); + + /* TODO: also add _len() which is a max + 1. */ + /* Get the number of reflection probe data elements. */ + int reflection_probe_data_index_max() const; + + /** + * Remove reflection probe data from the module. + * Ensures that data_buf is sequential and cubemaps are relinked to its corresponding data. + */ + void remove_reflection_probe_data(int reflection_probe_data_index); + + /** + * Create a reflection probe data element that points to an empty spot in the cubemap that can + * hold a texture with the given subdivision_level. + */ + ReflectionProbeData find_empty_reflection_probe_data(int subdivision_level) const; + + void upload_dummy_texture(const ReflectionProbe &probe); + bool do_world_update_get() const { return do_world_update_; @@ -77,4 +157,8 @@ class ReflectionProbeModule { friend class CaptureView; }; +std::ostream &operator<<(std::ostream &os, const ReflectionProbeModule &module); +std::ostream &operator<<(std::ostream &os, const ReflectionProbeData &probe_data); +std::ostream &operator<<(std::ostream &os, const ReflectionProbe &probe); + } // namespace blender::eevee diff --git a/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh b/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh index 63a2ffcc832..ff83d599e17 100644 --- a/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh +++ b/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh @@ -1022,6 +1022,45 @@ BLI_STATIC_ASSERT_ALIGN(SubsurfaceData, 16) /** \} */ +/* -------------------------------------------------------------------- */ +/** \name Reflection Probes + * \{ */ + +/** Mapping data to locate a reflection probe in texture. */ +struct ReflectionProbeData { + /** + * Position of the light probe in world space. + * World probe uses origin. + */ + packed_float3 pos; + + /** On which layer of the texture array is this reflection probe stored. */ + int layer; + + /** + * Subdivision of the layer. 0 = no subdivision and resolution would be + * ReflectionProbeModule::MAX_RESOLUTION. + */ + int layer_subdivision; + + /** + * Which area of the subdivided layer is the reflection probe located. + * + * A layer has (2^layer_subdivision)^2 areas. + */ + int area_index; + + /** + * LOD factor for mipmap selection. + */ + float lod_factor; + + int _pad[1]; +}; +BLI_STATIC_ASSERT_ALIGN(ReflectionProbeData, 16) + +/** \} */ + /* -------------------------------------------------------------------- */ /** \name Utility Texture * \{ */ @@ -1078,6 +1117,8 @@ using LightCullingZdistBuf = draw::StorageArrayBuffer; using LightDataBuf = draw::StorageArrayBuffer; using MotionBlurDataBuf = draw::UniformBuffer; using MotionBlurTileIndirectionBuf = draw::StorageBuffer; +using ReflectionProbeDataBuf = + draw::UniformArrayBuffer; using SamplingDataBuf = draw::StorageBuffer; using ShadowStatisticsBuf = draw::StorageBuffer; using ShadowPagesInfoDataBuf = draw::StorageBuffer; diff --git a/source/blender/draw/engines/eevee_next/eevee_sync.cc b/source/blender/draw/engines/eevee_next/eevee_sync.cc index 0cd90613e88..a490f99c5a2 100644 --- a/source/blender/draw/engines/eevee_next/eevee_sync.cc +++ b/source/blender/draw/engines/eevee_next/eevee_sync.cc @@ -356,4 +356,16 @@ void SyncModule::sync_curves(Object *ob, /** \} */ +/* -------------------------------------------------------------------- */ +/** \name Light Probes + * \{ */ + +void SyncModule::sync_light_probe(Object *ob, ObjectHandle &ob_handle) +{ + inst_.light_probes.sync_probe(ob, ob_handle); + inst_.reflection_probes.sync_object(ob, ob_handle); +} + +/** \} */ + } // namespace blender::eevee diff --git a/source/blender/draw/engines/eevee_next/eevee_sync.hh b/source/blender/draw/engines/eevee_next/eevee_sync.hh index 3d44cb31107..20ea7675f39 100644 --- a/source/blender/draw/engines/eevee_next/eevee_sync.hh +++ b/source/blender/draw/engines/eevee_next/eevee_sync.hh @@ -169,6 +169,7 @@ class SyncModule { ObjectHandle &ob_handle, ResourceHandle res_handle, ModifierData *modifier_data = nullptr); + void sync_light_probe(Object *ob, ObjectHandle &ob_handle); }; /** \} */ diff --git a/source/blender/draw/engines/eevee_next/eevee_view.cc b/source/blender/draw/engines/eevee_next/eevee_view.cc index 033855e5d97..b4ac0646caf 100644 --- a/source/blender/draw/engines/eevee_next/eevee_view.cc +++ b/source/blender/draw/engines/eevee_next/eevee_view.cc @@ -215,6 +215,7 @@ void CaptureView::render() view.sync(view_m4, win_m4); inst_.pipelines.world.render(view); } + GPU_texture_update_mipmap_chain(inst_.reflection_probes.cubemap_tx_); inst_.reflection_probes.remap_to_octahedral_projection(); GPU_debug_group_end(); } diff --git a/source/blender/draw/engines/eevee_next/eevee_world.cc b/source/blender/draw/engines/eevee_next/eevee_world.cc index 7a97234ef35..cf515a4b2ef 100644 --- a/source/blender/draw/engines/eevee_next/eevee_world.cc +++ b/source/blender/draw/engines/eevee_next/eevee_world.cc @@ -90,6 +90,7 @@ void World::sync() WorldHandle &wo_handle = inst_.sync.sync_world(bl_world); if (wo_handle.recalc != 0) { + inst_.reflection_probes.sync_world(bl_world, wo_handle); inst_.reflection_probes.do_world_update_set(true); } wo_handle.reset_recalc_flag(); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_light_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_light_frag.glsl index 8aa4d5ba3d1..81fd2c73efb 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_light_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_light_frag.glsl @@ -55,7 +55,7 @@ void main() vec3 reflection_light = vec3(0.0); float shadow = 1.0; - light_world_eval(reflection_data, P, V, reflection_light); + reflection_probes_eval(reflection_data, P, V, reflection_light); lightprobe_eval(diffuse_data, reflection_data, P, Ng, V, diffuse_light, reflection_light); light_eval(diffuse_data, diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_irradiance_ray_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_irradiance_ray_comp.glsl index 959133dce7a..91364cbcb19 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_irradiance_ray_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_irradiance_ray_comp.glsl @@ -43,7 +43,7 @@ void irradiance_capture(Surfel surfel, vec3 P, inout SphericalHarmonicL1 sh) vec3 irradiance_sky_sample(vec3 R) { - return light_world_sample(R, 0.0); + return reflection_probes_world_sample(R, 0.0).rgb; } void main() diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_octahedron_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_octahedron_lib.glsl index 1393ef0a250..af7f2ec4954 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_octahedron_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_octahedron_lib.glsl @@ -20,6 +20,7 @@ vec2 octahedral_uv_from_direction(vec3 co) vec3 octahedral_uv_to_direction(vec2 co) { + /* Change range to between [-1..1] */ co = co * 2.0 - 1.0; vec2 abs_co = abs(co); @@ -31,3 +32,47 @@ vec3 octahedral_uv_to_direction(vec2 co) return v; } + +/** + * Return the UV coordinates on the packed octahedral texture layer when applying the given + * octahedral_uv to a specific probe. + */ +vec2 octahedral_uv_to_layer_texture_coords(vec2 octahedral_uv, + ReflectionProbeData probe_data, + vec2 texel_size) +{ + /* Fix artifacts near edges. Proved one texel on each side.*/ + octahedral_uv = octahedral_uv * (1.0 - 2.0 * REFLECTION_PROBE_BORDER_SIZE * texel_size) + + REFLECTION_PROBE_BORDER_SIZE * texel_size + 0.5 * texel_size; + + int areas_per_dimension = 1 << probe_data.layer_subdivision; + vec2 area_scalar = vec2(1.0 / float(areas_per_dimension)); + octahedral_uv *= area_scalar; + + vec2 area_offset = vec2(probe_data.area_index % areas_per_dimension, + probe_data.area_index / areas_per_dimension) * + area_scalar; + return octahedral_uv + area_offset; +} + +/** + * Return the octahedral uv coordinates for the given texture uv coordinate on the packed + * octahedral texture layer for the given probe. + * + * It also applies wrapping in the additional space near borders. + * NOTE: Doesn't apply the translation part of the packing. + */ +vec2 octahedral_uv_from_layer_texture_coords(vec2 uv, + ReflectionProbeData probe_data, + vec2 texel_size) + +{ + /* Apply border region. */ + vec2 shrinked_uv = (uv - REFLECTION_PROBE_BORDER_SIZE * texel_size) / + (1.0 - 2.0 * REFLECTION_PROBE_BORDER_SIZE * texel_size); + /* Use ping/pong to extend the octahedral coordinates. */ + vec2 translated_pos = clamp(-sign(shrinked_uv), vec2(0.0), vec2(1.0)) * vec2(2.0) + shrinked_uv; + ivec2 checker_pos = ivec2(translated_pos); + bool is_even = ((checker_pos.x + checker_pos.y) & 1) == 0; + return is_even ? fract(shrinked_uv) : vec2(1.0) - fract(shrinked_uv); +} diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_eval_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_eval_lib.glsl index 68250ded591..6d2224ef851 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_eval_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_eval_lib.glsl @@ -1,13 +1,15 @@ + #pragma BLENDER_REQUIRE(eevee_sampling_lib.glsl) #pragma BLENDER_REQUIRE(eevee_reflection_probe_lib.glsl) -void light_world_eval(ClosureReflection reflection, vec3 P, vec3 V, inout vec3 out_specular) +vec4 reflection_probe_eval(ClosureReflection reflection, + vec3 P, + vec3 V, + ReflectionProbeData probe_data) { ivec3 texture_size = textureSize(reflectionProbes, 0); - /* TODO: This should be based by actual resolution. Currently the resolution is fixed but - * eventually this should based on a user setting and part of the reflection probe data that will - * be introduced by the reflection probe patch. */ - float lod_cube_max = 12.0; + float lod_cube_max = min(log(float(texture_size.x)) - float(probe_data.layer_subdivision) + 1.0, + REFLECTION_PROBE_MIPMAP_LEVELS); /* Pow2f to distributed across lod more evenly */ float roughness = clamp(pow2f(reflection.roughness), 1e-4f, 0.9999f); @@ -37,13 +39,8 @@ void light_world_eval(ClosureReflection reflection, vec3 P, vec3 V, inout vec3 o const float dist = 4.0 * M_PI / 6.0; /* http://http.developer.nvidia.com/GPUGems3/gpugems3_ch20.html : Equation 13 */ - /* TODO: lod_factor should be precalculated and stored inside the reflection probe data. */ - const float bias = 0.0; - const float lod_factor = bias + 0.5 * log(float(square_i(texture_size.x))) / log(2.0); - /* -2: Don't use LOD levels that are smaller than 4x4 pixels. */ - float lod = clamp(lod_factor - 0.5 * log2(pdf * dist), 0.0, lod_cube_max - 2.0); - - vec3 l_col = light_world_sample(L, lod); + float lod = clamp(probe_data.lod_factor - 0.5 * log2(pdf * dist), 0.0, lod_cube_max); + vec4 l_col = reflection_probes_sample(L, lod, probe_data); /* Clamped brightness. */ /* For artistic freedom this should be read from the scene/reflection probe. @@ -52,11 +49,46 @@ void light_world_eval(ClosureReflection reflection, vec3 P, vec3 V, inout vec3 o * account.*/ float luma = max(1e-8, max_v3(l_col)); const float firefly_factor = 1e16; - l_col *= 1.0 - max(0.0, luma - firefly_factor) / luma; + l_col.rgb *= 1.0 - max(0.0, luma - firefly_factor) / luma; - /* TODO: for artistic freedom want to read this from the reflection probe. That will be part of - * the reflection probe patch. */ - const float intensity_factor = 1.0; - out_specular += vec3(intensity_factor * l_col); + return l_col; } + return vec4(0.0); +} + +int reflection_probes_find_closest(vec3 P) +{ + int closest_index = -1; + float closest_distance = FLT_MAX; + + /* ReflectionProbeData doesn't contain any gab, exit at first item that is invalid. */ + for (int index = 1; reflection_probe_buf[index].layer != -1 && index < REFLECTION_PROBES_MAX; + index++) + { + float distance = distance(P, reflection_probe_buf[index].pos); + if (distance < closest_distance) { + closest_distance = distance; + closest_index = index; + } + } + return closest_index; +} + +void reflection_probes_eval(ClosureReflection reflection, vec3 P, vec3 V, inout vec3 out_specular) +{ + int closest_reflection_probe = reflection_probes_find_closest(P); + vec4 light_color = vec4(0.0); + if (closest_reflection_probe != -1) { + light_color = reflection_probe_eval( + reflection, P, V, reflection_probe_buf[closest_reflection_probe]); + } + + /* Mix world lighting. */ + if (light_color.a != 1.0) { + light_color.rgb = mix(reflection_probe_eval(reflection, P, V, reflection_probe_buf[0]).rgb, + light_color.rgb, + light_color.a); + } + + out_specular += light_color.rgb; } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_lib.glsl index a50d7b5c3ec..6a50f3a2529 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_lib.glsl @@ -2,8 +2,16 @@ #pragma BLENDER_REQUIRE(eevee_cubemap_lib.glsl) #pragma BLENDER_REQUIRE(eevee_octahedron_lib.glsl) -vec3 light_world_sample(vec3 L, float lod) +vec4 reflection_probes_sample(vec3 L, float lod, ReflectionProbeData probe_data) { - vec2 octahedral_uv = octahedral_uv_from_direction(L); - return textureLod(reflectionProbes, vec3(octahedral_uv, 0.0), lod).rgb; + vec2 octahedral_uv_packed = octahedral_uv_from_direction(L); + vec2 texel_size = vec2(1.0 / float(1 << (11 - probe_data.layer_subdivision))); + vec2 octahedral_uv = octahedral_uv_to_layer_texture_coords( + octahedral_uv_packed, probe_data, texel_size); + return textureLod(reflectionProbes, vec3(octahedral_uv, probe_data.layer), lod); } + +vec3 reflection_probes_world_sample(vec3 L, float lod) +{ + return reflection_probes_sample(L, lod, reflection_probe_buf[0]).rgb; +} \ No newline at end of file diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_remap_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_remap_comp.glsl index fae4bf5df1f..ade2d3326e2 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_remap_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_remap_comp.glsl @@ -5,15 +5,32 @@ void main() { + ReflectionProbeData probe_data = reflection_probe_buf[0]; + + ivec3 texture_coord = ivec3(gl_GlobalInvocationID.xyz); + ivec3 texture_size = imageSize(octahedral_img); + ivec3 octahedral_coord = ivec3(gl_GlobalInvocationID.xyz); - ivec3 octahedral_size = imageSize(octahedral_img); - /* Group doesn't fit in output texture. */ + ivec2 octahedral_size = ivec2(texture_size.x >> probe_data.layer_subdivision, + texture_size.y >> probe_data.layer_subdivision); + /* Exit when pixel being written doesn't fit in the area reserved for the probe. */ if (any(greaterThanEqual(octahedral_coord.xy, octahedral_size.xy))) { return; } - vec2 octahedral_uv = vec2(octahedral_coord.xy) / vec2(octahedral_size.xy); + + vec2 texel_size = vec2(1.0) / vec2(octahedral_size); + + vec2 uv = vec2(octahedral_coord.xy) / vec2(octahedral_size.xy); + vec2 octahedral_uv = octahedral_uv_from_layer_texture_coords(uv, probe_data, texel_size); vec3 R = octahedral_uv_to_direction(octahedral_uv); - vec4 col = textureLod(cubemap_tx, R, 0.0); - imageStore(octahedral_img, octahedral_coord, col); + vec4 col = textureLod(cubemap_tx, R, float(probe_data.layer_subdivision)); + // col.xy = octahedral_uv; + + int probes_per_dimension = 1 << probe_data.layer_subdivision; + ivec2 area_coord = ivec2(probe_data.area_index % probes_per_dimension, + probe_data.area_index / probes_per_dimension); + ivec2 area_offset = area_coord * octahedral_size; + + imageStore(octahedral_img, octahedral_coord + ivec3(area_offset, 0), col); } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_surfel_ray_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_surfel_ray_comp.glsl index 29b1559a12d..3e4204929e9 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_surfel_ray_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_surfel_ray_comp.glsl @@ -65,7 +65,7 @@ void radiance_transfer_surfel(inout Surfel receiver, Surfel sender) vec3 radiance_sky_sample(vec3 R) { - return light_world_sample(R, 0.0); + return reflection_probes_world_sample(R, 0.0).rgb; } void radiance_transfer_world(inout Surfel receiver, vec3 sky_L) diff --git a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_reflection_probe_info.hh b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_reflection_probe_info.hh index 838072f6a55..1980b114053 100644 --- a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_reflection_probe_info.hh +++ b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_reflection_probe_info.hh @@ -10,14 +10,23 @@ * \{ */ GPU_SHADER_CREATE_INFO(eevee_reflection_probe_data) + .storage_buf(REFLECTION_PROBE_BUF_SLOT, + Qualifier::READ, + "ReflectionProbeData", + "reflection_probe_buf[]") .sampler(REFLECTION_PROBE_TEX_SLOT, ImageType::FLOAT_2D_ARRAY, "reflectionProbes"); /* Sample cubemap and remap into an octahedral texture. */ GPU_SHADER_CREATE_INFO(eevee_reflection_probe_remap) .local_group_size(REFLECTION_PROBE_GROUP_SIZE, REFLECTION_PROBE_GROUP_SIZE) + .storage_buf(REFLECTION_PROBE_BUF_SLOT, + Qualifier::READ, + "ReflectionProbeData", + "reflection_probe_buf[]") .sampler(0, ImageType::FLOAT_CUBE, "cubemap_tx") .image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D_ARRAY, "octahedral_img") .compute_source("eevee_reflection_probe_remap_comp.glsl") + .additional_info("eevee_shared") .do_static_compilation(true); /** \} */ diff --git a/source/blender/makesdna/DNA_lightprobe_defaults.h b/source/blender/makesdna/DNA_lightprobe_defaults.h index 5fc61b5d6b0..d963b124362 100644 --- a/source/blender/makesdna/DNA_lightprobe_defaults.h +++ b/source/blender/makesdna/DNA_lightprobe_defaults.h @@ -31,6 +31,7 @@ .vis_blur = 0.2f, \ .intensity = 1.0f, \ .flag = LIGHTPROBE_FLAG_SHOW_INFLUENCE, \ + .resolution = LIGHT_PROBE_RESOLUTION_1024, \ } /** \} */ diff --git a/source/blender/makesdna/DNA_lightprobe_types.h b/source/blender/makesdna/DNA_lightprobe_types.h index 929d919a08e..e2586d26077 100644 --- a/source/blender/makesdna/DNA_lightprobe_types.h +++ b/source/blender/makesdna/DNA_lightprobe_types.h @@ -61,7 +61,10 @@ typedef struct LightProbe { /** Surface element density for scene surface cache. In surfel per unit distance. */ float surfel_density; - char _pad1[4]; + /** + * Resolution of the light probe when baked to a texture. Contains `eLightProbeResolution`. + */ + int resolution; /** Object to use as a parallax origin. */ struct Object *parallax_ob; @@ -71,6 +74,16 @@ typedef struct LightProbe { struct Collection *visibility_grp; } LightProbe; +/* LightProbe->resolution, World->probe_resolution. */ +typedef enum eLightProbeResolution { + LIGHT_PROBE_RESOLUTION_64 = 6, + LIGHT_PROBE_RESOLUTION_128 = 7, + LIGHT_PROBE_RESOLUTION_256 = 8, + LIGHT_PROBE_RESOLUTION_512 = 9, + LIGHT_PROBE_RESOLUTION_1024 = 10, + LIGHT_PROBE_RESOLUTION_2048 = 11, +} eLightProbeResolution; + /* Probe->type */ enum { LIGHTPROBE_TYPE_CUBE = 0, diff --git a/source/blender/makesdna/DNA_world_defaults.h b/source/blender/makesdna/DNA_world_defaults.h index 3429ea4761e..d06d4c85c12 100644 --- a/source/blender/makesdna/DNA_world_defaults.h +++ b/source/blender/makesdna/DNA_world_defaults.h @@ -27,6 +27,8 @@ .preview = NULL, \ .miststa = 5.0f, \ .mistdist = 25.0f, \ + \ + .probe_resolution = LIGHT_PROBE_RESOLUTION_1024, \ } /** \} */ diff --git a/source/blender/makesdna/DNA_world_types.h b/source/blender/makesdna/DNA_world_types.h index d274651b9d5..639517fb349 100644 --- a/source/blender/makesdna/DNA_world_types.h +++ b/source/blender/makesdna/DNA_world_types.h @@ -61,7 +61,13 @@ typedef struct World { /** Assorted settings. */ short flag; - char _pad3[6]; + char _pad3[2]; + + /** Eevee settings. */ + /** + * Resolution of the world probe when baked to a texture. Contains `eLightProbeResolution`. + */ + int probe_resolution; /** Old animation system, deprecated for 2.5. */ struct Ipo *ipo DNA_DEPRECATED; diff --git a/source/blender/makesrna/intern/rna_lightprobe.cc b/source/blender/makesrna/intern/rna_lightprobe.cc index b3fbe9af979..45d2389cba5 100644 --- a/source/blender/makesrna/intern/rna_lightprobe.cc +++ b/source/blender/makesrna/intern/rna_lightprobe.cc @@ -57,6 +57,16 @@ static EnumPropertyItem lightprobe_type_items[] = { {0, nullptr, 0, nullptr, nullptr}, }; +static EnumPropertyItem lightprobe_resolution_items[] = { + {LIGHT_PROBE_RESOLUTION_64, "64", 0, "64", ""}, + {LIGHT_PROBE_RESOLUTION_128, "128", 0, "128", ""}, + {LIGHT_PROBE_RESOLUTION_256, "256", 0, "256", ""}, + {LIGHT_PROBE_RESOLUTION_512, "512", 0, "512", ""}, + {LIGHT_PROBE_RESOLUTION_1024, "1024", 0, "1024", ""}, + {LIGHT_PROBE_RESOLUTION_2048, "2048", 0, "2048", ""}, + {0, nullptr, 0, nullptr, nullptr}, +}; + static void rna_def_lightprobe(BlenderRNA *brna) { StructRNA *srna; @@ -189,6 +199,12 @@ static void rna_def_lightprobe(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Visibility Blur", "Filter size of the visibility blur"); RNA_def_property_update(prop, NC_MATERIAL | ND_SHADING, "rna_LightProbe_recalc"); + prop = RNA_def_property(srna, "resolution", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, nullptr, "resolution"); + RNA_def_property_enum_items(prop, lightprobe_resolution_items); + RNA_def_property_ui_text(prop, "Resolution", "Resolution when baked to a texture"); + RNA_def_property_update(prop, NC_MATERIAL | ND_SHADING, "rna_LightProbe_recalc"); + prop = RNA_def_property(srna, "intensity", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, nullptr, "intensity"); RNA_def_property_range(prop, 0.0f, FLT_MAX); diff --git a/source/blender/makesrna/intern/rna_world.cc b/source/blender/makesrna/intern/rna_world.cc index 1af4f6068d9..85914039fcc 100644 --- a/source/blender/makesrna/intern/rna_world.cc +++ b/source/blender/makesrna/intern/rna_world.cc @@ -13,6 +13,7 @@ #include "rna_internal.h" +#include "DNA_lightprobe_types.h" #include "DNA_material_types.h" #include "DNA_texture_types.h" #include "DNA_world_types.h" @@ -108,6 +109,16 @@ void rna_World_lightgroup_set(PointerRNA *ptr, const char *value) #else +static const EnumPropertyItem world_probe_resolution_items[] = { + {LIGHT_PROBE_RESOLUTION_64, "64", 0, "64", ""}, + {LIGHT_PROBE_RESOLUTION_128, "128", 0, "128", ""}, + {LIGHT_PROBE_RESOLUTION_256, "256", 0, "256", ""}, + {LIGHT_PROBE_RESOLUTION_512, "512", 0, "512", ""}, + {LIGHT_PROBE_RESOLUTION_1024, "1024", 0, "1024", ""}, + {LIGHT_PROBE_RESOLUTION_2048, "2048", 0, "2048", ""}, + {0, nullptr, 0, nullptr, nullptr}, +}; + static void rna_def_lighting(BlenderRNA *brna) { StructRNA *srna; @@ -263,6 +274,13 @@ void RNA_def_world(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Lightgroup", "Lightgroup that the world belongs to"); + /* Reflection Probe Baking. */ + prop = RNA_def_property(srna, "probe_resolution", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, nullptr, "probe_resolution"); + RNA_def_property_enum_items(prop, world_probe_resolution_items); + RNA_def_property_ui_text(prop, "Resolution", "Resolution when baked to a texture"); + RNA_def_property_update(prop, 0, "rna_World_draw_update"); + rna_def_lighting(brna); rna_def_world_mist(brna); } -- 2.30.2 From f37fa6d0b1394ac67a3ce379df751eb84f0a2482 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Fri, 7 Jul 2023 15:43:04 +0200 Subject: [PATCH 042/115] Cleanup: make format --- source/blender/editors/space_graph/graph_draw.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c index 00405a05b75..ee2fc37b3e4 100644 --- a/source/blender/editors/space_graph/graph_draw.c +++ b/source/blender/editors/space_graph/graph_draw.c @@ -242,7 +242,8 @@ static void draw_locked_keyframe_vertices(FCurve *fcu, BezTriple *bezt = &fcu->bezt[i]; if (!IN_RANGE(bezt->vec[1][0], (v2d->cur.xmin - correction_factor), - (v2d->cur.xmax + correction_factor))) { + (v2d->cur.xmax + correction_factor))) + { continue; } float position[2] = {bezt->vec[1][0], bezt->vec[1][1]}; -- 2.30.2 From ec29d96d11abc9a89642307c18ba49245b93e59b Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 7 Jul 2023 09:59:55 -0400 Subject: [PATCH 043/115] Cleanup: Simplify replacing component data in geometry set --- .../blender/blenkernel/intern/DerivedMesh.cc | 4 +-- .../blender/blenkernel/intern/geometry_set.cc | 20 +++---------- .../blender/editors/object/object_modifier.cc | 14 +++------ .../spreadsheet_data_source_geometry.cc | 29 +++++++------------ .../geometry/intern/realize_instances.cc | 8 ++--- 5 files changed, 22 insertions(+), 53 deletions(-) diff --git a/source/blender/blenkernel/intern/DerivedMesh.cc b/source/blender/blenkernel/intern/DerivedMesh.cc index 03ea3663d0a..d29f0ab8c2d 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.cc +++ b/source/blender/blenkernel/intern/DerivedMesh.cc @@ -543,12 +543,10 @@ static Mesh *modifier_modify_mesh_and_geometry_set(ModifierData *md, * some point. */ BKE_mesh_wrapper_ensure_mdata(input_mesh); - /* Adds a new mesh component to the geometry set based on the #input_mesh. */ - MeshComponent &mesh_component = geometry_set.get_component_for_write(); /* Replace only the mesh rather than the whole component, because the entire #MeshComponent * might have been replaced by data from a different object in the node tree, which means the * component contains vertex group name data for that object that should not be removed. */ - mesh_component.replace(input_mesh, GeometryOwnershipType::Editable); + geometry_set.replace_mesh(input_mesh, GeometryOwnershipType::Editable); /* Let the modifier change the geometry set. */ mti->modifyGeometrySet(md, &mectx, &geometry_set); diff --git a/source/blender/blenkernel/intern/geometry_set.cc b/source/blender/blenkernel/intern/geometry_set.cc index cb9d07a9cca..62c6441cc95 100644 --- a/source/blender/blenkernel/intern/geometry_set.cc +++ b/source/blender/blenkernel/intern/geometry_set.cc @@ -390,20 +390,14 @@ bool GeometrySet::is_empty() const GeometrySet GeometrySet::create_with_mesh(Mesh *mesh, GeometryOwnershipType ownership) { GeometrySet geometry_set; - if (mesh != nullptr) { - MeshComponent &component = geometry_set.get_component_for_write(); - component.replace(mesh, ownership); - } + geometry_set.replace_mesh(mesh, ownership); return geometry_set; } GeometrySet GeometrySet::create_with_volume(Volume *volume, GeometryOwnershipType ownership) { GeometrySet geometry_set; - if (volume != nullptr) { - VolumeComponent &component = geometry_set.get_component_for_write(); - component.replace(volume, ownership); - } + geometry_set.replace_volume(volume, ownership); return geometry_set; } @@ -411,20 +405,14 @@ GeometrySet GeometrySet::create_with_pointcloud(PointCloud *pointcloud, GeometryOwnershipType ownership) { GeometrySet geometry_set; - if (pointcloud != nullptr) { - PointCloudComponent &component = geometry_set.get_component_for_write(); - component.replace(pointcloud, ownership); - } + geometry_set.replace_pointcloud(pointcloud, ownership); return geometry_set; } GeometrySet GeometrySet::create_with_curves(Curves *curves, GeometryOwnershipType ownership) { GeometrySet geometry_set; - if (curves != nullptr) { - CurveComponent &component = geometry_set.get_component_for_write(); - component.replace(curves, ownership); - } + geometry_set.replace_curves(curves, ownership); return geometry_set; } diff --git a/source/blender/editors/object/object_modifier.cc b/source/blender/editors/object/object_modifier.cc index c58589f8011..95365781f65 100644 --- a/source/blender/editors/object/object_modifier.cc +++ b/source/blender/editors/object/object_modifier.cc @@ -1066,9 +1066,7 @@ static bool modifier_apply_obdata( return false; } - /* Create a temporary geometry set and component. */ - bke::GeometrySet geometry_set; - geometry_set.get_component_for_write().replace( + bke::GeometrySet geometry_set = bke::GeometrySet::create_with_curves( &curves, bke::GeometryOwnershipType::ReadOnly); ModifierEvalContext mectx = {depsgraph, ob, ModifierApplyFlag(0)}; @@ -1079,10 +1077,9 @@ static bool modifier_apply_obdata( } Curves &curves_eval = *geometry_set.get_curves_for_write(); - /* Anonymous attributes shouldn't be available on the applied geometry. */ + /* Anonymous attributes shouldn't be available on original geometry. */ curves_eval.geometry.wrap().attributes_for_write().remove_anonymous(); - /* Copy the relevant information to the original. */ curves.geometry.wrap() = std::move(curves_eval.geometry.wrap()); Main *bmain = DEG_get_bmain(depsgraph); BKE_object_material_from_eval_data(bmain, ob, &curves_eval.id); @@ -1094,9 +1091,7 @@ static bool modifier_apply_obdata( return false; } - /* Create a temporary geometry set and component. */ - bke::GeometrySet geometry_set; - geometry_set.get_component_for_write().replace( + bke::GeometrySet geometry_set = bke::GeometrySet::create_with_pointcloud( &points, bke::GeometryOwnershipType::ReadOnly); ModifierEvalContext mectx = {depsgraph, ob, ModifierApplyFlag(0)}; @@ -1109,10 +1104,9 @@ static bool modifier_apply_obdata( PointCloud *pointcloud_eval = geometry_set.get_component_for_write().release(); - /* Anonymous attributes shouldn't be available on the applied geometry. */ + /* Anonymous attributes shouldn't be available on original geometry. */ pointcloud_eval->attributes_for_write().remove_anonymous(); - /* Copy the relevant information to the original. */ Main *bmain = DEG_get_bmain(depsgraph); BKE_object_material_from_eval_data(bmain, ob, &pointcloud_eval->id); BKE_pointcloud_nomain_to_pointcloud(pointcloud_eval, &points); diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc b/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc index 2b843d4dddf..19d8a7a227b 100644 --- a/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc +++ b/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc @@ -495,39 +495,32 @@ bke::GeometrySet spreadsheet_get_display_geometry_set(const SpaceSpreadsheet *ss { bke::GeometrySet geometry_set; if (sspreadsheet->object_eval_state == SPREADSHEET_OBJECT_EVAL_STATE_ORIGINAL) { - Object *object_orig = DEG_get_original_object(object_eval); + const Object *object_orig = DEG_get_original_object(object_eval); if (object_orig->type == OB_MESH) { - bke::MeshComponent &mesh_component = - geometry_set.get_component_for_write(); + const Mesh *mesh = static_cast(object_orig->data); if (object_orig->mode == OB_MODE_EDIT) { - Mesh *mesh = (Mesh *)object_orig->data; - BMEditMesh *em = mesh->edit_mesh; - if (em != nullptr) { + if (const BMEditMesh *em = mesh->edit_mesh) { Mesh *new_mesh = (Mesh *)BKE_id_new_nomain(ID_ME, nullptr); /* This is a potentially heavy operation to do on every redraw. The best solution here is * to display the data directly from the bmesh without a conversion, which can be * implemented a bit later. */ BM_mesh_bm_to_me_for_eval(em->bm, new_mesh, nullptr); - mesh_component.replace(new_mesh, bke::GeometryOwnershipType::Owned); + geometry_set.replace_mesh(new_mesh, bke::GeometryOwnershipType::Owned); } } else { - Mesh *mesh = (Mesh *)object_orig->data; - mesh_component.replace(mesh, bke::GeometryOwnershipType::ReadOnly); + geometry_set.replace_mesh(const_cast(mesh), bke::GeometryOwnershipType::ReadOnly); } } else if (object_orig->type == OB_POINTCLOUD) { - PointCloud *pointcloud = (PointCloud *)object_orig->data; - bke::PointCloudComponent &pointcloud_component = - geometry_set.get_component_for_write(); - pointcloud_component.replace(pointcloud, bke::GeometryOwnershipType::ReadOnly); + const PointCloud *pointcloud = static_cast(object_orig->data); + geometry_set.replace_pointcloud(const_cast(pointcloud), + bke::GeometryOwnershipType::ReadOnly); } else if (object_orig->type == OB_CURVES) { - const Curves &curves_id = *(const Curves *)object_orig->data; - bke::CurveComponent &curve_component = - geometry_set.get_component_for_write(); - curve_component.replace(&const_cast(curves_id), - bke::GeometryOwnershipType::ReadOnly); + const Curves &curves_id = *static_cast(object_orig->data); + geometry_set.replace_curves(&const_cast(curves_id), + bke::GeometryOwnershipType::ReadOnly); } } else { diff --git a/source/blender/geometry/intern/realize_instances.cc b/source/blender/geometry/intern/realize_instances.cc index 88d15c03827..c7e24edcbdc 100644 --- a/source/blender/geometry/intern/realize_instances.cc +++ b/source/blender/geometry/intern/realize_instances.cc @@ -776,9 +776,7 @@ static void execute_realize_pointcloud_tasks(const RealizeInstancesOptions &opti /* Allocate new point cloud. */ PointCloud *dst_pointcloud = BKE_pointcloud_new_nomain(tot_points); - bke::PointCloudComponent &dst_component = - r_realized_geometry.get_component_for_write(); - dst_component.replace(dst_pointcloud); + r_realized_geometry.replace_pointcloud(dst_pointcloud); bke::MutableAttributeAccessor dst_attributes = dst_pointcloud->attributes_for_write(); const RealizePointCloudTask &first_task = tasks.first(); @@ -1095,9 +1093,7 @@ static void execute_realize_mesh_tasks(const RealizeInstancesOptions &options, const int tot_poly = last_task.start_indices.poly + last_mesh.totpoly; Mesh *dst_mesh = BKE_mesh_new_nomain(tot_vertices, tot_edges, tot_poly, tot_loops); - bke::MeshComponent &dst_component = - r_realized_geometry.get_component_for_write(); - dst_component.replace(dst_mesh); + r_realized_geometry.replace_mesh(dst_mesh); bke::MutableAttributeAccessor dst_attributes = dst_mesh->attributes_for_write(); MutableSpan dst_positions = dst_mesh->vert_positions_for_write(); MutableSpan dst_edges = dst_mesh->edges_for_write(); -- 2.30.2 From c7cca085c64fb50d6bbe2fc2cb68c24ea6ff4cb1 Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Fri, 7 Jul 2023 16:06:58 +0200 Subject: [PATCH 044/115] Fix: assign char instead of string Using " instead of ' caused a compiler warning --- source/blender/editors/util/ed_draw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/util/ed_draw.c b/source/blender/editors/util/ed_draw.c index 7b453294a98..17c665a780d 100644 --- a/source/blender/editors/util/ed_draw.c +++ b/source/blender/editors/util/ed_draw.c @@ -414,7 +414,7 @@ tSlider *ED_slider_create(bContext *C) slider->factor_bounds[0] = 0; slider->factor_bounds[1] = 1; - slider->unit_string[0] = "%"; + slider->unit_string[0] = '%'; slider->slider_mode = SLIDER_MODE_PERCENT; -- 2.30.2 From 482211b7e0bf85a34e57f7ef9df8eebf1f2d1b9c Mon Sep 17 00:00:00 2001 From: Weizhen Huang Date: Fri, 7 Jul 2023 17:03:02 +0200 Subject: [PATCH 045/115] Fix wrong conversion from power to radiance of area lights The correct conversion factor should be 1 / (pi * area), see #108505 Co-authored-by: Brecht Van Lommel Pull Request: https://projects.blender.org/blender/blender/pulls/109153 --- intern/cycles/kernel/light/area.h | 3 ++- intern/cycles/scene/light_tree.cpp | 3 ++- source/blender/blenkernel/BKE_blender_version.h | 2 +- source/blender/blenkernel/intern/light.c | 6 ++++++ .../blender/blenloader/intern/versioning_280.cc | 8 ++++---- .../blender/blenloader/intern/versioning_400.cc | 16 ++++++++++++++-- source/blender/draw/engines/eevee/eevee_lights.c | 9 +++------ .../draw/engines/eevee_next/eevee_light.cc | 9 +++------ source/blender/makesdna/DNA_light_defaults.h | 1 + source/blender/makesdna/DNA_light_types.h | 2 ++ source/blender/makesdna/intern/dna_rename_defs.h | 2 ++ 11 files changed, 40 insertions(+), 21 deletions(-) diff --git a/intern/cycles/kernel/light/area.h b/intern/cycles/kernel/light/area.h index 2c331e4c2cb..a52e1079bba 100644 --- a/intern/cycles/kernel/light/area.h +++ b/intern/cycles/kernel/light/area.h @@ -290,7 +290,8 @@ ccl_device_inline bool area_light_eval(const ccl_global KernelLight *klight, ls->D = normalize_len(*light_P - ray_P, &ls->t); } - ls->eval_fac = 0.25f * invarea; + /* Convert radiant flux to radiance. */ + ls->eval_fac = M_1_PI_F * invarea; if (klight->area.normalize_spread > 0) { /* Area Light spread angle attenuation */ diff --git a/intern/cycles/scene/light_tree.cpp b/intern/cycles/scene/light_tree.cpp index 7c4c2738b9d..23b323f69b0 100644 --- a/intern/cycles/scene/light_tree.cpp +++ b/intern/cycles/scene/light_tree.cpp @@ -167,7 +167,8 @@ LightTreeEmitter::LightTreeEmitter(Scene *scene, measure.bbox.grow(centroid - half_extentu + half_extentv); measure.bbox.grow(centroid - half_extentu - half_extentv); - strength *= 0.25f; /* eval_fac scaling in `area.h` */ + /* Convert irradiance to radiance. */ + strength *= M_1_PI_F; } else if (type == LIGHT_POINT) { measure.bcone.theta_o = M_PI_F; diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index 96edba09c31..f590cc3158a 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -27,7 +27,7 @@ extern "C" { /* Blender file format version. */ #define BLENDER_FILE_VERSION BLENDER_VERSION -#define BLENDER_FILE_SUBVERSION 8 +#define BLENDER_FILE_SUBVERSION 9 /* Minimum Blender version that supports reading file written with the current * version. Older Blender versions will test this and show a warning if the file diff --git a/source/blender/blenkernel/intern/light.c b/source/blender/blenkernel/intern/light.c index f95c500431a..68f46273460 100644 --- a/source/blender/blenkernel/intern/light.c +++ b/source/blender/blenkernel/intern/light.c @@ -117,6 +117,12 @@ static void light_blend_write(BlendWriter *writer, ID *id, const void *id_addres { Light *la = (Light *)id; + /* Forward compatibility for energy. */ + la->energy_deprecated = la->energy; + if (la->type == LA_AREA) { + la->energy_deprecated /= M_PI_4; + } + /* write LibData */ BLO_write_id_struct(writer, Light, id_address, &la->id); BKE_id_blend_write(writer, &la->id); diff --git a/source/blender/blenloader/intern/versioning_280.cc b/source/blender/blenloader/intern/versioning_280.cc index cb6c961617b..885f4d78792 100644 --- a/source/blender/blenloader/intern/versioning_280.cc +++ b/source/blender/blenloader/intern/versioning_280.cc @@ -1434,7 +1434,7 @@ static void light_emission_node_to_energy(Light *light, float *energy, float col static void light_emission_unify(Light *light, const char *engine) { if (light->type != LA_SUN) { - light->energy *= 100.0f; + light->energy_deprecated *= 100.0f; } /* Attempt to extract constant energy and color from nodes. */ @@ -1445,16 +1445,16 @@ static void light_emission_unify(Light *light, const char *engine) if (STREQ(engine, "CYCLES")) { if (use_nodes) { /* Energy extracted from nodes */ - light->energy = energy; + light->energy_deprecated = energy; copy_v3_v3(&light->r, color); } else { /* Default cycles multipliers if there are no nodes */ if (light->type == LA_SUN) { - light->energy = 1.0f; + light->energy_deprecated = 1.0f; } else { - light->energy = 100.0f; + light->energy_deprecated = 100.0f; } } } diff --git a/source/blender/blenloader/intern/versioning_400.cc b/source/blender/blenloader/intern/versioning_400.cc index 623cc87e347..0eb01476592 100644 --- a/source/blender/blenloader/intern/versioning_400.cc +++ b/source/blender/blenloader/intern/versioning_400.cc @@ -10,6 +10,7 @@ #include "CLG_log.h" +#include "DNA_light_types.h" #include "DNA_lightprobe_types.h" #include "DNA_modifier_types.h" #include "DNA_movieclip_types.h" @@ -38,8 +39,18 @@ // static CLG_LogRef LOG = {"blo.readfile.doversion"}; -void do_versions_after_linking_400(FileData * /*fd*/, Main * /*bmain*/) +void do_versions_after_linking_400(FileData * /*fd*/, Main *bmain) { + if (!MAIN_VERSION_ATLEAST(bmain, 400, 9)) { + /* Fix area light scaling. */ + LISTBASE_FOREACH (Light *, light, &bmain->lights) { + light->energy = light->energy_deprecated; + if (light->type == LA_AREA) { + light->energy *= M_PI_4; + } + } + } + /** * Versioning code until next subversion bump goes here. * @@ -133,7 +144,8 @@ static void version_mesh_crease_generic(Main &bmain) LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { if (STR_ELEM(node->idname, "GeometryNodeStoreNamedAttribute", - "GeometryNodeInputNamedAttribute")) { + "GeometryNodeInputNamedAttribute")) + { bNodeSocket *socket = nodeFindSocket(node, SOCK_IN, "Name"); if (STREQ(socket->default_value_typed()->value, "crease")) { STRNCPY(socket->default_value_typed()->value, "crease_edge"); diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c index 15f194927a5..00a812f5ad5 100644 --- a/source/blender/draw/engines/eevee/eevee_lights.c +++ b/source/blender/draw/engines/eevee/eevee_lights.c @@ -78,9 +78,8 @@ static float light_shape_radiance_get(const Light *la, const EEVEE_Light *evli) if (ELEM(la->area_shape, LA_AREA_DISK, LA_AREA_ELLIPSE)) { area *= M_PI / 4.0f; } - /* NOTE: The 4 factor is from Cycles definition of power. */ - /* NOTE: Missing a factor of PI here to match Cycles. */ - return 1.0f / (4.0f * area); + /* Convert radiant flux to radiance. */ + return (float)M_1_PI / area; } case LA_SPOT: case LA_LOCAL: { @@ -120,9 +119,7 @@ static float light_volume_radiance_factor_get(const Light *la, float tmp = M_PI_2 / (M_PI_2 + sqrtf(area)); /* Lerp between 1.0 and the limit (1 / pi). */ float mrp_scaling = tmp + (1.0f - tmp) * M_1_PI; - /* NOTE: The 4 factor is from Cycles definition of power. */ - /* NOTE: Missing a factor of PI here to match Cycles. */ - power *= mrp_scaling / 4.0f; + power *= (float)M_1_PI * mrp_scaling; break; } case LA_SPOT: diff --git a/source/blender/draw/engines/eevee_next/eevee_light.cc b/source/blender/draw/engines/eevee_next/eevee_light.cc index b85e35a2171..5f1f470bf3c 100644 --- a/source/blender/draw/engines/eevee_next/eevee_light.cc +++ b/source/blender/draw/engines/eevee_next/eevee_light.cc @@ -178,9 +178,8 @@ float Light::shape_radiance_get(const ::Light *la) if (ELEM(la->area_shape, LA_AREA_DISK, LA_AREA_ELLIPSE)) { area *= M_PI / 4.0f; } - /* NOTE: The 4 factor is from Cycles definition of power. */ - /* NOTE: Missing a factor of PI here to match Cycles. */ - return 1.0f / (4.0f * area); + /* Convert radiant flux to radiance. */ + return float(M_1_PI) / area; } case LA_SPOT: case LA_LOCAL: { @@ -214,9 +213,7 @@ float Light::point_radiance_get(const ::Light *la) float tmp = M_PI_2 / (M_PI_2 + sqrtf(area)); /* Lerp between 1.0 and the limit (1 / pi). */ float mrp_scaling = tmp + (1.0f - tmp) * M_1_PI; - /* NOTE: The 4 factor is from Cycles definition of power. */ - /* NOTE: Missing a factor of PI here to match Cycles. */ - return mrp_scaling / 4.0f; + return float(M_1_PI) * mrp_scaling; } case LA_SPOT: case LA_LOCAL: { diff --git a/source/blender/makesdna/DNA_light_defaults.h b/source/blender/makesdna/DNA_light_defaults.h index c1d9e9acd13..f1d5eddcca1 100644 --- a/source/blender/makesdna/DNA_light_defaults.h +++ b/source/blender/makesdna/DNA_light_defaults.h @@ -21,6 +21,7 @@ .g = 1.0f, \ .b = 1.0f, \ .energy = 10.0f, \ + .energy_deprecated = 10.0f, \ .spotsize = DEG2RADF(45.0f), \ .spotblend = 0.15f, \ .mode = LA_SHADOW, \ diff --git a/source/blender/makesdna/DNA_light_types.h b/source/blender/makesdna/DNA_light_types.h index 41b0b915eaf..dd1e88c8b1b 100644 --- a/source/blender/makesdna/DNA_light_types.h +++ b/source/blender/makesdna/DNA_light_types.h @@ -89,6 +89,8 @@ typedef struct Light { /* Deprecated. */ struct Ipo *ipo DNA_DEPRECATED; /* Old animation system. */ + float energy_deprecated DNA_DEPRECATED; + float _pad2; } Light; /* **************** LIGHT ********************* */ diff --git a/source/blender/makesdna/intern/dna_rename_defs.h b/source/blender/makesdna/intern/dna_rename_defs.h index 461237619e2..b53741b08ee 100644 --- a/source/blender/makesdna/intern/dna_rename_defs.h +++ b/source/blender/makesdna/intern/dna_rename_defs.h @@ -85,6 +85,8 @@ DNA_STRUCT_RENAME_ELEM(GreasePencil, material_array_size, material_array_num) DNA_STRUCT_RENAME_ELEM(GreasePencilLayerFramesMapStorage, size, num) DNA_STRUCT_RENAME_ELEM(HookModifierData, totindex, indexar_num) DNA_STRUCT_RENAME_ELEM(Image, name, filepath) +DNA_STRUCT_RENAME_ELEM(Light, energy_new, energy) +DNA_STRUCT_RENAME_ELEM(Light, energy, energy_deprecated) DNA_STRUCT_RENAME_ELEM(LaplacianDeformModifierData, total_verts, verts_num) DNA_STRUCT_RENAME_ELEM(Library, name, filepath) DNA_STRUCT_RENAME_ELEM(LineartGpencilModifierData, line_types, edge_types) -- 2.30.2 From 9fe87646d5b96ebfbf60b327b33e3e308f9cf1b8 Mon Sep 17 00:00:00 2001 From: Weizhen Huang Date: Fri, 7 Jul 2023 17:15:18 +0200 Subject: [PATCH 046/115] Cycles: replace spot light disk sampling with sphere sampling The spotlight is now treated as a sphere instead of a view-aligned disk. The implementation remains almost identical to that of a point light, except for the spotlight attenuation and spot blend. There is no attenuation inside the sphere. Ref #108505 Other changes include: ## Sampling Instead of sampling the disk area, the new implementation samples either the cone of the visible portion on the sphere or the spread cone, based on which cone has a smaller solid angle. This reduces noise when the spotlight has a large radius and a small spread angle. | Before | After | | -- | -- | |![spot_size_before.png](/attachments/04ea864a-6bf9-40fe-b11b-61c838ae70cf)|![spot_size_after.png](/attachments/7077eaf9-b7a8-41b1-a8b6-aabf1eadb4f4) ## Texture Spot light can now project texture using UV coordinates. ## Normalization Previously, the normalization factor for the spotlight was \(\pi r^2\), the area of a disk. This factor has been adjusted to \(4\pi r^2\) to account for the surface area of a sphere. This change also affects point light since they share the same kernel type. ## Versioning Some pipeline uses the `Normal` socket of the Texture Coordinate node for projection, because `ls->Ng` was set to the incoming direction at the current shading point. Now that `ls->Ng` corresponds to the normal direction of a point on the sphere (except when the radius is zero), we replace these nodes with a combination of the Geometry shader node and the Vector Transform node, which gives the same result as before. ![versioning.png](/attachments/5bbfcacc-26c5-4f7f-8360-c42bcd851f68) Example file see https://archive.blender.org/developer/T93676 Pull Request: https://projects.blender.org/blender/blender/pulls/109329 --- intern/cycles/kernel/light/light.h | 4 +- intern/cycles/kernel/light/point.h | 6 +- intern/cycles/kernel/light/sample.h | 2 +- intern/cycles/kernel/light/spot.h | 233 ++++++++++++------ intern/cycles/kernel/types.h | 5 +- intern/cycles/scene/light.cpp | 26 +- intern/cycles/scene/light.h | 1 + .../blenloader/intern/versioning_400.cc | 40 +++ 8 files changed, 217 insertions(+), 100 deletions(-) diff --git a/intern/cycles/kernel/light/light.h b/intern/cycles/kernel/light/light.h index 87596a0abef..b3f5b3e9b41 100644 --- a/intern/cycles/kernel/light/light.h +++ b/intern/cycles/kernel/light/light.h @@ -147,7 +147,7 @@ ccl_device_inline bool light_sample(KernelGlobals kg, ls->eval_fac = 1.0f; } else if (type == LIGHT_SPOT) { - if (!spot_light_sample(klight, rand, P, ls)) { + if (!spot_light_sample(klight, rand, P, N, shader_flags, ls)) { return false; } } @@ -469,7 +469,7 @@ ccl_device bool light_sample_from_intersection(KernelGlobals kg, ls->group = lamp_lightgroup(kg, lamp); if (type == LIGHT_SPOT) { - if (!spot_light_sample_from_intersection(klight, isect, ray_P, ray_D, ls)) { + if (!spot_light_sample_from_intersection(klight, isect, ray_P, ray_D, N, path_flag, ls)) { return false; } } diff --git a/intern/cycles/kernel/light/point.h b/intern/cycles/kernel/light/point.h index a4dbd1850fe..bc41dea5fd1 100644 --- a/intern/cycles/kernel/light/point.h +++ b/intern/cycles/kernel/light/point.h @@ -44,7 +44,7 @@ ccl_device_inline bool point_light_sample(const ccl_global KernelLight *klight, ls->P = P + ls->D * ls->t; - ls->eval_fac = M_1_PI_F * 0.25f * klight->spot.invarea; + ls->eval_fac = klight->spot.eval_fac; if (r_sq == 0) { /* Use intensity instead of radiance for point light. */ ls->eval_fac /= sqr(ls->t); @@ -100,7 +100,7 @@ ccl_device_forceinline void point_light_mnee_sample_update(const ccl_global Kern ls->Ng = normalize(ls->P - klight->co); } else { - ls->eval_fac = M_1_PI_F * 0.25f * klight->spot.invarea; + ls->eval_fac = klight->spot.eval_fac; ls->Ng = -ls->D; @@ -136,7 +136,7 @@ ccl_device_inline bool point_light_sample_from_intersection( const uint32_t path_flag, ccl_private LightSample *ccl_restrict ls) { - ls->eval_fac = M_1_PI_F * 0.25f * klight->spot.invarea; + ls->eval_fac = klight->spot.eval_fac; const float radius = klight->spot.radius; diff --git a/intern/cycles/kernel/light/sample.h b/intern/cycles/kernel/light/sample.h index 96d6474e7af..afc4537c671 100644 --- a/intern/cycles/kernel/light/sample.h +++ b/intern/cycles/kernel/light/sample.h @@ -381,7 +381,7 @@ ccl_device_forceinline void light_sample_update(KernelGlobals kg, point_light_mnee_sample_update(klight, ls, P, N, path_flag); } else if (ls->type == LIGHT_SPOT) { - spot_light_mnee_sample_update(klight, ls, P); + spot_light_mnee_sample_update(klight, ls, P, N, path_flag); } else if (ls->type == LIGHT_AREA) { area_light_mnee_sample_update(klight, ls, P); diff --git a/intern/cycles/kernel/light/spot.h b/intern/cycles/kernel/light/spot.h index ca9fe5cf34a..57430e79992 100644 --- a/intern/cycles/kernel/light/spot.h +++ b/intern/cycles/kernel/light/spot.h @@ -8,96 +8,187 @@ CCL_NAMESPACE_BEGIN -ccl_device float spot_light_attenuation(const ccl_global KernelSpotLight *spot, float3 ray) +/* Transform vector to spot light's local coordinate system. */ +ccl_device float3 spot_light_to_local(const ccl_global KernelSpotLight *spot, const float3 ray) { - const float3 scaled_ray = safe_normalize(make_float3(dot(ray, spot->scaled_axis_u), - dot(ray, spot->scaled_axis_v), - dot(ray, spot->dir * spot->inv_len_z))); + return safe_normalize(make_float3(dot(ray, spot->scaled_axis_u), + dot(ray, spot->scaled_axis_v), + dot(ray, spot->dir * spot->inv_len_z))); +} - return smoothstepf((scaled_ray.z - spot->cos_half_spot_angle) * spot->spot_smooth); +/* Compute spot light attenuation of a ray given in local coordinate system. */ +ccl_device float spot_light_attenuation(const ccl_global KernelSpotLight *spot, const float3 ray) +{ + return smoothstepf((ray.z - spot->cos_half_spot_angle) * spot->spot_smooth); +} + +ccl_device void spot_light_uv(const float3 ray, + const float half_cot_half_spot_angle, + ccl_private float *u, + ccl_private float *v) +{ + /* Ensures that the spot light projects the full image regarless of the spot angle. */ + const float factor = half_cot_half_spot_angle / ray.z; + + /* NOTE: Return barycentric coordinates in the same notation as Embree and OptiX. */ + *u = ray.y * factor + 0.5f; + *v = -(ray.x + ray.y) * factor; } template ccl_device_inline bool spot_light_sample(const ccl_global KernelLight *klight, const float2 rand, const float3 P, + const float3 N, + const int shader_flags, ccl_private LightSample *ls) { - ls->P = klight->co; + const float radius = klight->spot.radius; + const float r_sq = sqr(klight->spot.radius); const float3 center = klight->co; - const float radius = klight->spot.radius; - /* disk oriented normal */ - const float3 lightN = normalize(P - center); - ls->P = center; - if (radius > 0.0f) { - /* disk light */ - ls->P += disk_light_sample(lightN, rand) * radius; + float3 lightN = P - center; + const float d_sq = len_squared(lightN); + const float d = sqrtf(d_sq); + lightN /= d; + + float cos_theta; + ls->t = FLT_MAX; + if (d_sq > r_sq) { + const float one_minus_cos_half_spot_spread = 1.0f - klight->spot.cos_half_spot_angle; + const float one_minus_cos_half_angle = sin_sqr_to_one_minus_cos(r_sq / d_sq); + + if (in_volume_segment || one_minus_cos_half_angle < one_minus_cos_half_spot_spread) { + /* Sample visible part of the sphere. */ + sample_uniform_cone_concentric( + -lightN, one_minus_cos_half_angle, rand, &cos_theta, &ls->D, &ls->pdf); + } + else { + /* Sample spread cone. */ + sample_uniform_cone_concentric( + -klight->spot.dir, one_minus_cos_half_spot_spread, rand, &cos_theta, &ls->D, &ls->pdf); + + if (!ray_sphere_intersect(P, ls->D, 0.0f, FLT_MAX, center, radius, &ls->P, &ls->t)) { + /* Sampled direction does not intersect with the light. */ + return false; + } + } + } + else { + const bool has_transmission = (shader_flags & SD_BSDF_HAS_TRANSMISSION); + if (has_transmission) { + ls->D = sample_uniform_sphere(rand); + ls->pdf = M_1_2PI_F * 0.5f; + } + else { + sample_cos_hemisphere(N, rand, &ls->D, &ls->pdf); + } + cos_theta = -dot(ls->D, lightN); } - const float invarea = klight->spot.invarea; - ls->pdf = invarea; + if (ls->t == FLT_MAX) { + /* Law of cosines. */ + ls->t = d * cos_theta - + copysignf(safe_sqrtf(r_sq - d_sq + d_sq * sqr(cos_theta)), d_sq - r_sq); + ls->P = P + ls->D * ls->t; + } + else { + /* Already computed when sampling the spread cone. */ + } - ls->D = normalize_len(ls->P - P, &ls->t); - /* we set the light normal to the outgoing direction to support texturing */ - ls->Ng = -ls->D; + const float3 local_ray = spot_light_to_local(&klight->spot, -ls->D); + ls->eval_fac = klight->spot.eval_fac; + if (d_sq > r_sq) { + ls->eval_fac *= spot_light_attenuation(&klight->spot, local_ray); + } - ls->eval_fac = (0.25f * M_1_PI_F) * invarea; - - /* spot light attenuation */ - ls->eval_fac *= spot_light_attenuation(&klight->spot, -ls->D); if (!in_volume_segment && ls->eval_fac == 0.0f) { return false; } - float2 uv = map_to_sphere(ls->Ng); - ls->u = uv.x; - ls->v = uv.y; + if (r_sq == 0) { + /* Use intensity instead of radiance when the radius is zero. */ + ls->eval_fac /= sqr(ls->t); + /* `ls->Ng` is not well-defined when the radius is zero, use the incoming direction instead. */ + ls->Ng = -ls->D; + } + else { + ls->Ng = normalize(ls->P - center); + /* Remap sampled point onto the sphere to prevent precision issues with small radius. */ + ls->P = ls->Ng * radius + center; + } + + spot_light_uv(local_ray, klight->spot.half_cot_half_spot_angle, &ls->u, &ls->v); - ls->pdf *= lamp_light_pdf(lightN, -ls->D, ls->t); return true; } +ccl_device_forceinline float spot_light_pdf(const float cos_half_spread, + const float d_sq, + const float r_sq, + const float3 N, + const float3 D, + const uint32_t path_flag) +{ + if (d_sq > r_sq) { + return M_1_2PI_F / min(sin_sqr_to_one_minus_cos(r_sq / d_sq), 1.0f - cos_half_spread); + } + + const bool has_transmission = (path_flag & PATH_RAY_MIS_HAD_TRANSMISSION); + return has_transmission ? M_1_2PI_F * 0.5f : pdf_cos_hemisphere(N, D); +} + ccl_device_forceinline void spot_light_mnee_sample_update(const ccl_global KernelLight *klight, ccl_private LightSample *ls, - const float3 P) + const float3 P, + const float3 N, + const uint32_t path_flag) { ls->D = normalize_len(ls->P - P, &ls->t); - ls->Ng = -ls->D; - float2 uv = map_to_sphere(ls->Ng); - ls->u = uv.x; - ls->v = uv.y; + const float3 local_ray = spot_light_to_local(&klight->spot, -ls->D); + ls->eval_fac = klight->spot.eval_fac; - float invarea = klight->spot.invarea; - ls->eval_fac = (0.25f * M_1_PI_F) * invarea; - /* NOTE : preserve pdf in area measure. */ - ls->pdf = invarea; + const float radius = klight->spot.radius; - /* spot light attenuation */ - ls->eval_fac *= spot_light_attenuation(&klight->spot, ls->Ng); + if (radius > 0) { + const float d_sq = len_squared(P - klight->co); + const float r_sq = sqr(radius); + const float t_sq = sqr(ls->t); + + ls->pdf = spot_light_pdf(klight->spot.cos_half_spot_angle, d_sq, r_sq, N, ls->D, path_flag); + + /* NOTE : preserve pdf in area measure. */ + ls->pdf *= 0.5f * fabsf(d_sq - r_sq - t_sq) / (radius * ls->t * t_sq); + + ls->Ng = normalize(ls->P - klight->co); + + if (d_sq > r_sq) { + ls->eval_fac *= spot_light_attenuation(&klight->spot, local_ray); + } + } + else { + ls->Ng = -ls->D; + + ls->eval_fac *= spot_light_attenuation(&klight->spot, local_ray); + + /* PDF does not change. */ + } + + spot_light_uv(local_ray, klight->spot.half_cot_half_spot_angle, &ls->u, &ls->v); } ccl_device_inline bool spot_light_intersect(const ccl_global KernelLight *klight, const ccl_private Ray *ccl_restrict ray, ccl_private float *t) { - /* Spot/Disk light. */ - const float3 lightP = klight->co; - const float radius = klight->spot.radius; - if (radius == 0.0f) { - return false; - } - /* disk oriented normal */ - const float3 lightN = normalize(ray->P - lightP); /* One sided. */ - if (dot(ray->D, lightN) >= 0.0f) { + if (dot(ray->D, ray->P - klight->co) >= 0.0f) { return false; } - float3 P; - return ray_disk_intersect(ray->P, ray->D, ray->tmin, ray->tmax, lightP, lightN, radius, &P, t); + return point_light_intersect(klight, ray, t); } ccl_device_inline bool spot_light_sample_from_intersection( @@ -105,35 +196,27 @@ ccl_device_inline bool spot_light_sample_from_intersection( ccl_private const Intersection *ccl_restrict isect, const float3 ray_P, const float3 ray_D, + const float3 N, + const uint32_t path_flag, ccl_private LightSample *ccl_restrict ls) { - /* the normal of the oriented disk */ - const float3 lightN = normalize(ray_P - klight->co); - /* We set the light normal to the outgoing direction to support texturing. */ - ls->Ng = -ls->D; + const float d_sq = len_squared(ray_P - klight->co); + const float r_sq = sqr(klight->spot.radius); - float invarea = klight->spot.invarea; - ls->eval_fac = (0.25f * M_1_PI_F) * invarea; - ls->pdf = invarea; + ls->pdf = spot_light_pdf(klight->spot.cos_half_spot_angle, d_sq, r_sq, N, ray_D, path_flag); - /* spot light attenuation */ - ls->eval_fac *= spot_light_attenuation(&klight->spot, -ls->D); - - if (ls->eval_fac == 0.0f) { + const float3 local_ray = spot_light_to_local(&klight->spot, -ray_D); + ls->eval_fac = klight->spot.eval_fac; + if (d_sq > r_sq) { + ls->eval_fac *= spot_light_attenuation(&klight->spot, local_ray); + } + if (ls->eval_fac == 0) { return false; } - float2 uv = map_to_sphere(ls->Ng); - ls->u = uv.x; - ls->v = uv.y; + ls->Ng = r_sq > 0 ? normalize(ls->P - klight->co) : -ray_D; - /* compute pdf */ - if (ls->t != FLT_MAX) { - ls->pdf *= lamp_light_pdf(lightN, -ls->D, ls->t); - } - else { - ls->pdf = 0.f; - } + spot_light_uv(local_ray, klight->spot.half_cot_half_spot_angle, &ls->u, &ls->v); return true; } @@ -146,18 +229,20 @@ ccl_device_forceinline bool spot_light_tree_parameters(const ccl_global KernelLi ccl_private float2 &distance, ccl_private float3 &point_to_centroid) { - float min_distance; - const float3 point_to_centroid_ = safe_normalize_len(centroid - P, &min_distance); + float dist_point_to_centroid; + const float3 point_to_centroid_ = safe_normalize_len(centroid - P, &dist_point_to_centroid); const float radius = klight->spot.radius; - const float hypotenus = sqrtf(sqr(radius) + sqr(min_distance)); - cos_theta_u = min_distance / hypotenus; + cos_theta_u = (dist_point_to_centroid > radius) ? cos_from_sin(radius / dist_point_to_centroid) : + -1.0f; if (in_volume_segment) { return true; } - distance = make_float2(hypotenus, min_distance); + distance = (dist_point_to_centroid > radius) ? + dist_point_to_centroid * make_float2(1.0f / cos_theta_u, 1.0f) : + one_float2() * radius / M_SQRT2_F; point_to_centroid = point_to_centroid_; return true; diff --git a/intern/cycles/kernel/types.h b/intern/cycles/kernel/types.h index 3366fd331a4..1d8a956aeac 100644 --- a/intern/cycles/kernel/types.h +++ b/intern/cycles/kernel/types.h @@ -1353,12 +1353,13 @@ typedef struct KernelSpotLight { packed_float3 scaled_axis_u; float radius; packed_float3 scaled_axis_v; - float invarea; + float eval_fac; packed_float3 dir; float cos_half_spot_angle; + float half_cot_half_spot_angle; float inv_len_z; float spot_smooth; - float pad[2]; + float pad; } KernelSpotLight; /* PointLight is SpotLight with only radius and invarea being used. */ diff --git a/intern/cycles/scene/light.cpp b/intern/cycles/scene/light.cpp index 12cfdae4eb1..529fe2ca947 100644 --- a/intern/cycles/scene/light.cpp +++ b/intern/cycles/scene/light.cpp @@ -1210,22 +1210,22 @@ void LightManager::device_update_lights(Device *device, DeviceScene *dscene, Sce klights[light_index].strength[1] = light->strength.y; klights[light_index].strength[2] = light->strength.z; - if (light->light_type == LIGHT_POINT) { + if (light->light_type == LIGHT_POINT || light->light_type == LIGHT_SPOT) { shader_id &= ~SHADER_AREA_LIGHT; float radius = light->size; - /* TODO: `invarea` was used for disk sampling, with the current solid angle sampling this - * becomes unnecessary. We could store `eval_fac` instead, but currently it shares the same - * #KernelSpotLight type with #LIGHT_SPOT, so keep it know until refactor for spot light. */ - float invarea = (light->normalize && radius > 0.0f) ? 1.0f / (M_PI_F * radius * radius) : + + float invarea = (light->normalize && radius > 0.0f) ? 1.0f / (M_4PI_F * radius * radius) : 1.0f; + /* Convert radiant flux to radiance or radiant intensity. */ + float eval_fac = (radius > 0) ? invarea * M_1_PI_F : 0.25f * M_1_PI_F; if (light->use_mis && radius > 0.0f) shader_id |= SHADER_USE_MIS; klights[light_index].co = co; klights[light_index].spot.radius = radius; - klights[light_index].spot.invarea = invarea; + klights[light_index].spot.eval_fac = eval_fac; } else if (light->light_type == LIGHT_DISTANT) { shader_id &= ~SHADER_AREA_LIGHT; @@ -1306,9 +1306,7 @@ void LightManager::device_update_lights(Device *device, DeviceScene *dscene, Sce klights[light_index].area.tan_half_spread = tan_half_spread; klights[light_index].area.normalize_spread = normalize_spread; } - else if (light->light_type == LIGHT_SPOT) { - shader_id &= ~SHADER_AREA_LIGHT; - + if (light->light_type == LIGHT_SPOT) { /* Scale axes to accommodate non-uniform scaling. */ float3 scaled_axis_u = light->axisu / len_squared(light->axisu); float3 scaled_axis_v = light->axisv / len_squared(light->axisv); @@ -1316,22 +1314,14 @@ void LightManager::device_update_lights(Device *device, DeviceScene *dscene, Sce /* Keep direction normalized. */ float3 dir = safe_normalize_len(light->dir, &len_z); - float radius = light->size; - float invarea = (light->normalize && radius > 0.0f) ? 1.0f / (M_PI_F * radius * radius) : - 1.0f; float cos_half_spot_angle = cosf(light->spot_angle * 0.5f); float spot_smooth = 1.0f / ((1.0f - cos_half_spot_angle) * light->spot_smooth); - if (light->use_mis && radius > 0.0f) - shader_id |= SHADER_USE_MIS; - - klights[light_index].co = co; klights[light_index].spot.scaled_axis_u = scaled_axis_u; - klights[light_index].spot.radius = radius; klights[light_index].spot.scaled_axis_v = scaled_axis_v; - klights[light_index].spot.invarea = invarea; klights[light_index].spot.dir = dir; klights[light_index].spot.cos_half_spot_angle = cos_half_spot_angle; + klights[light_index].spot.half_cot_half_spot_angle = 0.5f / tanf(light->spot_angle * 0.5f); klights[light_index].spot.inv_len_z = 1.0f / len_z; klights[light_index].spot.spot_smooth = spot_smooth; } diff --git a/intern/cycles/scene/light.h b/intern/cycles/scene/light.h index 875c079ec9d..7aa1542a974 100644 --- a/intern/cycles/scene/light.h +++ b/intern/cycles/scene/light.h @@ -76,6 +76,7 @@ class Light : public Node { NODE_SOCKET_API(uint64_t, light_set_membership); NODE_SOCKET_API(uint64_t, shadow_set_membership); + /* Normalize power by the surface area of the light. */ NODE_SOCKET_API(bool, normalize) void tag_update(Scene *scene); diff --git a/source/blender/blenloader/intern/versioning_400.cc b/source/blender/blenloader/intern/versioning_400.cc index 0eb01476592..df25e248274 100644 --- a/source/blender/blenloader/intern/versioning_400.cc +++ b/source/blender/blenloader/intern/versioning_400.cc @@ -213,6 +213,37 @@ static void versioning_remove_microfacet_sharp_distribution(bNodeTree *ntree) } } +static void version_replace_texcoord_normal_socket(bNodeTree *ntree) +{ + /* The normal of a spot light was set to the incoming light direction, replace with the + * `Incoming` socket from the Geometry shader node. */ + bNode *geometry_node = nullptr; + bNode *transform_node = nullptr; + bNodeSocket *incoming_socket = nullptr; + bNodeSocket *vec_in_socket = nullptr; + bNodeSocket *vec_out_socket = nullptr; + + LISTBASE_FOREACH_MUTABLE (bNodeLink *, link, &ntree->links) { + if (link->fromnode->type == SH_NODE_TEX_COORD && STREQ(link->fromsock->identifier, "Normal")) { + if (geometry_node == nullptr) { + geometry_node = nodeAddStaticNode(nullptr, ntree, SH_NODE_NEW_GEOMETRY); + incoming_socket = nodeFindSocket(geometry_node, SOCK_OUT, "Incoming"); + + transform_node = nodeAddStaticNode(nullptr, ntree, SH_NODE_VECT_TRANSFORM); + vec_in_socket = nodeFindSocket(transform_node, SOCK_IN, "Vector"); + vec_out_socket = nodeFindSocket(transform_node, SOCK_OUT, "Vector"); + + NodeShaderVectTransform *nodeprop = (NodeShaderVectTransform *)transform_node->storage; + nodeprop->type = SHD_VECT_TRANSFORM_TYPE_NORMAL; + + nodeAddLink(ntree, geometry_node, incoming_socket, transform_node, vec_in_socket); + } + nodeAddLink(ntree, transform_node, vec_out_socket, link->tonode, link->tosock); + nodeRemLink(ntree, link); + } + } +} + void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain) { if (!MAIN_VERSION_ATLEAST(bmain, 400, 1)) { @@ -277,6 +308,15 @@ void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain) act->frame_end = min_ff(act->frame_end, MAXFRAMEF); } } + + if (!MAIN_VERSION_ATLEAST(bmain, 400, 9)) { + LISTBASE_FOREACH (Light *, light, &bmain->lights) { + if (light->type == LA_SPOT && light->nodetree) { + version_replace_texcoord_normal_socket(light->nodetree); + } + } + } + /** * Versioning code until next subversion bump goes here. * -- 2.30.2 From 213204c229584cfa29db7fce12f6e556538ee60a Mon Sep 17 00:00:00 2001 From: Lukas Stockner Date: Fri, 7 Jul 2023 17:20:19 +0200 Subject: [PATCH 047/115] Cycles: Change sun lamp to have uniform intensity at high angles MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This fixes the issue described in https://projects.blender.org/blender/blender/issues/108957. Instead of modeling distant lights like a disk light at infinity, it models them as cones. This way, the radiance is constant across the entire range of directions that it covers. For smaller angles, the difference is very subtle, but for very large angles it becomes obvious (here's the file from #108957, the angle is 179°): | Old | New | | - | - | | ![old_bigsun.png](/attachments/4ef8e7a7-1a29-4bdf-a74c-3cfa103bf1e7) | ![new_bigsun.png](/attachments/d53c7749-2672-40b6-9048-ccf2fffceeb7) | One notable detail is the sampling method: Using `sample_uniform_cone` can increase noise, since the sampling method no longer preserves the stratification of the samples. This is visible in the "light tree multi distant" test scene. Turns out we can do better, and after a bit of testing I found a way to adapt the concentric Shirley mapping to uniform cone sampling. I hope the comment explains the logic behind it reasonably well. Here's the result, note that even the noise distribution is the same when using the new sampling: | Method | Old | New, basic sampling | New, concentric sampling | | - | - |- | - | | Image | ![old.png](/attachments/b3258a70-f015-4065-a774-193974cce439) | ![new_basic.png](/attachments/a9008576-0af6-4152-a687-c800fd958bbd) | ![new_concentric.png](/attachments/769b6c43-34bc-434e-a4fd-ce69addd1ba5) | | Render time (at higher spp)| 9.03sec | 8.79sec | 8.96sec | I'm not sure if I got the `light->normalized` handling right, since I don't really know what the expectation from Hydra is here. Co-authored-by: Weizhen Huang Pull Request: https://projects.blender.org/blender/blender/pulls/108996 --- intern/cycles/kernel/light/distant.h | 60 ++++++--------------------- intern/cycles/kernel/sample/mapping.h | 25 ++++++++++- intern/cycles/kernel/types.h | 8 ++-- intern/cycles/scene/light.cpp | 23 +++++----- intern/cycles/util/math_fast.h | 6 +++ 5 files changed, 58 insertions(+), 64 deletions(-) diff --git a/intern/cycles/kernel/light/distant.h b/intern/cycles/kernel/light/distant.h index 2dd02a58e2f..0f1b2ea0179 100644 --- a/intern/cycles/kernel/light/distant.h +++ b/intern/cycles/kernel/light/distant.h @@ -14,24 +14,15 @@ ccl_device_inline bool distant_light_sample(const ccl_global KernelLight *klight const float2 rand, ccl_private LightSample *ls) { - /* distant light */ - float3 lightD = klight->co; - float3 D = lightD; - float radius = klight->distant.radius; - float invarea = klight->distant.invarea; + float unused; + sample_uniform_cone_concentric( + klight->co, klight->distant.one_minus_cosangle, rand, &unused, &ls->Ng, &ls->pdf); - if (radius > 0.0f) { - D = normalize(D + disk_light_sample(D, rand) * radius); - } - - ls->P = D; - ls->Ng = D; - ls->D = -D; + ls->P = ls->Ng; + ls->D = -ls->Ng; ls->t = FLT_MAX; - float costheta = dot(lightD, D); - ls->pdf = invarea / (costheta * costheta * costheta); - ls->eval_fac = ls->pdf; + ls->eval_fac = klight->distant.eval_fac; return true; } @@ -50,15 +41,11 @@ ccl_device bool distant_light_intersect(const ccl_global KernelLight *klight, { kernel_assert(klight->type == LIGHT_DISTANT); - if (klight->distant.radius == 0.0f) { + if (klight->distant.angle == 0.0f) { return false; } - const float3 lightD = klight->co; - const float costheta = dot(-lightD, ray->D); - const float cosangle = klight->distant.cosangle; - - if (costheta < cosangle) { + if (vector_angle(-klight->co, ray->D) > klight->distant.angle) { return false; } @@ -76,7 +63,6 @@ ccl_device bool distant_light_sample_from_intersection(KernelGlobals kg, { ccl_global const KernelLight *klight = &kernel_data_fetch(lights, lamp); const int shader = klight->shader_id; - const float radius = klight->distant.radius; const LightType type = (LightType)klight->type; if (type != LIGHT_DISTANT) { @@ -85,37 +71,19 @@ ccl_device bool distant_light_sample_from_intersection(KernelGlobals kg, if (!(shader & SHADER_USE_MIS)) { return false; } - if (radius == 0.0f) { + if (klight->distant.angle == 0.0f) { return false; } - /* a distant light is infinitely far away, but equivalent to a disk - * shaped light exactly 1 unit away from the current shading point. - * - * radius t^2/cos(theta) - * <----------> t = sqrt(1^2 + tan(theta)^2) - * tan(th) area = radius*radius*pi - * <-----> - * \ | (1 + tan(theta)^2)/cos(theta) - * \ | (1 + tan(acos(cos(theta)))^2)/cos(theta) - * t \th| 1 simplifies to - * \-| 1/(cos(theta)^3) - * \| magic! - * P - */ - - float3 lightD = klight->co; - float costheta = dot(-lightD, ray_D); - float cosangle = klight->distant.cosangle; - /* Workaround to prevent a hang in the classroom scene with AMD HIP drivers 22.10, * Remove when a compiler fix is available. */ #ifdef __HIP__ ls->shader = klight->shader_id; #endif - if (costheta < cosangle) + if (vector_angle(-klight->co, ray_D) > klight->distant.angle) { return false; + } ls->type = type; #ifndef __HIP__ @@ -133,10 +101,8 @@ ccl_device bool distant_light_sample_from_intersection(KernelGlobals kg, ls->D = ray_D; ls->group = lamp_lightgroup(kg, lamp); - /* compute pdf */ - float invarea = klight->distant.invarea; - ls->pdf = invarea / (costheta * costheta * costheta); - ls->eval_fac = ls->pdf; + ls->pdf = klight->distant.pdf; + ls->eval_fac = klight->distant.eval_fac; return true; } diff --git a/intern/cycles/kernel/sample/mapping.h b/intern/cycles/kernel/sample/mapping.h index 6ae8fb9f95a..91e12f5f625 100644 --- a/intern/cycles/kernel/sample/mapping.h +++ b/intern/cycles/kernel/sample/mapping.h @@ -133,14 +133,35 @@ ccl_device_inline void sample_uniform_cone_concentric(const float3 N, ccl_private float *pdf) { if (one_minus_cos_angle > 0) { - /* Map random number from 2D to 1D. */ + /* Remap radius to get a uniform distribution w.r.t. solid angle on the cone. + * The logic to derive this mapping is as follows: + * + * Sampling a cone is comparable to sampling the hemisphere, we just restrict theta. Therefore, + * the same trick of first sampling the unit disk and the projecting the result up towards the + * hemisphere by calculating the appropriate z coordinate still works. + * + * However, by itself this results in cosine-weighted hemisphere sampling, so we need some kind + * of remapping. Cosine-weighted hemisphere and uniform cone sampling have the same conditional + * PDF for phi (both are constant), so we only need to think about theta, which corresponds + * directly to the radius. + * + * To find this mapping, we consider the simplest sampling strategies for cosine-weighted + * hemispheres and uniform cones. In both, phi is chosen as 2pi * random(). For the former, + * r_disk(rand) = sqrt(rand). This is just naive disk sampling, since the projection to the + * hemisphere doesn't change the radius. For the latter, r_cone(rand) = + * sin_from_cos(mix(cos_angle, 1, rand)). + * + * So, to remap, we just invert r_disk (-> rand(r_disk) = r_disk^2) and insert it into r_cone: + * r_cone(r_disk) = r_cone(rand(r_disk)) = sin_from_cos(mix(cos_angle, 1, r_disk^2)). In + * practise, we need to replace `rand` with `1 - rand` to preserve the stratification, but + * since it's uniform, that's fine. */ float2 xy = concentric_sample_disk(rand); const float r2 = len_squared(xy); /* Equivalent to `mix(cos_angle, 1.0f, 1.0f - r2)` */ *cos_theta = 1.0f - r2 * one_minus_cos_angle; - /* Equivalent to `xy *= sin_theta / sqrt(r2); */ + /* Remap disk radius to cone radius, equivalent to `xy *= sin_theta / sqrt(r2); */ xy *= safe_sqrtf(one_minus_cos_angle * (2.0f - one_minus_cos_angle * r2)); float3 T, B; diff --git a/intern/cycles/kernel/types.h b/intern/cycles/kernel/types.h index 1d8a956aeac..3fe479c6bac 100644 --- a/intern/cycles/kernel/types.h +++ b/intern/cycles/kernel/types.h @@ -1377,10 +1377,10 @@ typedef struct KernelAreaLight { } KernelAreaLight; typedef struct KernelDistantLight { - float radius; - float cosangle; - float invarea; - float pad; + float angle; + float one_minus_cosangle; + float pdf; + float eval_fac; } KernelDistantLight; typedef struct KernelLight { diff --git a/intern/cycles/scene/light.cpp b/intern/cycles/scene/light.cpp index 529fe2ca947..ee72c67e6f0 100644 --- a/intern/cycles/scene/light.cpp +++ b/intern/cycles/scene/light.cpp @@ -1230,22 +1230,23 @@ void LightManager::device_update_lights(Device *device, DeviceScene *dscene, Sce else if (light->light_type == LIGHT_DISTANT) { shader_id &= ~SHADER_AREA_LIGHT; + float3 dir = safe_normalize(light->dir); float angle = light->angle / 2.0f; - float radius = tanf(angle); - float cosangle = cosf(angle); - float area = M_PI_F * radius * radius; - float invarea = (light->normalize && area > 0.0f) ? 1.0f / area : 1.0f; - float3 dir = light->dir; - dir = safe_normalize(dir); - - if (light->use_mis && area > 0.0f) + if (light->use_mis && angle > 0.0f) { shader_id |= SHADER_USE_MIS; + } + + const float one_minus_cosangle = 2.0f * sqr(sinf(0.5f * angle)); + const float pdf = (angle > 0.0f) ? (M_1_2PI_F / one_minus_cosangle) : 1.0f; klights[light_index].co = dir; - klights[light_index].distant.invarea = invarea; - klights[light_index].distant.radius = radius; - klights[light_index].distant.cosangle = cosangle; + klights[light_index].distant.angle = angle; + klights[light_index].distant.one_minus_cosangle = one_minus_cosangle; + klights[light_index].distant.pdf = pdf; + klights[light_index].distant.eval_fac = (light->normalize && angle > 0) ? + M_1_PI_F / sqr(sinf(angle)) : + 1.0f; } else if (light->light_type == LIGHT_BACKGROUND) { uint visibility = scene->background->get_visibility(); diff --git a/intern/cycles/util/math_fast.h b/intern/cycles/util/math_fast.h index dbd932409e3..52f17f57418 100644 --- a/intern/cycles/util/math_fast.h +++ b/intern/cycles/util/math_fast.h @@ -336,6 +336,12 @@ ccl_device float fast_atan2f(float y, float x) return copysignf(r, y); } +/* Same as precise_angle, but using fast_atan2f. Still much better that acos(dot(a, b)). */ +ccl_device_inline float vector_angle(float3 a, float3 b) +{ + return 2.0f * fast_atan2f(len(a - b), len(a + b)); +} + /* Based on: * * https://github.com/LiraNuna/glsl-sse2/blob/master/source/vec4.h -- 2.30.2 From 59adf9cdd6bc3365afb033e79851cae82561c0c1 Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Fri, 7 Jul 2023 18:01:50 +0200 Subject: [PATCH 048/115] GPv3: API tweaks to prepare for drag & drop reordering Minor tweaks to the API to support drag & drop management in the layer tree UI. These changes were needed for #109826: - Add `TreeNode.parent_group()` - Add `LayerGroup.as_node()` - Use `TreeNode` instead of `Layer` whenever a link is needed to link or unlink a layer. Pull Request: https://projects.blender.org/blender/blender/pulls/109824 --- .../blender/blenkernel/BKE_grease_pencil.hh | 30 +++++++++++++++---- .../blenkernel/intern/grease_pencil.cc | 23 ++++++++------ .../intern/grease_pencil_layers.cc | 8 ++--- .../makesdna/DNA_grease_pencil_types.h | 2 +- 4 files changed, 44 insertions(+), 19 deletions(-) diff --git a/source/blender/blenkernel/BKE_grease_pencil.hh b/source/blender/blenkernel/BKE_grease_pencil.hh index 7af6999b47b..e6100d2be7f 100644 --- a/source/blender/blenkernel/BKE_grease_pencil.hh +++ b/source/blender/blenkernel/BKE_grease_pencil.hh @@ -133,6 +133,11 @@ class TreeNode : public ::GreasePencilLayerTreeNode { * \note This results in undefined behavior if the node is not a Layer. */ Layer &as_layer_for_write(); + + /** + * \returns the parent layer group or nullptr for the root group. + */ + LayerGroup *parent_group() const; }; /** @@ -296,6 +301,12 @@ class LayerGroup : public ::GreasePencilLayerTreeGroup { bool is_visible() const; bool is_locked() const; + /** + * \returns the group as a `TreeNode`. + */ + const TreeNode &as_node() const; + TreeNode &as_node(); + /** * Adds a group at the end of this group. */ @@ -317,14 +328,14 @@ class LayerGroup : public ::GreasePencilLayerTreeGroup { /** * Adds a layer before \a link and returns it. */ - Layer &add_layer_before(Layer *layer, Layer *link); - Layer &add_layer_before(StringRefNull name, Layer *link); + Layer &add_layer_before(Layer *layer, TreeNode *link); + Layer &add_layer_before(StringRefNull name, TreeNode *link); /** * Adds a layer after \a link and returns it. */ - Layer &add_layer_after(Layer *layer, Layer *link); - Layer &add_layer_after(StringRefNull name, Layer *link); + Layer &add_layer_after(Layer *layer, TreeNode *link); + Layer &add_layer_after(StringRefNull name, TreeNode *link); /** * Returns the number of direct nodes in this group. @@ -340,7 +351,7 @@ class LayerGroup : public ::GreasePencilLayerTreeGroup { * Tries to unlink the layer from the list of nodes in this group. * \returns true, if the layer was successfully unlinked. */ - bool unlink_layer(Layer *link); + bool unlink_node(TreeNode *link); /** * Returns a `Span` of pointers to all the `TreeNode`s in this group. @@ -382,6 +393,15 @@ class LayerGroup : public ::GreasePencilLayerTreeGroup { void tag_nodes_cache_dirty() const; }; +inline const TreeNode &LayerGroup::as_node() const +{ + return *reinterpret_cast(this); +} +inline TreeNode &LayerGroup::as_node() +{ + return *reinterpret_cast(this); +} + inline const TreeNode &Layer::as_node() const { return *reinterpret_cast(this); diff --git a/source/blender/blenkernel/intern/grease_pencil.cc b/source/blender/blenkernel/intern/grease_pencil.cc index d152b52d9c4..c4b8a9d968d 100644 --- a/source/blender/blenkernel/intern/grease_pencil.cc +++ b/source/blender/blenkernel/intern/grease_pencil.cc @@ -401,6 +401,11 @@ Layer &TreeNode::as_layer_for_write() return *reinterpret_cast(this); } +LayerGroup *TreeNode::parent_group() const +{ + return &this->parent->wrap(); +} + LayerMask::LayerMask() { this->layer_name = nullptr; @@ -738,7 +743,7 @@ Layer &LayerGroup::add_layer(Layer *layer) return *layer; } -Layer &LayerGroup::add_layer_before(Layer *layer, Layer *link) +Layer &LayerGroup::add_layer_before(Layer *layer, TreeNode *link) { BLI_assert(layer != nullptr && link != nullptr); BLI_insertlinkbefore(&this->children, @@ -749,7 +754,7 @@ Layer &LayerGroup::add_layer_before(Layer *layer, Layer *link) return *layer; } -Layer &LayerGroup::add_layer_after(Layer *layer, Layer *link) +Layer &LayerGroup::add_layer_after(Layer *layer, TreeNode *link) { BLI_assert(layer != nullptr && link != nullptr); BLI_insertlinkafter(&this->children, @@ -766,13 +771,13 @@ Layer &LayerGroup::add_layer(StringRefNull name) return this->add_layer(new_layer); } -Layer &LayerGroup::add_layer_before(StringRefNull name, Layer *link) +Layer &LayerGroup::add_layer_before(StringRefNull name, TreeNode *link) { Layer *new_layer = MEM_new(__func__, name); return this->add_layer_before(new_layer, link); } -Layer &LayerGroup::add_layer_after(StringRefNull name, Layer *link) +Layer &LayerGroup::add_layer_after(StringRefNull name, TreeNode *link) { Layer *new_layer = MEM_new(__func__, name); return this->add_layer_after(new_layer, link); @@ -789,11 +794,11 @@ int64_t LayerGroup::num_nodes_total() const return this->runtime->nodes_cache_.size(); } -bool LayerGroup::unlink_layer(Layer *link) +bool LayerGroup::unlink_node(TreeNode *link) { if (BLI_remlink_safe(&this->children, link)) { this->tag_nodes_cache_dirty(); - link->base.parent = nullptr; + link->parent = nullptr; return true; } return false; @@ -1434,14 +1439,14 @@ blender::bke::greasepencil::Layer &GreasePencil::add_layer( blender::bke::greasepencil::Layer &GreasePencil::add_layer_after( blender::bke::greasepencil::LayerGroup &group, - blender::bke::greasepencil::Layer *layer, + blender::bke::greasepencil::TreeNode *link, const blender::StringRefNull name) { using namespace blender; VectorSet names = get_node_names(*this); std::string unique_name(name.c_str()); unique_layer_name(names, unique_name.data()); - return group.add_layer_after(unique_name, layer); + return group.add_layer_after(unique_name, link); } blender::bke::greasepencil::Layer &GreasePencil::add_layer(const blender::StringRefNull name) @@ -1551,7 +1556,7 @@ void GreasePencil::remove_layer(blender::bke::greasepencil::Layer &layer) } /* Unlink the layer from the parent group. */ - layer.parent_group().unlink_layer(&layer); + layer.parent_group().unlink_node(&layer.as_node()); /* Remove drawings. */ /* TODO: In the future this should only remove drawings when the user count hits zero. */ diff --git a/source/blender/editors/grease_pencil/intern/grease_pencil_layers.cc b/source/blender/editors/grease_pencil/intern/grease_pencil_layers.cc index 5f5ef25668b..a189d960e9d 100644 --- a/source/blender/editors/grease_pencil/intern/grease_pencil_layers.cc +++ b/source/blender/editors/grease_pencil/intern/grease_pencil_layers.cc @@ -36,7 +36,7 @@ static int grease_pencil_layer_add_exec(bContext *C, wmOperator *op) if (grease_pencil.has_active_layer()) { LayerGroup &active_group = grease_pencil.get_active_layer()->parent_group(); Layer &new_layer = grease_pencil.add_layer_after( - active_group, grease_pencil.get_active_layer_for_write(), new_layer_name); + active_group, &grease_pencil.get_active_layer_for_write()->as_node(), new_layer_name); grease_pencil.set_active_layer(&new_layer); grease_pencil.insert_blank_frame(new_layer, scene->r.cfra, 0, BEZT_KEYTYPE_KEYFRAME); } @@ -133,19 +133,19 @@ static int grease_pencil_layer_reorder_exec(bContext *C, wmOperator *op) } Layer *active_layer = grease_pencil.get_active_layer_for_write(); - active_layer->parent_group().unlink_layer(active_layer); + active_layer->parent_group().unlink_node(&active_layer->as_node()); switch (reorder_location) { case LAYER_REORDER_ABOVE: { /* Note: The layers are stored from bottom to top, so inserting above (visually), means * inserting the link after the target. */ - target_layer->parent_group().add_layer_after(active_layer, target_layer); + target_layer->parent_group().add_layer_after(active_layer, &target_layer->as_node()); break; } case LAYER_REORDER_BELOW: { /* Note: The layers are stored from bottom to top, so inserting below (visually), means * inserting the link before the target. */ - target_layer->parent_group().add_layer_before(active_layer, target_layer); + target_layer->parent_group().add_layer_before(active_layer, &target_layer->as_node()); break; } default: diff --git a/source/blender/makesdna/DNA_grease_pencil_types.h b/source/blender/makesdna/DNA_grease_pencil_types.h index fb48274cf79..3667bb0e9ed 100644 --- a/source/blender/makesdna/DNA_grease_pencil_types.h +++ b/source/blender/makesdna/DNA_grease_pencil_types.h @@ -459,7 +459,7 @@ typedef struct GreasePencil { blender::StringRefNull name); blender::bke::greasepencil::Layer &add_layer(blender::StringRefNull name); blender::bke::greasepencil::Layer &add_layer_after(blender::bke::greasepencil::LayerGroup &group, - blender::bke::greasepencil::Layer *layer, + blender::bke::greasepencil::TreeNode *link, blender::StringRefNull name); blender::bke::greasepencil::LayerGroup &add_layer_group( -- 2.30.2 From 05c97df2dead07630d7adf7dabe8810afcc903c3 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 3 Jul 2023 15:08:28 +0200 Subject: [PATCH 049/115] USD: improve light units conversion * Use pi factor to convert between radiant flux and intensity * Mark lights as normalized on export * Add spot light export support * Add treatAsPoint support for import and export * Empirically match normalized distant light * Fix wrong unnormalized point/sphere/disk light unit in Cycles Overall it should be much closer now for all light types. Point and distant light units are inconsistent between renderers, so not possible to match everything there. Ref #109404 Pull Request: https://projects.blender.org/blender/blender/pulls/109795 --- intern/cycles/hydra/light.cpp | 21 ++++++- intern/cycles/scene/light.cpp | 20 +++++-- .../blender/io/usd/intern/usd_reader_light.cc | 60 +++++++++---------- .../blender/io/usd/intern/usd_writer_light.cc | 32 +++++++--- 4 files changed, 85 insertions(+), 48 deletions(-) diff --git a/intern/cycles/hydra/light.cpp b/intern/cycles/hydra/light.cpp index 244b6226e44..1cb2b0fb17a 100644 --- a/intern/cycles/hydra/light.cpp +++ b/intern/cycles/hydra/light.cpp @@ -94,6 +94,15 @@ void HdCyclesLight::Sync(HdSceneDelegate *sceneDelegate, strength *= value.Get(); } + if (_lightType == HdPrimTypeTokens->distantLight) { + /* Unclear why, but approximately matches Karma. */ + strength *= 4.0f; + } + else { + /* Convert from intensity to radiant flux. */ + strength *= M_PI; + } + value = sceneDelegate->GetLightParamValue(id, HdLightTokens->normalize); _light->set_normalize(value.IsHolding() && value.UncheckedGet()); @@ -133,9 +142,15 @@ void HdCyclesLight::Sync(HdSceneDelegate *sceneDelegate, } } else if (_lightType == HdPrimTypeTokens->sphereLight) { - value = sceneDelegate->GetLightParamValue(id, HdLightTokens->radius); - if (!value.IsEmpty()) { - _light->set_size(value.Get()); + value = sceneDelegate->GetLightParamValue(id, TfToken("treatAsPoint")); + if (!value.IsEmpty() && value.Get()) { + _light->set_size(0.0f); + } + else { + value = sceneDelegate->GetLightParamValue(id, HdLightTokens->radius); + if (!value.IsEmpty()) { + _light->set_size(value.Get()); + } } bool shaping = false; diff --git a/intern/cycles/scene/light.cpp b/intern/cycles/scene/light.cpp index ee72c67e6f0..41cf86327c9 100644 --- a/intern/cycles/scene/light.cpp +++ b/intern/cycles/scene/light.cpp @@ -1152,9 +1152,13 @@ void LightManager::device_update_lights(Device *device, DeviceScene *dscene, Sce float3 axis_v = normalize_len(extentv, &len_v); float area = len_u * len_v; if (light->ellipse) { - area *= -M_PI_4_F; + area *= M_PI_4_F; } float invarea = (area != 0.0f) ? 1.0f / area : 1.0f; + if (light->ellipse) { + /* Negative inverse area indicates ellipse. */ + invarea = -invarea; + } float3 dir = light->dir; dir = safe_normalize(dir); @@ -1215,10 +1219,12 @@ void LightManager::device_update_lights(Device *device, DeviceScene *dscene, Sce float radius = light->size; - float invarea = (light->normalize && radius > 0.0f) ? 1.0f / (M_4PI_F * radius * radius) : - 1.0f; + float invarea = (radius == 0.0f) ? 1.0f / 4.0f : + (light->normalize) ? 1.0f / (4.0f * M_PI_F * radius * radius) : + 1.0f; + /* Convert radiant flux to radiance or radiant intensity. */ - float eval_fac = (radius > 0) ? invarea * M_1_PI_F : 0.25f * M_1_PI_F; + float eval_fac = invarea * M_1_PI_F; if (light->use_mis && radius > 0.0f) shader_id |= SHADER_USE_MIS; @@ -1278,9 +1284,13 @@ void LightManager::device_update_lights(Device *device, DeviceScene *dscene, Sce float3 axis_v = normalize_len(extentv, &len_v); float area = len_u * len_v; if (light->ellipse) { - area *= -M_PI_4_F; + area *= M_PI_4_F; } float invarea = (light->normalize && area != 0.0f) ? 1.0f / area : 1.0f; + if (light->ellipse) { + /* Negative inverse area indicates ellipse. */ + invarea = -invarea; + } float3 dir = light->dir; const float half_spread = 0.5f * light->spread; diff --git a/source/blender/io/usd/intern/usd_reader_light.cc b/source/blender/io/usd/intern/usd_reader_light.cc index e8de47965eb..7294e3652b5 100644 --- a/source/blender/io/usd/intern/usd_reader_light.cc +++ b/source/blender/io/usd/intern/usd_reader_light.cc @@ -4,6 +4,8 @@ #include "usd_reader_light.h" +#include "BLI_math_rotation.h" + #include "BKE_light.h" #include "BKE_object.h" @@ -80,7 +82,15 @@ void USDLightReader::read_object_data(Main *bmain, const double motionSampleTime if (pxr::UsdAttribute intensity_attr = light_api.GetIntensityAttr()) { float intensity = 0.0f; if (intensity_attr.Get(&intensity, motionSampleTime)) { - blight->energy = intensity * this->import_params_.light_intensity_scale; + if (blight->type == LA_SUN) { + /* Unclear why, but approximately matches Karma. */ + blight->energy = intensity * 4.0f; + } + else { + /* Convert from intensity to radiant flux. */ + blight->energy = intensity * M_PI; + } + blight->energy *= this->import_params_.light_intensity_scale; } } @@ -165,22 +175,6 @@ void USDLightReader::read_object_data(Main *bmain, const double motionSampleTime } break; case LA_LOCAL: - if (prim_.IsA()) { - - pxr::UsdLuxSphereLight sphere_light(prim_); - - if (!sphere_light) { - break; - } - - if (pxr::UsdAttribute radius_attr = sphere_light.GetRadiusAttr()) { - float radius = 0.0f; - if (radius_attr.Get(&radius, motionSampleTime)) { - blight->radius = radius; - } - } - } - break; case LA_SPOT: if (prim_.IsA()) { @@ -190,28 +184,32 @@ void USDLightReader::read_object_data(Main *bmain, const double motionSampleTime break; } - if (pxr::UsdAttribute radius_attr = sphere_light.GetRadiusAttr()) { + pxr::UsdAttribute treatAsPoint_attr = sphere_light.GetTreatAsPointAttr(); + bool treatAsPoint; + if (treatAsPoint_attr && treatAsPoint_attr.Get(&treatAsPoint, motionSampleTime) && + treatAsPoint) { + blight->radius = 0.0f; + } + else if (pxr::UsdAttribute radius_attr = sphere_light.GetRadiusAttr()) { float radius = 0.0f; if (radius_attr.Get(&radius, motionSampleTime)) { blight->radius = radius; } } - if (!shaping_api) { - break; - } - - if (pxr::UsdAttribute cone_angle_attr = shaping_api.GetShapingConeAngleAttr()) { - float cone_angle = 0.0f; - if (cone_angle_attr.Get(&cone_angle, motionSampleTime)) { - blight->spotsize = cone_angle * (float(M_PI) / 180.0f) * 2.0f; + if (blight->type == LA_SPOT && shaping_api) { + if (pxr::UsdAttribute cone_angle_attr = shaping_api.GetShapingConeAngleAttr()) { + float cone_angle = 0.0f; + if (cone_angle_attr.Get(&cone_angle, motionSampleTime)) { + blight->spotsize = DEG2RADF(cone_angle) * 2.0f; + } } - } - if (pxr::UsdAttribute cone_softness_attr = shaping_api.GetShapingConeSoftnessAttr()) { - float cone_softness = 0.0f; - if (cone_softness_attr.Get(&cone_softness, motionSampleTime)) { - blight->spotblend = cone_softness; + if (pxr::UsdAttribute cone_softness_attr = shaping_api.GetShapingConeSoftnessAttr()) { + float cone_softness = 0.0f; + if (cone_softness_attr.Get(&cone_softness, motionSampleTime)) { + blight->spotblend = cone_softness; + } } } } diff --git a/source/blender/io/usd/intern/usd_writer_light.cc b/source/blender/io/usd/intern/usd_writer_light.cc index 5406d40d284..a4dae5956f1 100644 --- a/source/blender/io/usd/intern/usd_writer_light.cc +++ b/source/blender/io/usd/intern/usd_writer_light.cc @@ -7,9 +7,11 @@ #include #include #include +#include #include #include "BLI_assert.h" +#include "BLI_math_rotation.h" #include "BLI_utildefines.h" #include "DNA_light_types.h" @@ -22,7 +24,7 @@ USDLightWriter::USDLightWriter(const USDExporterContext &ctx) : USDAbstractWrite bool USDLightWriter::is_supported(const HierarchyContext *context) const { Light *light = static_cast(context->object->data); - return ELEM(light->type, LA_AREA, LA_LOCAL, LA_SUN); + return ELEM(light->type, LA_AREA, LA_LOCAL, LA_SUN, LA_SPOT); } void USDLightWriter::do_write(HierarchyContext &context) @@ -77,9 +79,22 @@ void USDLightWriter::do_write(HierarchyContext &context) } } break; - case LA_LOCAL: { + case LA_LOCAL: + case LA_SPOT: { pxr::UsdLuxSphereLight sphere_light = pxr::UsdLuxSphereLight::Define(stage, usd_path); sphere_light.CreateRadiusAttr().Set(light->radius, timecode); + if (light->radius == 0.0f) { + sphere_light.CreateTreatAsPointAttr().Set(true, timecode); + } + + if (light->type == LA_SPOT) { + pxr::UsdLuxShapingAPI shaping_api = pxr::UsdLuxShapingAPI::Apply(sphere_light.GetPrim()); + if (shaping_api) { + shaping_api.CreateShapingConeAngleAttr().Set(RAD2DEGF(light->spotsize) / 2.0f, timecode); + shaping_api.CreateShapingConeSoftnessAttr().Set(light->spotblend, timecode); + } + } + #if PXR_VERSION >= 2111 usd_light_api = sphere_light.LightAPI(); #else @@ -101,21 +116,20 @@ void USDLightWriter::do_write(HierarchyContext &context) BLI_assert_msg(0, "is_supported() returned true for unsupported light type"); } - /* Scale factor to get to somewhat-similar illumination. Since the USDViewer had similar - * over-exposure as Blender Internal with the same values, this code applies the reverse of the - * versioning code in light_emission_unify(). */ float usd_intensity; if (light->type == LA_SUN) { - /* Untested, as the Hydra GL viewport of USDViewer doesn't support distant lights. */ - usd_intensity = light->energy; + /* Unclear why, but approximately matches Karma. */ + usd_intensity = light->energy / 4.0f; } else { - usd_intensity = light->energy / 100.0f; + /* Convert from radiant flux to intensity. */ + usd_intensity = light->energy / M_PI; } - usd_light_api.CreateIntensityAttr().Set(usd_intensity, timecode); + usd_light_api.CreateIntensityAttr().Set(usd_intensity, timecode); usd_light_api.CreateColorAttr().Set(pxr::GfVec3f(light->r, light->g, light->b), timecode); usd_light_api.CreateSpecularAttr().Set(light->spec_fac, timecode); + usd_light_api.CreateNormalizeAttr().Set(true, timecode); } } // namespace blender::io::usd -- 2.30.2 From f36d8eb064e4aa83b4b5023098111392ec045510 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 7 Jul 2023 17:29:56 +0200 Subject: [PATCH 050/115] Cycles Hydra: set background color depending if there are lights So that there is some lighting when there are no lights in the scene, and black when there are lights. This matches the behavior of other Hydra renderers. Ref #96731 --- intern/cycles/hydra/session.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/intern/cycles/hydra/session.cpp b/intern/cycles/hydra/session.cpp index cceb4388237..c3cfe6fa33d 100644 --- a/intern/cycles/hydra/session.cpp +++ b/intern/cycles/hydra/session.cpp @@ -116,6 +116,15 @@ void HdCyclesSession::UpdateScene() if (!background_light) { scene->background->set_shader(scene->default_background); scene->background->set_transparent(true); + + /* Set background color depending to non-zero value if there are no + * lights in the scene, to match behavior of other renderers. */ + for (ShaderNode *node : scene->default_background->graph->nodes) { + if (node->is_a(BackgroundNode::get_node_type())) { + BackgroundNode *bgNode = static_cast(node); + bgNode->set_color((scene->lights.size() == 0) ? make_float3(0.5f) : zero_float3()); + } + } } else { scene->background->set_shader(background_light->get_shader()); -- 2.30.2 From 4fa30a317df0db4fdc0442da7a4fcf9326cad7a5 Mon Sep 17 00:00:00 2001 From: Ray Molenkamp Date: Fri, 7 Jul 2023 11:00:29 -0600 Subject: [PATCH 051/115] CMake: Fix list_assert_duplicates `list_assert_duplicates` validates a list that should contain no duplicates, contains no duplicates, with scope keywords now being allowed in `INC` sections, there is the situation where multiple include paths can have the same scope set on them causing `list_assert_duplicates` to error out. To remedy this we remove the scope keywords from the list first, before running the test. --- build_files/cmake/macros.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake index 95f2e8df1ff..607456b3815 100644 --- a/build_files/cmake/macros.cmake +++ b/build_files/cmake/macros.cmake @@ -33,6 +33,7 @@ function(list_assert_duplicates # message(STATUS "list data: ${list_id}") + list(REMOVE_ITEM list_id "PUBLIC" "PRIVATE" "INTERFACE") list(LENGTH list_id _len_before) list(REMOVE_DUPLICATES list_id) list(LENGTH list_id _len_after) -- 2.30.2 From 8ad4a242878cce689e9317b6bd6fff5160563eee Mon Sep 17 00:00:00 2001 From: Weizhen Huang Date: Fri, 7 Jul 2023 19:51:32 +0200 Subject: [PATCH 052/115] EEVEE: Change sun light factor to match Cycles Ref #108505 Pull Request: https://projects.blender.org/blender/blender/pulls/109831 --- source/blender/draw/engines/eevee/eevee_lights.c | 12 +++--------- .../blender/draw/engines/eevee_next/eevee_light.cc | 12 +++--------- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c index 00a812f5ad5..37aca7ea8c0 100644 --- a/source/blender/draw/engines/eevee/eevee_lights.c +++ b/source/blender/draw/engines/eevee/eevee_lights.c @@ -90,14 +90,9 @@ static float light_shape_radiance_get(const Light *la, const EEVEE_Light *evli) } default: case LA_SUN: { - /* Disk area. */ - float area = (float)M_PI * square_f(evli->radius); - /* Make illumination power closer to cycles for bigger radii. Cycles uses a cos^3 term that - * we cannot reproduce so we account for that by scaling the light power. This function is - * the result of a rough manual fitting. */ - float sun_scaling = 1.0f + square_f(evli->radius) / 2.0f; - /* NOTE: Missing a factor of PI here to match Cycles. */ - return sun_scaling / area; + float inv_sin_sq = 1.0f + 1.0f / square_f(evli->radius); + /* Convert irradiance to radiance. */ + return (float)M_1_PI * inv_sin_sq; } } } @@ -131,7 +126,6 @@ static float light_volume_radiance_factor_get(const Light *la, } default: case LA_SUN: { - /* NOTE: Missing a factor of PI here to match Cycles. */ /* Do nothing. */ break; } diff --git a/source/blender/draw/engines/eevee_next/eevee_light.cc b/source/blender/draw/engines/eevee_next/eevee_light.cc index 5f1f470bf3c..f8f68a5e767 100644 --- a/source/blender/draw/engines/eevee_next/eevee_light.cc +++ b/source/blender/draw/engines/eevee_next/eevee_light.cc @@ -190,14 +190,9 @@ float Light::shape_radiance_get(const ::Light *la) } default: case LA_SUN: { - /* Disk area. */ - float area = float(M_PI) * square_f(_radius); - /* Make illumination power closer to cycles for bigger radii. Cycles uses a cos^3 term that - * we cannot reproduce so we account for that by scaling the light power. This function is - * the result of a rough manual fitting. */ - float sun_scaling = 1.0f + square_f(_radius) / 2.0f; - /* NOTE: Missing a factor of PI here to match Cycles. */ - return sun_scaling / area; + float inv_sin_sq = 1.0f + 1.0f / square_f(_radius); + /* Convert irradiance to radiance. */ + return float(M_1_PI) * inv_sin_sq; } } } @@ -223,7 +218,6 @@ float Light::point_radiance_get(const ::Light *la) } default: case LA_SUN: { - /* NOTE: Missing a factor of PI here to match Cycles. */ return 1.0f; } } -- 2.30.2 From 7e55dfcf271dd1786baddbe35421b470250fb054 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 7 Jul 2023 20:15:36 +0200 Subject: [PATCH 053/115] Fix #103918: Cycles point cloud motion blur artifacts on the GPU Change storage to consistently put xyz + radius in the motion blur attribute. Pull Request: https://projects.blender.org/blender/blender/pulls/109830 --- intern/cycles/blender/pointcloud.cpp | 8 ++-- intern/cycles/bvh/build.cpp | 6 +-- intern/cycles/bvh/embree.cpp | 25 ++++------- intern/cycles/device/hiprt/device_impl.cpp | 6 +-- intern/cycles/device/metal/bvh.mm | 33 +++++++++----- intern/cycles/device/optix/device_impl.cpp | 50 ++++++++++++++-------- intern/cycles/scene/pointcloud.cpp | 17 +++----- intern/cycles/scene/pointcloud.h | 4 +- 8 files changed, 84 insertions(+), 65 deletions(-) diff --git a/intern/cycles/blender/pointcloud.cpp b/intern/cycles/blender/pointcloud.cpp index 40203a92630..34a92723985 100644 --- a/intern/cycles/blender/pointcloud.cpp +++ b/intern/cycles/blender/pointcloud.cpp @@ -31,7 +31,8 @@ static void attr_create_motion(PointCloud *pointcloud, const int num_points = pointcloud->get_points().size(); /* Find or add attribute */ - float3 *P = &pointcloud->get_points()[0]; + float3 *P = pointcloud->get_points().data(); + float *radius = pointcloud->get_radius().data(); Attribute *attr_mP = pointcloud->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION); if (!attr_mP) { @@ -42,10 +43,11 @@ static void attr_create_motion(PointCloud *pointcloud, float motion_times[2] = {-1.0f, 1.0f}; for (int step = 0; step < 2; step++) { const float relative_time = motion_times[step] * 0.5f * motion_scale; - float3 *mP = attr_mP->data_float3() + step * num_points; + float4 *mP = attr_mP->data_float4() + step * num_points; for (int i = 0; i < num_points; i++) { - mP[i] = P[i] + get_float3(b_vector_attribute.data[i].vector()) * relative_time; + float3 Pi = P[i] + get_float3(b_vector_attribute.data[i].vector()) * relative_time; + mP[i] = make_float4(Pi.x, Pi.y, Pi.z, radius[i]); } } } diff --git a/intern/cycles/bvh/build.cpp b/intern/cycles/bvh/build.cpp index 8f175573e11..ddfc451d892 100644 --- a/intern/cycles/bvh/build.cpp +++ b/intern/cycles/bvh/build.cpp @@ -271,7 +271,7 @@ void BVHBuild::add_reference_points(BoundBox &root, const float3 *points_data = &pointcloud->points[0]; const float *radius_data = &pointcloud->radius[0]; const size_t num_points = pointcloud->num_points(); - const float3 *motion_data = (point_attr_mP) ? point_attr_mP->data_float3() : NULL; + const float4 *motion_data = (point_attr_mP) ? point_attr_mP->data_float4() : NULL; const size_t num_steps = pointcloud->get_motion_steps(); if (point_attr_mP == NULL) { @@ -298,7 +298,7 @@ void BVHBuild::add_reference_points(BoundBox &root, BoundBox bounds = BoundBox::empty; point.bounds_grow(points_data, radius_data, bounds); for (size_t step = 0; step < num_steps - 1; step++) { - point.bounds_grow(motion_data + step * num_points, radius_data, bounds); + point.bounds_grow(motion_data[step * num_points + j], bounds); } if (bounds.valid()) { references.push_back(BVHReference(bounds, j, i, PRIMITIVE_MOTION_POINT)); @@ -318,7 +318,7 @@ void BVHBuild::add_reference_points(BoundBox &root, for (uint j = 0; j < num_points; j++) { const PointCloud::Point point = pointcloud->get_point(j); const size_t num_steps = pointcloud->get_motion_steps(); - const float3 *point_steps = point_attr_mP->data_float3(); + const float4 *point_steps = point_attr_mP->data_float4(); /* Calculate bounding box of the previous time step. * Will be reused later to avoid duplicated work on diff --git a/intern/cycles/bvh/embree.cpp b/intern/cycles/bvh/embree.cpp index e894873ad98..aad985d8624 100644 --- a/intern/cycles/bvh/embree.cpp +++ b/intern/cycles/bvh/embree.cpp @@ -471,20 +471,6 @@ void BVHEmbree::set_curve_vertex_buffer(RTCGeometry geom_id, const Hair *hair, c } } -/** - * Pack the motion points into a float4 as [x y z radius] - */ -template -void pack_motion_points(size_t num_points, const T *verts, const float *radius, float4 *rtc_verts) -{ - for (size_t j = 0; j < num_points; ++j) { - rtc_verts[j].x = verts[j].x; - rtc_verts[j].y = verts[j].y; - rtc_verts[j].z = verts[j].z; - rtc_verts[j].w = radius[j]; - } -} - void BVHEmbree::set_point_vertex_buffer(RTCGeometry geom_id, const PointCloud *pointcloud, const bool update) @@ -520,13 +506,20 @@ void BVHEmbree::set_point_vertex_buffer(RTCGeometry geom_id, assert(rtc_verts); if (rtc_verts) { if (t == t_mid || attr_mP == NULL) { + /* Pack the motion points into a float4 as [x y z radius]. */ const float3 *verts = pointcloud->get_points().data(); - pack_motion_points(num_points, verts, radius, rtc_verts); + for (size_t j = 0; j < num_points; ++j) { + rtc_verts[j].x = verts[j].x; + rtc_verts[j].y = verts[j].y; + rtc_verts[j].z = verts[j].z; + rtc_verts[j].w = radius[j]; + } } else { + /* Motion blur is already packed as [x y z radius]. */ int t_ = (t > t_mid) ? (t - 1) : t; const float4 *verts = &attr_mP->data_float4()[t_ * num_points]; - pack_motion_points(num_points, verts, radius, rtc_verts); + memcpy(rtc_verts, verts, sizeof(float4) * num_points); } } diff --git a/intern/cycles/device/hiprt/device_impl.cpp b/intern/cycles/device/hiprt/device_impl.cpp index bbdb7f40355..f805359ae6d 100644 --- a/intern/cycles/device/hiprt/device_impl.cpp +++ b/intern/cycles/device/hiprt/device_impl.cpp @@ -618,7 +618,7 @@ hiprtGeometryBuildInput HIPRTDevice::prepare_point_blas(BVHHIPRT *bvh, PointClou const float3 *points_data = pointcloud->get_points().data(); const float *radius_data = pointcloud->get_radius().data(); const size_t num_points = pointcloud->num_points(); - const float3 *motion_data = (point_attr_mP) ? point_attr_mP->data_float3() : NULL; + const float4 *motion_data = (point_attr_mP) ? point_attr_mP->data_float4() : NULL; const size_t num_steps = pointcloud->get_motion_steps(); int num_bounds = 0; @@ -646,7 +646,7 @@ hiprtGeometryBuildInput HIPRTDevice::prepare_point_blas(BVHHIPRT *bvh, PointClou BoundBox bounds = BoundBox::empty; point.bounds_grow(points_data, radius_data, bounds); for (size_t step = 0; step < num_steps - 1; step++) { - point.bounds_grow(motion_data + step * num_points, radius_data, bounds); + point.bounds_grow(motion_data[step * num_points + j], bounds); } if (bounds.valid()) { bvh->custom_primitive_bound[num_bounds] = bounds; @@ -666,7 +666,7 @@ hiprtGeometryBuildInput HIPRTDevice::prepare_point_blas(BVHHIPRT *bvh, PointClou for (uint j = 0; j < num_points; j++) { const PointCloud::Point point = pointcloud->get_point(j); const size_t num_steps = pointcloud->get_motion_steps(); - const float3 *point_steps = point_attr_mP->data_float3(); + const float4 *point_steps = point_attr_mP->data_float4(); float4 prev_key = point.motion_key( points_data, radius_data, point_steps, num_points, num_steps, 0.0f, j); diff --git a/intern/cycles/device/metal/bvh.mm b/intern/cycles/device/metal/bvh.mm index 23560575b7f..267d8ab9ee5 100644 --- a/intern/cycles/device/metal/bvh.mm +++ b/intern/cycles/device/metal/bvh.mm @@ -516,20 +516,31 @@ bool BVHMetal::build_BLAS_pointcloud(Progress &progress, /* Get AABBs for each motion step */ size_t center_step = (num_motion_steps - 1) / 2; for (size_t step = 0; step < num_motion_steps; ++step) { - /* The center step for motion vertices is not stored in the attribute */ - if (step != center_step) { - size_t attr_offset = (step > center_step) ? step - 1 : step; - points = motion_keys->data_float3() + attr_offset * num_points; + if (step == center_step) { + /* The center step for motion vertices is not stored in the attribute */ + for (size_t j = 0; j < num_points; ++j) { + const PointCloud::Point point = pointcloud->get_point(j); + BoundBox bounds = BoundBox::empty; + point.bounds_grow(points, radius, bounds); + + const size_t index = step * num_points + j; + aabb_data[index].min = (MTLPackedFloat3 &)bounds.min; + aabb_data[index].max = (MTLPackedFloat3 &)bounds.max; + } } + else { + size_t attr_offset = (step > center_step) ? step - 1 : step; + float4 *motion_points = motion_keys->data_float4() + attr_offset * num_points; - for (size_t j = 0; j < num_points; ++j) { - const PointCloud::Point point = pointcloud->get_point(j); - BoundBox bounds = BoundBox::empty; - point.bounds_grow(points, radius, bounds); + for (size_t j = 0; j < num_points; ++j) { + const PointCloud::Point point = pointcloud->get_point(j); + BoundBox bounds = BoundBox::empty; + point.bounds_grow(motion_points[j], bounds); - const size_t index = step * num_points + j; - aabb_data[index].min = (MTLPackedFloat3 &)bounds.min; - aabb_data[index].max = (MTLPackedFloat3 &)bounds.max; + const size_t index = step * num_points + j; + aabb_data[index].min = (MTLPackedFloat3 &)bounds.min; + aabb_data[index].max = (MTLPackedFloat3 &)bounds.max; + } } } diff --git a/intern/cycles/device/optix/device_impl.cpp b/intern/cycles/device/optix/device_impl.cpp index 7426e99a415..97ef030f44b 100644 --- a/intern/cycles/device/optix/device_impl.cpp +++ b/intern/cycles/device/optix/device_impl.cpp @@ -1395,27 +1395,43 @@ void OptiXDevice::build_bvh(BVH *bvh, Progress &progress, bool refit) /* Get AABBs for each motion step. */ for (size_t step = 0; step < num_motion_steps; ++step) { /* The center step for motion vertices is not stored in the attribute. */ - const float3 *points = pointcloud->get_points().data(); - const float *radius = pointcloud->get_radius().data(); size_t center_step = (num_motion_steps - 1) / 2; - if (step != center_step) { - size_t attr_offset = (step > center_step) ? step - 1 : step; - /* Technically this is a float4 array, but sizeof(float3) == sizeof(float4). */ - points = motion_points->data_float3() + attr_offset * num_points; + + if (step == center_step) { + const float3 *points = pointcloud->get_points().data(); + const float *radius = pointcloud->get_radius().data(); + + for (size_t i = 0; i < num_points; ++i) { + const PointCloud::Point point = pointcloud->get_point(i); + BoundBox bounds = BoundBox::empty; + point.bounds_grow(points, radius, bounds); + + const size_t index = step * num_points + i; + aabb_data[index].minX = bounds.min.x; + aabb_data[index].minY = bounds.min.y; + aabb_data[index].minZ = bounds.min.z; + aabb_data[index].maxX = bounds.max.x; + aabb_data[index].maxY = bounds.max.y; + aabb_data[index].maxZ = bounds.max.z; + } } + else { + size_t attr_offset = (step > center_step) ? step - 1 : step; + const float4 *points = motion_points->data_float4() + attr_offset * num_points; - for (size_t i = 0; i < num_points; ++i) { - const PointCloud::Point point = pointcloud->get_point(i); - BoundBox bounds = BoundBox::empty; - point.bounds_grow(points, radius, bounds); + for (size_t i = 0; i < num_points; ++i) { + const PointCloud::Point point = pointcloud->get_point(i); + BoundBox bounds = BoundBox::empty; + point.bounds_grow(points[i], bounds); - const size_t index = step * num_points + i; - aabb_data[index].minX = bounds.min.x; - aabb_data[index].minY = bounds.min.y; - aabb_data[index].minZ = bounds.min.z; - aabb_data[index].maxX = bounds.max.x; - aabb_data[index].maxY = bounds.max.y; - aabb_data[index].maxZ = bounds.max.z; + const size_t index = step * num_points + i; + aabb_data[index].minX = bounds.min.x; + aabb_data[index].minY = bounds.min.y; + aabb_data[index].minZ = bounds.min.z; + aabb_data[index].maxX = bounds.max.x; + aabb_data[index].maxY = bounds.max.y; + aabb_data[index].maxZ = bounds.max.z; + } } } diff --git a/intern/cycles/scene/pointcloud.cpp b/intern/cycles/scene/pointcloud.cpp index f5b6a7f2050..bdd76cf530e 100644 --- a/intern/cycles/scene/pointcloud.cpp +++ b/intern/cycles/scene/pointcloud.cpp @@ -34,7 +34,7 @@ void PointCloud::Point::bounds_grow(const float4 &point, BoundBox &bounds) const float4 PointCloud::Point::motion_key(const float3 *points, const float *radius, - const float3 *point_steps, + const float4 *point_steps, size_t num_points, size_t num_steps, float time, @@ -56,7 +56,7 @@ float4 PointCloud::Point::motion_key(const float3 *points, float4 PointCloud::Point::point_for_step(const float3 *points, const float *radius, - const float3 *point_steps, + const float4 *point_steps, size_t num_points, size_t num_steps, size_t step, @@ -73,10 +73,7 @@ float4 PointCloud::Point::point_for_step(const float3 *points, step--; } const size_t offset = step * num_points; - return make_float4(point_steps[offset + p].x, - point_steps[offset + p].y, - point_steps[offset + p].z, - radius[offset + p]); + return point_steps[offset + p]; } } @@ -189,10 +186,10 @@ void PointCloud::compute_bounds() Attribute *attr = attributes.find(ATTR_STD_MOTION_VERTEX_POSITION); if (use_motion_blur && attr) { size_t steps_size = points.size() * (motion_steps - 1); - float3 *point_steps = attr->data_float3(); + float4 *point_steps = attr->data_float4(); for (size_t i = 0; i < steps_size; i++) - bnds.grow(point_steps[i]); + bnds.grow(float4_to_float3(point_steps[i]), point_steps[i].w); } if (!bnds.valid()) { @@ -204,10 +201,10 @@ void PointCloud::compute_bounds() if (use_motion_blur && attr) { size_t steps_size = points.size() * (motion_steps - 1); - float3 *point_steps = attr->data_float3(); + float4 *point_steps = attr->data_float4(); for (size_t i = 0; i < steps_size; i++) - bnds.grow_safe(point_steps[i]); + bnds.grow_safe(float4_to_float3(point_steps[i]), point_steps[i].w); } } } diff --git a/intern/cycles/scene/pointcloud.h b/intern/cycles/scene/pointcloud.h index 11676ffba90..c4a8d7f0e96 100644 --- a/intern/cycles/scene/pointcloud.h +++ b/intern/cycles/scene/pointcloud.h @@ -28,14 +28,14 @@ class PointCloud : public Geometry { float4 motion_key(const float3 *points, const float *radius, - const float3 *point_steps, + const float4 *point_steps, size_t num_points, size_t num_steps, float time, size_t p) const; float4 point_for_step(const float3 *points, const float *radius, - const float3 *point_steps, + const float4 *point_steps, size_t num_points, size_t num_steps, size_t step, -- 2.30.2 From a0243dd8f99c88809debcf4c10ca5f34ae448566 Mon Sep 17 00:00:00 2001 From: Ray Molenkamp Date: Fri, 7 Jul 2023 14:10:55 -0600 Subject: [PATCH 054/115] Cleanup: make format --- source/blender/blenloader/intern/versioning_400.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/blender/blenloader/intern/versioning_400.cc b/source/blender/blenloader/intern/versioning_400.cc index df25e248274..cb748b08d26 100644 --- a/source/blender/blenloader/intern/versioning_400.cc +++ b/source/blender/blenloader/intern/versioning_400.cc @@ -144,8 +144,7 @@ static void version_mesh_crease_generic(Main &bmain) LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { if (STR_ELEM(node->idname, "GeometryNodeStoreNamedAttribute", - "GeometryNodeInputNamedAttribute")) - { + "GeometryNodeInputNamedAttribute")) { bNodeSocket *socket = nodeFindSocket(node, SOCK_IN, "Name"); if (STREQ(socket->default_value_typed()->value, "crease")) { STRNCPY(socket->default_value_typed()->value, "crease_edge"); -- 2.30.2 From b894e901061c27a47699fd731b9e75edc80661b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cle=CC=81ment=20Foucault?= Date: Fri, 7 Jul 2023 23:22:13 +0200 Subject: [PATCH 055/115] EEVEE-Next: Fix shader compilation on Mac --- .../shaders/eevee_reflection_probe_eval_lib.glsl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_eval_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_eval_lib.glsl index 6d2224ef851..4214b007525 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_eval_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_eval_lib.glsl @@ -9,7 +9,7 @@ vec4 reflection_probe_eval(ClosureReflection reflection, { ivec3 texture_size = textureSize(reflectionProbes, 0); float lod_cube_max = min(log(float(texture_size.x)) - float(probe_data.layer_subdivision) + 1.0, - REFLECTION_PROBE_MIPMAP_LEVELS); + float(REFLECTION_PROBE_MIPMAP_LEVELS)); /* Pow2f to distributed across lod more evenly */ float roughness = clamp(pow2f(reflection.roughness), 1e-4f, 0.9999f); @@ -65,9 +65,9 @@ int reflection_probes_find_closest(vec3 P) for (int index = 1; reflection_probe_buf[index].layer != -1 && index < REFLECTION_PROBES_MAX; index++) { - float distance = distance(P, reflection_probe_buf[index].pos); - if (distance < closest_distance) { - closest_distance = distance; + float dist = distance(P, reflection_probe_buf[index].pos); + if (dist < closest_distance) { + closest_distance = dist; closest_index = index; } } -- 2.30.2 From 3f90bb6a48d285daaeeb8123921e54840c147c3f Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Fri, 7 Jul 2023 21:22:01 -0300 Subject: [PATCH 056/115] Fix transform updating during some navigation operations Navigation operations, like those of the trackpad, are not modal and therefore are confirmed on each call. To prevent the transform operations from being updated in this case, add a fake navigation flag. The removal of this flag is postponed to the next call. --- source/blender/editors/space_view3d/view3d_navigate.cc | 9 +++++++++ source/blender/editors/transform/transform.c | 8 ++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/space_view3d/view3d_navigate.cc b/source/blender/editors/space_view3d/view3d_navigate.cc index 1bcdd2f3f82..6bcdac4cc0d 100644 --- a/source/blender/editors/space_view3d/view3d_navigate.cc +++ b/source/blender/editors/space_view3d/view3d_navigate.cc @@ -2129,6 +2129,9 @@ bool ED_view3d_navigation_do(bContext *C, ViewOpsData *vod, const wmEvent *event } else { viewops_data_end_navigation(C, vod); + /* Postpone the navigation confirmation to the next call. + * This avoids constant updating of the transform operation for example. */ + vod->rv3d->rflag |= RV3D_NAVIGATING; } break; } @@ -2142,6 +2145,12 @@ bool ED_view3d_navigation_do(bContext *C, ViewOpsData *vod, const wmEvent *event return true; } + else if (vod->rv3d->rflag & RV3D_NAVIGATING) { + /* Add a fake confirmation. */ + vod->rv3d->rflag &= ~RV3D_NAVIGATING; + return true; + } + return false; } diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index f2e322d06d4..866735f1567 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -1268,7 +1268,11 @@ int transformEvent(TransInfo *t, const wmEvent *event) } break; case TFM_MODAL_PRECISION: - if (event->prev_val == KM_PRESS) { + if (is_navigating) { + /* WORKAROUND: During navigation, due to key conflicts, precision may be unintentionally + * enabled. */ + } + else if (event->prev_val == KM_PRESS) { t->modifiers |= MOD_PRECISION; /* Shift is modifier for higher precision transform. */ t->mouse.precision = 1; @@ -1390,7 +1394,7 @@ int transformEvent(TransInfo *t, const wmEvent *event) WM_window_status_area_tag_redraw(CTX_wm_window(t->context)); } - if (handled || t->redraw) { + if (!is_navigating && (handled || t->redraw)) { return 0; } return OPERATOR_PASS_THROUGH; -- 2.30.2 From 0b01b7c1fadd179807b251fd7ed580aea57632b8 Mon Sep 17 00:00:00 2001 From: Joseph Eagar Date: Fri, 7 Jul 2023 18:53:06 -0700 Subject: [PATCH 057/115] Sculpt: Fix #109555: More floating point error fixes * Renamed BKE_pbvh_raycast_project_ray_root to BKE_pbvh_clip_ray_ortho for greater clarity. * BKE_pbvh_clip_ray_ortho no longer strictly clips within the input ray interval. This is not necassary for orthographic views and was too prone to floating point error. The function is only called to clip brush rays for orthographic views so this is acceptable. --- source/blender/blenkernel/BKE_pbvh_api.hh | 9 +++- source/blender/blenkernel/intern/pbvh.cc | 45 ++++++++----------- source/blender/editors/sculpt_paint/sculpt.cc | 20 +++++---- 3 files changed, 38 insertions(+), 36 deletions(-) diff --git a/source/blender/blenkernel/BKE_pbvh_api.hh b/source/blender/blenkernel/BKE_pbvh_api.hh index d16c26465f6..b6632aaf4e4 100644 --- a/source/blender/blenkernel/BKE_pbvh_api.hh +++ b/source/blender/blenkernel/BKE_pbvh_api.hh @@ -271,8 +271,15 @@ bool BKE_pbvh_bmesh_node_raycast_detail(PBVHNode *node, /** * For orthographic cameras, project the far away ray segment points to the root node so * we can have better precision. + * + * Note: the interval is not guaranteed to lie between ray_start and ray_end; this is + * not necessary for orthographic views and is impossible anyhow due to the necessity of + * projecting the far clipping plane into the local object space. This works out to + * dividing view3d->clip_end by the object scale, which for small object and large + * clip_end's can easily lead to floating-point overflows. + * */ -void BKE_pbvh_raycast_project_ray_root( +void BKE_pbvh_clip_ray_ortho( PBVH *pbvh, bool original, float ray_start[3], float ray_end[3], float ray_normal[3]); void BKE_pbvh_find_nearest_to_ray(PBVH *pbvh, diff --git a/source/blender/blenkernel/intern/pbvh.cc b/source/blender/blenkernel/intern/pbvh.cc index bb02ecc698f..20aadc48607 100644 --- a/source/blender/blenkernel/intern/pbvh.cc +++ b/source/blender/blenkernel/intern/pbvh.cc @@ -2681,7 +2681,7 @@ bool BKE_pbvh_node_raycast(PBVH *pbvh, return hit; } -void BKE_pbvh_raycast_project_ray_root( +void BKE_pbvh_clip_ray_ortho( PBVH *pbvh, bool original, float ray_start[3], float ray_end[3], float ray_normal[3]) { if (pbvh->nodes) { @@ -2712,58 +2712,49 @@ void BKE_pbvh_raycast_project_ray_root( minmax_v3v3_v3(min, max, a); minmax_v3v3_v3(min, max, b); - float cent[3], vec[3]; - float ray_start_new[3], ray_end_new[3]; + float cent[3]; - float dist = max[2] - min[2]; - - /* Build ray interval from z dimension of bounds. */ + /* Find midpoint of aabb on ray. */ mid_v3_v3v3(cent, bb_min_root, bb_max_root); - madd_v3_v3v3fl(ray_start_new, cent, ray_normal, -dist); - madd_v3_v3v3fl(ray_end_new, cent, ray_normal, dist); + float t = line_point_factor_v3(cent, ray_start, ray_end); + interp_v3_v3v3(cent, ray_start, ray_end, t); - /* Don't go behind existing ray_start. */ - sub_v3_v3v3(vec, ray_end_new, ray_start); - if (dot_v3v3(vec, ray_normal) > 0.0f) { - copy_v3_v3(ray_end, ray_end_new); - } - - sub_v3_v3v3(vec, ray_start_new, ray_start); - if (dot_v3v3(vec, ray_normal) > 0.0f) { - copy_v3_v3(ray_start, ray_start_new); - } + /* Compute rough interval. */ + float dist = max[2] - min[2]; + madd_v3_v3v3fl(ray_start, cent, ray_normal, -dist); + madd_v3_v3v3fl(ray_end, cent, ray_normal, dist); /* Slightly offset min and max in case we have a zero width node * (due to a plane mesh for instance), or faces very close to the bounding box boundary. */ mid_v3_v3v3(bb_center, bb_max_root, bb_min_root); - /* diff should be same for both min/max since it's calculated from center */ + /* Diff should be same for both min/max since it's calculated from center. */ sub_v3_v3v3(bb_diff, bb_max_root, bb_center); - /* handles case of zero width bb */ + /* Handles case of zero width bb. */ add_v3_v3(bb_diff, offset_vec); madd_v3_v3v3fl(bb_max_root, bb_center, bb_diff, offset); madd_v3_v3v3fl(bb_min_root, bb_center, bb_diff, -offset); - /* first project start ray */ + /* Final projection of start ray. */ isect_ray_aabb_v3_precalc(&ray, ray_start, ray_normal); if (!isect_ray_aabb_v3(&ray, bb_min_root, bb_max_root, &rootmin_start)) { return; } - /* then the end ray */ + /* Final projection of end ray. */ mul_v3_v3fl(ray_normal_inv, ray_normal, -1.0); isect_ray_aabb_v3_precalc(&ray, ray_end, ray_normal_inv); - /* unlikely to fail exiting if entering succeeded, still keep this here */ + /* Unlikely to fail exiting if entering succeeded, still keep this here. */ if (!isect_ray_aabb_v3(&ray, bb_min_root, bb_max_root, &rootmin_end)) { return; } - /* Small object sizes or small clip starts can lead to floating-point - * overflow. To solve this, we compute a margin using the next - * possible floating point value after ray start. See #109555. + /* + * As a last-ditch effort to correct floating point overflow compute + * and add an epsilon if rootmin_start == rootmin_end. */ float epsilon = (std::nextafter(rootmin_start, rootmin_start + 1000.0f) - rootmin_start) * - +5000.0f; + 5000.0f; if (rootmin_start == rootmin_end) { rootmin_start -= epsilon; diff --git a/source/blender/editors/sculpt_paint/sculpt.cc b/source/blender/editors/sculpt_paint/sculpt.cc index 7157de9f410..5d36582c200 100644 --- a/source/blender/editors/sculpt_paint/sculpt.cc +++ b/source/blender/editors/sculpt_paint/sculpt.cc @@ -5099,15 +5099,19 @@ float SCULPT_raycast_init(ViewContext *vc, sub_v3_v3v3(ray_normal, ray_end, ray_start); dist = normalize_v3(ray_normal); - if ((rv3d->is_persp == false) && - /* If the ray is clipped, don't adjust its start/end. */ - !RV3D_CLIPPING_ENABLED(v3d, rv3d)) - { - BKE_pbvh_raycast_project_ray_root(ob->sculpt->pbvh, original, ray_start, ray_end, ray_normal); + /* If the ray is clipped, don't adjust its start/end. */ + if ((rv3d->is_persp == false) && !RV3D_CLIPPING_ENABLED(v3d, rv3d)) { + /* Get the view origin without the addition + * of -ray_normal * clip_start that + * ED_view3d_win_to_segment_clipped gave us. + * This is necessary to avoid floating point overflow. + */ + ED_view3d_win_to_origin(vc->region, mval, ray_start); + mul_m4_v3(obimat, ray_start); - /* rRecalculate the normal. */ - sub_v3_v3v3(ray_normal, ray_end, ray_start); - dist = normalize_v3(ray_normal); + BKE_pbvh_clip_ray_ortho(ob->sculpt->pbvh, original, ray_start, ray_end, ray_normal); + + dist = len_v3v3(ray_start, ray_end); } return dist; -- 2.30.2 From c677f791f0636803ecf625f241a8c29537ddbc7b Mon Sep 17 00:00:00 2001 From: Ray Molenkamp Date: Fri, 7 Jul 2023 20:41:57 -0600 Subject: [PATCH 058/115] Cleanup: Make format --- source/blender/blenkernel/BKE_pbvh_api.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/blenkernel/BKE_pbvh_api.hh b/source/blender/blenkernel/BKE_pbvh_api.hh index b6632aaf4e4..f0dd5f42f51 100644 --- a/source/blender/blenkernel/BKE_pbvh_api.hh +++ b/source/blender/blenkernel/BKE_pbvh_api.hh @@ -277,7 +277,7 @@ bool BKE_pbvh_bmesh_node_raycast_detail(PBVHNode *node, * projecting the far clipping plane into the local object space. This works out to * dividing view3d->clip_end by the object scale, which for small object and large * clip_end's can easily lead to floating-point overflows. - * + * */ void BKE_pbvh_clip_ray_ortho( PBVH *pbvh, bool original, float ray_start[3], float ray_end[3], float ray_normal[3]); -- 2.30.2 From b183e3ae89a66b55200844b2ac91e4b29a76ea83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dietrich?= Date: Sun, 9 Jul 2023 01:26:07 +0200 Subject: [PATCH 059/115] Cleanup: Alembic, use a structure to hold interpolation settings The Alembic importer can optionnaly interpolate vertex and matrix data. To detect if two samples can be interpolated `get_weight_and_index` needs to be called which output the interpolation weight and the indices for the floor and ceil samples separately. Either the weight or the indices could be used to determine if interpolation was needed. This adds a `SampleInterpolationSettings` structure to hold the weight and indices together so we don't need to manage multiple local variables, and replaces `get_weight_and_index` with `get_sample_interpolation_settings` which returns either a `SampleInterpolationSettings` or nothing if no interpolation is necessary. This also modifies `AbcMeshData` to have an optional `SampleInterpolationSettings` and removes members used for interpolation from `CDStreamConfig`, which simplifies the latter structure as well as the check in `read_mverts` to verify if interpolation is needed. `get_config` also no longer needs a parameter for setting the now removed `use_vertex_interpolation` member from `CDStreamConfig`. This was only used for Mesh vertex interpolation despite also being set in the points reader (which does not yet support any interpolation). No functional changes. Pull Request: #109155 --- .../io/alembic/intern/abc_customdata.h | 7 --- .../io/alembic/intern/abc_reader_mesh.cc | 55 +++++++++---------- .../io/alembic/intern/abc_reader_mesh.h | 2 +- .../io/alembic/intern/abc_reader_object.cc | 23 ++++---- .../io/alembic/intern/abc_reader_points.cc | 5 +- source/blender/io/alembic/intern/abc_util.cc | 25 ++++----- source/blender/io/alembic/intern/abc_util.h | 28 ++++++++-- 7 files changed, 78 insertions(+), 67 deletions(-) diff --git a/source/blender/io/alembic/intern/abc_customdata.h b/source/blender/io/alembic/intern/abc_customdata.h index 740a132e191..1ae68f16ba3 100644 --- a/source/blender/io/alembic/intern/abc_customdata.h +++ b/source/blender/io/alembic/intern/abc_customdata.h @@ -49,12 +49,8 @@ struct CDStreamConfig { Mesh *mesh; void *(*add_customdata_cb)(Mesh *mesh, const char *name, int data_type); - double weight; Alembic::Abc::chrono_t time; int timesample_index; - bool use_vertex_interpolation; - Alembic::AbcGeom::index_t index; - Alembic::AbcGeom::index_t ceil_index; const char **modifier_error_message; @@ -80,10 +76,7 @@ struct CDStreamConfig { pack_uvs(false), mesh(NULL), add_customdata_cb(NULL), - weight(0.0), time(0.0), - index(0), - ceil_index(0), modifier_error_message(NULL) { } diff --git a/source/blender/io/alembic/intern/abc_reader_mesh.cc b/source/blender/io/alembic/intern/abc_reader_mesh.cc index 90af7db308d..41e36cec186 100644 --- a/source/blender/io/alembic/intern/abc_reader_mesh.cc +++ b/source/blender/io/alembic/intern/abc_reader_mesh.cc @@ -118,6 +118,9 @@ struct AbcMeshData { Int32ArraySamplePtr face_indices; Int32ArraySamplePtr face_counts; + /* Optional settings for reading interpolated vertices. If present, `ceil_positions` has to be + * valid. */ + std::optional interpolation_settings; P3fArraySamplePtr positions; P3fArraySamplePtr ceil_positions; @@ -146,10 +149,13 @@ static void read_mverts(CDStreamConfig &config, const AbcMeshData &mesh_data) float3 *vert_positions = config.positions; const P3fArraySamplePtr &positions = mesh_data.positions; - if (config.use_vertex_interpolation && config.weight != 0.0f && - mesh_data.ceil_positions != nullptr && mesh_data.ceil_positions->size() == positions->size()) - { - read_mverts_interp(vert_positions, positions, mesh_data.ceil_positions, config.weight); + if (mesh_data.interpolation_settings.has_value()) { + BLI_assert_msg( + mesh_data.ceil_positions != nullptr, + "AbcMeshData does not have ceil positions although it has some interpolation settings."); + + const double weight = mesh_data.interpolation_settings->weight; + read_mverts_interp(vert_positions, positions, mesh_data.ceil_positions, weight); BKE_mesh_tag_positions_changed(config.mesh); return; } @@ -398,18 +404,6 @@ static void *add_customdata_cb(Mesh *mesh, const char *name, int data_type) return cd_ptr; } -static void get_weight_and_index(CDStreamConfig &config, - Alembic::AbcCoreAbstract::TimeSamplingPtr time_sampling, - size_t samples_number) -{ - Alembic::AbcGeom::index_t i0, i1; - - config.weight = get_weight_and_index(config.time, time_sampling, samples_number, i0, i1); - - config.index = i0; - config.ceil_index = i1; -} - static V3fArraySamplePtr get_velocity_prop(const ICompoundProperty &schema, const ISampleSelector &selector, const std::string &name) @@ -513,14 +507,18 @@ static void read_mesh_sample(const std::string &iobject_full_name, abc_mesh_data.face_indices = sample.getFaceIndices(); abc_mesh_data.positions = sample.getPositions(); - get_weight_and_index(config, schema.getTimeSampling(), schema.getNumSamples()); + const std::optional interpolation_settings = + get_sample_interpolation_settings( + selector, schema.getTimeSampling(), schema.getNumSamples()); - if (config.weight != 0.0f) { + const bool use_vertex_interpolation = settings->read_flag & MOD_MESHSEQ_INTERPOLATE_VERTICES; + if (use_vertex_interpolation && interpolation_settings.has_value()) { Alembic::AbcGeom::IPolyMeshSchema::Sample ceil_sample; - schema.get(ceil_sample, Alembic::Abc::ISampleSelector(config.ceil_index)); + schema.get(ceil_sample, Alembic::Abc::ISampleSelector(interpolation_settings->ceil_index)); if (samples_have_same_topology(sample, ceil_sample)) { /* Only set interpolation data if the samples are compatible. */ abc_mesh_data.ceil_positions = ceil_sample.getPositions(); + abc_mesh_data.interpolation_settings = interpolation_settings; } } @@ -550,7 +548,7 @@ static void read_mesh_sample(const std::string &iobject_full_name, } } -CDStreamConfig get_config(Mesh *mesh, const bool use_vertex_interpolation) +CDStreamConfig get_config(Mesh *mesh) { CDStreamConfig config; config.mesh = mesh; @@ -562,7 +560,6 @@ CDStreamConfig get_config(Mesh *mesh, const bool use_vertex_interpolation) config.totpoly = mesh->totpoly; config.loopdata = &mesh->ldata; config.add_customdata_cb = add_customdata_cb; - config.use_vertex_interpolation = use_vertex_interpolation; return config; } @@ -823,8 +820,7 @@ Mesh *AbcMeshReader::read_mesh(Mesh *existing_mesh, } Mesh *mesh_to_export = new_mesh ? new_mesh : existing_mesh; - const bool use_vertex_interpolation = read_flag & MOD_MESHSEQ_INTERPOLATE_VERTICES; - CDStreamConfig config = get_config(mesh_to_export, use_vertex_interpolation); + CDStreamConfig config = get_config(mesh_to_export); config.time = sample_sel.getRequestedTime(); config.modifier_error_message = err_str; @@ -921,14 +917,18 @@ static void read_subd_sample(const std::string &iobject_full_name, abc_mesh_data.face_indices = sample.getFaceIndices(); abc_mesh_data.positions = sample.getPositions(); - get_weight_and_index(config, schema.getTimeSampling(), schema.getNumSamples()); + const std::optional interpolation_settings = + get_sample_interpolation_settings( + selector, schema.getTimeSampling(), schema.getNumSamples()); - if (config.weight != 0.0f) { + const bool use_vertex_interpolation = settings->read_flag & MOD_MESHSEQ_INTERPOLATE_VERTICES; + if (use_vertex_interpolation && interpolation_settings.has_value()) { Alembic::AbcGeom::ISubDSchema::Sample ceil_sample; - schema.get(ceil_sample, Alembic::Abc::ISampleSelector(config.ceil_index)); + schema.get(ceil_sample, Alembic::Abc::ISampleSelector(interpolation_settings->ceil_index)); if (samples_have_same_topology(sample, ceil_sample)) { /* Only set interpolation data if the samples are compatible. */ abc_mesh_data.ceil_positions = ceil_sample.getPositions(); + abc_mesh_data.interpolation_settings = interpolation_settings; } } @@ -1161,8 +1161,7 @@ Mesh *AbcSubDReader::read_mesh(Mesh *existing_mesh, /* Only read point data when streaming meshes, unless we need to create new ones. */ Mesh *mesh_to_export = new_mesh ? new_mesh : existing_mesh; - const bool use_vertex_interpolation = read_flag & MOD_MESHSEQ_INTERPOLATE_VERTICES; - CDStreamConfig config = get_config(mesh_to_export, use_vertex_interpolation); + CDStreamConfig config = get_config(mesh_to_export); config.time = sample_sel.getRequestedTime(); config.modifier_error_message = err_str; read_subd_sample(m_iobject.getFullName(), &settings, m_schema, sample_sel, config); diff --git a/source/blender/io/alembic/intern/abc_reader_mesh.h b/source/blender/io/alembic/intern/abc_reader_mesh.h index 63280af24b9..ec0bc74360a 100644 --- a/source/blender/io/alembic/intern/abc_reader_mesh.h +++ b/source/blender/io/alembic/intern/abc_reader_mesh.h @@ -70,6 +70,6 @@ void read_mverts(Mesh &mesh, const Alembic::AbcGeom::P3fArraySamplePtr positions, const Alembic::AbcGeom::N3fArraySamplePtr normals); -CDStreamConfig get_config(struct Mesh *mesh, bool use_vertex_interpolation); +CDStreamConfig get_config(struct Mesh *mesh); } // namespace blender::io::alembic diff --git a/source/blender/io/alembic/intern/abc_reader_object.cc b/source/blender/io/alembic/intern/abc_reader_object.cc index a73f62687cd..e5d8e20bccd 100644 --- a/source/blender/io/alembic/intern/abc_reader_object.cc +++ b/source/blender/io/alembic/intern/abc_reader_object.cc @@ -119,20 +119,23 @@ static Imath::M44d blend_matrices(const Imath::M44d &m0, Imath::M44d get_matrix(const IXformSchema &schema, const chrono_t time) { - Alembic::AbcGeom::index_t i0, i1; - Alembic::AbcGeom::XformSample s0, s1; + Alembic::AbcGeom::ISampleSelector selector(time); - const double weight = get_weight_and_index( - time, schema.getTimeSampling(), schema.getNumSamples(), i0, i1); + const std::optional interpolation_settings = + get_sample_interpolation_settings( + selector, schema.getTimeSampling(), schema.getNumSamples()); - schema.get(s0, Alembic::AbcGeom::ISampleSelector(i0)); - - if (i0 != i1) { - schema.get(s1, Alembic::AbcGeom::ISampleSelector(i1)); - return blend_matrices(s0.getMatrix(), s1.getMatrix(), weight); + if (!interpolation_settings.has_value()) { + /* No interpolation, just read the current time. */ + Alembic::AbcGeom::XformSample s0; + schema.get(s0, selector); + return s0.getMatrix(); } - return s0.getMatrix(); + Alembic::AbcGeom::XformSample s0, s1; + schema.get(s0, Alembic::AbcGeom::ISampleSelector(interpolation_settings->index)); + schema.get(s1, Alembic::AbcGeom::ISampleSelector(interpolation_settings->ceil_index)); + return blend_matrices(s0.getMatrix(), s1.getMatrix(), interpolation_settings->weight); } Mesh *AbcObjectReader::read_mesh(Mesh *existing_mesh, diff --git a/source/blender/io/alembic/intern/abc_reader_points.cc b/source/blender/io/alembic/intern/abc_reader_points.cc index 61403f0ba42..fad932abc73 100644 --- a/source/blender/io/alembic/intern/abc_reader_points.cc +++ b/source/blender/io/alembic/intern/abc_reader_points.cc @@ -113,7 +113,7 @@ void read_points_sample(const IPointsSchema &schema, Mesh *AbcPointsReader::read_mesh(Mesh *existing_mesh, const ISampleSelector &sample_sel, - int read_flag, + int /*read_flag*/, const char * /*velocity_name*/, const float /*velocity_scale*/, const char **err_str) @@ -141,8 +141,7 @@ Mesh *AbcPointsReader::read_mesh(Mesh *existing_mesh, } Mesh *mesh_to_export = new_mesh ? new_mesh : existing_mesh; - const bool use_vertex_interpolation = read_flag & MOD_MESHSEQ_INTERPOLATE_VERTICES; - CDStreamConfig config = get_config(mesh_to_export, use_vertex_interpolation); + CDStreamConfig config = get_config(mesh_to_export); read_points_sample(m_schema, sample_sel, config); return mesh_to_export; diff --git a/source/blender/io/alembic/intern/abc_util.cc b/source/blender/io/alembic/intern/abc_util.cc index 138506ea71f..28c1b316f3b 100644 --- a/source/blender/io/alembic/intern/abc_util.cc +++ b/source/blender/io/alembic/intern/abc_util.cc @@ -116,36 +116,35 @@ bool has_property(const Alembic::Abc::ICompoundProperty &prop, const std::string using index_time_pair_t = std::pair; -double get_weight_and_index(Alembic::AbcGeom::chrono_t time, - const Alembic::AbcCoreAbstract::TimeSamplingPtr &time_sampling, - int samples_number, - Alembic::AbcGeom::index_t &i0, - Alembic::AbcGeom::index_t &i1) +std::optional get_sample_interpolation_settings( + const Alembic::AbcGeom::ISampleSelector &selector, + const Alembic::AbcCoreAbstract::TimeSamplingPtr &time_sampling, + size_t samples_number) { - samples_number = std::max(samples_number, 1); + const chrono_t time = selector.getRequestedTime(); + samples_number = std::max(samples_number, size_t(1)); index_time_pair_t t0 = time_sampling->getFloorIndex(time, samples_number); - i0 = i1 = t0.first; + Alembic::AbcCoreAbstract::index_t i0 = t0.first; if (samples_number == 1 || (fabs(time - t0.second) < 0.0001)) { - return 0.0; + return {}; } index_time_pair_t t1 = time_sampling->getCeilIndex(time, samples_number); - i1 = t1.first; + Alembic::AbcCoreAbstract::index_t i1 = t1.first; if (i0 == i1) { - return 0.0; + return {}; } const double bias = (time - t0.second) / (t1.second - t0.second); if (fabs(1.0 - bias) < 0.0001) { - i0 = i1; - return 0.0; + return {}; } - return bias; + return SampleInterpolationSettings{i0, i1, bias}; } //#define USE_NURBS diff --git a/source/blender/io/alembic/intern/abc_util.h b/source/blender/io/alembic/intern/abc_util.h index 6ab73018eed..10627caa112 100644 --- a/source/blender/io/alembic/intern/abc_util.h +++ b/source/blender/io/alembic/intern/abc_util.h @@ -10,6 +10,8 @@ #include #include +#include + using Alembic::Abc::chrono_t; struct ID; @@ -81,11 +83,27 @@ void get_min_max_time(const Alembic::AbcGeom::IObject &object, bool has_property(const Alembic::Abc::ICompoundProperty &prop, const std::string &name); -double get_weight_and_index(Alembic::AbcCoreAbstract::chrono_t time, - const Alembic::AbcCoreAbstract::TimeSamplingPtr &time_sampling, - int samples_number, - Alembic::AbcGeom::index_t &i0, - Alembic::AbcGeom::index_t &i1); +/** + * The SampleInterpolationSettings struct holds information for interpolating data between two + * samples. + */ +struct SampleInterpolationSettings { + /* Index of the first ("floor") sample. */ + Alembic::AbcGeom::index_t index; + /* Index of the second ("ceil") sample. */ + Alembic::AbcGeom::index_t ceil_index; + /* Factor to interpolate between the `index` and `ceil_index`. */ + double weight; +}; + +/** Check whether the requested time from the \a selector falls between two sampling time from the + * \a time_sampling. If so, returns a #SampleInterpolationSettings with the required data to + * interpolate. If not, returns nothing and we can assume that the requested time falls on a + * specific sampling time of \a time_sampling and no interpolation is necessary. */ +std::optional get_sample_interpolation_settings( + const Alembic::AbcGeom::ISampleSelector &selector, + const Alembic::AbcCoreAbstract::TimeSamplingPtr &time_sampling, + size_t samples_number); AbcObjectReader *create_reader(const Alembic::AbcGeom::IObject &object, ImportSettings &settings); -- 2.30.2 From 751db88748d34360724268a323ea1ea3605488f9 Mon Sep 17 00:00:00 2001 From: Guillermo Venegas Date: Sun, 9 Jul 2023 16:55:05 +1000 Subject: [PATCH 060/115] Fix #109532: Added missing conversion from wl_fixed to int in Wayland When blender is not focused and a selection is executed with the mouse, since there is no conversion from `wl_fixed` to `int`, the bounds of the selection can cause the selection box to be too large, causing `draw_select_framebuffer_depth_only_setup` to fail when create `g_select_buffer.texture_depth`. Ref !109834 --- intern/ghost/intern/GHOST_SystemWayland.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/intern/ghost/intern/GHOST_SystemWayland.cc b/intern/ghost/intern/GHOST_SystemWayland.cc index 6754c428f10..2bd1bd46f22 100644 --- a/intern/ghost/intern/GHOST_SystemWayland.cc +++ b/intern/ghost/intern/GHOST_SystemWayland.cc @@ -6097,8 +6097,8 @@ static GHOST_TSuccess getCursorPositionClientRelative_impl( y = wl_fixed_to_int(win->wl_fixed_to_window(xy_wrap[1])); } else { - x = win->wl_fixed_to_window(seat_state_pointer->xy[0]); - y = win->wl_fixed_to_window(seat_state_pointer->xy[1]); + x = wl_fixed_to_int(win->wl_fixed_to_window(seat_state_pointer->xy[0])); + y = wl_fixed_to_int(win->wl_fixed_to_window(seat_state_pointer->xy[1])); } return GHOST_kSuccess; -- 2.30.2 From 2f2facef744317ba4c2e6123f5270163ce84259b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 9 Jul 2023 18:17:58 +1000 Subject: [PATCH 061/115] Cleanup: use BKE_action prefix, position return arguments last - BKE_action_frame_range_get (was BKE_action_get_frame_range) - BKE_action_frame_range_calc (was calc_action_range) - BKE_action_has_motion (was action_has_motion) --- source/blender/blenkernel/BKE_action.h | 15 ++++++++---- source/blender/blenkernel/intern/action.c | 23 +++++++++++-------- source/blender/blenkernel/intern/anim_sys.c | 3 ++- source/blender/blenkernel/intern/nla.c | 6 ++--- .../editors/space_action/action_data.cc | 6 ++--- source/blender/editors/space_nla/nla_draw.cc | 2 +- .../editors/transform/transform_convert.c | 2 +- source/blender/makesrna/intern/rna_action.cc | 6 ++--- 8 files changed, 36 insertions(+), 27 deletions(-) diff --git a/source/blender/blenkernel/BKE_action.h b/source/blender/blenkernel/BKE_action.h index 0eeaccbed8f..3414e69785c 100644 --- a/source/blender/blenkernel/BKE_action.h +++ b/source/blender/blenkernel/BKE_action.h @@ -77,16 +77,21 @@ short action_get_item_transforms(struct bAction *act, /** * Calculate the extents of given action. */ -void calc_action_range(const struct bAction *act, float *start, float *end, short incl_modifiers); +void BKE_action_frame_range_calc(const struct bAction *act, + bool include_modifiers, + float *r_start, + float *r_end); -/* Retrieve the intended playback frame range, using the manually set range if available, - * or falling back to scanning F-Curves for their first & last frames otherwise. */ -void BKE_action_get_frame_range(const struct bAction *act, float *r_start, float *r_end); +/** + * Retrieve the intended playback frame range, using the manually set range if available, + * or falling back to scanning F-Curves for their first & last frames otherwise. + */ +void BKE_action_frame_range_get(const struct bAction *act, float *r_start, float *r_end); /** * Check if the given action has any keyframes. */ -bool action_has_motion(const struct bAction *act); +bool BKE_action_has_motion(const struct bAction *act); /** * Is the action configured as cyclic. diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c index ca558d328bf..dded5e99322 100644 --- a/source/blender/blenkernel/intern/action.c +++ b/source/blender/blenkernel/intern/action.c @@ -1334,7 +1334,7 @@ void BKE_pose_remove_group_index(bPose *pose, const int index) /* ************** F-Curve Utilities for Actions ****************** */ -bool action_has_motion(const bAction *act) +bool BKE_action_has_motion(const bAction *act) { FCurve *fcu; @@ -1392,7 +1392,10 @@ bool BKE_action_has_single_frame(const bAction *act) return found_key; } -void calc_action_range(const bAction *act, float *start, float *end, short incl_modifiers) +void BKE_action_frame_range_calc(const bAction *act, + bool include_modifiers, + float *r_start, + float *r_end) { FCurve *fcu; float min = 999999999.0f, max = -999999999.0f; @@ -1419,10 +1422,10 @@ void calc_action_range(const bAction *act, float *start, float *end, short incl_ foundvert = 1; } - /* if incl_modifiers is enabled, need to consider modifiers too + /* if include_modifiers is enabled, need to consider modifiers too * - only really care about the last modifier */ - if ((incl_modifiers) && (fcu->modifiers.last)) { + if ((include_modifiers) && (fcu->modifiers.last)) { FModifier *fcm = fcu->modifiers.last; /* only use the maximum sensible limits of the modifiers if they are more extreme */ @@ -1470,23 +1473,23 @@ void calc_action_range(const bAction *act, float *start, float *end, short incl_ max += 1.0f; } - *start = max_ff(min, MINAFRAMEF); - *end = min_ff(max, MAXFRAMEF); + *r_start = max_ff(min, MINAFRAMEF); + *r_end = min_ff(max, MAXFRAMEF); } else { - *start = 0.0f; - *end = 1.0f; + *r_start = 0.0f; + *r_end = 1.0f; } } -void BKE_action_get_frame_range(const bAction *act, float *r_start, float *r_end) +void BKE_action_frame_range_get(const bAction *act, float *r_start, float *r_end) { if (act && (act->flag & ACT_FRAME_RANGE)) { *r_start = act->frame_start; *r_end = act->frame_end; } else { - calc_action_range(act, r_start, r_end, false); + BKE_action_frame_range_calc(act, r_start, r_end, false); } /* Ensure that action is at least 1 frame long (for NLA strips to have a valid length). */ diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index 298dce9dec7..ec7654149fd 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -3237,7 +3237,8 @@ static void animsys_create_action_track_strip(const AnimData *adt, /* Action range is calculated taking F-Modifiers into account * (which making new strips doesn't do due to the troublesome nature of that). */ - calc_action_range(r_action_strip->act, &r_action_strip->actstart, &r_action_strip->actend, 1); + BKE_action_frame_range_calc( + r_action_strip->act, true, &r_action_strip->actstart, &r_action_strip->actend); r_action_strip->start = r_action_strip->actstart; r_action_strip->end = IS_EQF(r_action_strip->actstart, r_action_strip->actend) ? (r_action_strip->actstart + 1.0f) : diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c index ed0bfa2c636..e1f5c07892c 100644 --- a/source/blender/blenkernel/intern/nla.c +++ b/source/blender/blenkernel/intern/nla.c @@ -481,7 +481,7 @@ NlaStrip *BKE_nlastrip_new(bAction *act) /* determine initial range * - strip length cannot be 0... ever... */ - BKE_action_get_frame_range(strip->act, &strip->actstart, &strip->actend); + BKE_action_frame_range_get(strip->act, &strip->actstart, &strip->actend); strip->start = strip->actstart; strip->end = IS_EQF(strip->actstart, strip->actend) ? (strip->actstart + 1.0f) : strip->actend; @@ -1580,7 +1580,7 @@ void BKE_nlastrip_recalculate_bounds_sync_action(NlaStrip *strip) prev_actstart = strip->actstart; - BKE_action_get_frame_range(strip->act, &strip->actstart, &strip->actend); + BKE_action_frame_range_get(strip->act, &strip->actstart, &strip->actend); /* Set start such that key's do not visually move, to preserve the overall animation result. */ strip->start += (strip->actstart - prev_actstart) * strip->scale; @@ -2113,7 +2113,7 @@ void BKE_nla_action_pushdown(AnimData *adt, const bool is_liboverride) * as that will cause us grief down the track */ /* TODO: what about modifiers? */ - if (action_has_motion(adt->action) == 0) { + if (BKE_action_has_motion(adt->action) == 0) { CLOG_ERROR(&LOG, "action has no data"); return; } diff --git a/source/blender/editors/space_action/action_data.cc b/source/blender/editors/space_action/action_data.cc index 5d3a2367f79..43fdfd5ea4a 100644 --- a/source/blender/editors/space_action/action_data.cc +++ b/source/blender/editors/space_action/action_data.cc @@ -341,7 +341,7 @@ static int action_pushdown_exec(bContext *C, wmOperator *op) if (adt) { /* Perform the push-down operation * - This will deal with all the AnimData-side user-counts. */ - if (action_has_motion(adt->action) == 0) { + if (BKE_action_has_motion(adt->action) == 0) { /* action may not be suitable... */ BKE_report(op->reports, RPT_WARNING, "Action must have at least one keyframe or F-Modifier"); return OPERATOR_CANCELLED; @@ -398,7 +398,7 @@ static int action_stash_exec(bContext *C, wmOperator *op) /* Perform stashing operation */ if (adt) { /* don't do anything if this action is empty... */ - if (action_has_motion(adt->action) == 0) { + if (BKE_action_has_motion(adt->action) == 0) { /* action may not be suitable... */ BKE_report(op->reports, RPT_WARNING, "Action must have at least one keyframe or F-Modifier"); return OPERATOR_CANCELLED; @@ -506,7 +506,7 @@ static int action_stash_create_exec(bContext *C, wmOperator *op) } else if (adt) { /* Perform stashing operation */ - if (action_has_motion(adt->action) == 0) { + if (BKE_action_has_motion(adt->action) == 0) { /* don't do anything if this action is empty... */ BKE_report(op->reports, RPT_WARNING, "Action must have at least one keyframe or F-Modifier"); return OPERATOR_CANCELLED; diff --git a/source/blender/editors/space_nla/nla_draw.cc b/source/blender/editors/space_nla/nla_draw.cc index be59663fd8c..9171234c860 100644 --- a/source/blender/editors/space_nla/nla_draw.cc +++ b/source/blender/editors/space_nla/nla_draw.cc @@ -888,7 +888,7 @@ void draw_nla_main_data(bAnimContext *ac, SpaceNla *snla, ARegion *region) case NLASTRIP_EXTEND_HOLD_FORWARD: { float r_start; float r_end; - BKE_action_get_frame_range(static_cast(ale->data), &r_start, &r_end); + BKE_action_frame_range_get(static_cast(ale->data), &r_start, &r_end); immRectf(pos, r_end, ymin + NLACHANNEL_SKIP, v2d->cur.xmax, ymax - NLACHANNEL_SKIP); break; diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c index c419a9d12f1..f34c61f2202 100644 --- a/source/blender/editors/transform/transform_convert.c +++ b/source/blender/editors/transform/transform_convert.c @@ -1199,7 +1199,7 @@ void animrecord_check_state(TransInfo *t, ID *id) float astart, aend; /* only push down if action is more than 1-2 frames long */ - calc_action_range(adt->action, &astart, &aend, 1); + BKE_action_frame_range_calc(adt->action, true, &astart, &aend); if (aend > astart + 2.0f) { NlaStrip *strip = BKE_nlastack_add_strip(adt, adt->action, ID_IS_OVERRIDE_LIBRARY(id)); diff --git a/source/blender/makesrna/intern/rna_action.cc b/source/blender/makesrna/intern/rna_action.cc index e7c751714aa..0080bd76d19 100644 --- a/source/blender/makesrna/intern/rna_action.cc +++ b/source/blender/makesrna/intern/rna_action.cc @@ -242,7 +242,7 @@ static void rna_Action_active_pose_marker_index_range( static void rna_Action_frame_range_get(PointerRNA *ptr, float *r_values) { - BKE_action_get_frame_range((bAction *)ptr->owner_id, &r_values[0], &r_values[1]); + BKE_action_frame_range_get((bAction *)ptr->owner_id, &r_values[0], &r_values[1]); } static void rna_Action_frame_range_set(PointerRNA *ptr, const float *values) @@ -258,7 +258,7 @@ static void rna_Action_frame_range_set(PointerRNA *ptr, const float *values) static void rna_Action_curve_frame_range_get(PointerRNA *ptr, float *values) { /* don't include modifiers because they too easily can have very large * ranges: MINAFRAMEF to MAXFRAMEF. */ - calc_action_range((bAction *)ptr->owner_id, values, values + 1, false); + BKE_action_frame_range_calc((bAction *)ptr->owner_id, false, values, values + 1); } static void rna_Action_use_frame_range_set(PointerRNA *ptr, bool value) @@ -268,7 +268,7 @@ static void rna_Action_use_frame_range_set(PointerRNA *ptr, bool value) if (value) { /* If the frame range is blank, initialize it by scanning F-Curves. */ if ((data->frame_start == data->frame_end) && (data->frame_start == 0)) { - calc_action_range(data, &data->frame_start, &data->frame_end, false); + BKE_action_frame_range_calc(data, false, &data->frame_start, &data->frame_end); } data->flag |= ACT_FRAME_RANGE; -- 2.30.2 From 7bc806ff25e9908e676995c51b2a3b26c9998f3f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 9 Jul 2023 18:22:29 +1000 Subject: [PATCH 062/115] Cleanup: use BKE_action prefix, return typed enum Use eAction_TransformFlags typed return value. --- source/blender/blenkernel/BKE_action.h | 13 +++++++------ source/blender/blenkernel/intern/action.c | 5 ++++- source/blender/editors/armature/pose_utils.cc | 3 ++- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/source/blender/blenkernel/BKE_action.h b/source/blender/blenkernel/BKE_action.h index 3414e69785c..cbd6376fa2d 100644 --- a/source/blender/blenkernel/BKE_action.h +++ b/source/blender/blenkernel/BKE_action.h @@ -40,8 +40,9 @@ struct bAction *BKE_action_add(struct Main *bmain, const char name[]); /* Action API ----------------- */ -/* types of transforms applied to the given item - * - these are the return flags for action_get_item_transforms() +/** + * Types of transforms applied to the given item: + * - these are the return flags for #BKE_action_get_item_transform_flags() */ typedef enum eAction_TransformFlags { /* location */ @@ -69,10 +70,10 @@ typedef enum eAction_TransformFlags { * - if 'curves' is provided, a list of links to these curves are also returned * whose nodes WILL NEED FREEING. */ -short action_get_item_transforms(struct bAction *act, - struct Object *ob, - struct bPoseChannel *pchan, - ListBase *curves); +eAction_TransformFlags BKE_action_get_item_transform_flags(struct bAction *act, + struct Object *ob, + struct bPoseChannel *pchan, + ListBase *curves); /** * Calculate the extents of given action. diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c index dded5e99322..553d5cc32c8 100644 --- a/source/blender/blenkernel/intern/action.c +++ b/source/blender/blenkernel/intern/action.c @@ -1503,7 +1503,10 @@ bool BKE_action_is_cyclic(const bAction *act) return act && (act->flag & ACT_FRAME_RANGE) && (act->flag & ACT_CYCLIC); } -short action_get_item_transforms(bAction *act, Object *ob, bPoseChannel *pchan, ListBase *curves) +eAction_TransformFlags BKE_action_get_item_transform_flags(bAction *act, + Object *ob, + bPoseChannel *pchan, + ListBase *curves) { PointerRNA ptr; FCurve *fcu; diff --git a/source/blender/editors/armature/pose_utils.cc b/source/blender/editors/armature/pose_utils.cc index e135b967945..6aafd5ca414 100644 --- a/source/blender/editors/armature/pose_utils.cc +++ b/source/blender/editors/armature/pose_utils.cc @@ -56,7 +56,8 @@ static void fcurves_to_pchan_links_get(ListBase *pfLinks, bPoseChannel *pchan) { ListBase curves = {nullptr, nullptr}; - int transFlags = action_get_item_transforms(act, ob, pchan, &curves); + const eAction_TransformFlags transFlags = BKE_action_get_item_transform_flags( + act, ob, pchan, &curves); pchan->flag &= ~(POSE_LOC | POSE_ROT | POSE_SIZE | POSE_BBONE_SHAPE); -- 2.30.2 From 043d23e9c637d59122161a8a2545dcd6231bcabd Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 9 Jul 2023 20:51:51 +1000 Subject: [PATCH 063/115] Cleanup: spelling of variable name --- source/blender/blenkernel/intern/curveprofile.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/blender/blenkernel/intern/curveprofile.cc b/source/blender/blenkernel/intern/curveprofile.cc index a0b99f44cae..934ab2630ff 100644 --- a/source/blender/blenkernel/intern/curveprofile.cc +++ b/source/blender/blenkernel/intern/curveprofile.cc @@ -1029,31 +1029,31 @@ void BKE_curveprofile_evaluate_length_portion(const CurveProfile *profile, /* Find the last point along the path with a lower length portion than the input. */ int i = 0; - float length_travelled = 0.0f; - while (length_travelled < requested_length) { + float length_traveled = 0.0f; + while (length_traveled < requested_length) { /* Check if we reached the last point before the final one. */ if (i == BKE_curveprofile_table_size(profile) - 2) { break; } float new_length = curveprofile_distance_to_next_table_point(profile, i); - if (length_travelled + new_length >= requested_length) { + if (length_traveled + new_length >= requested_length) { break; } - length_travelled += new_length; + length_traveled += new_length; i++; } /* Now travel the remaining distance of length portion down the path to the next point and * find the location where we stop. */ float distance_to_next_point = curveprofile_distance_to_next_table_point(profile, i); - float lerp_factor = (requested_length - length_travelled) / distance_to_next_point; + float lerp_factor = (requested_length - length_traveled) / distance_to_next_point; #ifdef DEBUG_CURVEPROFILE_EVALUATE printf("CURVEPROFILE EVALUATE\n"); printf(" length portion input: %f\n", double(length_portion)); printf(" requested path length: %f\n", double(requested_length)); printf(" distance to next point: %f\n", double(distance_to_next_point)); - printf(" length travelled: %f\n", double(length_travelled)); + printf(" length traveled: %f\n", double(length_traveled)); printf(" lerp-factor: %f\n", double(lerp_factor)); printf(" ith point (%f, %f)\n", double(profile->path[i].x), double(profile->path[i].y)); printf(" next point(%f, %f)\n", double(profile->path[i + 1].x), double(profile->path[i + 1].y)); -- 2.30.2 From 6290451712cd8c94f60380a7358d4e629237f7ea Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 9 Jul 2023 21:22:31 +1000 Subject: [PATCH 064/115] Cleanup: spelling in comments --- intern/cycles/kernel/light/spot.h | 2 +- intern/cycles/kernel/sample/mapping.h | 8 ++++---- source/blender/blenkernel/BKE_node.h | 2 +- source/blender/blenkernel/intern/action.c | 2 +- source/blender/blenkernel/intern/anim_data.c | 2 +- source/blender/blenkernel/intern/anim_sys.c | 10 +++++----- source/blender/blenkernel/intern/idtype.c | 2 +- source/blender/blenkernel/intern/lib_id.c | 12 ++++++------ source/blender/blenkernel/intern/material.cc | 2 +- source/blender/blenlib/tests/BLI_delaunay_2d_test.cc | 2 +- source/blender/blenloader/intern/versioning_260.cc | 2 +- source/blender/depsgraph/intern/node/deg_node.cc | 2 +- source/blender/depsgraph/intern/node/deg_node.h | 2 +- .../engines/eevee_next/eevee_reflection_probes.hh | 2 +- .../blender/draw/engines/eevee_next/eevee_world.hh | 4 ++-- .../eevee_next/shaders/eevee_geom_curves_vert.glsl | 6 +++--- .../eevee_next/shaders/eevee_geom_gpencil_vert.glsl | 6 +++--- source/blender/editors/animation/anim_ipo_utils.cc | 4 ++-- source/blender/editors/animation/anim_markers.cc | 10 +++++----- source/blender/editors/armature/armature_add.cc | 2 +- source/blender/editors/armature/pose_edit.cc | 7 ++++--- source/blender/editors/mesh/editmesh_add.cc | 2 +- source/blender/editors/mesh/editmesh_bevel.cc | 4 ++-- source/blender/editors/mesh/editmesh_extrude.cc | 2 +- source/blender/editors/mesh/editmesh_loopcut.cc | 2 +- source/blender/editors/scene/scene_edit.cc | 2 +- source/blender/editors/util/ed_draw.c | 2 +- source/blender/makesrna/intern/rna_space.cc | 2 +- source/blender/modifiers/intern/MOD_boolean.cc | 4 ++-- .../nodes/composite/nodes/node_composite_image.cc | 2 +- source/blender/windowmanager/intern/wm_gesture.c | 2 +- 31 files changed, 58 insertions(+), 57 deletions(-) diff --git a/intern/cycles/kernel/light/spot.h b/intern/cycles/kernel/light/spot.h index 57430e79992..7a46b1b660a 100644 --- a/intern/cycles/kernel/light/spot.h +++ b/intern/cycles/kernel/light/spot.h @@ -27,7 +27,7 @@ ccl_device void spot_light_uv(const float3 ray, ccl_private float *u, ccl_private float *v) { - /* Ensures that the spot light projects the full image regarless of the spot angle. */ + /* Ensures that the spot light projects the full image regardless of the spot angle. */ const float factor = half_cot_half_spot_angle / ray.z; /* NOTE: Return barycentric coordinates in the same notation as Embree and OptiX. */ diff --git a/intern/cycles/kernel/sample/mapping.h b/intern/cycles/kernel/sample/mapping.h index 91e12f5f625..fc5da4e31ce 100644 --- a/intern/cycles/kernel/sample/mapping.h +++ b/intern/cycles/kernel/sample/mapping.h @@ -151,10 +151,10 @@ ccl_device_inline void sample_uniform_cone_concentric(const float3 N, * hemisphere doesn't change the radius. For the latter, r_cone(rand) = * sin_from_cos(mix(cos_angle, 1, rand)). * - * So, to remap, we just invert r_disk (-> rand(r_disk) = r_disk^2) and insert it into r_cone: - * r_cone(r_disk) = r_cone(rand(r_disk)) = sin_from_cos(mix(cos_angle, 1, r_disk^2)). In - * practise, we need to replace `rand` with `1 - rand` to preserve the stratification, but - * since it's uniform, that's fine. */ + * So, to remap, we just invert r_disk `(-> rand(r_disk) = r_disk^2)` and insert it into + * r_cone: `r_cone(r_disk) = r_cone(rand(r_disk)) = sin_from_cos(mix(cos_angle, 1, r_disk^2))`. + * In practice, we need to replace `rand` with `1 - rand` to preserve the stratification, + * but since it's uniform, that's fine. */ float2 xy = concentric_sample_disk(rand); const float r2 = len_squared(xy); diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 9096434a81d..ef44cd7484d 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -845,7 +845,7 @@ void node_type_storage(struct bNodeType *ntype, * * - nodetree: * The actual bNodeTree data block. - * Check nodetree->idname or nodetree->typeinfo to use only specific types. + * Check `nodetree->idname` or `nodetree->typeinfo` to use only specific types. * * - id: * The owner of the bNodeTree data block. diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c index 553d5cc32c8..9bb73329e10 100644 --- a/source/blender/blenkernel/intern/action.c +++ b/source/blender/blenkernel/intern/action.c @@ -108,7 +108,7 @@ static void action_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src, for (fcurve_src = action_src->curves.first; fcurve_src; fcurve_src = fcurve_src->next) { /* Duplicate F-Curve. */ - /* XXX TODO: pass subdata flag? + /* XXX TODO: pass sub-data flag? * But surprisingly does not seem to be doing any ID reference-counting. */ fcurve_dst = BKE_fcurve_copy(fcurve_src); diff --git a/source/blender/blenkernel/intern/anim_data.c b/source/blender/blenkernel/intern/anim_data.c index 0f4e3f51e81..384ec4078b1 100644 --- a/source/blender/blenkernel/intern/anim_data.c +++ b/source/blender/blenkernel/intern/anim_data.c @@ -1352,7 +1352,7 @@ void BKE_animdata_fix_paths_rename_all_ex(Main *bmain, } \ (void)0 - /* another version of this macro for nodetrees */ + /* Another version of this macro for node-trees. */ #define RENAMEFIX_ANIM_NODETREE_IDS(first, NtId_Type) \ for (id = first; id; id = id->next) { \ AnimData *adt = BKE_animdata_from_id(id); \ diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index ec7654149fd..f6f5f065de2 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -4003,11 +4003,11 @@ void BKE_animsys_evaluate_all_animation(Main *main, Depsgraph *depsgraph, float } \ (void)0 - /* another macro for the "embedded" nodetree cases - * - this is like EVAL_ANIM_IDS, but this handles the case "embedded nodetrees" - * (i.e. scene/material/texture->nodetree) which we need a special exception - * for, otherwise they'd get skipped - * - 'ntp' stands for "node tree parent" = data-block where node tree stuff resides + /* Another macro for the "embedded" node-tree cases + * - This is like #EVAL_ANIM_IDS, but this handles the case "embedded node-trees" + * (i.e. `scene/material/texture->nodetree`) which we need a special exception + * for, otherwise they'd get skipped. + * - `ntp` stands for "node tree parent" = data-block where node tree stuff resides. */ #define EVAL_ANIM_NODETREE_IDS(first, NtId_Type, aflag) \ for (id = first; id; id = id->next) { \ diff --git a/source/blender/blenkernel/intern/idtype.c b/source/blender/blenkernel/intern/idtype.c index 0cdeaf939ca..fbd94172bae 100644 --- a/source/blender/blenkernel/intern/idtype.c +++ b/source/blender/blenkernel/intern/idtype.c @@ -466,7 +466,7 @@ void BKE_idtype_id_foreach_cache(ID *id, type_info = BKE_idtype_get_info_from_id(&nodetree->id); if (type_info == NULL) { /* Very old .blend file seem to have empty names for their embedded node trees, see - * `blo_do_versions_250()`. Assume those are nodetrees then. */ + * `blo_do_versions_250()`. Assume those are node-trees then. */ type_info = BKE_idtype_get_info_from_idcode(ID_NT); } if (type_info->foreach_cache != NULL) { diff --git a/source/blender/blenkernel/intern/lib_id.c b/source/blender/blenkernel/intern/lib_id.c index 51e731b5954..2a44edcea0c 100644 --- a/source/blender/blenkernel/intern/lib_id.c +++ b/source/blender/blenkernel/intern/lib_id.c @@ -593,7 +593,7 @@ static int id_copy_libmanagement_cb(LibraryIDLinkCallbackData *cb_data) /* Remap self-references to new copied ID. */ if (id == data->id_src) { - /* We cannot use self_id here, it is not *always* id_dst (thanks to $£!+@#&/? nodetrees). */ + /* We cannot use self_id here, it is not *always* id_dst (thanks to confounded node-trees!). */ id = *id_pointer = data->id_dst; } @@ -713,15 +713,15 @@ ID *BKE_id_copy_for_duplicate(Main *bmain, ID_NEW_SET(key, key_new); } - /* NOTE: embedded data (root nodetrees and master collections) should never be referenced by + /* NOTE: embedded data (root node-trees and master collections) should never be referenced by * anything else, so we do not need to set their newid pointer and flag. */ BKE_animdata_duplicate_id_action(bmain, id_new, duplicate_flags); if (key_new != NULL) { BKE_animdata_duplicate_id_action(bmain, key_new, duplicate_flags); } - /* Note that actions of embedded data (root nodetrees and master collections) are handled - * by `BKE_animdata_duplicate_id_action` as well. */ + /* Note that actions of embedded data (root node-trees and master collections) are handled + * by #BKE_animdata_duplicate_id_action as well. */ } return id->newid; } @@ -1436,7 +1436,7 @@ void BKE_libblock_copy_ex(Main *bmain, const ID *id, ID **r_newid, const int ori /* the duplicate should get a copy of the animdata */ if ((flag & LIB_ID_COPY_NO_ANIMDATA) == 0) { - /* Note that even though horrors like root nodetrees are not in bmain, the actions they use + /* Note that even though horrors like root node-trees are not in bmain, the actions they use * in their anim data *are* in bmain... super-mega-hooray. */ BLI_assert((copy_data_flag & LIB_ID_COPY_ACTIONS) == 0 || (copy_data_flag & LIB_ID_CREATE_NO_MAIN) == 0); @@ -1837,7 +1837,7 @@ void BKE_library_make_local(Main *bmain, BLI_linklist_prepend_arena(&todo_ids, id, linklist_mem); id->tag |= LIB_TAG_DOIT; - /* Tag those nasty non-ID nodetrees, + /* Tag those nasty non-ID node-trees, * but do not add them to todo list, making them local is handled by 'owner' ID. * This is needed for library_make_local_copying_check() to work OK at step 2. */ if (ntree != NULL) { diff --git a/source/blender/blenkernel/intern/material.cc b/source/blender/blenkernel/intern/material.cc index 58f6c0d1a17..a7351f6c26d 100644 --- a/source/blender/blenkernel/intern/material.cc +++ b/source/blender/blenkernel/intern/material.cc @@ -160,7 +160,7 @@ static void material_free_data(ID *id) static void material_foreach_id(ID *id, LibraryForeachIDData *data) { Material *material = (Material *)id; - /* Nodetrees **are owned by IDs**, treat them as mere sub-data and not real ID! */ + /* Node-trees **are owned by IDs**, treat them as mere sub-data and not real ID! */ BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL( data, BKE_library_foreach_ID_embedded(data, (ID **)&material->nodetree)); if (material->texpaintslot != nullptr) { diff --git a/source/blender/blenlib/tests/BLI_delaunay_2d_test.cc b/source/blender/blenlib/tests/BLI_delaunay_2d_test.cc index 3422deae1c2..484c9ed0a3a 100644 --- a/source/blender/blenlib/tests/BLI_delaunay_2d_test.cc +++ b/source/blender/blenlib/tests/BLI_delaunay_2d_test.cc @@ -1063,7 +1063,7 @@ template void twoface2_test() EXPECT_EQ(out.edge.size(), 18); EXPECT_EQ(out.face.size(), 9); if (out.vert.size() == 10 && out.edge.size() == 18 && out.face.size() == 9) { - /* Input verts have no dups, so expect output ones match input ones. */ + /* Input verts have no duplicates, so expect output ones match input ones. */ for (int i = 0; i < 6; i++) { EXPECT_EQ(get_orig_index(out.vert_orig, i), i); } diff --git a/source/blender/blenloader/intern/versioning_260.cc b/source/blender/blenloader/intern/versioning_260.cc index 8b74924100a..11256adf988 100644 --- a/source/blender/blenloader/intern/versioning_260.cc +++ b/source/blender/blenloader/intern/versioning_260.cc @@ -1754,7 +1754,7 @@ if (!MAIN_VERSION_ATLEAST(bmain, 266, 3)) { { /* Fix for a very old issue: * Node names were nominally made unique in r24478 (2.50.8), but the do_versions check - * to update existing node names only applied to bmain->nodetree (i.e. group nodes). + * to update existing node names only applied to `bmain->nodetree` (i.e. group nodes). * Uniqueness is now required for proper preview mapping, * so do this now to ensure old files don't break. */ diff --git a/source/blender/depsgraph/intern/node/deg_node.cc b/source/blender/depsgraph/intern/node/deg_node.cc index 1de1e3485f3..29c6b7ee725 100644 --- a/source/blender/depsgraph/intern/node/deg_node.cc +++ b/source/blender/depsgraph/intern/node/deg_node.cc @@ -68,7 +68,7 @@ const char *nodeTypeAsString(NodeType type) return "OBJECT_FROM_LAYER"; case NodeType::HIERARCHY: return "HIERARCHY"; - /* **** Evaluation-Related Outer Types (with Subdata) **** */ + /* **** Evaluation-Related Outer Types (with Sub-data) **** */ case NodeType::EVAL_POSE: return "EVAL_POSE"; case NodeType::BONE: diff --git a/source/blender/depsgraph/intern/node/deg_node.h b/source/blender/depsgraph/intern/node/deg_node.h index b99d8d5447c..c2180e99d06 100644 --- a/source/blender/depsgraph/intern/node/deg_node.h +++ b/source/blender/depsgraph/intern/node/deg_node.h @@ -103,7 +103,7 @@ enum class NodeType { * properly evaluated. Example of this is custom shapes for bones. */ VISIBILITY, - /* **** Evaluation-Related Outer Types (with Subdata) **** */ + /* **** Evaluation-Related Outer Types (with Sub-data) **** */ /* Pose Component - Owner/Container of Bones Eval */ EVAL_POSE, diff --git a/source/blender/draw/engines/eevee_next/eevee_reflection_probes.hh b/source/blender/draw/engines/eevee_next/eevee_reflection_probes.hh index 018571c38a2..fb2780a16c8 100644 --- a/source/blender/draw/engines/eevee_next/eevee_reflection_probes.hh +++ b/source/blender/draw/engines/eevee_next/eevee_reflection_probes.hh @@ -134,7 +134,7 @@ class ReflectionProbeModule { /** * Remove reflection probe data from the module. - * Ensures that data_buf is sequential and cubemaps are relinked to its corresponding data. + * Ensures that data_buf is sequential and cube-maps are relinked to its corresponding data. */ void remove_reflection_probe_data(int reflection_probe_data_index); diff --git a/source/blender/draw/engines/eevee_next/eevee_world.hh b/source/blender/draw/engines/eevee_next/eevee_world.hh index c589ffec290..55b3ce03d84 100644 --- a/source/blender/draw/engines/eevee_next/eevee_world.hh +++ b/source/blender/draw/engines/eevee_next/eevee_world.hh @@ -20,9 +20,9 @@ class Instance; /* -------------------------------------------------------------------- */ /** \name Default World Node-Tree * - * In order to support worlds without nodetree we reuse and configure a standalone nodetree that + * In order to support worlds without node-tree we reuse and configure a standalone node-tree that * we pass for shader generation. The GPUMaterial is still stored inside the World even if - * it does not use a nodetree. + * it does not use a node-tree. * \{ */ class DefaultWorldNodeTree { diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_geom_curves_vert.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_geom_curves_vert.glsl index 875f0db347c..fb5d2894bcf 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_geom_curves_vert.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_geom_curves_vert.glsl @@ -41,9 +41,9 @@ void main() velocity_local_pos_get(pos, vert_idx, prv, nxt); /* FIXME(fclem): Evaluating before displacement avoid displacement being treated as motion but * ignores motion from animated displacement. Supporting animated displacement motion vectors - * would require evaluating the nodetree multiple time with different nodetree UBOs evaluated at - * different times, but also with different attributes (maybe we could assume static attribute at - * least). */ + * would require evaluating the node-tree multiple time with different node-tree UBOs evaluated + * at different times, but also with different attributes (maybe we could assume static attribute + * at least). */ velocity_vertex(prv, pos, nxt, motion.prev, motion.next); #endif diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_geom_gpencil_vert.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_geom_gpencil_vert.glsl index 868d7a0cc3e..d2b96ad6a99 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_geom_gpencil_vert.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_geom_gpencil_vert.glsl @@ -38,9 +38,9 @@ void main() vec3 lP_curr = transform_point(ModelMatrixInverse, interp.P); /* FIXME(fclem): Evaluating before displacement avoid displacement being treated as motion but * ignores motion from animated displacement. Supporting animated displacement motion vectors - * would require evaluating the nodetree multiple time with different nodetree UBOs evaluated at - * different times, but also with different attributes (maybe we could assume static attribute at - * least). */ + * would require evaluating the node-tree multiple time with different node-tree UBOs evaluated + * at different times, but also with different attributes (maybe we could assume static attribute + * at least). */ velocity_vertex(lP_curr, lP_curr, lP_curr, motion.prev, motion.next); #endif diff --git a/source/blender/editors/animation/anim_ipo_utils.cc b/source/blender/editors/animation/anim_ipo_utils.cc index 4d5de5df22d..4988034d282 100644 --- a/source/blender/editors/animation/anim_ipo_utils.cc +++ b/source/blender/editors/animation/anim_ipo_utils.cc @@ -80,9 +80,9 @@ int getname_anim_fcurve(char *name, ID *id, FCurve *fcu) * which isn't so clear with option 2. */ - /* For structname: + /* For struct-name: * - As base, we use a custom name from the structs if one is available - * - However, if we're showing subdata of bones + * - However, if we're showing sub-data of bones * (probably there will be other exceptions later). * need to include that info too since it gets confusing otherwise. * - If a pointer just refers to the ID-block, then don't repeat this info diff --git a/source/blender/editors/animation/anim_markers.cc b/source/blender/editors/animation/anim_markers.cc index 66e0aa70857..82e8ad45e33 100644 --- a/source/blender/editors/animation/anim_markers.cc +++ b/source/blender/editors/animation/anim_markers.cc @@ -361,7 +361,7 @@ TimeMarker *ED_markers_get_first_selected(ListBase *markers) void debug_markers_print_list(ListBase *markers) { - /* NOTE: do NOT make static or put in if-defs as "unused code". + /* NOTE: do NOT make static or use `ifdef`'s as "unused code". * That's too much trouble when we need to use for quick debugging! */ TimeMarker *marker; @@ -780,7 +780,7 @@ static void MARKER_OT_add(wmOperatorType *ot) * \{ */ /* operator state vars used: - * frs: delta movement + * frames: delta movement * * functions: * @@ -957,7 +957,7 @@ static int ed_marker_move_invoke(bContext *C, wmOperator *op, const wmEvent *eve /* add temp handler */ WM_event_add_modal_handler(C, op); - /* reset frs delta */ + /* Reset frames delta. */ RNA_int_set(op->ptr, "frames", 0); ed_marker_move_update_header(C, op); @@ -1144,7 +1144,7 @@ static void MARKER_OT_move(wmOperatorType *ot) * \{ */ /* operator state vars used: - * frs: delta movement + * frames: delta movement * * functions: * @@ -1201,7 +1201,7 @@ static void ed_marker_duplicate_apply(bContext *C) static int ed_marker_duplicate_exec(bContext *C, wmOperator *op) { ed_marker_duplicate_apply(C); - ed_marker_move_exec(C, op); /* assumes frs delta set */ + ed_marker_move_exec(C, op); /* Assumes frame delta set. */ return OPERATOR_FINISHED; } diff --git a/source/blender/editors/armature/armature_add.cc b/source/blender/editors/armature/armature_add.cc index 770b947605b..04a0f40597d 100644 --- a/source/blender/editors/armature/armature_add.cc +++ b/source/blender/editors/armature/armature_add.cc @@ -1054,7 +1054,7 @@ static int armature_duplicate_selected_exec(bContext *C, wmOperator *op) ebone->bbone_next = ebone_iter->bbone_next->temp.ebone; } - /* Lets try to fix any constraint subtargets that might have been duplicated. */ + /* Lets try to fix any constraint sub-targets that might have been duplicated. */ updateDuplicateSubtarget(ebone, arm->edbo, ob, false); } } diff --git a/source/blender/editors/armature/pose_edit.cc b/source/blender/editors/armature/pose_edit.cc index f18beb34970..b541659cc7f 100644 --- a/source/blender/editors/armature/pose_edit.cc +++ b/source/blender/editors/armature/pose_edit.cc @@ -236,8 +236,9 @@ static int pose_calculate_paths_invoke(bContext *C, wmOperator *op, const wmEven return WM_operator_props_dialog_popup(C, op, 270); } -/* For the object with pose/action: create path curves for selected bones - * This recalculates the WHOLE path within the pchan->pathsf and pchan->pathef range +/** + * For the object with pose/action: create path curves for selected bones + * This recalculates the WHOLE path within the `pchan->pathsf` and `pchan->pathef` range. */ static int pose_calculate_paths_exec(bContext *C, wmOperator *op) { @@ -272,7 +273,7 @@ static int pose_calculate_paths_exec(bContext *C, wmOperator *op) TIMEIT_START(recalc_pose_paths); #endif - /* Calculate the bones that now have motionpaths. */ + /* Calculate the bones that now have motion-paths. */ /* TODO: only make for the selected bones? */ ED_pose_recalculate_paths(C, scene, ob, POSE_PATH_CALC_RANGE_FULL); diff --git a/source/blender/editors/mesh/editmesh_add.cc b/source/blender/editors/mesh/editmesh_add.cc index d274fc804df..b9b6014622a 100644 --- a/source/blender/editors/mesh/editmesh_add.cc +++ b/source/blender/editors/mesh/editmesh_add.cc @@ -75,7 +75,7 @@ static void make_prim_finish(bContext *C, * to push this up to edges & faces. */ EDBM_selectmode_flush_ex(em, SCE_SELECT_VERTEX); - /* only recalc editmode tessface if we are staying in editmode */ + /* Only recalculate edit-mode tessellation if we are staying in edit-mode. */ EDBMUpdate_Params params{}; params.calc_looptri = !exit_editmode; params.calc_normals = false; diff --git a/source/blender/editors/mesh/editmesh_bevel.cc b/source/blender/editors/mesh/editmesh_bevel.cc index e2d5e29f60c..eec075e93ba 100644 --- a/source/blender/editors/mesh/editmesh_bevel.cc +++ b/source/blender/editors/mesh/editmesh_bevel.cc @@ -374,8 +374,8 @@ static bool edbm_bevel_calc(wmOperator *op) BMO_op_exec(em->bm, &bmop); if (offset != 0.0f) { - /* not essential, but we may have some loose geometry that - * won't get bevel'd and better not leave it selected */ + /* Not essential, but we may have some loose geometry that + * won't get beveled and better not leave it selected. */ EDBM_flag_disable_all(em, BM_ELEM_SELECT); BMO_slot_buffer_hflag_enable( em->bm, bmop.slots_out, "faces.out", BM_FACE, BM_ELEM_SELECT, true); diff --git a/source/blender/editors/mesh/editmesh_extrude.cc b/source/blender/editors/mesh/editmesh_extrude.cc index 72090408922..d5963d03ff2 100644 --- a/source/blender/editors/mesh/editmesh_extrude.cc +++ b/source/blender/editors/mesh/editmesh_extrude.cc @@ -354,7 +354,7 @@ void MESH_OT_extrude_repeat(wmOperatorType *ot) /** \name Extrude Operator * \{ */ -/* generic extern called extruder */ +/** Implement generic externally called extrude function. */ static bool edbm_extrude_mesh(Object *obedit, BMEditMesh *em, wmOperator *op) { const bool use_normal_flip = RNA_boolean_get(op->ptr, "use_normal_flip"); diff --git a/source/blender/editors/mesh/editmesh_loopcut.cc b/source/blender/editors/mesh/editmesh_loopcut.cc index 3ab916d528c..0c3acea3aac 100644 --- a/source/blender/editors/mesh/editmesh_loopcut.cc +++ b/source/blender/editors/mesh/editmesh_loopcut.cc @@ -195,7 +195,7 @@ static void ringsel_finish(bContext *C, wmOperator *op) use_only_quads, 0); - /* when used in a macro the tessfaces will be recalculated anyway, + /* When used in a macro the tessellation will be recalculated anyway, * this is needed here because modifiers depend on updated tessellation, see #45920 */ EDBMUpdate_Params params{}; params.calc_looptri = true; diff --git a/source/blender/editors/scene/scene_edit.cc b/source/blender/editors/scene/scene_edit.cc index e3e5ad25843..4630c233ee1 100644 --- a/source/blender/editors/scene/scene_edit.cc +++ b/source/blender/editors/scene/scene_edit.cc @@ -213,7 +213,7 @@ bool ED_scene_view_layer_delete(Main *bmain, Scene *scene, ViewLayer *layer, Rep return false; } - /* We need to unset nodetrees before removing the layer, otherwise its index will be -1. */ + /* We need to unset node-trees before removing the layer, otherwise its index will be -1. */ view_layer_remove_unset_nodetrees(bmain, scene, layer); BLI_remlink(&scene->view_layers, layer); diff --git a/source/blender/editors/util/ed_draw.c b/source/blender/editors/util/ed_draw.c index 17c665a780d..0e41f75a904 100644 --- a/source/blender/editors/util/ed_draw.c +++ b/source/blender/editors/util/ed_draw.c @@ -372,7 +372,7 @@ static void slider_draw(const bContext *UNUSED(C), ARegion *region, void *arg) static void slider_update_factor(tSlider *slider, const wmEvent *event) { - /* Normalize so no matter the factor bounds, the mouse distance travelled from min to max is + /* Normalize so no matter the factor bounds, the mouse distance traveled from min to max is * constant. */ const float slider_range = slider->factor_bounds[1] - slider->factor_bounds[0]; const float factor_delta = (event->xy[0] - slider->last_cursor[0]) / diff --git a/source/blender/makesrna/intern/rna_space.cc b/source/blender/makesrna/intern/rna_space.cc index a1c6a1f2650..40054dbc6df 100644 --- a/source/blender/makesrna/intern/rna_space.cc +++ b/source/blender/makesrna/intern/rna_space.cc @@ -3402,7 +3402,7 @@ static IDFilterEnumPropertyItem rna_enum_space_file_id_filter_categories[] = { "category_shading", ICON_MATERIAL_DATA, "Shading", - "Show materials, nodetrees, textures and Freestyle's linestyles"}, + "Show materials, node-trees, textures and Freestyle's line-styles"}, {FILTER_ID_IM | FILTER_ID_MC | FILTER_ID_MSK | FILTER_ID_SO, "category_image", ICON_IMAGE_DATA, diff --git a/source/blender/modifiers/intern/MOD_boolean.cc b/source/blender/modifiers/intern/MOD_boolean.cc index 236a75a2f98..2e742d644eb 100644 --- a/source/blender/modifiers/intern/MOD_boolean.cc +++ b/source/blender/modifiers/intern/MOD_boolean.cc @@ -279,8 +279,8 @@ static void BMD_mesh_intersection(BMesh *bm, BooleanModifierData *bmd = (BooleanModifierData *)md; - /* main bmesh intersection setup */ - /* create tessface & intersect */ + /* Main BMesh intersection setup. */ + /* Create tessellation & intersect. */ const int looptris_tot = poly_to_tri_count(bm->totface, bm->totloop); BMLoop *(*looptris)[3] = (BMLoop * (*)[3]) MEM_malloc_arrayN(looptris_tot, sizeof(*looptris), __func__); diff --git a/source/blender/nodes/composite/nodes/node_composite_image.cc b/source/blender/nodes/composite/nodes/node_composite_image.cc index f5343644a30..0c44d55be1f 100644 --- a/source/blender/nodes/composite/nodes/node_composite_image.cc +++ b/source/blender/nodes/composite/nodes/node_composite_image.cc @@ -714,7 +714,7 @@ static bool node_composit_poll_rlayers(const bNodeType * /*ntype*/, Scene *scene; /* XXX ugly: check if ntree is a local scene node tree. - * Render layers node can only be used in local scene->nodetree, + * Render layers node can only be used in local `scene->nodetree`, * since it directly links to the scene. */ for (scene = (Scene *)G.main->scenes.first; scene; scene = (Scene *)scene->id.next) { diff --git a/source/blender/windowmanager/intern/wm_gesture.c b/source/blender/windowmanager/intern/wm_gesture.c index a1c9421d9f5..37568a0086a 100644 --- a/source/blender/windowmanager/intern/wm_gesture.c +++ b/source/blender/windowmanager/intern/wm_gesture.c @@ -46,7 +46,7 @@ wmGesture *WM_gesture_new(wmWindow *window, const ARegion *region, const wmEvent gesture->event_modifier = event->modifier; gesture->event_keymodifier = event->keymodifier; gesture->winrct = region->winrct; - gesture->user_data.use_free = true; /* Free if userdata is set. */ + gesture->user_data.use_free = true; /* Free if user-data is set. */ gesture->modal_state = GESTURE_MODAL_NOP; gesture->move = false; -- 2.30.2 From 85a10bc4d99f9a2b92c06dcaded422b17460dc0d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 9 Jul 2023 21:22:52 +1000 Subject: [PATCH 065/115] Cleanup: use doxy sections for mesh rip --- source/blender/editors/mesh/editmesh_rip.cc | 46 ++++++++++++++++++--- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/source/blender/editors/mesh/editmesh_rip.cc b/source/blender/editors/mesh/editmesh_rip.cc index 2fe1f4555a8..eddfbdc7b27 100644 --- a/source/blender/editors/mesh/editmesh_rip.cc +++ b/source/blender/editors/mesh/editmesh_rip.cc @@ -35,6 +35,10 @@ #include "mesh_intern.h" /* own include */ +/* -------------------------------------------------------------------- */ +/** \name Local Utilities + * \{ */ + /** * helper to find edge for edge_rip, * @@ -147,10 +151,14 @@ static float edbm_rip_edge_side_measure( return -score; } -/* - Advanced selection handling 'ripsel' functions ----- */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Rip Selection Handling (advanced rip-select `ripsel` functions) + * \{ */ /** - * How rip selection works + * How rip selection works: * * Firstly - rip is basically edge split with side-selection & grab. * Things would be much more simple if we didn't have to worry about side selection @@ -308,7 +316,11 @@ printf("%s: found contiguous edge loop of (%d)\n", __func__, uid_end - uid_start return eloop_pairs; } -/* - De-Select the worst rip-edge side -------------------------------- */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Rip Far-Side De-Select + * \{ */ static BMEdge *edbm_ripsel_edge_uid_step(BMEdge *e_orig, BMVert **v_prev) { @@ -366,9 +378,13 @@ static void edbm_ripsel_deselect_helper(BMesh *bm, } } } -/* --- end 'ripsel' selection handling code --- */ -/* --- face-fill code --- */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Rip Face-Fill code + * \{ */ + /** * return an un-ordered array of loop pairs * use for rebuilding face-fill @@ -496,7 +512,11 @@ static void edbm_tagged_loop_pairs_do_fill_faces(BMesh *bm, UnorderedLoopPair *u } } -/* --- end 'face-fill' code --- */ +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Rip Vertex Implementation + * \{ */ /** * This is the main vert ripping function (rip when one vertex is selected) @@ -857,6 +877,12 @@ static int edbm_rip_invoke__vert(bContext *C, const wmEvent *event, Object *obed return OPERATOR_FINISHED; } +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Rip Edge Implementation + * \{ */ + /** * This is the main edge ripping function */ @@ -989,6 +1015,12 @@ static int edbm_rip_invoke__edge(bContext *C, const wmEvent *event, Object *obed return OPERATOR_FINISHED; } +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Rip Operator + * \{ */ + /* based on mouse cursor position, it defines how is being ripped */ static int edbm_rip_invoke(bContext *C, wmOperator *op, const wmEvent *event) { @@ -1122,3 +1154,5 @@ void MESH_OT_rip(wmOperatorType *ot) prop = RNA_def_boolean(ot->srna, "use_fill", false, "Fill", "Fill the ripped region"); RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_ID_MESH); } + +/** \} */ -- 2.30.2 From 09f1844d75d822acecbe566effe3f3e764ff9223 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 9 Jul 2023 21:40:17 +1000 Subject: [PATCH 066/115] Cleanup: correct doxy-groups --- source/blender/blenkernel/BKE_node.h | 4 +++- source/blender/blenkernel/intern/customdata.cc | 6 +++++- source/blender/blenkernel/intern/geometry_set.cc | 8 ++++---- source/blender/blenkernel/intern/vfont.cc | 2 -- source/blender/blenlib/intern/string.c | 2 ++ .../blender/depsgraph/intern/depsgraph_light_linking.cc | 4 ++-- source/blender/editors/include/ED_grease_pencil.h | 2 ++ .../editors/transform/transform_snap_object_editmesh.cc | 2 ++ source/blender/makesdna/DNA_userdef_defaults.h | 4 +--- 9 files changed, 21 insertions(+), 13 deletions(-) diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index ef44cd7484d..9853ac05dcf 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -818,7 +818,9 @@ void node_type_storage(struct bNodeType *ntype, /** \} */ -/* ************** COMMON NODES *************** */ +/* -------------------------------------------------------------------- */ +/** \name Common Node Types + * \{ */ #define NODE_UNDEFINED -2 /* node type is not registered */ #define NODE_CUSTOM -1 /* for dynamically registered custom types */ diff --git a/source/blender/blenkernel/intern/customdata.cc b/source/blender/blenkernel/intern/customdata.cc index c23638c58d5..d0512450bd1 100644 --- a/source/blender/blenkernel/intern/customdata.cc +++ b/source/blender/blenkernel/intern/customdata.cc @@ -105,7 +105,7 @@ bool CustomData_MeshMasks_are_matching(const CustomData_MeshMasks *mask_ref, /** \} */ /* -------------------------------------------------------------------- */ -/** \name Layer Type Information +/** \name Layer Type Information Struct * \{ */ struct LayerTypeInfo { @@ -1557,6 +1557,10 @@ static void layerDefault_propquaternion(void *data, const int count) /** \} */ +/* -------------------------------------------------------------------- */ +/** \name Layer Type Information (#LAYERTYPEINFO) + * \{ */ + static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { /* 0: CD_MVERT */ /* DEPRECATED */ {sizeof(MVert), "MVert", 1, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}, diff --git a/source/blender/blenkernel/intern/geometry_set.cc b/source/blender/blenkernel/intern/geometry_set.cc index 62c6441cc95..76c13079dba 100644 --- a/source/blender/blenkernel/intern/geometry_set.cc +++ b/source/blender/blenkernel/intern/geometry_set.cc @@ -28,12 +28,12 @@ #include "MEM_guardedalloc.h" +namespace blender::bke { + /* -------------------------------------------------------------------- */ /** \name Geometry Component * \{ */ -namespace blender::bke { - GeometryComponent::GeometryComponent(Type type) : type_(type) {} GeometryComponentPtr GeometryComponent::create(Type component_type) @@ -717,6 +717,6 @@ bool object_has_geometry_set_instances(const Object &object) return false; } -} // namespace blender::bke - /** \} */ + +} // namespace blender::bke diff --git a/source/blender/blenkernel/intern/vfont.cc b/source/blender/blenkernel/intern/vfont.cc index ae6a6305beb..14e0a77090a 100644 --- a/source/blender/blenkernel/intern/vfont.cc +++ b/source/blender/blenkernel/intern/vfont.cc @@ -749,8 +749,6 @@ typedef struct VFontCursor_Params { int r_string_offset; } VFontCursor_Params; -/** \} */ - enum { VFONT_TO_CURVE_INIT = 0, VFONT_TO_CURVE_BISECT, diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c index 7cc8d5600ad..3157ec15e26 100644 --- a/source/blender/blenlib/intern/string.c +++ b/source/blender/blenlib/intern/string.c @@ -122,6 +122,8 @@ size_t BLI_strncpy_rlen(char *__restrict dst, const char *__restrict src, const return srclen; } +/** \} */ + /* -------------------------------------------------------------------- */ /** \name String Append * \{ */ diff --git a/source/blender/depsgraph/intern/depsgraph_light_linking.cc b/source/blender/depsgraph/intern/depsgraph_light_linking.cc index 8c593fd5f16..8e8ac4333f8 100644 --- a/source/blender/depsgraph/intern/depsgraph_light_linking.cc +++ b/source/blender/depsgraph/intern/depsgraph_light_linking.cc @@ -45,7 +45,7 @@ void eval_runtime_data(const ::Depsgraph *depsgraph, Object &object_eval) } // namespace blender::deg::light_linking -/* \} */ +/** \} */ /* -------------------------------------------------------------------- */ /** \name Internal builder API @@ -504,4 +504,4 @@ void Cache::eval_runtime_data(Object &object_eval) const } // namespace blender::deg::light_linking -/* \} */ +/** \} */ diff --git a/source/blender/editors/include/ED_grease_pencil.h b/source/blender/editors/include/ED_grease_pencil.h index 620b84d67bb..48079b45e37 100644 --- a/source/blender/editors/include/ED_grease_pencil.h +++ b/source/blender/editors/include/ED_grease_pencil.h @@ -41,6 +41,8 @@ void ED_keymap_grease_pencil(struct wmKeyConfig *keyconf); */ eAttrDomain ED_grease_pencil_selection_domain_get(struct bContext *C); +/** \} */ + #ifdef __cplusplus } #endif diff --git a/source/blender/editors/transform/transform_snap_object_editmesh.cc b/source/blender/editors/transform/transform_snap_object_editmesh.cc index 3d2d7a3c2f9..6874730dfd9 100644 --- a/source/blender/editors/transform/transform_snap_object_editmesh.cc +++ b/source/blender/editors/transform/transform_snap_object_editmesh.cc @@ -389,6 +389,8 @@ static bool raycastEditMesh(SnapCache_EditMesh *em_cache, return retval; } +/** \} */ + /* -------------------------------------------------------------------- */ /** \name Surface Snap Functions * \{ */ diff --git a/source/blender/makesdna/DNA_userdef_defaults.h b/source/blender/makesdna/DNA_userdef_defaults.h index 68253c5acd9..cc13c832ed1 100644 --- a/source/blender/makesdna/DNA_userdef_defaults.h +++ b/source/blender/makesdna/DNA_userdef_defaults.h @@ -25,6 +25,4 @@ /** \} */ -/* clang-format off */ - -/** \} */ +/* clang-format on */ -- 2.30.2 From 1c8bd06652ddc3e76263f3e5ace2bc13d173cd56 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Sun, 9 Jul 2023 19:10:41 -0400 Subject: [PATCH 067/115] Refactor: Reduce template usage in paint_vertex.cc --- .../editors/sculpt_paint/paint_vertex.cc | 365 +++++------------- 1 file changed, 103 insertions(+), 262 deletions(-) diff --git a/source/blender/editors/sculpt_paint/paint_vertex.cc b/source/blender/editors/sculpt_paint/paint_vertex.cc index c2a87ecfee4..db72f9ac9c9 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.cc +++ b/source/blender/editors/sculpt_paint/paint_vertex.cc @@ -77,11 +77,6 @@ using namespace blender::color; /** \name Internal Utilities * \{ */ -static uint color2uint(ColorPaint4b c) -{ - return *(reinterpret_cast(&c)); -} - static bool isZero(ColorPaint4f c) { return c.r == 0.0f && c.g == 0.0f && c.b == 0.0f && c.a == 0.0f; @@ -92,7 +87,7 @@ static bool isZero(ColorPaint4b c) return c.r == 0 && c.g == 0 && c.b == 0 && c.a == 0; } -template static ColorPaint4f toFloat(const Color &c) +template static ColorPaint4f toFloat(const Color &c) { if constexpr (std::is_same_v) { return c.decode(); @@ -102,7 +97,7 @@ template static ColorPaint4f toFloat(const Color } } -template static Color fromFloat(const ColorPaint4f &c) +template static Color fromFloat(const ColorPaint4f &c) { if constexpr (std::is_same_v) { return c.encode(); @@ -135,26 +130,6 @@ struct NormalAnglePrecalc { float angle_range; }; -/* Returns number of elements. */ -static int get_vcol_elements(Mesh *me, size_t *r_elem_size) -{ - const std::optional meta_data = *me->attributes().lookup_meta_data( - me->active_color_attribute); - - if (r_elem_size) { - *r_elem_size = meta_data->data_type == CD_PROP_COLOR ? sizeof(float[4]) : 4ULL; - } - - switch (meta_data->domain) { - case ATTR_DOMAIN_POINT: - return me->totvert; - case ATTR_DOMAIN_CORNER: - return me->totloop; - default: - return 0; - } -} - static void view_angle_limits_init(NormalAnglePrecalc *a, float angle, bool do_mask_normal) { angle = RAD2DEGF(angle); @@ -314,8 +289,7 @@ bool weight_paint_poll_ignore_tool(bContext *C) return weight_paint_poll_ex(C, false); } -template -static Color vpaint_get_current_col(Scene *scene, VPaint *vp, bool secondary) +static ColorPaint4f vpaint_get_current_col(Scene *scene, VPaint *vp, bool secondary) { const Brush *brush = BKE_paint_brush_for_read(&vp->paint); float color[4]; @@ -325,15 +299,7 @@ static Color vpaint_get_current_col(Scene *scene, VPaint *vp, bool secondary) color[3] = 1.0f; /* alpha isn't used, could even be removed to speedup paint a little */ - return fromFloat(ColorPaint4f(color)); -} - -uint vpaint_get_current_color(Scene *scene, VPaint *vp, bool secondary) -{ - ColorPaint4b col = vpaint_get_current_col( - scene, vp, secondary); - - return color2uint(col); + return ColorPaint4f(color); } /* wpaint has 'wpaint_blend' */ @@ -1212,18 +1178,16 @@ static void vertex_paint_init_stroke(Scene *scene, Depsgraph *depsgraph, Object /* Allocate scratch array for previous colors if needed. */ if (!brush_use_accumulate(ts->vpaint)) { - if (!ss->cache->prev_colors_vpaint) { - Mesh *me = BKE_object_get_original_mesh(ob); - size_t elem_size; - int elem_num; - - elem_num = get_vcol_elements(me, &elem_size); - - ss->cache->prev_colors_vpaint = (uint *)MEM_callocN(elem_num * elem_size, __func__); + if (ss->cache->prev_colors_vpaint.is_empty()) { + const Mesh *mesh = BKE_object_get_original_mesh(ob); + const GVArray attribute = *mesh->attributes().lookup(mesh->active_color_attribute); + ss->cache->prev_colors_vpaint = GArray(attribute.type(), attribute.size()); + attribute.type().value_initialize_n(ss->cache->prev_colors_vpaint.data(), + ss->cache->prev_colors_vpaint.size()); } } else { - MEM_SAFE_FREE(ss->cache->prev_colors_vpaint); + ss->cache->prev_colors_vpaint = {}; } } @@ -2805,17 +2769,14 @@ void PAINT_OT_vertex_paint_toggle(wmOperatorType *ot) * - revise whether op->customdata should be added in object, in set_vpaint. */ -struct VPaintDataBase { +struct VPaintData { ViewContext vc; eAttrDomain domain; eCustomDataType type; -}; -template -struct VPaintData : public VPaintDataBase { NormalAnglePrecalc normal_angle_precalc; - Color paintcol; + ColorPaint4f paintcol; VertProjHandle *vp_handle; CoNo *vertexcosnos; @@ -2824,33 +2785,24 @@ struct VPaintData : public VPaintDataBase { /* Special storage for smear brush, avoid feedback loop - update each step. */ struct { - void *color_prev; - void *color_curr; + GArray<> color_prev; + GArray<> color_curr; } smear; }; -template -static void *vpaint_init_vpaint(bContext *C, - wmOperator *op, - Scene *scene, - Depsgraph *depsgraph, - VPaint *vp, - Object *ob, - Mesh *me, - const Brush *brush) +static VPaintData *vpaint_init_vpaint(bContext *C, + wmOperator *op, + Scene *scene, + Depsgraph *depsgraph, + VPaint *vp, + Object *ob, + Mesh *me, + const eAttrDomain domain, + const eCustomDataType type, + const Brush *brush) { - VPaintData *vpd; - - /* make mode data storage */ - vpd = MEM_new>("VPaintData"); - - if constexpr (std::is_same_v) { - vpd->type = CD_PROP_COLOR; - } - else { - vpd->type = CD_PROP_BYTE_COLOR; - } - + VPaintData *vpd = MEM_new(__func__); + vpd->type = type; vpd->domain = domain; ED_view3d_viewcontext_init(C, &vpd->vc, depsgraph); @@ -2858,17 +2810,18 @@ static void *vpaint_init_vpaint(bContext *C, vp->paint.brush->falloff_angle, (vp->paint.brush->flag & BRUSH_FRONTFACE_FALLOFF) != 0); - vpd->paintcol = vpaint_get_current_col( + vpd->paintcol = vpaint_get_current_col( scene, vp, (RNA_enum_get(op->ptr, "mode") == BRUSH_STROKE_INVERT)); + ; vpd->is_texbrush = !(brush->vertexpaint_tool == VPAINT_TOOL_BLUR) && brush->mtex.tex; if (brush->vertexpaint_tool == VPAINT_TOOL_SMEAR) { const GVArray attribute = *me->attributes().lookup(me->active_color_attribute, domain); - vpd->smear.color_prev = MEM_malloc_arrayN(attribute.size(), attribute.type().size(), __func__); - attribute.materialize(vpd->smear.color_prev); + vpd->smear.color_prev = GArray(attribute.type(), attribute.size()); + attribute.materialize(vpd->smear.color_prev.data()); - vpd->smear.color_curr = MEM_dupallocN(vpd->smear.color_prev); + vpd->smear.color_curr = vpd->smear.color_prev; } /* Create projection handle */ @@ -2878,7 +2831,7 @@ static void *vpaint_init_vpaint(bContext *C, ob->sculpt->building_vp_handle = false; } - return static_cast(vpd); + return vpd; } static bool vpaint_stroke_test_start(bContext *C, wmOperator *op, const float mouse[2]) @@ -2908,30 +2861,8 @@ static bool vpaint_stroke_test_start(bContext *C, wmOperator *op, const float mo return false; } - void *vpd = nullptr; - - if (meta_data->domain == ATTR_DOMAIN_POINT) { - if (meta_data->data_type == CD_PROP_COLOR) { - vpd = vpaint_init_vpaint( - C, op, scene, depsgraph, vp, ob, me, brush); - } - else if (meta_data->data_type == CD_PROP_BYTE_COLOR) { - vpd = vpaint_init_vpaint( - C, op, scene, depsgraph, vp, ob, me, brush); - } - } - else if (meta_data->domain == ATTR_DOMAIN_CORNER) { - if (meta_data->data_type == CD_PROP_COLOR) { - vpd = vpaint_init_vpaint( - C, op, scene, depsgraph, vp, ob, me, brush); - } - else if (meta_data->data_type == CD_PROP_BYTE_COLOR) { - vpd = vpaint_init_vpaint( - C, op, scene, depsgraph, vp, ob, me, brush); - } - } - - BLI_assert(vpd != nullptr); + VPaintData *vpd = vpaint_init_vpaint( + C, op, scene, depsgraph, vp, ob, me, meta_data->domain, meta_data->data_type, brush); paint_stroke_set_mode_data(stroke, vpd); @@ -2943,15 +2874,14 @@ static bool vpaint_stroke_test_start(bContext *C, wmOperator *op, const float mo return true; } -template static void do_vpaint_brush_blur_loops(bContext *C, Sculpt * /*sd*/, VPaint *vp, - VPaintData *vpd, + VPaintData *vpd, Object *ob, Mesh *me, Span nodes, - Color *lcol) + GMutableSpan lcol) { using Blend = typename Traits::BlendType; @@ -2960,7 +2890,7 @@ static void do_vpaint_brush_blur_loops(bContext *C, const Brush *brush = ob->sculpt->cache->brush; const Scene *scene = CTX_data_scene(C); - Color *previous_color = static_cast(ss->cache->prev_colors_vpaint); + GMutableSpan previous_color = ss->cache->prev_colors_vpaint; const blender::VArray select_vert = *me->attributes().lookup_or_default( ".select_vert", ATTR_DOMAIN_POINT, false); @@ -3057,7 +2987,7 @@ static void do_vpaint_brush_blur_loops(bContext *C, if (!use_face_sel || select_poly[p_index]) { Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ - if (previous_color != nullptr) { + if (!previous_color.is_empty()) { /* Get the previous loop color */ if (isZero(previous_color[l_index])) { previous_color[l_index] = lcol[l_index]; @@ -3086,15 +3016,14 @@ static void do_vpaint_brush_blur_loops(bContext *C, }); } -template static void do_vpaint_brush_blur_verts(bContext *C, Sculpt * /*sd*/, VPaint *vp, - VPaintData *vpd, + VPaintData *vpd, Object *ob, Mesh *me, Span nodes, - Color *lcol) + GMutableSpan lcol) { using Blend = typename Traits::BlendType; @@ -3103,7 +3032,7 @@ static void do_vpaint_brush_blur_verts(bContext *C, const Brush *brush = ob->sculpt->cache->brush; const Scene *scene = CTX_data_scene(C); - Color *previous_color = static_cast(ss->cache->prev_colors_vpaint); + GMutableSpan previous_color = ss->cache->prev_colors_vpaint; const blender::VArray select_vert = *me->attributes().lookup_or_default( ".select_vert", ATTR_DOMAIN_POINT, false); @@ -3167,7 +3096,7 @@ static void do_vpaint_brush_blur_verts(bContext *C, const blender::IndexRange poly = ss->polys[p_index]; total_hit_loops += poly.size(); for (const int vert : ss->corner_verts.slice(poly)) { - Color *col = lcol + vert; + const Color &col = lcol[vert]; /* Color is squared to compensate the `sqrt` color encoding. */ blend[0] += (Blend)col->r * (Blend)col->r; @@ -3197,7 +3126,7 @@ static void do_vpaint_brush_blur_verts(bContext *C, if (!use_face_sel || select_poly[p_index]) { Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ - if (previous_color != nullptr) { + if (!previous_color.is_empty()) { /* Get the previous loop color */ if (isZero(previous_color[v_index])) { previous_color[v_index] = lcol[v_index]; @@ -3226,15 +3155,14 @@ static void do_vpaint_brush_blur_verts(bContext *C, }); } -template static void do_vpaint_brush_smear(bContext *C, Sculpt * /*sd*/, VPaint *vp, - VPaintData *vpd, + VPaintData *vpd, Object *ob, Mesh *me, Span nodes, - Color *lcol) + GMutableSpan lcol) { SculptSession *ss = ob->sculpt; @@ -3245,9 +3173,9 @@ static void do_vpaint_brush_smear(bContext *C, const Brush *brush = ob->sculpt->cache->brush; const Scene *scene = CTX_data_scene(C); - Color *color_curr = static_cast(vpd->smear.color_curr); - Color *color_prev_smear = static_cast(vpd->smear.color_prev); - Color *color_prev = reinterpret_cast(ss->cache->prev_colors_vpaint); + GMutableSpan color_curr = vpd->smear.color_curr; + GMutableSpan color_prev_smear = vpd->smear.color_prev; + GMutableSpan color_prev = ss->cache->prev_colors_vpaint; const blender::VArray select_vert = *me->attributes().lookup_or_default( ".select_vert", ATTR_DOMAIN_POINT, false); @@ -3336,7 +3264,7 @@ static void do_vpaint_brush_smear(bContext *C, const float stroke_dot = dot_v3v3(other_dir, brush_dir); int elem_index; - if constexpr (domain == ATTR_DOMAIN_POINT) { + if (vpd->domain == ATTR_DOMAIN_POINT) { elem_index = v_other_index; } else { @@ -3363,7 +3291,7 @@ static void do_vpaint_brush_smear(bContext *C, const int p_index = gmap->vert_to_poly[v_index][j]; int elem_index; - if constexpr (domain == ATTR_DOMAIN_POINT) { + if (vpd->domain == ATTR_DOMAIN_POINT) { elem_index = v_index; } else { @@ -3376,7 +3304,7 @@ static void do_vpaint_brush_smear(bContext *C, /* Get the previous element color */ Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ - if (color_prev != nullptr) { + if (!color_prev.is_empty()) { /* Get the previous element color */ if (isZero(color_prev[elem_index])) { color_prev[elem_index] = lcol[elem_index]; @@ -3407,12 +3335,11 @@ static void do_vpaint_brush_smear(bContext *C, }); } -template -static void calculate_average_color(VPaintData *vpd, +static void calculate_average_color(VPaintData *vpd, Object *ob, Mesh *me, const Brush *brush, - Color *lcol, + GMutableSpan lcol, Span nodes) { using Blend = typename Traits::BlendType; @@ -3456,14 +3383,14 @@ static void calculate_average_color(VPaintData *vpd, for (int j = 0; j < gmap->vert_to_poly[v_index].size(); j++) { int elem_index; - if constexpr (domain == ATTR_DOMAIN_CORNER) { + if (vpd->domain == ATTR_DOMAIN_CORNER) { elem_index = gmap->vert_to_loop[v_index][j]; } else { elem_index = v_index; } - Color *col = lcol + elem_index; + const Color &col = lcol[elem_index]; /* Color is squared to compensate the `sqrt` color encoding. */ accum2->value[0] += col->r * col->r; @@ -3498,9 +3425,9 @@ static void calculate_average_color(VPaintData *vpd, } } -template +template static float paint_and_tex_color_alpha(VPaint *vp, - VPaintData *vpd, + VPaintData *vpd, const float v_co[3], Color *r_color) { @@ -3516,15 +3443,14 @@ static float paint_and_tex_color_alpha(VPaint *vp, return rgba[3]; } -template static void vpaint_do_draw(bContext *C, Sculpt * /*sd*/, VPaint *vp, - VPaintData *vpd, + VPaintData *vpd, Object *ob, Mesh *me, Span nodes, - Color *lcol) + GMutableSpan lcol) { SculptSession *ss = ob->sculpt; const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh); @@ -3532,7 +3458,7 @@ static void vpaint_do_draw(bContext *C, const Brush *brush = ob->sculpt->cache->brush; const Scene *scene = CTX_data_scene(C); - Color *previous_color = static_cast(ss->cache->prev_colors_vpaint); + GMutableSpan previous_color = ss->cache->prev_colors_vpaint; const blender::VArray select_vert = *me->attributes().lookup_or_default( ".select_vert", ATTR_DOMAIN_POINT, false); @@ -3595,16 +3521,16 @@ static void vpaint_do_draw(bContext *C, float tex_alpha = 1.0; if (vpd->is_texbrush) { /* NOTE: we may want to paint alpha as vertex color alpha. */ - tex_alpha = paint_and_tex_color_alpha( + tex_alpha = paint_and_tex_color_alpha( vp, vpd, vpd->vertexcosnos[v_index].co, &color_final); } Color color_orig(0, 0, 0, 0); - if constexpr (domain == ATTR_DOMAIN_POINT) { + if (vpd->domain == ATTR_DOMAIN_POINT) { int v_index = vd.index; - if (previous_color != nullptr) { + if (!previous_color.is_empty()) { /* Get the previous loop color */ if (isZero(previous_color[v_index])) { previous_color[v_index] = lcol[v_index]; @@ -3630,7 +3556,7 @@ static void vpaint_do_draw(bContext *C, if (!use_face_sel || select_poly[p_index]) { Color color_orig = Color(0, 0, 0, 0); /* unused when array is nullptr */ - if (previous_color != nullptr) { + if (!previous_color.is_empty()) { /* Get the previous loop color */ if (isZero(previous_color[l_index])) { previous_color[l_index] = lcol[l_index]; @@ -3659,32 +3585,30 @@ static void vpaint_do_draw(bContext *C, }); } -template static void vpaint_do_blur(bContext *C, Sculpt *sd, VPaint *vp, - VPaintData *vpd, + VPaintData *vpd, Object *ob, Mesh *me, Span nodes, - Color *lcol) + GMutableSpan lcol) { - if constexpr (domain == ATTR_DOMAIN_POINT) { - do_vpaint_brush_blur_verts(C, sd, vp, vpd, ob, me, nodes, lcol); + if (vpd->domain == ATTR_DOMAIN_POINT) { + do_vpaint_brush_blur_verts(C, sd, vp, vpd, ob, me, nodes, lcol); } else { - do_vpaint_brush_blur_loops(C, sd, vp, vpd, ob, me, nodes, lcol); + do_vpaint_brush_blur_loops(C, sd, vp, vpd, ob, me, nodes, lcol); } } -template static void vpaint_paint_leaves(bContext *C, Sculpt *sd, VPaint *vp, - VPaintData *vpd, + VPaintData *vpd, Object *ob, Mesh *me, - Color *lcol, + GMutableSpan lcol, Span nodes) { @@ -3696,27 +3620,26 @@ static void vpaint_paint_leaves(bContext *C, switch ((eBrushVertexPaintTool)brush->vertexpaint_tool) { case VPAINT_TOOL_AVERAGE: - calculate_average_color(vpd, ob, me, brush, lcol, nodes); + calculate_average_color(vpd, ob, me, brush, lcol, nodes); break; case VPAINT_TOOL_DRAW: - vpaint_do_draw(C, sd, vp, vpd, ob, me, nodes, lcol); + vpaint_do_draw(C, sd, vp, vpd, ob, me, nodes, lcol); break; case VPAINT_TOOL_BLUR: - vpaint_do_blur(C, sd, vp, vpd, ob, me, nodes, lcol); + vpaint_do_blur(C, sd, vp, vpd, ob, me, nodes, lcol); break; case VPAINT_TOOL_SMEAR: - do_vpaint_brush_smear(C, sd, vp, vpd, ob, me, nodes, lcol); + do_vpaint_brush_smear(C, sd, vp, vpd, ob, me, nodes, lcol); break; default: break; } } -template static void vpaint_do_paint(bContext *C, Sculpt *sd, VPaint *vp, - VPaintData *vpd, + VPaintData *vpd, Object *ob, Mesh *me, Brush *brush, @@ -3735,19 +3658,16 @@ static void vpaint_do_paint(bContext *C, me->active_color_attribute); BLI_assert(attribute.domain == domain); - Color *color_data = static_cast(attribute.span.data()); - /* Paint those leaves. */ - vpaint_paint_leaves(C, sd, vp, vpd, ob, me, color_data, nodes); + vpaint_paint_leaves(C, sd, vp, vpd, ob, me, attribute.span, nodes); attribute.finish(); } -template static void vpaint_do_radial_symmetry(bContext *C, Sculpt *sd, VPaint *vp, - VPaintData *vpd, + VPaintData *vpd, Object *ob, Mesh *me, Brush *brush, @@ -3756,15 +3676,14 @@ static void vpaint_do_radial_symmetry(bContext *C, { for (int i = 1; i < vp->radial_symm[axis - 'X']; i++) { const float angle = (2.0 * M_PI) * i / vp->radial_symm[axis - 'X']; - vpaint_do_paint(C, sd, vp, vpd, ob, me, brush, symm, axis, i, angle); + vpaint_do_paint(C, sd, vp, vpd, ob, me, brush, symm, axis, i, angle); } } /* near duplicate of: sculpt.cc's, * 'do_symmetrical_brush_actions' and 'wpaint_do_symmetrical_brush_actions'. */ -template static void vpaint_do_symmetrical_brush_actions( - bContext *C, Sculpt *sd, VPaint *vp, VPaintData *vpd, Object *ob) + bContext *C, Sculpt *sd, VPaint *vp, VPaintData *vpd, Object *ob) { Brush *brush = BKE_paint_brush(&vp->paint); Mesh *me = (Mesh *)ob->data; @@ -3776,13 +3695,10 @@ static void vpaint_do_symmetrical_brush_actions( /* initial stroke */ const ePaintSymmetryFlags initial_symm = ePaintSymmetryFlags(0); cache->mirror_symmetry_pass = ePaintSymmetryFlags(0); - vpaint_do_paint(C, sd, vp, vpd, ob, me, brush, initial_symm, 'X', 0, 0); - vpaint_do_radial_symmetry( - C, sd, vp, vpd, ob, me, brush, initial_symm, 'X'); - vpaint_do_radial_symmetry( - C, sd, vp, vpd, ob, me, brush, initial_symm, 'Y'); - vpaint_do_radial_symmetry( - C, sd, vp, vpd, ob, me, brush, initial_symm, 'Z'); + vpaint_do_paint(C, sd, vp, vpd, ob, me, brush, initial_symm, 'X', 0, 0); + vpaint_do_radial_symmetry(C, sd, vp, vpd, ob, me, brush, initial_symm, 'X'); + vpaint_do_radial_symmetry(C, sd, vp, vpd, ob, me, brush, initial_symm, 'Y'); + vpaint_do_radial_symmetry(C, sd, vp, vpd, ob, me, brush, initial_symm, 'Z'); cache->symmetry = symm; @@ -3796,22 +3712,16 @@ static void vpaint_do_symmetrical_brush_actions( SCULPT_cache_calc_brushdata_symm(cache, symm_pass, 0, 0); if (i & (1 << 0)) { - vpaint_do_paint( - C, sd, vp, vpd, ob, me, brush, symm_pass, 'X', 0, 0); - vpaint_do_radial_symmetry( - C, sd, vp, vpd, ob, me, brush, symm_pass, 'X'); + vpaint_do_paint(C, sd, vp, vpd, ob, me, brush, symm_pass, 'X', 0, 0); + vpaint_do_radial_symmetry(C, sd, vp, vpd, ob, me, brush, symm_pass, 'X'); } if (i & (1 << 1)) { - vpaint_do_paint( - C, sd, vp, vpd, ob, me, brush, symm_pass, 'Y', 0, 0); - vpaint_do_radial_symmetry( - C, sd, vp, vpd, ob, me, brush, symm_pass, 'Y'); + vpaint_do_paint(C, sd, vp, vpd, ob, me, brush, symm_pass, 'Y', 0, 0); + vpaint_do_radial_symmetry(C, sd, vp, vpd, ob, me, brush, symm_pass, 'Y'); } if (i & (1 << 2)) { - vpaint_do_paint( - C, sd, vp, vpd, ob, me, brush, symm_pass, 'Z', 0, 0); - vpaint_do_radial_symmetry( - C, sd, vp, vpd, ob, me, brush, symm_pass, 'Z'); + vpaint_do_paint(C, sd, vp, vpd, ob, me, brush, symm_pass, 'Z', 0, 0); + vpaint_do_radial_symmetry(C, sd, vp, vpd, ob, me, brush, symm_pass, 'Z'); } } } @@ -3820,13 +3730,14 @@ static void vpaint_do_symmetrical_brush_actions( cache->is_last_valid = true; } -template -static void vpaint_stroke_update_step_intern(bContext *C, PaintStroke *stroke, PointerRNA *itemptr) +static void vpaint_stroke_update_step(bContext *C, + wmOperator * /*op*/, + PaintStroke *stroke, + PointerRNA *itemptr) { Scene *scene = CTX_data_scene(C); ToolSettings *ts = CTX_data_tool_settings(C); - VPaintData *vpd = static_cast *>( - paint_stroke_mode_data(stroke)); + VPaintData *vpd = static_cast(paint_stroke_mode_data(stroke)); VPaint *vp = ts->vpaint; ViewContext *vc = &vpd->vc; Object *ob = vc->obact; @@ -3844,20 +3755,14 @@ static void vpaint_stroke_update_step_intern(bContext *C, PaintStroke *stroke, P swap_m4m4(vc->rv3d->persmat, mat); - vpaint_do_symmetrical_brush_actions(C, sd, vp, vpd, ob); + vpaint_do_symmetrical_brush_actions(C, sd, vp, vpd, ob); swap_m4m4(vc->rv3d->persmat, mat); BKE_mesh_batch_cache_dirty_tag((Mesh *)ob->data, BKE_MESH_BATCH_DIRTY_ALL); if (vp->paint.brush->vertexpaint_tool == VPAINT_TOOL_SMEAR) { - Mesh *me = BKE_object_get_original_mesh(ob); - - size_t elem_size; - int elem_num; - - elem_num = get_vcol_elements(me, &elem_size); - memcpy(vpd->smear.color_prev, vpd->smear.color_curr, elem_size * elem_num); + vpd->smear.color_prev = vpd->smear.color_curr; } /* Calculate pivot for rotation around selection if needed. @@ -3871,78 +3776,16 @@ static void vpaint_stroke_update_step_intern(bContext *C, PaintStroke *stroke, P DEG_id_tag_update((ID *)ob->data, ID_RECALC_GEOMETRY); } -static void vpaint_stroke_update_step(bContext *C, - wmOperator * /*op*/, - PaintStroke *stroke, - PointerRNA *itemptr) +static void vpaint_stroke_done(const bContext *C, PaintStroke *stroke) { - VPaintDataBase *vpd = static_cast(paint_stroke_mode_data(stroke)); - - if (vpd->domain == ATTR_DOMAIN_POINT) { - if (vpd->type == CD_PROP_COLOR) { - vpaint_stroke_update_step_intern( - C, stroke, itemptr); - } - else if (vpd->type == CD_PROP_BYTE_COLOR) { - vpaint_stroke_update_step_intern( - C, stroke, itemptr); - } - } - else if (vpd->domain == ATTR_DOMAIN_CORNER) { - if (vpd->type == CD_PROP_COLOR) { - vpaint_stroke_update_step_intern( - C, stroke, itemptr); - } - else if (vpd->type == CD_PROP_BYTE_COLOR) { - vpaint_stroke_update_step_intern( - C, stroke, itemptr); - } - } -} - -template -static void vpaint_free_vpaintdata(Object * /*ob*/, void *_vpd) -{ - VPaintData *vpd = static_cast *>(_vpd); + VPaintData *vpd = static_cast(paint_stroke_mode_data(stroke)); + Object *ob = vpd->vc.obact; if (vpd->is_texbrush) { ED_vpaint_proj_handle_free(vpd->vp_handle); } - if (vpd->smear.color_prev) { - MEM_freeN(vpd->smear.color_prev); - } - if (vpd->smear.color_curr) { - MEM_freeN(vpd->smear.color_curr); - } - - MEM_delete>(vpd); -} - -static void vpaint_stroke_done(const bContext *C, PaintStroke *stroke) -{ - void *vpd_ptr = paint_stroke_mode_data(stroke); - VPaintDataBase *vpd = static_cast(vpd_ptr); - - ViewContext *vc = &vpd->vc; - Object *ob = vc->obact; - - if (vpd->domain == ATTR_DOMAIN_POINT) { - if (vpd->type == CD_PROP_COLOR) { - vpaint_free_vpaintdata(ob, vpd); - } - else if (vpd->type == CD_PROP_BYTE_COLOR) { - vpaint_free_vpaintdata(ob, vpd); - } - } - else if (vpd->domain == ATTR_DOMAIN_CORNER) { - if (vpd->type == CD_PROP_COLOR) { - vpaint_free_vpaintdata(ob, vpd); - } - else if (vpd->type == CD_PROP_BYTE_COLOR) { - vpaint_free_vpaintdata(ob, vpd); - } - } + MEM_delete(vpd); SculptSession *ss = ob->sculpt; @@ -4196,9 +4039,7 @@ static int vertex_color_set_exec(bContext *C, wmOperator * /*op*/) Scene *scene = CTX_data_scene(C); Object *obact = CTX_data_active_object(C); - // uint paintcol = vpaint_get_current_color(scene, scene->toolsettings->vpaint, false); - ColorPaint4f paintcol = vpaint_get_current_col( - scene, scene->toolsettings->vpaint, false); + ColorPaint4f paintcol = vpaint_get_current_col(scene, scene->toolsettings->vpaint, false); if (paint_object_attributes_active_color_fill_ex(obact, paintcol)) { WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obact); -- 2.30.2 From 475e8bcd9777c2e98f73cd301a469288621d296a Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Sun, 9 Jul 2023 19:38:32 -0400 Subject: [PATCH 068/115] Cleanup: Deduplicate color attribute domain and type RNA enums --- .../editors/sculpt_paint/paint_image_proj.cc | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/source/blender/editors/sculpt_paint/paint_image_proj.cc b/source/blender/editors/sculpt_paint/paint_image_proj.cc index aa1604c1880..c8a6dcaa941 100644 --- a/source/blender/editors/sculpt_paint/paint_image_proj.cc +++ b/source/blender/editors/sculpt_paint/paint_image_proj.cc @@ -6925,18 +6925,6 @@ void PAINT_OT_add_texture_paint_slot(wmOperatorType *ot) {0, nullptr, 0, nullptr, nullptr}, }; - static const EnumPropertyItem domain_items[3] = { - {ATTR_DOMAIN_POINT, "POINT", 0, "Vertex", ""}, - {ATTR_DOMAIN_CORNER, "CORNER", 0, "Face Corner", ""}, - {0, nullptr, 0, nullptr, nullptr}, - }; - - static const EnumPropertyItem attribute_type_items[3] = { - {CD_PROP_COLOR, "COLOR", 0, "Color", ""}, - {CD_PROP_BYTE_COLOR, "BYTE_COLOR", 0, "Byte Color", ""}, - {0, nullptr, 0, nullptr, nullptr}, - }; - /* identifiers */ ot->name = "Add Paint Slot"; ot->description = "Add a paint slot"; @@ -6997,14 +6985,14 @@ void PAINT_OT_add_texture_paint_slot(wmOperatorType *ot) /* Color Attribute Properties */ RNA_def_enum(ot->srna, "domain", - domain_items, + rna_enum_color_attribute_domain_items, ATTR_DOMAIN_POINT, "Domain", "Type of element that attribute is stored on"); RNA_def_enum(ot->srna, "data_type", - attribute_type_items, + rna_enum_color_attribute_type_items, CD_PROP_COLOR, "Data Type", "Type of data stored in attribute"); -- 2.30.2 From 2a1ac6145a97ace82a7e1c10bea37d247c0b6fa0 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Sun, 9 Jul 2023 20:00:17 -0400 Subject: [PATCH 069/115] Cleanup: Use C++ attribute API to add attributes in a few places This is a bit more flexible and future proof than CustomData. --- .../blenkernel/intern/curves_geometry.cc | 4 +- .../blenkernel/intern/mesh_calc_edges.cc | 9 +-- .../blender/blenkernel/intern/mesh_convert.cc | 60 +++++++++---------- .../blender/blenkernel/intern/pointcloud.cc | 7 +-- .../editors/sculpt_paint/sculpt_undo.cc | 10 +--- .../blender/modifiers/intern/MOD_uvproject.cc | 7 +-- 6 files changed, 42 insertions(+), 55 deletions(-) diff --git a/source/blender/blenkernel/intern/curves_geometry.cc b/source/blender/blenkernel/intern/curves_geometry.cc index 31586440fec..f756c24d461 100644 --- a/source/blender/blenkernel/intern/curves_geometry.cc +++ b/source/blender/blenkernel/intern/curves_geometry.cc @@ -60,8 +60,8 @@ CurvesGeometry::CurvesGeometry(const int point_num, const int curve_num) CustomData_reset(&this->point_data); CustomData_reset(&this->curve_data); - CustomData_add_layer_named( - &this->point_data, CD_PROP_FLOAT3, CD_CONSTRUCT, this->point_num, ATTR_POSITION.c_str()); + this->attributes_for_write().add( + "position", ATTR_DOMAIN_POINT, AttributeInitConstruct()); this->runtime = MEM_new(__func__); diff --git a/source/blender/blenkernel/intern/mesh_calc_edges.cc b/source/blender/blenkernel/intern/mesh_calc_edges.cc index cb98f33deb2..e39a0625163 100644 --- a/source/blender/blenkernel/intern/mesh_calc_edges.cc +++ b/source/blender/blenkernel/intern/mesh_calc_edges.cc @@ -205,10 +205,8 @@ void BKE_mesh_calc_edges(Mesh *mesh, bool keep_existing_edges, const bool select } /* Create new edges. */ - if (!CustomData_has_layer_named(&mesh->ldata, CD_PROP_INT32, ".corner_edge")) { - CustomData_add_layer_named( - &mesh->ldata, CD_PROP_INT32, CD_CONSTRUCT, mesh->totloop, ".corner_edge"); - } + MutableAttributeAccessor attributes = mesh->attributes_for_write(); + attributes.add(".corner_edge", ATTR_DOMAIN_CORNER, AttributeInitConstruct()); MutableSpan new_edges{ static_cast(MEM_calloc_arrayN(new_totedge, sizeof(int2), __func__)), new_totedge}; calc_edges::serialize_and_initialize_deduplicated_edges(edge_maps, new_edges); @@ -221,9 +219,8 @@ void BKE_mesh_calc_edges(Mesh *mesh, bool keep_existing_edges, const bool select /* Free old CustomData and assign new one. */ CustomData_free(&mesh->edata, mesh->totedge); CustomData_reset(&mesh->edata); - CustomData_add_layer_named_with_data( - &mesh->edata, CD_PROP_INT32_2D, new_edges.data(), new_totedge, ".edge_verts", nullptr); mesh->totedge = new_totedge; + attributes.add(".edge_verts", ATTR_DOMAIN_EDGE, AttributeInitMoveArray(new_edges.data())); if (select_new_edges) { MutableAttributeAccessor attributes = mesh->attributes_for_write(); diff --git a/source/blender/blenkernel/intern/mesh_convert.cc b/source/blender/blenkernel/intern/mesh_convert.cc index ac24d3c4af8..c4df968d522 100644 --- a/source/blender/blenkernel/intern/mesh_convert.cc +++ b/source/blender/blenkernel/intern/mesh_convert.cc @@ -69,6 +69,7 @@ static CLG_LogRef LOG = {"bke.mesh_convert"}; static Mesh *mesh_nurbs_displist_to_mesh(const Curve *cu, const ListBase *dispbase) { + using namespace blender; using namespace blender::bke; int a, b, ofs; const bool conv_polys = ( @@ -127,9 +128,9 @@ static Mesh *mesh_nurbs_displist_to_mesh(const Curve *cu, const ListBase *dispba "material_index", ATTR_DOMAIN_FACE); SpanAttributeWriter sharp_faces = attributes.lookup_or_add_for_write_span( "sharp_face", ATTR_DOMAIN_FACE); - - blender::float2 *mloopuv = static_cast(CustomData_add_layer_named( - &mesh->ldata, CD_PROP_FLOAT2, CD_SET_DEFAULT, mesh->totloop, DATA_("UVMap"))); + SpanAttributeWriter uv_attribute = attributes.lookup_or_add_for_write_span( + DATA_("UVMap"), ATTR_DOMAIN_CORNER); + MutableSpan uv_map = uv_attribute.span; int dst_vert = 0; int dst_edge = 0; @@ -203,11 +204,9 @@ static Mesh *mesh_nurbs_displist_to_mesh(const Curve *cu, const ListBase *dispba poly_offsets[dst_poly] = dst_loop; material_indices.span[dst_poly] = dl->col; - if (mloopuv) { - for (int i = 0; i < 3; i++, mloopuv++) { - (*mloopuv)[0] = (corner_verts[dst_loop + i] - startvert) / float(dl->nr - 1); - (*mloopuv)[1] = 0.0f; - } + for (int i = 0; i < 3; i++) { + uv_map[dst_loop + i][0] = (corner_verts[dst_loop + i] - startvert) / float(dl->nr - 1); + uv_map[dst_loop + i][1] = 0.0f; } sharp_faces.span[dst_poly] = !is_smooth; @@ -260,35 +259,33 @@ static Mesh *mesh_nurbs_displist_to_mesh(const Curve *cu, const ListBase *dispba poly_offsets[dst_poly] = dst_loop; material_indices.span[dst_poly] = dl->col; - if (mloopuv) { - int orco_sizeu = dl->nr - 1; - int orco_sizev = dl->parts - 1; + int orco_sizeu = dl->nr - 1; + int orco_sizev = dl->parts - 1; - /* exception as handled in convertblender.c too */ - if (dl->flag & DL_CYCL_U) { - orco_sizeu++; - if (dl->flag & DL_CYCL_V) { - orco_sizev++; - } - } - else if (dl->flag & DL_CYCL_V) { + /* exception as handled in convertblender.c too */ + if (dl->flag & DL_CYCL_U) { + orco_sizeu++; + if (dl->flag & DL_CYCL_V) { orco_sizev++; } + } + else if (dl->flag & DL_CYCL_V) { + orco_sizev++; + } - for (int i = 0; i < 4; i++, mloopuv++) { - /* find uv based on vertex index into grid array */ - int v = corner_verts[dst_loop + i] - startvert; + for (int i = 0; i < 4; i++) { + /* find uv based on vertex index into grid array */ + int v = corner_verts[dst_loop + i] - startvert; - (*mloopuv)[0] = (v / dl->nr) / float(orco_sizev); - (*mloopuv)[1] = (v % dl->nr) / float(orco_sizeu); + uv_map[dst_loop + i][0] = (v / dl->nr) / float(orco_sizev); + uv_map[dst_loop + i][1] = (v % dl->nr) / float(orco_sizeu); - /* cyclic correction */ - if (ELEM(i, 1, 2) && (*mloopuv)[0] == 0.0f) { - (*mloopuv)[0] = 1.0f; - } - if (ELEM(i, 0, 1) && (*mloopuv)[1] == 0.0f) { - (*mloopuv)[1] = 1.0f; - } + /* cyclic correction */ + if (ELEM(i, 1, 2) && uv_map[dst_loop + i][0] == 0.0f) { + uv_map[dst_loop + i][0] = 1.0f; + } + if (ELEM(i, 0, 1) && uv_map[dst_loop + i][1] == 0.0f) { + uv_map[dst_loop + i][1] = 1.0f; } } @@ -311,6 +308,7 @@ static Mesh *mesh_nurbs_displist_to_mesh(const Curve *cu, const ListBase *dispba material_indices.finish(); sharp_faces.finish(); + uv_attribute.finish(); return mesh; } diff --git a/source/blender/blenkernel/intern/pointcloud.cc b/source/blender/blenkernel/intern/pointcloud.cc index 196cb5a294a..531d7c2e86c 100644 --- a/source/blender/blenkernel/intern/pointcloud.cc +++ b/source/blender/blenkernel/intern/pointcloud.cc @@ -64,11 +64,8 @@ static void pointcloud_init_data(ID *id) MEMCPY_STRUCT_AFTER(pointcloud, DNA_struct_default_get(PointCloud), id); CustomData_reset(&pointcloud->pdata); - CustomData_add_layer_named(&pointcloud->pdata, - CD_PROP_FLOAT3, - CD_CONSTRUCT, - pointcloud->totpoint, - POINTCLOUD_ATTR_POSITION); + pointcloud->attributes_for_write().add( + "position", ATTR_DOMAIN_POINT, blender::bke::AttributeInitConstruct()); pointcloud->runtime = new blender::bke::PointCloudRuntime(); } diff --git a/source/blender/editors/sculpt_paint/sculpt_undo.cc b/source/blender/editors/sculpt_paint/sculpt_undo.cc index d73901a5503..56d5e0b6338 100644 --- a/source/blender/editors/sculpt_paint/sculpt_undo.cc +++ b/source/blender/editors/sculpt_paint/sculpt_undo.cc @@ -1840,8 +1840,7 @@ static void sculpt_undo_set_active_layer(bContext *C, SculptAttrRef *attr) SculptAttrRef existing; sculpt_save_active_attribute(ob, &existing); - CustomDataLayer *layer; - layer = BKE_id_attribute_find(&me->id, attr->name, attr->type, attr->domain); + CustomDataLayer *layer = BKE_id_attribute_find(&me->id, attr->name, attr->type, attr->domain); /* Temporary fix for #97408. This is a fundamental * bug in the undo stack; the operator code needs to push @@ -1864,11 +1863,8 @@ static void sculpt_undo_set_active_layer(bContext *C, SculptAttrRef *attr) if (!layer) { /* Memfile undo killed the layer; re-create it. */ - CustomData *cdata = attr->domain == ATTR_DOMAIN_POINT ? &me->vdata : &me->ldata; - int totelem = attr->domain == ATTR_DOMAIN_POINT ? me->totvert : me->totloop; - - CustomData_add_layer_named( - cdata, eCustomDataType(attr->type), CD_SET_DEFAULT, totelem, attr->name); + me->attributes_for_write().add( + attr->name, attr->domain, attr->type, blender::bke::AttributeInitDefaultValue()); layer = BKE_id_attribute_find(&me->id, attr->name, attr->type, attr->domain); } diff --git a/source/blender/modifiers/intern/MOD_uvproject.cc b/source/blender/modifiers/intern/MOD_uvproject.cc index 8c8d90e11b5..5ba28c7e318 100644 --- a/source/blender/modifiers/intern/MOD_uvproject.cc +++ b/source/blender/modifiers/intern/MOD_uvproject.cc @@ -22,6 +22,7 @@ #include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "BKE_attribute.hh" #include "BKE_camera.h" #include "BKE_context.h" #include "BKE_lib_query.h" @@ -119,10 +120,8 @@ static Mesh *uvprojectModifier_do(UVProjectModifierData *umd, /* Create a new layer if no UV Maps are available * (e.g. if a preceding modifier could not preserve it). */ - if (!CustomData_has_layer(&mesh->ldata, CD_PROP_FLOAT2)) { - CustomData_add_layer_named( - &mesh->ldata, CD_PROP_FLOAT2, CD_SET_DEFAULT, mesh->totloop, umd->uvlayer_name); - } + mesh->attributes_for_write().add( + umd->uvlayer_name, ATTR_DOMAIN_CORNER, bke::AttributeInitDefaultValue()); /* make sure we're using an existing layer */ CustomData_validate_layer_name(&mesh->ldata, CD_PROP_FLOAT2, umd->uvlayer_name, uvname); -- 2.30.2 From 0965c732d2ac91c1a958f128cbbb28cc80d8ce41 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Sun, 9 Jul 2023 21:34:36 -0400 Subject: [PATCH 070/115] Progress --- source/blender/editors/sculpt_paint/sculpt.cc | 2 +- source/blender/editors/sculpt_paint/sculpt_intern.hh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/sculpt_paint/sculpt.cc b/source/blender/editors/sculpt_paint/sculpt.cc index 5d36582c200..e523fa64b86 100644 --- a/source/blender/editors/sculpt_paint/sculpt.cc +++ b/source/blender/editors/sculpt_paint/sculpt.cc @@ -4323,7 +4323,7 @@ void SCULPT_cache_free(StrokeCache *cache) MEM_SAFE_FREE(cache->detail_directions); MEM_SAFE_FREE(cache->prev_displacement); MEM_SAFE_FREE(cache->limit_surface_co); - MEM_SAFE_FREE(cache->prev_colors_vpaint); + cache->prev_colors_vpaint = {}; if (cache->pose_ik_chain) { SCULPT_pose_ik_chain_free(cache->pose_ik_chain); diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.hh b/source/blender/editors/sculpt_paint/sculpt_intern.hh index cc441c27b19..999b5945b52 100644 --- a/source/blender/editors/sculpt_paint/sculpt_intern.hh +++ b/source/blender/editors/sculpt_paint/sculpt_intern.hh @@ -555,7 +555,7 @@ struct StrokeCache { float mouse_event[2]; float (*prev_colors)[4]; - void *prev_colors_vpaint; + GArray<> prev_colors_vpaint; /* Multires Displacement Smear. */ float (*prev_displacement)[3]; -- 2.30.2 From 4da96623ffe9b75c677224037d95f37fb2e60097 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 10 Jul 2023 12:02:15 +1000 Subject: [PATCH 071/115] CMake: use mark_as_advancd for most non WITH_* options Avoid showing many obscure CMake options by default. --- CMakeLists.txt | 4 ++++ build_files/cmake/Modules/FindSYCL.cmake | 4 +++- build_files/cmake/platform/platform_apple.cmake | 5 +++++ build_files/cmake/platform/platform_apple_xcode.cmake | 1 + build_files/cmake/platform/platform_unix.cmake | 7 +++++++ build_files/cmake/platform/platform_win32.cmake | 1 + intern/cycles/kernel/CMakeLists.txt | 3 +++ 7 files changed, 24 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fe24ef565fa..3453e68036d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -517,6 +517,7 @@ mark_as_advanced(WITH_CYCLES_LOGGING) mark_as_advanced(WITH_CYCLES_DEBUG_NAN) mark_as_advanced(WITH_CYCLES_NATIVE_ONLY) mark_as_advanced(WITH_CYCLES_PRECOMPUTE) +mark_as_advanced(CYCLES_TEST_DEVICES) # NVIDIA CUDA & OptiX if(NOT APPLE) @@ -1292,6 +1293,9 @@ if(WITH_OPENMP) add_definitions("${OpenMP_C_FLAGS}") find_library_static(OpenMP_LIBRARIES gomp ${CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES}) + mark_as_advanced( + OpenMP_LIBRARIES + ) endif() endif() diff --git a/build_files/cmake/Modules/FindSYCL.cmake b/build_files/cmake/Modules/FindSYCL.cmake index f24bfc27b81..0f05b5ca5f5 100644 --- a/build_files/cmake/Modules/FindSYCL.cmake +++ b/build_files/cmake/Modules/FindSYCL.cmake @@ -119,5 +119,7 @@ ELSE() ENDIF() MARK_AS_ADVANCED( - _SYCL_INCLUDE_PARENT_DIR + SYCL_COMPILER + SYCL_INCLUDE_DIR + SYCL_LIBRARY ) diff --git a/build_files/cmake/platform/platform_apple.cmake b/build_files/cmake/platform/platform_apple.cmake index 1330dd272ce..d2c33172e5d 100644 --- a/build_files/cmake/platform/platform_apple.cmake +++ b/build_files/cmake/platform/platform_apple.cmake @@ -444,10 +444,15 @@ endif() if(WITH_COMPILER_CCACHE) if(NOT CMAKE_GENERATOR STREQUAL "Xcode") find_program(CCACHE_PROGRAM ccache) + mark_as_advanced(CCACHE_PROGRAM) if(CCACHE_PROGRAM) # Makefiles and ninja set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_PROGRAM}" CACHE STRING "" FORCE) set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}" CACHE STRING "" FORCE) + mark_as_advanced( + CMAKE_C_COMPILER_LAUNCHER + CMAKE_CXX_COMPILER_LAUNCHER + ) else() message(WARNING "Ccache NOT found, disabling WITH_COMPILER_CCACHE") set(WITH_COMPILER_CCACHE OFF) diff --git a/build_files/cmake/platform/platform_apple_xcode.cmake b/build_files/cmake/platform/platform_apple_xcode.cmake index 5d8672d098d..b6e0258c2fb 100644 --- a/build_files/cmake/platform/platform_apple_xcode.cmake +++ b/build_files/cmake/platform/platform_apple_xcode.cmake @@ -172,6 +172,7 @@ endif() if(WITH_COMPILER_CCACHE) if(CMAKE_GENERATOR STREQUAL "Xcode") find_program(CCACHE_PROGRAM ccache) + mark_as_advanced(CCACHE_PROGRAM) if(CCACHE_PROGRAM) get_filename_component(ccompiler "${CMAKE_C_COMPILER}" NAME) get_filename_component(cxxcompiler "${CMAKE_CXX_COMPILER}" NAME) diff --git a/build_files/cmake/platform/platform_unix.cmake b/build_files/cmake/platform/platform_unix.cmake index 19d777f252c..c59eaf4be3b 100644 --- a/build_files/cmake/platform/platform_unix.cmake +++ b/build_files/cmake/platform/platform_unix.cmake @@ -321,11 +321,13 @@ endif() if(WITH_CYCLES AND WITH_CYCLES_DEVICE_ONEAPI) set(CYCLES_LEVEL_ZERO ${LIBDIR}/level-zero CACHE PATH "Path to Level Zero installation") + mark_as_advanced(CYCLES_LEVEL_ZERO) if(EXISTS ${CYCLES_LEVEL_ZERO} AND NOT LEVEL_ZERO_ROOT_DIR) set(LEVEL_ZERO_ROOT_DIR ${CYCLES_LEVEL_ZERO}) endif() set(CYCLES_SYCL ${LIBDIR}/dpcpp CACHE PATH "Path to oneAPI DPC++ compiler") + mark_as_advanced(CYCLES_SYCL) if(EXISTS ${CYCLES_SYCL} AND NOT SYCL_ROOT_DIR) set(SYCL_ROOT_DIR ${CYCLES_SYCL}) endif() @@ -990,10 +992,15 @@ endif() if(WITH_COMPILER_CCACHE) find_program(CCACHE_PROGRAM ccache) + mark_as_advanced(CCACHE_PROGRAM) if(CCACHE_PROGRAM) # Makefiles and ninja set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_PROGRAM}" CACHE STRING "" FORCE) set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}" CACHE STRING "" FORCE) + mark_as_advanced( + CMAKE_C_COMPILER_LAUNCHER + CMAKE_CXX_COMPILER_LAUNCHER + ) else() message(WARNING "Ccache NOT found, disabling WITH_COMPILER_CCACHE") set(WITH_COMPILER_CCACHE OFF) diff --git a/build_files/cmake/platform/platform_win32.cmake b/build_files/cmake/platform/platform_win32.cmake index d9a434a699b..7a3506b6f62 100644 --- a/build_files/cmake/platform/platform_win32.cmake +++ b/build_files/cmake/platform/platform_win32.cmake @@ -1103,6 +1103,7 @@ set(ZSTD_LIBRARIES ${LIBDIR}/zstd/lib/zstd_static.lib) if(WITH_CYCLES AND (WITH_CYCLES_DEVICE_ONEAPI OR (WITH_CYCLES_EMBREE AND EMBREE_SYCL_SUPPORT))) set(LEVEL_ZERO_ROOT_DIR ${LIBDIR}/level_zero) set(CYCLES_SYCL ${LIBDIR}/dpcpp CACHE PATH "Path to oneAPI DPC++ compiler") + mark_as_advanced(CYCLES_SYCL) if(EXISTS ${CYCLES_SYCL} AND NOT SYCL_ROOT_DIR) set(SYCL_ROOT_DIR ${CYCLES_SYCL}) endif() diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt index 0588bfa739f..b3c49c5cf53 100644 --- a/intern/cycles/kernel/CMakeLists.txt +++ b/intern/cycles/kernel/CMakeLists.txt @@ -832,6 +832,8 @@ if(WITH_CYCLES_DEVICE_ONEAPI) ) set(SYCL_OFFLINE_COMPILER_PARALLEL_JOBS 1 CACHE STRING "Number of parallel compiler instances to use for device binaries compilation (expect ~8GB peak memory usage per instance).") + mark_as_advanced(SYCL_OFFLINE_COMPILER_PARALLEL_JOBS) + if(WITH_CYCLES_ONEAPI_BINARIES) message(STATUS "${SYCL_OFFLINE_COMPILER_PARALLEL_JOBS} instance(s) of oneAPI offline compiler will be used.") endif() @@ -865,6 +867,7 @@ if(WITH_CYCLES_DEVICE_ONEAPI) endif() if(NOT DEFINED CYCLES_ONEAPI_SYCL_OPTIONS_spir64_gen) set(CYCLES_ONEAPI_SYCL_OPTIONS_spir64_gen "${CYCLES_ONEAPI_SYCL_OPTIONS_spir64}" CACHE STRING "Extra build options for spir64_gen target") + mark_as_advanced(CYCLES_ONEAPI_SYCL_OPTIONS_spir64_gen) endif() # Enable zebin, a graphics binary format with improved compatibility. string(PREPEND CYCLES_ONEAPI_SYCL_OPTIONS_spir64_gen "--format zebin ") -- 2.30.2 From 29bfd03009118792af393b1ddc2277b94a775bd6 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Sun, 9 Jul 2023 22:19:28 -0400 Subject: [PATCH 072/115] Cleanup: Reduce indentation in paint_vertex.cc The file is easier to read and change when less context is needed at each step. Also extract some complex-looking flag testing into a separate function, and move some constant checks out of loops. --- .../editors/sculpt_paint/paint_vertex.cc | 1114 +++++++++-------- 1 file changed, 566 insertions(+), 548 deletions(-) diff --git a/source/blender/editors/sculpt_paint/paint_vertex.cc b/source/blender/editors/sculpt_paint/paint_vertex.cc index c2a87ecfee4..9c9937a50a3 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.cc +++ b/source/blender/editors/sculpt_paint/paint_vertex.cc @@ -194,6 +194,20 @@ static float view_angle_limits_apply_falloff(const NormalAnglePrecalc *a, return true; } +static bool test_brush_angle_falloff(const Brush &brush, + const NormalAnglePrecalc &normal_angle_precalc, + const float angle_cos, + float *brush_strength) +{ + if (((brush.flag & BRUSH_FRONTFACE) == 0 || (angle_cos > 0.0f)) && + ((brush.flag & BRUSH_FRONTFACE_FALLOFF) == 0 || + view_angle_limits_apply_falloff(&normal_angle_precalc, angle_cos, brush_strength))) + { + return true; + } + return false; +} + static bool vwpaint_use_normal(const VPaint *vp) { return ((vp->paint.brush->flag & BRUSH_FRONTFACE) != 0) || @@ -1963,59 +1977,58 @@ static void do_wpaint_brush_blur_task_cb_ex(void *__restrict userdata, PBVHVertexIter vd; BKE_pbvh_vertex_iter_begin (ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { /* Test to see if the vertex coordinates are within the spherical brush region. */ - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - /* For grid based pbvh, take the vert whose loop corresponds to the current grid. - * Otherwise, take the current vert. */ - const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : - vd.vert_indices[vd.i]; - const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f; - /* If the vertex is selected */ - if (!(use_face_sel || use_vert_sel) || select_vert[v_index]) { - /* Get the average poly weight */ - int total_hit_loops = 0; - float weight_final = 0.0f; - for (const int p_index : gmap->vert_to_poly[v_index]) { - const blender::IndexRange poly = ss->polys[p_index]; + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + /* For grid based pbvh, take the vert whose loop corresponds to the current grid. + * Otherwise, take the current vert. */ + const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : + vd.vert_indices[vd.i]; + const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f; + /* If the vertex is selected */ + if ((use_face_sel || use_vert_sel) && !select_vert[v_index]) { + continue; + } + /* Get the average poly weight */ + int total_hit_loops = 0; + float weight_final = 0.0f; + for (const int p_index : gmap->vert_to_poly[v_index]) { + const blender::IndexRange poly = ss->polys[p_index]; - total_hit_loops += poly.size(); - for (const int vert : ss->corner_verts.slice(poly)) { - weight_final += data->wpd->precomputed_weight[vert]; - } - } - - /* Apply the weight to the vertex. */ - if (total_hit_loops != 0) { - float brush_strength = cache->bstrength; - const float angle_cos = (use_normal && vd.no) ? - dot_v3v3(sculpt_normal_frontface, vd.no) : - 1.0f; - if (((brush->flag & BRUSH_FRONTFACE) == 0 || (angle_cos > 0.0f)) && - ((brush->flag & BRUSH_FRONTFACE_FALLOFF) == 0 || - view_angle_limits_apply_falloff( - &data->wpd->normal_angle_precalc, angle_cos, &brush_strength))) - { - const float brush_fade = BKE_brush_curve_strength( - brush, sqrtf(test.dist), cache->radius); - const float final_alpha = brush_fade * brush_strength * grid_alpha * - brush_alpha_pressure; - - if ((brush->flag & BRUSH_ACCUMULATE) == 0) { - if (ss->mode.wpaint.alpha_weight[v_index] < final_alpha) { - ss->mode.wpaint.alpha_weight[v_index] = final_alpha; - } - else { - continue; - } - } - - weight_final /= total_hit_loops; - /* Only paint visible verts */ - do_weight_paint_vertex( - data->vp, data->ob, data->wpi, v_index, final_alpha, weight_final); - } - } + total_hit_loops += poly.size(); + for (const int vert : ss->corner_verts.slice(poly)) { + weight_final += data->wpd->precomputed_weight[vert]; } } + + /* Apply the weight to the vertex. */ + if (total_hit_loops == 0) { + continue; + } + + float brush_strength = cache->bstrength; + const float angle_cos = (use_normal && vd.no) ? dot_v3v3(sculpt_normal_frontface, vd.no) : + 1.0f; + if (!test_brush_angle_falloff( + *brush, data->wpd->normal_angle_precalc, angle_cos, &brush_strength)) { + continue; + } + + const float brush_fade = BKE_brush_curve_strength(brush, sqrtf(test.dist), cache->radius); + const float final_alpha = brush_fade * brush_strength * grid_alpha * brush_alpha_pressure; + + if ((brush->flag & BRUSH_ACCUMULATE) == 0) { + if (ss->mode.wpaint.alpha_weight[v_index] < final_alpha) { + ss->mode.wpaint.alpha_weight[v_index] = final_alpha; + } + else { + continue; + } + } + + weight_final /= total_hit_loops; + /* Only paint visible verts */ + do_weight_paint_vertex(data->vp, data->ob, data->wpi, v_index, final_alpha, weight_final); } BKE_pbvh_vertex_iter_end; } @@ -2033,6 +2046,10 @@ static void do_wpaint_brush_smear_task_cb_ex(void *__restrict userdata, const Brush *brush = data->brush; const Scene *scene = CTX_data_scene(data->C); const StrokeCache *cache = ss->cache; + if (!cache->is_last_valid) { + return; + } + float brush_size_pressure, brush_alpha_value, brush_alpha_pressure; get_brush_alpha_data( scene, ss, brush, &brush_size_pressure, &brush_alpha_value, &brush_alpha_pressure); @@ -2043,92 +2060,93 @@ static void do_wpaint_brush_smear_task_cb_ex(void *__restrict userdata, sub_v3_v3v3(brush_dir, cache->location, cache->last_location); project_plane_v3_v3v3(brush_dir, brush_dir, cache->view_normal); + if (normalize_v3(brush_dir) == 0.0f) { + return; + } const blender::bke::AttributeAccessor attributes = data->me->attributes(); const blender::VArray select_vert = *attributes.lookup_or_default( ".select_vert", ATTR_DOMAIN_POINT, false); - if (cache->is_last_valid && (normalize_v3(brush_dir) != 0.0f)) { + SculptBrushTest test; + SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( + ss, &test, data->brush->falloff_shape); + const float *sculpt_normal_frontface = SCULPT_brush_frontface_normal_from_falloff_shape( + ss, data->brush->falloff_shape); - SculptBrushTest test; - SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( - ss, &test, data->brush->falloff_shape); - const float *sculpt_normal_frontface = SCULPT_brush_frontface_normal_from_falloff_shape( - ss, data->brush->falloff_shape); + /* For each vertex */ + PBVHVertexIter vd; + BKE_pbvh_vertex_iter_begin (ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { + /* Test to see if the vertex coordinates are within the spherical brush region. */ + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } - /* For each vertex */ - PBVHVertexIter vd; - BKE_pbvh_vertex_iter_begin (ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - /* Test to see if the vertex coordinates are within the spherical brush region. */ - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - /* For grid based pbvh, take the vert whose loop corresponds to the current grid. - * Otherwise, take the current vert. */ - const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : - vd.vert_indices[vd.i]; - const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f; - const float3 &mv_curr = ss->vert_positions[v_index]; + /* For grid based pbvh, take the vert whose loop corresponds to the current grid. + * Otherwise, take the current vert. */ + const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : + vd.vert_indices[vd.i]; + const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f; + const float3 &mv_curr = ss->vert_positions[v_index]; - /* If the vertex is selected */ - if (!(use_face_sel || use_vert_sel) || select_vert[v_index]) { - float brush_strength = cache->bstrength; - const float angle_cos = (use_normal && vd.no) ? - dot_v3v3(sculpt_normal_frontface, vd.no) : - 1.0f; - if (((brush->flag & BRUSH_FRONTFACE) == 0 || (angle_cos > 0.0f)) && - ((brush->flag & BRUSH_FRONTFACE_FALLOFF) == 0 || - view_angle_limits_apply_falloff( - &data->wpd->normal_angle_precalc, angle_cos, &brush_strength))) - { - bool do_color = false; - /* Minimum dot product between brush direction and current - * to neighbor direction is 0.0, meaning orthogonal. */ - float stroke_dot_max = 0.0f; + /* If the vertex is selected */ + if ((use_face_sel || use_vert_sel) && !select_vert[v_index]) { + continue; + } - /* Get the color of the loop in the opposite direction of the brush movement - * (this callback is specifically for smear.) */ - float weight_final = 0.0; - for (const int p_index : gmap->vert_to_poly[v_index]) { - for (const int v_other_index : ss->corner_verts.slice(ss->polys[p_index])) { - if (v_other_index != v_index) { - const float3 &mv_other = ss->vert_positions[v_other_index]; + float brush_strength = cache->bstrength; + const float angle_cos = (use_normal && vd.no) ? dot_v3v3(sculpt_normal_frontface, vd.no) : + 1.0f; + if (!test_brush_angle_falloff( + *brush, data->wpd->normal_angle_precalc, angle_cos, &brush_strength)) { + continue; + } - /* Get the direction from the selected vert to the neighbor. */ - float other_dir[3]; - sub_v3_v3v3(other_dir, mv_curr, mv_other); - project_plane_v3_v3v3(other_dir, other_dir, cache->view_normal); + bool do_color = false; + /* Minimum dot product between brush direction and current + * to neighbor direction is 0.0, meaning orthogonal. */ + float stroke_dot_max = 0.0f; - normalize_v3(other_dir); + /* Get the color of the loop in the opposite direction of the brush movement + * (this callback is specifically for smear.) */ + float weight_final = 0.0; + for (const int p_index : gmap->vert_to_poly[v_index]) { + for (const int v_other_index : ss->corner_verts.slice(ss->polys[p_index])) { + if (v_other_index == v_index) { + continue; + } - const float stroke_dot = dot_v3v3(other_dir, brush_dir); + /* Get the direction from the selected vert to the neighbor. */ + float other_dir[3]; + sub_v3_v3v3(other_dir, mv_curr, ss->vert_positions[v_other_index]); + project_plane_v3_v3v3(other_dir, other_dir, cache->view_normal); - if (stroke_dot > stroke_dot_max) { - stroke_dot_max = stroke_dot; - weight_final = data->wpd->precomputed_weight[v_other_index]; - do_color = true; - } - } - } - } - /* Apply weight to vertex */ - if (do_color) { - const float brush_fade = BKE_brush_curve_strength( - brush, sqrtf(test.dist), cache->radius); - const float final_alpha = brush_fade * brush_strength * grid_alpha * - brush_alpha_pressure; + normalize_v3(other_dir); - if (final_alpha <= 0.0f) { - continue; - } + const float stroke_dot = dot_v3v3(other_dir, brush_dir); - do_weight_paint_vertex( - data->vp, data->ob, data->wpi, v_index, final_alpha, float(weight_final)); - } - } + if (stroke_dot > stroke_dot_max) { + stroke_dot_max = stroke_dot; + weight_final = data->wpd->precomputed_weight[v_other_index]; + do_color = true; } } + /* Apply weight to vertex */ + if (!do_color) { + continue; + } + const float brush_fade = BKE_brush_curve_strength(brush, sqrtf(test.dist), cache->radius); + const float final_alpha = brush_fade * brush_strength * grid_alpha * brush_alpha_pressure; + + if (final_alpha <= 0.0f) { + continue; + } + + do_weight_paint_vertex( + data->vp, data->ob, data->wpi, v_index, final_alpha, float(weight_final)); } - BKE_pbvh_vertex_iter_end; } + BKE_pbvh_vertex_iter_end; } static void do_wpaint_brush_draw_task_cb_ex(void *__restrict userdata, @@ -2167,42 +2185,40 @@ static void do_wpaint_brush_draw_task_cb_ex(void *__restrict userdata, PBVHVertexIter vd; BKE_pbvh_vertex_iter_begin (ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { /* Test to see if the vertex coordinates are within the spherical brush region. */ - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - /* NOTE: grids are 1:1 with corners (aka loops). - * For multires, take the vert whose loop corresponds to the current grid. - * Otherwise, take the current vert. */ - const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : - vd.vert_indices[vd.i]; - const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f; + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + /* NOTE: grids are 1:1 with corners (aka loops). + * For multires, take the vert whose loop corresponds to the current grid. + * Otherwise, take the current vert. */ + const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : + vd.vert_indices[vd.i]; + const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f; - /* If the vertex is selected */ - if (!(use_face_sel || use_vert_sel) || select_vert[v_index]) { - float brush_strength = cache->bstrength; - const float angle_cos = (use_normal && vd.no) ? dot_v3v3(sculpt_normal_frontface, vd.no) : - 1.0f; - if (((brush->flag & BRUSH_FRONTFACE) == 0 || (angle_cos > 0.0f)) && - ((brush->flag & BRUSH_FRONTFACE_FALLOFF) == 0 || - view_angle_limits_apply_falloff( - &data->wpd->normal_angle_precalc, angle_cos, &brush_strength))) - { - const float brush_fade = BKE_brush_curve_strength( - brush, sqrtf(test.dist), cache->radius); - const float final_alpha = brush_fade * brush_strength * grid_alpha * - brush_alpha_pressure; + /* If the vertex is selected */ + if ((use_face_sel || use_vert_sel) && !select_vert[v_index]) { + continue; + } + float brush_strength = cache->bstrength; + const float angle_cos = (use_normal && vd.no) ? dot_v3v3(sculpt_normal_frontface, vd.no) : + 1.0f; + if (!test_brush_angle_falloff( + *brush, data->wpd->normal_angle_precalc, angle_cos, &brush_strength)) { + continue; + } + const float brush_fade = BKE_brush_curve_strength(brush, sqrtf(test.dist), cache->radius); + const float final_alpha = brush_fade * brush_strength * grid_alpha * brush_alpha_pressure; - if ((brush->flag & BRUSH_ACCUMULATE) == 0) { - if (ss->mode.wpaint.alpha_weight[v_index] < final_alpha) { - ss->mode.wpaint.alpha_weight[v_index] = final_alpha; - } - else { - continue; - } - } - - do_weight_paint_vertex(data->vp, data->ob, data->wpi, v_index, final_alpha, paintweight); - } + if ((brush->flag & BRUSH_ACCUMULATE) == 0) { + if (ss->mode.wpaint.alpha_weight[v_index] < final_alpha) { + ss->mode.wpaint.alpha_weight[v_index] = final_alpha; + } + else { + continue; } } + + do_weight_paint_vertex(data->vp, data->ob, data->wpi, v_index, final_alpha, paintweight); } BKE_pbvh_vertex_iter_end; } @@ -2239,23 +2255,28 @@ static void do_wpaint_brush_calc_average_weight_cb_ex(void *__restrict userdata, PBVHVertexIter vd; BKE_pbvh_vertex_iter_begin (ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { /* Test to see if the vertex coordinates are within the spherical brush region. */ - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const float angle_cos = (use_normal && vd.no) ? dot_v3v3(sculpt_normal_frontface, vd.no) : - 1.0f; - if (angle_cos > 0.0 && - BKE_brush_curve_strength(data->brush, sqrtf(test.dist), cache->radius) > 0.0) - { - const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : - vd.vert_indices[vd.i]; - - /* If the vertex is selected. */ - if (!(use_face_sel || use_vert_sel) || select_vert[v_index]) { - const MDeformVert *dv = &data->wpi->dvert[v_index]; - accum->len += 1; - accum->value += wpaint_get_active_weight(dv, data->wpi); - } - } + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; } + + const float angle_cos = (use_normal && vd.no) ? dot_v3v3(sculpt_normal_frontface, vd.no) : + 1.0f; + if (angle_cos <= 0.0f || + BKE_brush_curve_strength(data->brush, sqrtf(test.dist), cache->radius) <= 0.0f) + { + continue; + } + + const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : + vd.vert_indices[vd.i]; + /* If the vertex is selected. */ + if ((use_face_sel || use_vert_sel) && !select_vert[v_index]) { + continue; + } + + const MDeformVert *dv = &data->wpi->dvert[v_index]; + accum->len += 1; + accum->value += wpaint_get_active_weight(dv, data->wpi); } BKE_pbvh_vertex_iter_end; } @@ -2889,12 +2910,11 @@ static bool vpaint_stroke_test_start(bContext *C, wmOperator *op, const float mo VPaint *vp = ts->vpaint; Brush *brush = BKE_paint_brush(&vp->paint); Object *ob = CTX_data_active_object(C); - Mesh *me; SculptSession *ss = ob->sculpt; Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); /* context checks could be a poll() */ - me = BKE_mesh_from_object(ob); + Mesh *me = BKE_mesh_from_object(ob); if (me == nullptr || me->totpoly == 0) { return false; } @@ -2992,93 +3012,89 @@ static void do_vpaint_brush_blur_loops(bContext *C, PBVHVertexIter vd; BKE_pbvh_vertex_iter_begin (ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { /* Test to see if the vertex coordinates are within the spherical brush region. */ - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - /* For grid based pbvh, take the vert whose loop corresponds to the current grid. - * Otherwise, take the current vert. */ - const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : - vd.vert_indices[vd.i]; - const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f; + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + /* For grid based pbvh, take the vert whose loop corresponds to the current grid. + * Otherwise, take the current vert. */ + const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : + vd.vert_indices[vd.i]; + const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f; - /* If the vertex is selected for painting. */ - if (!use_vert_sel || select_vert[v_index]) { - float brush_strength = cache->bstrength; - const float angle_cos = (use_normal && vd.no) ? - dot_v3v3(sculpt_normal_frontface, vd.no) : - 1.0f; - if (((brush->flag & BRUSH_FRONTFACE) == 0 || (angle_cos > 0.0f)) && - ((brush->flag & BRUSH_FRONTFACE_FALLOFF) == 0 || - view_angle_limits_apply_falloff( - &vpd->normal_angle_precalc, angle_cos, &brush_strength))) - { - const float brush_fade = BKE_brush_curve_strength( - brush, sqrtf(test.dist), cache->radius); + /* If the vertex is selected for painting. */ + if (use_vert_sel && !select_vert[v_index]) { + continue; + } - /* Get the average poly color */ - Color color_final(0, 0, 0, 0); + float brush_strength = cache->bstrength; + const float angle_cos = (use_normal && vd.no) ? dot_v3v3(sculpt_normal_frontface, vd.no) : + 1.0f; + if (!test_brush_angle_falloff( + *brush, vpd->normal_angle_precalc, angle_cos, &brush_strength)) { + continue; + } - int total_hit_loops = 0; - Blend blend[4] = {0}; + const float brush_fade = BKE_brush_curve_strength(brush, sqrtf(test.dist), cache->radius); - for (const int p_index : gmap->vert_to_poly[v_index]) { - if (!use_face_sel || select_poly[p_index]) { - const blender::IndexRange poly = ss->polys[p_index]; - total_hit_loops += poly.size(); - for (const int corner : poly) { - Color *col = lcol + corner; + /* Get the average poly color */ + Color color_final(0, 0, 0, 0); - /* Color is squared to compensate the `sqrt` color encoding. */ - blend[0] += (Blend)col->r * (Blend)col->r; - blend[1] += (Blend)col->g * (Blend)col->g; - blend[2] += (Blend)col->b * (Blend)col->b; - blend[3] += (Blend)col->a * (Blend)col->a; - } - } - } + int total_hit_loops = 0; + Blend blend[4] = {0}; - if (total_hit_loops != 0) { - /* Use rgb^2 color averaging. */ - Color *col = &color_final; - - color_final.r = Traits::round( - sqrtf(Traits::divide_round(blend[0], total_hit_loops))); - color_final.g = Traits::round( - sqrtf(Traits::divide_round(blend[1], total_hit_loops))); - color_final.b = Traits::round( - sqrtf(Traits::divide_round(blend[2], total_hit_loops))); - color_final.a = Traits::round( - sqrtf(Traits::divide_round(blend[3], total_hit_loops))); - - /* For each poly owning this vert, - * paint each loop belonging to this vert. */ - for (const int j : gmap->vert_to_poly[v_index].index_range()) { - const int p_index = gmap->vert_to_poly[v_index][j]; - const int l_index = gmap->vert_to_loop[v_index][j]; - BLI_assert(ss->corner_verts[l_index] == v_index); - if (!use_face_sel || select_poly[p_index]) { - Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ - - if (previous_color != nullptr) { - /* Get the previous loop color */ - if (isZero(previous_color[l_index])) { - previous_color[l_index] = lcol[l_index]; - } - color_orig = previous_color[l_index]; - } - const float final_alpha = Traits::range * brush_fade * brush_strength * - brush_alpha_pressure * grid_alpha; - /* Mix the new color with the original - * based on the brush strength and the curve. */ - lcol[l_index] = vpaint_blend(vp, - lcol[l_index], - color_orig, - *col, - final_alpha, - Traits::range * brush_strength); - } - } - } - } + for (const int p_index : gmap->vert_to_poly[v_index]) { + if (use_face_sel && !select_poly[p_index]) { + continue; } + const blender::IndexRange poly = ss->polys[p_index]; + total_hit_loops += poly.size(); + for (const int corner : poly) { + Color *col = lcol + corner; + + /* Color is squared to compensate the `sqrt` color encoding. */ + blend[0] += (Blend)col->r * (Blend)col->r; + blend[1] += (Blend)col->g * (Blend)col->g; + blend[2] += (Blend)col->b * (Blend)col->b; + blend[3] += (Blend)col->a * (Blend)col->a; + } + } + + if (total_hit_loops == 0) { + continue; + } + + /* Use rgb^2 color averaging. */ + Color *col = &; + + color_final.r = Traits::round(sqrtf(Traits::divide_round(blend[0], total_hit_loops))); + color_final.g = Traits::round(sqrtf(Traits::divide_round(blend[1], total_hit_loops))); + color_final.b = Traits::round(sqrtf(Traits::divide_round(blend[2], total_hit_loops))); + color_final.a = Traits::round(sqrtf(Traits::divide_round(blend[3], total_hit_loops))); + + /* For each poly owning this vert, + * paint each loop belonging to this vert. */ + for (const int j : gmap->vert_to_poly[v_index].index_range()) { + const int p_index = gmap->vert_to_poly[v_index][j]; + const int l_index = gmap->vert_to_loop[v_index][j]; + BLI_assert(ss->corner_verts[l_index] == v_index); + if (use_face_sel && !select_poly[p_index]) { + continue; + } + Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ + + if (previous_color != nullptr) { + /* Get the previous loop color */ + if (isZero(previous_color[l_index])) { + previous_color[l_index] = lcol[l_index]; + } + color_orig = previous_color[l_index]; + } + const float final_alpha = Traits::range * brush_fade * brush_strength * + brush_alpha_pressure * grid_alpha; + /* Mix the new color with the original + * based on the brush strength and the curve. */ + lcol[l_index] = vpaint_blend( + vp, lcol[l_index], color_orig, *col, final_alpha, Traits::range * brush_strength); } } BKE_pbvh_vertex_iter_end; @@ -3135,90 +3151,84 @@ static void do_vpaint_brush_blur_verts(bContext *C, PBVHVertexIter vd; BKE_pbvh_vertex_iter_begin (ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { /* Test to see if the vertex coordinates are within the spherical brush region. */ - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - /* For grid based pbvh, take the vert whose loop corresponds to the current grid. - * Otherwise, take the current vert. */ - const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : - vd.vert_indices[vd.i]; - const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f; + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + /* For grid based pbvh, take the vert whose loop corresponds to the current grid. + * Otherwise, take the current vert. */ + const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : + vd.vert_indices[vd.i]; + const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f; - /* If the vertex is selected for painting. */ - if (!use_vert_sel || select_vert[v_index]) { - float brush_strength = cache->bstrength; - const float angle_cos = (use_normal && vd.no) ? - dot_v3v3(sculpt_normal_frontface, vd.no) : - 1.0f; - if (((brush->flag & BRUSH_FRONTFACE) == 0 || (angle_cos > 0.0f)) && - ((brush->flag & BRUSH_FRONTFACE_FALLOFF) == 0 || - view_angle_limits_apply_falloff( - &vpd->normal_angle_precalc, angle_cos, &brush_strength))) - { - const float brush_fade = BKE_brush_curve_strength( - brush, sqrtf(test.dist), cache->radius); + /* If the vertex is selected for painting. */ + if (use_vert_sel && !select_vert[v_index]) { + continue; + } - /* Get the average poly color */ - Color color_final(0, 0, 0, 0); + float brush_strength = cache->bstrength; + const float angle_cos = (use_normal && vd.no) ? dot_v3v3(sculpt_normal_frontface, vd.no) : + 1.0f; + if (!test_brush_angle_falloff( + *brush, vpd->normal_angle_precalc, angle_cos, &brush_strength)) { + continue; + } + const float brush_fade = BKE_brush_curve_strength(brush, sqrtf(test.dist), cache->radius); - int total_hit_loops = 0; - Blend blend[4] = {0}; + /* Get the average poly color */ + Color color_final(0, 0, 0, 0); - for (const int p_index : gmap->vert_to_poly[v_index]) { - if (!use_face_sel || select_poly[p_index]) { - const blender::IndexRange poly = ss->polys[p_index]; - total_hit_loops += poly.size(); - for (const int vert : ss->corner_verts.slice(poly)) { - Color *col = lcol + vert; + int total_hit_loops = 0; + Blend blend[4] = {0}; - /* Color is squared to compensate the `sqrt` color encoding. */ - blend[0] += (Blend)col->r * (Blend)col->r; - blend[1] += (Blend)col->g * (Blend)col->g; - blend[2] += (Blend)col->b * (Blend)col->b; - blend[3] += (Blend)col->a * (Blend)col->a; - } - } - } - - if (total_hit_loops != 0) { - /* Use rgb^2 color averaging. */ - Color *col = &color_final; - - color_final.r = Traits::round( - sqrtf(Traits::divide_round(blend[0], total_hit_loops))); - color_final.g = Traits::round( - sqrtf(Traits::divide_round(blend[1], total_hit_loops))); - color_final.b = Traits::round( - sqrtf(Traits::divide_round(blend[2], total_hit_loops))); - color_final.a = Traits::round( - sqrtf(Traits::divide_round(blend[3], total_hit_loops))); - - /* For each poly owning this vert, - * paint each loop belonging to this vert. */ - for (const int p_index : gmap->vert_to_poly[v_index]) { - if (!use_face_sel || select_poly[p_index]) { - Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ - - if (previous_color != nullptr) { - /* Get the previous loop color */ - if (isZero(previous_color[v_index])) { - previous_color[v_index] = lcol[v_index]; - } - color_orig = previous_color[v_index]; - } - const float final_alpha = Traits::range * brush_fade * brush_strength * - brush_alpha_pressure * grid_alpha; - /* Mix the new color with the original - * based on the brush strength and the curve. */ - lcol[v_index] = vpaint_blend(vp, - lcol[v_index], - color_orig, - *col, - final_alpha, - Traits::range * brush_strength); - } - } - } - } + for (const int p_index : gmap->vert_to_poly[v_index]) { + if (use_face_sel && !select_poly[p_index]) { + continue; } + const blender::IndexRange poly = ss->polys[p_index]; + total_hit_loops += poly.size(); + for (const int vert : ss->corner_verts.slice(poly)) { + Color *col = lcol + vert; + + /* Color is squared to compensate the `sqrt` color encoding. */ + blend[0] += (Blend)col->r * (Blend)col->r; + blend[1] += (Blend)col->g * (Blend)col->g; + blend[2] += (Blend)col->b * (Blend)col->b; + blend[3] += (Blend)col->a * (Blend)col->a; + } + } + + if (total_hit_loops == 0) { + continue; + } + /* Use rgb^2 color averaging. */ + Color *col = &color_final; + + color_final.r = Traits::round(sqrtf(Traits::divide_round(blend[0], total_hit_loops))); + color_final.g = Traits::round(sqrtf(Traits::divide_round(blend[1], total_hit_loops))); + color_final.b = Traits::round(sqrtf(Traits::divide_round(blend[2], total_hit_loops))); + color_final.a = Traits::round(sqrtf(Traits::divide_round(blend[3], total_hit_loops))); + + /* For each poly owning this vert, + * paint each loop belonging to this vert. */ + for (const int p_index : gmap->vert_to_poly[v_index]) { + if (use_face_sel && !select_poly[p_index]) { + continue; + } + Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ + + if (previous_color != nullptr) { + /* Get the previous loop color */ + if (isZero(previous_color[v_index])) { + previous_color[v_index] = lcol[v_index]; + } + color_orig = previous_color[v_index]; + } + const float final_alpha = Traits::range * brush_fade * brush_strength * + brush_alpha_pressure * grid_alpha; + /* Mix the new color with the original + * based on the brush strength and the curve. */ + lcol[v_index] = vpaint_blend( + vp, lcol[v_index], color_orig, *col, final_alpha, Traits::range * brush_strength); } } BKE_pbvh_vertex_iter_end; @@ -3240,6 +3250,9 @@ static void do_vpaint_brush_smear(bContext *C, const SculptVertexPaintGeomMap *gmap = &ss->mode.vpaint.gmap; const StrokeCache *cache = ss->cache; + if (!cache->is_last_valid) { + return; + } const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh); const bool has_grids = (pbvh_type == PBVH_GRIDS); @@ -3260,149 +3273,151 @@ static void do_vpaint_brush_smear(bContext *C, get_brush_alpha_data( scene, ss, brush, &brush_size_pressure, &brush_alpha_value, &brush_alpha_pressure); - float brush_dir[3]; const bool use_normal = vwpaint_use_normal(vp); const bool use_vert_sel = (me->editflag & (ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL)) != 0; const bool use_face_sel = (me->editflag & ME_EDIT_PAINT_FACE_SEL) != 0; + float brush_dir[3]; sub_v3_v3v3(brush_dir, cache->location, cache->last_location); project_plane_v3_v3v3(brush_dir, brush_dir, cache->view_normal); + if (normalize_v3(brush_dir) == 0.0f) { + continue; + } - if (cache->is_last_valid && (normalize_v3(brush_dir) != 0.0f)) { + SculptBrushTest test; + SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( + ss, &test, brush->falloff_shape); + const float *sculpt_normal_frontface = SCULPT_brush_frontface_normal_from_falloff_shape( + ss, brush->falloff_shape); - SculptBrushTest test; - SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( - ss, &test, brush->falloff_shape); - const float *sculpt_normal_frontface = SCULPT_brush_frontface_normal_from_falloff_shape( - ss, brush->falloff_shape); + /* For each vertex */ + PBVHVertexIter vd; + BKE_pbvh_vertex_iter_begin (ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + /* Test to see if the vertex coordinates are within the spherical brush region. */ + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + /* For grid based pbvh, take the vert whose loop corresponds to the current grid. + * Otherwise, take the current vert. */ + const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : + vd.vert_indices[vd.i]; + const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f; + const float3 &mv_curr = &ss->vert_positions[v_index]; - /* For each vertex */ - PBVHVertexIter vd; - BKE_pbvh_vertex_iter_begin (ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { - /* Test to see if the vertex coordinates are within the spherical brush region. */ - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - /* For grid based pbvh, take the vert whose loop corresponds to the current grid. - * Otherwise, take the current vert. */ - const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : - vd.vert_indices[vd.i]; - const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f; - const float3 &mv_curr = &ss->vert_positions[v_index]; + /* if the vertex is selected for painting. */ + if (use_vert_sel && !select_vert[v_index]) { + continue; + } - /* if the vertex is selected for painting. */ - if (!use_vert_sel || select_vert[v_index]) { - /* Calculate the dot prod. between ray norm on surf and current vert - * (ie splash prevention factor), and only paint front facing verts. */ - float brush_strength = cache->bstrength; - const float angle_cos = (use_normal && vd.no) ? - dot_v3v3(sculpt_normal_frontface, vd.no) : - 1.0f; - if (((brush->flag & BRUSH_FRONTFACE) == 0 || (angle_cos > 0.0f)) && - ((brush->flag & BRUSH_FRONTFACE_FALLOFF) == 0 || - view_angle_limits_apply_falloff( - &vpd->normal_angle_precalc, angle_cos, &brush_strength))) - { - const float brush_fade = BKE_brush_curve_strength( - brush, sqrtf(test.dist), cache->radius); + /* Calculate the dot prod. between ray norm on surf and current vert + * (ie splash prevention factor), and only paint front facing verts. */ + float brush_strength = cache->bstrength; + const float angle_cos = (use_normal && vd.no) ? dot_v3v3(sculpt_normal_frontface, vd.no) : + 1.0f; + if (!test_brush_angle_falloff( + *brush, vpd->normal_angle_precalc, angle_cos, &brush_strength)) { + continue; + } + const float brush_fade = BKE_brush_curve_strength(brush, sqrtf(test.dist), cache->radius); - bool do_color = false; - /* Minimum dot product between brush direction and current - * to neighbor direction is 0.0, meaning orthogonal. */ - float stroke_dot_max = 0.0f; + bool do_color = false; + /* Minimum dot product between brush direction and current + * to neighbor direction is 0.0, meaning orthogonal. */ + float stroke_dot_max = 0.0f; - /* Get the color of the loop in the opposite - * direction of the brush movement */ - Color color_final(0, 0, 0, 0); + /* Get the color of the loop in the opposite + * direction of the brush movement */ + Color color_final(0, 0, 0, 0); - for (const int j : gmap->vert_to_poly[v_index].index_range()) { - const int p_index = gmap->vert_to_poly[v_index][j]; - const int l_index = gmap->vert_to_loop[v_index][j]; - BLI_assert(ss->corner_verts[l_index] == v_index); - UNUSED_VARS_NDEBUG(l_index); - if (!use_face_sel || select_poly[p_index]) { - for (const int corner : ss->polys[p_index]) { - const int v_other_index = ss->corner_verts[corner]; - if (v_other_index != v_index) { - const float3 &mv_other = &ss->vert_positions[v_other_index]; + for (const int j : gmap->vert_to_poly[v_index].index_range()) { + const int p_index = gmap->vert_to_poly[v_index][j]; + const int l_index = gmap->vert_to_loop[v_index][j]; + BLI_assert(ss->corner_verts[l_index] == v_index); + UNUSED_VARS_NDEBUG(l_index); + if (use_face_sel && !select_poly[p_index]) { + continue; + } + for (const int corner : ss->polys[p_index]) { + const int v_other_index = ss->corner_verts[corner]; + if (v_other_index == v_index) { + continue; + } - /* Get the direction from the - * selected vert to the neighbor. */ - float other_dir[3]; - sub_v3_v3v3(other_dir, mv_curr, mv_other); - project_plane_v3_v3v3(other_dir, other_dir, cache->view_normal); + /* Get the direction from the + * selected vert to the neighbor. */ + float other_dir[3]; + sub_v3_v3v3(other_dir, mv_curr, ss->vert_positions[v_other_index]); + project_plane_v3_v3v3(other_dir, other_dir, cache->view_normal); - normalize_v3(other_dir); + normalize_v3(other_dir); - const float stroke_dot = dot_v3v3(other_dir, brush_dir); - int elem_index; + const float stroke_dot = dot_v3v3(other_dir, brush_dir); + int elem_index; - if constexpr (domain == ATTR_DOMAIN_POINT) { - elem_index = v_other_index; - } - else { - elem_index = corner; - } + if constexpr (domain == ATTR_DOMAIN_POINT) { + elem_index = v_other_index; + } + else { + elem_index = corner; + } - if (stroke_dot > stroke_dot_max) { - stroke_dot_max = stroke_dot; - color_final = color_prev_smear[elem_index]; - do_color = true; - } - } - } - } - } - - if (do_color) { - const float final_alpha = Traits::range * brush_fade * brush_strength * - brush_alpha_pressure * grid_alpha; - - /* For each poly owning this vert, - * paint each loop belonging to this vert. */ - for (const int j : gmap->vert_to_poly[v_index].index_range()) { - const int p_index = gmap->vert_to_poly[v_index][j]; - - int elem_index; - if constexpr (domain == ATTR_DOMAIN_POINT) { - elem_index = v_index; - } - else { - const int l_index = gmap->vert_to_loop[v_index][j]; - elem_index = l_index; - BLI_assert(ss->corner_verts[l_index] == v_index); - } - - if (!use_face_sel || select_poly[p_index]) { - /* Get the previous element color */ - Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ - - if (color_prev != nullptr) { - /* Get the previous element color */ - if (isZero(color_prev[elem_index])) { - color_prev[elem_index] = lcol[elem_index]; - } - color_orig = color_prev[elem_index]; - } - /* Mix the new color with the original - * based on the brush strength and the curve. */ - lcol[elem_index] = vpaint_blend(vp, - lcol[elem_index], - color_orig, - color_final, - final_alpha, - Traits::range * - brush_strength); - - color_curr[elem_index] = lcol[elem_index]; - } - } - } - } + if (stroke_dot > stroke_dot_max) { + stroke_dot_max = stroke_dot; + color_final = color_prev_smear[elem_index]; + do_color = true; } } } - BKE_pbvh_vertex_iter_end; + + if (!do_color) { + continue; + } + + const float final_alpha = Traits::range * brush_fade * brush_strength * + brush_alpha_pressure * grid_alpha; + + /* For each poly owning this vert, + * paint each loop belonging to this vert. */ + for (const int j : gmap->vert_to_poly[v_index].index_range()) { + const int p_index = gmap->vert_to_poly[v_index][j]; + + int elem_index; + if constexpr (domain == ATTR_DOMAIN_POINT) { + elem_index = v_index; + } + else { + const int l_index = gmap->vert_to_loop[v_index][j]; + elem_index = l_index; + BLI_assert(ss->corner_verts[l_index] == v_index); + } + if (use_face_sel && !select_poly[p_index]) { + continue; + } + + /* Get the previous element color */ + Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ + + if (color_prev != nullptr) { + /* Get the previous element color */ + if (isZero(color_prev[elem_index])) { + color_prev[elem_index] = lcol[elem_index]; + } + color_orig = color_prev[elem_index]; + } + /* Mix the new color with the original + * based on the brush strength and the curve. */ + lcol[elem_index] = vpaint_blend(vp, + lcol[elem_index], + color_orig, + color_final, + final_alpha, + Traits::range * brush_strength); + + color_curr[elem_index] = lcol[elem_index]; + } } + BKE_pbvh_vertex_iter_end; } }); } @@ -3445,33 +3460,37 @@ static void calculate_average_color(VPaintData *vpd, PBVHVertexIter vd; BKE_pbvh_vertex_iter_begin (ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { /* Test to see if the vertex coordinates are within the spherical brush region. */ - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : - vd.vert_indices[vd.i]; - if (BKE_brush_curve_strength(brush, 0.0, cache->radius) > 0.0) { - /* If the vertex is selected for painting. */ - if (!use_vert_sel || select_vert[v_index]) { - accum2->len += gmap->vert_to_poly[v_index].size(); - /* if a vertex is within the brush region, then add its color to the blend. */ - for (int j = 0; j < gmap->vert_to_poly[v_index].size(); j++) { - int elem_index; + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + if (BKE_brush_curve_strength(brush, 0.0, cache->radius) <= 0.0f) { + continue; + } + const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : + vd.vert_indices[vd.i]; + /* If the vertex is selected for painting. */ + if (use_vert_sel && !select_vert[v_index]) { + continue; + } - if constexpr (domain == ATTR_DOMAIN_CORNER) { - elem_index = gmap->vert_to_loop[v_index][j]; - } - else { - elem_index = v_index; - } + accum2->len += gmap->vert_to_poly[v_index].size(); + /* if a vertex is within the brush region, then add its color to the blend. */ + for (int j = 0; j < gmap->vert_to_poly[v_index].size(); j++) { + int elem_index; - Color *col = lcol + elem_index; - - /* Color is squared to compensate the `sqrt` color encoding. */ - accum2->value[0] += col->r * col->r; - accum2->value[1] += col->g * col->g; - accum2->value[2] += col->b * col->b; - } - } + if constexpr (domain == ATTR_DOMAIN_CORNER) { + elem_index = gmap->vert_to_loop[v_index][j]; } + else { + elem_index = v_index; + } + + Color *col = lcol + elem_index; + + /* Color is squared to compensate the `sqrt` color encoding. */ + accum2->value[0] += col->r * col->r; + accum2->value[1] += col->g * col->g; + accum2->value[2] += col->b * col->b; } } BKE_pbvh_vertex_iter_end; @@ -3565,92 +3584,92 @@ static void vpaint_do_draw(bContext *C, PBVHVertexIter vd; BKE_pbvh_vertex_iter_begin (ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { /* Test to see if the vertex coordinates are within the spherical brush region. */ - if (sculpt_brush_test_sq_fn(&test, vd.co)) { - /* NOTE: Grids are 1:1 with corners (aka loops). - * For grid based pbvh, take the vert whose loop corresponds to the current grid. - * Otherwise, take the current vert. */ - const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : - vd.vert_indices[vd.i]; - const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f; + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + /* NOTE: Grids are 1:1 with corners (aka loops). + * For grid based pbvh, take the vert whose loop corresponds to the current grid. + * Otherwise, take the current vert. */ + const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : + vd.vert_indices[vd.i]; + /* If the vertex is selected for painting. */ + if (use_vert_sel && !select_vert[v_index]) { + continue; + } - /* If the vertex is selected for painting. */ - if (!use_vert_sel || select_vert[v_index]) { - /* Calc the dot prod. between ray norm on surf and current vert - * (ie splash prevention factor), and only paint front facing verts. */ - float brush_strength = cache->bstrength; - const float angle_cos = (use_normal && vd.no) ? - dot_v3v3(sculpt_normal_frontface, vd.no) : - 1.0f; - if (((brush->flag & BRUSH_FRONTFACE) == 0 || (angle_cos > 0.0f)) && - ((brush->flag & BRUSH_FRONTFACE_FALLOFF) == 0 || - view_angle_limits_apply_falloff( - &vpd->normal_angle_precalc, angle_cos, &brush_strength))) - { - const float brush_fade = BKE_brush_curve_strength( - brush, sqrtf(test.dist), cache->radius); + const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f; - Color color_final = paintcol; + /* Calc the dot prod. between ray norm on surf and current vert + * (ie splash prevention factor), and only paint front facing verts. */ + float brush_strength = cache->bstrength; + const float angle_cos = (use_normal && vd.no) ? dot_v3v3(sculpt_normal_frontface, vd.no) : + 1.0f; + if (!test_brush_angle_falloff( + *brush, vpd->normal_angle_precalc, angle_cos, &brush_strength)) { + continue; + } + const float brush_fade = BKE_brush_curve_strength(brush, sqrtf(test.dist), cache->radius); - /* If we're painting with a texture, sample the texture color and alpha. */ - float tex_alpha = 1.0; - if (vpd->is_texbrush) { - /* NOTE: we may want to paint alpha as vertex color alpha. */ - tex_alpha = paint_and_tex_color_alpha( - vp, vpd, vpd->vertexcosnos[v_index].co, &color_final); - } + Color color_final = paintcol; - Color color_orig(0, 0, 0, 0); + /* If we're painting with a texture, sample the texture color and alpha. */ + float tex_alpha = 1.0; + if (vpd->is_texbrush) { + /* NOTE: we may want to paint alpha as vertex color alpha. */ + tex_alpha = paint_and_tex_color_alpha( + vp, vpd, vpd->vertexcosnos[v_index].co, &color_final); + } - if constexpr (domain == ATTR_DOMAIN_POINT) { - int v_index = vd.index; + Color color_orig(0, 0, 0, 0); - if (previous_color != nullptr) { - /* Get the previous loop color */ - if (isZero(previous_color[v_index])) { - previous_color[v_index] = lcol[v_index]; - } - color_orig = previous_color[v_index]; - } - const float final_alpha = Traits::frange * brush_fade * brush_strength * - tex_alpha * brush_alpha_pressure * grid_alpha; + if constexpr (domain == ATTR_DOMAIN_POINT) { + int v_index = vd.index; - lcol[v_index] = vpaint_blend(vp, - lcol[v_index], - color_orig, - color_final, - final_alpha, - Traits::range * brush_strength); - } - else { - /* For each poly owning this vert, paint each loop belonging to this vert. */ - for (const int j : gmap->vert_to_poly[v_index].index_range()) { - const int p_index = gmap->vert_to_poly[v_index][j]; - const int l_index = gmap->vert_to_loop[v_index][j]; - BLI_assert(ss->corner_verts[l_index] == v_index); - if (!use_face_sel || select_poly[p_index]) { - Color color_orig = Color(0, 0, 0, 0); /* unused when array is nullptr */ - - if (previous_color != nullptr) { - /* Get the previous loop color */ - if (isZero(previous_color[l_index])) { - previous_color[l_index] = lcol[l_index]; - } - color_orig = previous_color[l_index]; - } - const float final_alpha = Traits::frange * brush_fade * brush_strength * - tex_alpha * brush_alpha_pressure * grid_alpha; - - /* Mix the new color with the original based on final_alpha. */ - lcol[l_index] = vpaint_blend(vp, - lcol[l_index], - color_orig, - color_final, - final_alpha, - Traits::range * brush_strength); - } - } - } + if (previous_color != nullptr) { + /* Get the previous loop color */ + if (isZero(previous_color[v_index])) { + previous_color[v_index] = lcol[v_index]; } + color_orig = previous_color[v_index]; + } + const float final_alpha = Traits::frange * brush_fade * brush_strength * tex_alpha * + brush_alpha_pressure * grid_alpha; + + lcol[v_index] = vpaint_blend(vp, + lcol[v_index], + color_orig, + color_final, + final_alpha, + Traits::range * brush_strength); + } + else { + /* For each poly owning this vert, paint each loop belonging to this vert. */ + for (const int j : gmap->vert_to_poly[v_index].index_range()) { + const int p_index = gmap->vert_to_poly[v_index][j]; + const int l_index = gmap->vert_to_loop[v_index][j]; + BLI_assert(ss->corner_verts[l_index] == v_index); + if (use_face_sel && !select_poly[p_index]) { + continue; + } + Color color_orig = Color(0, 0, 0, 0); /* unused when array is nullptr */ + + if (previous_color != nullptr) { + /* Get the previous loop color */ + if (isZero(previous_color[l_index])) { + previous_color[l_index] = lcol[l_index]; + } + color_orig = previous_color[l_index]; + } + const float final_alpha = Traits::frange * brush_fade * brush_strength * tex_alpha * + brush_alpha_pressure * grid_alpha; + + /* Mix the new color with the original based on final_alpha. */ + lcol[l_index] = vpaint_blend(vp, + lcol[l_index], + color_orig, + color_final, + final_alpha, + Traits::range * brush_strength); } } } @@ -3687,7 +3706,6 @@ static void vpaint_paint_leaves(bContext *C, Color *lcol, Span nodes) { - for (PBVHNode *node : nodes) { SCULPT_undo_push_node(ob, node, SCULPT_UNDO_COLOR); } -- 2.30.2 From 98a2c2229d2d06b905490a8eb0daf1f710f3a21c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 10 Jul 2023 12:36:59 +1000 Subject: [PATCH 073/115] Fix error in 29bfd03009118792af393b1ddc2277b94a775bd6 --- source/blender/editors/sculpt_paint/paint_vertex.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/sculpt_paint/paint_vertex.cc b/source/blender/editors/sculpt_paint/paint_vertex.cc index 9c9937a50a3..303458214b0 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.cc +++ b/source/blender/editors/sculpt_paint/paint_vertex.cc @@ -3064,7 +3064,7 @@ static void do_vpaint_brush_blur_loops(bContext *C, } /* Use rgb^2 color averaging. */ - Color *col = &; + Color *col = &color_final; color_final.r = Traits::round(sqrtf(Traits::divide_round(blend[0], total_hit_loops))); color_final.g = Traits::round(sqrtf(Traits::divide_round(blend[1], total_hit_loops))); -- 2.30.2 From 0b5eb86e2cf6402583fab74867f60e8ef639d9ba Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 10 Jul 2023 12:11:33 +1000 Subject: [PATCH 074/115] Cleanup: check the result of BLI_findindex against -1 instead of < 0 There is only one error value, prefer a specific check. --- source/blender/blenkernel/intern/subsurf_ccg.cc | 2 +- source/blender/makesrna/intern/rna_constraint.cc | 2 +- source/blender/makesrna/intern/rna_sequencer.cc | 2 +- source/blender/sequencer/intern/utils.c | 2 +- source/blender/windowmanager/intern/wm_window.c | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/source/blender/blenkernel/intern/subsurf_ccg.cc b/source/blender/blenkernel/intern/subsurf_ccg.cc index c9c1bc62c7b..789bb615b71 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.cc +++ b/source/blender/blenkernel/intern/subsurf_ccg.cc @@ -1023,7 +1023,7 @@ static void ccgDM_release(DerivedMesh *dm) if (ccgdm->multires.modified_flags) { /* Check that mmd still exists */ if (!ccgdm->multires.local_mmd && - BLI_findindex(&ccgdm->multires.ob->modifiers, ccgdm->multires.mmd) < 0) + BLI_findindex(&ccgdm->multires.ob->modifiers, ccgdm->multires.mmd) == -1) { ccgdm->multires.mmd = nullptr; } diff --git a/source/blender/makesrna/intern/rna_constraint.cc b/source/blender/makesrna/intern/rna_constraint.cc index d1643851d73..f7f55f7e358 100644 --- a/source/blender/makesrna/intern/rna_constraint.cc +++ b/source/blender/makesrna/intern/rna_constraint.cc @@ -658,7 +658,7 @@ static void rna_ArmatureConstraint_target_remove( bArmatureConstraint *acon = static_cast(con->data); bConstraintTarget *tgt = static_cast(target_ptr->data); - if (BLI_findindex(&acon->targets, tgt) < 0) { + if (BLI_findindex(&acon->targets, tgt) == -1) { BKE_report(reports, RPT_ERROR, "Target is not in the constraint target list"); return; } diff --git a/source/blender/makesrna/intern/rna_sequencer.cc b/source/blender/makesrna/intern/rna_sequencer.cc index 13dcf95af54..d167555b0fd 100644 --- a/source/blender/makesrna/intern/rna_sequencer.cc +++ b/source/blender/makesrna/intern/rna_sequencer.cc @@ -1474,7 +1474,7 @@ static Sequence *rna_SeqTimelineChannel_owner_get(Editing *ed, SeqTimelineChanne if (seq->type != SEQ_TYPE_META) { continue; } - if (BLI_findindex(&seq->channels, channel) >= 0) { + if (BLI_findindex(&seq->channels, channel) != -1) { channel_owner = seq; } } diff --git a/source/blender/sequencer/intern/utils.c b/source/blender/sequencer/intern/utils.c index 05d31e07188..39a377f8f2c 100644 --- a/source/blender/sequencer/intern/utils.c +++ b/source/blender/sequencer/intern/utils.c @@ -377,7 +377,7 @@ ListBase *SEQ_get_seqbase_by_seq(const Scene *scene, Sequence *seq) if (seq_meta != NULL) { return &seq_meta->seqbase; } - if (BLI_findindex(main_seqbase, seq) >= 0) { + if (BLI_findindex(main_seqbase, seq) != -1) { return main_seqbase; } return NULL; diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index 4fff4c855ae..e2a043af4d0 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -1950,7 +1950,7 @@ void wm_window_delete_removed_timers(wmWindowManager *wm) void WM_event_remove_timer(wmWindowManager *wm, wmWindow *UNUSED(win), wmTimer *timer) { /* Extra security check. */ - if (BLI_findindex(&wm->timers, timer) < 0) { + if (BLI_findindex(&wm->timers, timer) == -1) { return; } -- 2.30.2 From 116861dc2fa37dddde19beed19b58a4dbf0c8867 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 10 Jul 2023 12:17:38 +1000 Subject: [PATCH 075/115] Cleanup: break early out of rna_SeqTimelineChannel_owner_get Once the channel was found the for-loop kept searching. --- source/blender/makesrna/intern/rna_sequencer.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/makesrna/intern/rna_sequencer.cc b/source/blender/makesrna/intern/rna_sequencer.cc index d167555b0fd..c3d1afeb57d 100644 --- a/source/blender/makesrna/intern/rna_sequencer.cc +++ b/source/blender/makesrna/intern/rna_sequencer.cc @@ -1476,6 +1476,7 @@ static Sequence *rna_SeqTimelineChannel_owner_get(Editing *ed, SeqTimelineChanne } if (BLI_findindex(&seq->channels, channel) != -1) { channel_owner = seq; + break; } } -- 2.30.2 From 7271ceb0573e3c699877b38a9a053e0193abdc3b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 10 Jul 2023 12:23:21 +1000 Subject: [PATCH 076/115] Fix memory leak when there are unexpectedly more than MAXSEQ strips --- source/blender/sequencer/intern/render.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/blender/sequencer/intern/render.c b/source/blender/sequencer/intern/render.c index 445ae1f070d..2bc790db3bb 100644 --- a/source/blender/sequencer/intern/render.c +++ b/source/blender/sequencer/intern/render.c @@ -280,7 +280,8 @@ int seq_get_shown_sequences(const Scene *scene, scene, channels, seqbase, timeline_frame, chanshown); const int strip_count = BLI_gset_len(collection->set); - if (strip_count > MAXSEQ) { + if (UNLIKELY(strip_count > MAXSEQ)) { + SEQ_collection_free(collection); BLI_assert_msg(0, "Too many strips, this shouldn't happen"); return 0; } -- 2.30.2 From 7e24a0a2ecd7b580e9c9911902d70340fd48d379 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 10 Jul 2023 12:28:27 +1000 Subject: [PATCH 077/115] Fix invalid address-of operator (hidden by a cast) While in practice this didn't cause problems, it's misleading & unnecessary. --- source/blender/sequencer/intern/render.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/sequencer/intern/render.c b/source/blender/sequencer/intern/render.c index 2bc790db3bb..dd967f8a904 100644 --- a/source/blender/sequencer/intern/render.c +++ b/source/blender/sequencer/intern/render.c @@ -1879,7 +1879,7 @@ static ImBuf *seq_render_strip_stack(const SeqRenderData *context, ImBuf *out = NULL; count = seq_get_shown_sequences( - context->scene, channels, seqbasep, timeline_frame, chanshown, (Sequence **)&seq_arr); + context->scene, channels, seqbasep, timeline_frame, chanshown, seq_arr); if (count == 0) { return NULL; -- 2.30.2 From 9ac0172016099816faabfd4d728295bd2d570a9a Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Sun, 9 Jul 2023 22:40:44 -0400 Subject: [PATCH 078/115] Progress --- .../editors/sculpt_paint/paint_intern.hh | 2 - .../editors/sculpt_paint/paint_vertex.cc | 727 +++++++++--------- 2 files changed, 378 insertions(+), 351 deletions(-) diff --git a/source/blender/editors/sculpt_paint/paint_intern.hh b/source/blender/editors/sculpt_paint/paint_intern.hh index 872d2076fb8..1221060cd38 100644 --- a/source/blender/editors/sculpt_paint/paint_intern.hh +++ b/source/blender/editors/sculpt_paint/paint_intern.hh @@ -136,8 +136,6 @@ void PAINT_OT_weight_gradient(wmOperatorType *ot); void PAINT_OT_vertex_paint_toggle(wmOperatorType *ot); void PAINT_OT_vertex_paint(wmOperatorType *ot); -unsigned int vpaint_get_current_color(Scene *scene, VPaint *vp, bool secondary); - /** * \note weight-paint has an equivalent function: #ED_wpaint_blend_tool */ diff --git a/source/blender/editors/sculpt_paint/paint_vertex.cc b/source/blender/editors/sculpt_paint/paint_vertex.cc index 9484e375aac..da767bbcee5 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.cc +++ b/source/blender/editors/sculpt_paint/paint_vertex.cc @@ -2790,6 +2790,22 @@ void PAINT_OT_vertex_paint_toggle(wmOperatorType *ot) * - revise whether op->customdata should be added in object, in set_vpaint. */ +template +static void to_static_color_type(const eCustomDataType type, const Func &func) +{ + switch (type) { + case CD_PROP_COLOR: + func(ColorPaint4f()); + break; + case CD_PROP_BYTE_COLOR: + func(ColorPaint4b()); + break; + default: + BLI_assert_unreachable(); + break; + } +} + struct VPaintData { ViewContext vc; eAttrDomain domain; @@ -2833,7 +2849,6 @@ static VPaintData *vpaint_init_vpaint(bContext *C, vpd->paintcol = vpaint_get_current_col( scene, vp, (RNA_enum_get(op->ptr, "mode") == BRUSH_STROKE_INVERT)); - ; vpd->is_texbrush = !(brush->vertexpaint_tool == VPAINT_TOOL_BLUR) && brush->mtex.tex; @@ -2903,8 +2918,6 @@ static void do_vpaint_brush_blur_loops(bContext *C, Span nodes, GMutableSpan lcol) { - using Blend = typename Traits::BlendType; - SculptSession *ss = ob->sculpt; const Brush *brush = ob->sculpt->cache->brush; @@ -2966,66 +2979,70 @@ static void do_vpaint_brush_blur_loops(bContext *C, const float brush_fade = BKE_brush_curve_strength(brush, sqrtf(test.dist), cache->radius); - /* Get the average poly color */ - Color color_final(0, 0, 0, 0); + to_static_color_type(vpd->type, [&](auto dummy) { + using Color = decltype(dummy); + using Blend = typename Traits::BlendType; + /* Get the average poly color */ + Color color_final(0, 0, 0, 0); - int total_hit_loops = 0; - Blend blend[4] = {0}; + int total_hit_loops = 0; + Blend blend[4] = {0}; - for (const int p_index : gmap->vert_to_poly[v_index]) { - if (use_face_sel && !select_poly[p_index]) { - continue; - } - const blender::IndexRange poly = ss->polys[p_index]; - total_hit_loops += poly.size(); - for (const int corner : poly) { - Color *col = lcol + corner; - - /* Color is squared to compensate the `sqrt` color encoding. */ - blend[0] += (Blend)col->r * (Blend)col->r; - blend[1] += (Blend)col->g * (Blend)col->g; - blend[2] += (Blend)col->b * (Blend)col->b; - blend[3] += (Blend)col->a * (Blend)col->a; - } - } - - if (total_hit_loops == 0) { - continue; - } - - /* Use rgb^2 color averaging. */ - Color *col = &; - - color_final.r = Traits::round(sqrtf(Traits::divide_round(blend[0], total_hit_loops))); - color_final.g = Traits::round(sqrtf(Traits::divide_round(blend[1], total_hit_loops))); - color_final.b = Traits::round(sqrtf(Traits::divide_round(blend[2], total_hit_loops))); - color_final.a = Traits::round(sqrtf(Traits::divide_round(blend[3], total_hit_loops))); - - /* For each poly owning this vert, - * paint each loop belonging to this vert. */ - for (const int j : gmap->vert_to_poly[v_index].index_range()) { - const int p_index = gmap->vert_to_poly[v_index][j]; - const int l_index = gmap->vert_to_loop[v_index][j]; - BLI_assert(ss->corner_verts[l_index] == v_index); - if (use_face_sel && !select_poly[p_index]) { - continue; - } - Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ - - if (previous_color != nullptr) { - /* Get the previous loop color */ - if (isZero(previous_color[l_index])) { - previous_color[l_index] = lcol[l_index]; + for (const int p_index : gmap->vert_to_poly[v_index]) { + if (use_face_sel && !select_poly[p_index]) { + continue; + } + const blender::IndexRange poly = ss->polys[p_index]; + total_hit_loops += poly.size(); + for (const int corner : poly) { + Color *col = lcol + corner; + + /* Color is squared to compensate the `sqrt` color encoding. */ + blend[0] += (Blend)col->r * (Blend)col->r; + blend[1] += (Blend)col->g * (Blend)col->g; + blend[2] += (Blend)col->b * (Blend)col->b; + blend[3] += (Blend)col->a * (Blend)col->a; } - color_orig = previous_color[l_index]; } - const float final_alpha = Traits::range * brush_fade * brush_strength * - brush_alpha_pressure * grid_alpha; - /* Mix the new color with the original - * based on the brush strength and the curve. */ - lcol[l_index] = vpaint_blend( - vp, lcol[l_index], color_orig, *col, final_alpha, Traits::range * brush_strength); - } + + if (total_hit_loops == 0) { + continue; + } + + /* Use rgb^2 color averaging. */ + Color *col = &; + + color_final.r = Traits::round(sqrtf(Traits::divide_round(blend[0], total_hit_loops))); + color_final.g = Traits::round(sqrtf(Traits::divide_round(blend[1], total_hit_loops))); + color_final.b = Traits::round(sqrtf(Traits::divide_round(blend[2], total_hit_loops))); + color_final.a = Traits::round(sqrtf(Traits::divide_round(blend[3], total_hit_loops))); + + /* For each poly owning this vert, + * paint each loop belonging to this vert. */ + for (const int j : gmap->vert_to_poly[v_index].index_range()) { + const int p_index = gmap->vert_to_poly[v_index][j]; + const int l_index = gmap->vert_to_loop[v_index][j]; + BLI_assert(ss->corner_verts[l_index] == v_index); + if (use_face_sel && !select_poly[p_index]) { + continue; + } + Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ + + if (previous_color != nullptr) { + /* Get the previous loop color */ + if (isZero(previous_color[l_index])) { + previous_color[l_index] = lcol[l_index]; + } + color_orig = previous_color[l_index]; + } + const float final_alpha = Traits::range * brush_fade * brush_strength * + brush_alpha_pressure * grid_alpha; + /* Mix the new color with the original + * based on the brush strength and the curve. */ + lcol[l_index] = vpaint_blend( + vp, lcol[l_index], color_orig, *col, final_alpha, Traits::range * brush_strength); + } + }); } BKE_pbvh_vertex_iter_end; }; @@ -3041,8 +3058,6 @@ static void do_vpaint_brush_blur_verts(bContext *C, Span nodes, GMutableSpan lcol) { - using Blend = typename Traits::BlendType; - SculptSession *ss = ob->sculpt; const Brush *brush = ob->sculpt->cache->brush; @@ -3104,61 +3119,65 @@ static void do_vpaint_brush_blur_verts(bContext *C, const float brush_fade = BKE_brush_curve_strength(brush, sqrtf(test.dist), cache->radius); /* Get the average poly color */ - Color color_final(0, 0, 0, 0); + to_static_color_type(vpd->type, [&](auto dummy) { + using Color = decltype(dummy); + using Blend = typename Traits::BlendType; + Color color_final(0, 0, 0, 0); - int total_hit_loops = 0; - Blend blend[4] = {0}; + int total_hit_loops = 0; + Blend blend[4] = {0}; - for (const int p_index : gmap->vert_to_poly[v_index]) { - if (use_face_sel && !select_poly[p_index]) { - continue; - } - const blender::IndexRange poly = ss->polys[p_index]; - total_hit_loops += poly.size(); - for (const int vert : ss->corner_verts.slice(poly)) { - Color *col = lcol + vert; - - /* Color is squared to compensate the `sqrt` color encoding. */ - blend[0] += (Blend)col->r * (Blend)col->r; - blend[1] += (Blend)col->g * (Blend)col->g; - blend[2] += (Blend)col->b * (Blend)col->b; - blend[3] += (Blend)col->a * (Blend)col->a; - } - } - - if (total_hit_loops == 0) { - continue; - } - /* Use rgb^2 color averaging. */ - Color *col = &color_final; - - color_final.r = Traits::round(sqrtf(Traits::divide_round(blend[0], total_hit_loops))); - color_final.g = Traits::round(sqrtf(Traits::divide_round(blend[1], total_hit_loops))); - color_final.b = Traits::round(sqrtf(Traits::divide_round(blend[2], total_hit_loops))); - color_final.a = Traits::round(sqrtf(Traits::divide_round(blend[3], total_hit_loops))); - - /* For each poly owning this vert, - * paint each loop belonging to this vert. */ - for (const int p_index : gmap->vert_to_poly[v_index]) { - if (use_face_sel && !select_poly[p_index]) { - continue; - } - Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ - - if (previous_color != nullptr) { - /* Get the previous loop color */ - if (isZero(previous_color[v_index])) { - previous_color[v_index] = lcol[v_index]; + for (const int p_index : gmap->vert_to_poly[v_index]) { + if (use_face_sel && !select_poly[p_index]) { + continue; + } + const blender::IndexRange poly = ss->polys[p_index]; + total_hit_loops += poly.size(); + for (const int vert : ss->corner_verts.slice(poly)) { + Color *col = lcol + vert; + + /* Color is squared to compensate the `sqrt` color encoding. */ + blend[0] += (Blend)col->r * (Blend)col->r; + blend[1] += (Blend)col->g * (Blend)col->g; + blend[2] += (Blend)col->b * (Blend)col->b; + blend[3] += (Blend)col->a * (Blend)col->a; } - color_orig = previous_color[v_index]; } - const float final_alpha = Traits::range * brush_fade * brush_strength * - brush_alpha_pressure * grid_alpha; - /* Mix the new color with the original - * based on the brush strength and the curve. */ - lcol[v_index] = vpaint_blend( - vp, lcol[v_index], color_orig, *col, final_alpha, Traits::range * brush_strength); - } + + if (total_hit_loops == 0) { + continue; + } + /* Use rgb^2 color averaging. */ + Color *col = &color_final; + + color_final.r = Traits::round(sqrtf(Traits::divide_round(blend[0], total_hit_loops))); + color_final.g = Traits::round(sqrtf(Traits::divide_round(blend[1], total_hit_loops))); + color_final.b = Traits::round(sqrtf(Traits::divide_round(blend[2], total_hit_loops))); + color_final.a = Traits::round(sqrtf(Traits::divide_round(blend[3], total_hit_loops))); + + /* For each poly owning this vert, + * paint each loop belonging to this vert. */ + for (const int p_index : gmap->vert_to_poly[v_index]) { + if (use_face_sel && !select_poly[p_index]) { + continue; + } + Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ + + if (previous_color != nullptr) { + /* Get the previous loop color */ + if (isZero(previous_color[v_index])) { + previous_color[v_index] = lcol[v_index]; + } + color_orig = previous_color[v_index]; + } + const float final_alpha = Traits::range * brush_fade * brush_strength * + brush_alpha_pressure * grid_alpha; + /* Mix the new color with the original + * based on the brush strength and the curve. */ + lcol[v_index] = vpaint_blend( + vp, lcol[v_index], color_orig, *col, final_alpha, Traits::range * brush_strength); + } + }); } BKE_pbvh_vertex_iter_end; }; @@ -3190,6 +3209,28 @@ static void do_vpaint_brush_smear(bContext *C, GMutableSpan color_prev_smear = vpd->smear.color_prev; GMutableSpan color_prev = ss->cache->prev_colors_vpaint; + float brush_size_pressure, brush_alpha_value, brush_alpha_pressure; + + get_brush_alpha_data( + scene, ss, brush, &brush_size_pressure, &brush_alpha_value, &brush_alpha_pressure); + const bool use_normal = vwpaint_use_normal(vp); + const bool use_vert_sel = (me->editflag & (ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL)) != + 0; + const bool use_face_sel = (me->editflag & ME_EDIT_PAINT_FACE_SEL) != 0; + + float brush_dir[3]; + sub_v3_v3v3(brush_dir, cache->location, cache->last_location); + project_plane_v3_v3v3(brush_dir, brush_dir, cache->view_normal); + if (normalize_v3(brush_dir) == 0.0f) { + return; + } + + SculptBrushTest test; + SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( + ss, &test, brush->falloff_shape); + const float *sculpt_normal_frontface = SCULPT_brush_frontface_normal_from_falloff_shape( + ss, brush->falloff_shape); + const blender::VArray select_vert = *me->attributes().lookup_or_default( ".select_vert", ATTR_DOMAIN_POINT, false); const blender::VArray select_poly = *me->attributes().lookup_or_default( @@ -3197,27 +3238,6 @@ static void do_vpaint_brush_smear(bContext *C, blender::threading::parallel_for(nodes.index_range(), 1LL, [&](IndexRange range) { for (int n : range) { - float brush_size_pressure, brush_alpha_value, brush_alpha_pressure; - - get_brush_alpha_data( - scene, ss, brush, &brush_size_pressure, &brush_alpha_value, &brush_alpha_pressure); - const bool use_normal = vwpaint_use_normal(vp); - const bool use_vert_sel = (me->editflag & - (ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL)) != 0; - const bool use_face_sel = (me->editflag & ME_EDIT_PAINT_FACE_SEL) != 0; - - float brush_dir[3]; - sub_v3_v3v3(brush_dir, cache->location, cache->last_location); - project_plane_v3_v3v3(brush_dir, brush_dir, cache->view_normal); - if (normalize_v3(brush_dir) == 0.0f) { - continue; - } - - SculptBrushTest test; - SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( - ss, &test, brush->falloff_shape); - const float *sculpt_normal_frontface = SCULPT_brush_frontface_normal_from_falloff_shape( - ss, brush->falloff_shape); /* For each vertex */ PBVHVertexIter vd; @@ -3256,94 +3276,97 @@ static void do_vpaint_brush_smear(bContext *C, /* Get the color of the loop in the opposite * direction of the brush movement */ - Color color_final(0, 0, 0, 0); + to_static_color_type(vpd->type, [&](auto dummy) { + using Color = decltype(dummy); + Color color_final(0, 0, 0, 0); - for (const int j : gmap->vert_to_poly[v_index].index_range()) { - const int p_index = gmap->vert_to_poly[v_index][j]; - const int l_index = gmap->vert_to_loop[v_index][j]; - BLI_assert(ss->corner_verts[l_index] == v_index); - UNUSED_VARS_NDEBUG(l_index); - if (use_face_sel && !select_poly[p_index]) { + for (const int j : gmap->vert_to_poly[v_index].index_range()) { + const int p_index = gmap->vert_to_poly[v_index][j]; + const int l_index = gmap->vert_to_loop[v_index][j]; + BLI_assert(ss->corner_verts[l_index] == v_index); + UNUSED_VARS_NDEBUG(l_index); + if (use_face_sel && !select_poly[p_index]) { + continue; + } + for (const int corner : ss->polys[p_index]) { + const int v_other_index = ss->corner_verts[corner]; + if (v_other_index == v_index) { + continue; + } + + /* Get the direction from the + * selected vert to the neighbor. */ + float other_dir[3]; + sub_v3_v3v3(other_dir, mv_curr, ss->vert_positions[v_other_index]); + project_plane_v3_v3v3(other_dir, other_dir, cache->view_normal); + + normalize_v3(other_dir); + + const float stroke_dot = dot_v3v3(other_dir, brush_dir); + int elem_index; + + if (domain == ATTR_DOMAIN_POINT) { + elem_index = v_other_index; + } + else { + elem_index = corner; + } + + if (stroke_dot > stroke_dot_max) { + stroke_dot_max = stroke_dot; + color_final = color_prev_smear[elem_index]; + do_color = true; + } + } + } + + if (!do_color) { continue; } - for (const int corner : ss->polys[p_index]) { - const int v_other_index = ss->corner_verts[corner]; - if (v_other_index == v_index) { + + const float final_alpha = Traits::range * brush_fade * brush_strength * + brush_alpha_pressure * grid_alpha; + + /* For each poly owning this vert, + * paint each loop belonging to this vert. */ + for (const int j : gmap->vert_to_poly[v_index].index_range()) { + const int p_index = gmap->vert_to_poly[v_index][j]; + + int elem_index; + if (vpd->domain == ATTR_DOMAIN_POINT) { + elem_index = v_index; + } + else { + const int l_index = gmap->vert_to_loop[v_index][j]; + elem_index = l_index; + BLI_assert(ss->corner_verts[l_index] == v_index); + } + if (use_face_sel && !select_poly[p_index]) { continue; } - /* Get the direction from the - * selected vert to the neighbor. */ - float other_dir[3]; - sub_v3_v3v3(other_dir, mv_curr, ss->vert_positions[v_other_index]); - project_plane_v3_v3v3(other_dir, other_dir, cache->view_normal); - - normalize_v3(other_dir); - - const float stroke_dot = dot_v3v3(other_dir, brush_dir); - int elem_index; - - if constexpr (domain == ATTR_DOMAIN_POINT) { - elem_index = v_other_index; - } - else { - elem_index = corner; - } - - if (stroke_dot > stroke_dot_max) { - stroke_dot_max = stroke_dot; - color_final = color_prev_smear[elem_index]; - do_color = true; - } - } - } - - if (!do_color) { - continue; - } - - const float final_alpha = Traits::range * brush_fade * brush_strength * - brush_alpha_pressure * grid_alpha; - - /* For each poly owning this vert, - * paint each loop belonging to this vert. */ - for (const int j : gmap->vert_to_poly[v_index].index_range()) { - const int p_index = gmap->vert_to_poly[v_index][j]; - - int elem_index; - if constexpr (domain == ATTR_DOMAIN_POINT) { - elem_index = v_index; - } - else { - const int l_index = gmap->vert_to_loop[v_index][j]; - elem_index = l_index; - BLI_assert(ss->corner_verts[l_index] == v_index); - } - if (use_face_sel && !select_poly[p_index]) { - continue; - } - - /* Get the previous element color */ - Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ - - if (color_prev != nullptr) { /* Get the previous element color */ - if (isZero(color_prev[elem_index])) { - color_prev[elem_index] = lcol[elem_index]; - } - color_orig = color_prev[elem_index]; - } - /* Mix the new color with the original - * based on the brush strength and the curve. */ - lcol[elem_index] = vpaint_blend(vp, - lcol[elem_index], - color_orig, - color_final, - final_alpha, - Traits::range * brush_strength); + Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ - color_curr[elem_index] = lcol[elem_index]; - } + if (color_prev != nullptr) { + /* Get the previous element color */ + if (isZero(color_prev[elem_index])) { + color_prev[elem_index] = lcol[elem_index]; + } + color_orig = color_prev[elem_index]; + } + /* Mix the new color with the original + * based on the brush strength and the curve. */ + lcol[elem_index] = vpaint_blend(vp, + lcol[elem_index], + color_orig, + color_final, + final_alpha, + Traits::range * brush_strength); + + color_curr[elem_index] = lcol[elem_index]; + } + }); } BKE_pbvh_vertex_iter_end; } @@ -3357,91 +3380,94 @@ static void calculate_average_color(VPaintData *vpd, GMutableSpan lcol, Span nodes) { - using Blend = typename Traits::BlendType; + SculptSession *ss = ob->sculpt; + const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh); + const bool has_grids = (pbvh_type == PBVH_GRIDS); + const SculptVertexPaintGeomMap *gmap = &ss->mode.vpaint.gmap; + + StrokeCache *cache = ss->cache; + const bool use_vert_sel = (me->editflag & (ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL)) != + 0; + + SculptBrushTest test; + SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( + ss, &test, brush->falloff_shape); const blender::VArray select_vert = *me->attributes().lookup_or_default( ".select_vert", ATTR_DOMAIN_POINT, false); - VPaintAverageAccum *accum = (VPaintAverageAccum *)MEM_mallocN( - sizeof(*accum) * nodes.size(), __func__); - blender::threading::parallel_for(nodes.index_range(), 1LL, [&](IndexRange range) { - for (int n : range) { - SculptSession *ss = ob->sculpt; - const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh); - const bool has_grids = (pbvh_type == PBVH_GRIDS); - const SculptVertexPaintGeomMap *gmap = &ss->mode.vpaint.gmap; + to_static_color_type(vpd->type, [&](auto dummy) { + using Color = decltype(dummy); + using Blend = typename Traits::BlendType; - StrokeCache *cache = ss->cache; - const bool use_vert_sel = (me->editflag & - (ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL)) != 0; + VPaintAverageAccum *accum = (VPaintAverageAccum *)MEM_mallocN( + sizeof(*accum) * nodes.size(), __func__); + blender::threading::parallel_for(nodes.index_range(), 1LL, [&](IndexRange range) { + for (int n : range) { + VPaintAverageAccum *accum2 = accum + n; + accum2->len = 0; + memset(accum2->value, 0, sizeof(accum2->value)); - VPaintAverageAccum *accum2 = accum + n; - accum2->len = 0; - memset(accum2->value, 0, sizeof(accum2->value)); - - SculptBrushTest test; - SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( - ss, &test, brush->falloff_shape); - - /* For each vertex */ - PBVHVertexIter vd; - BKE_pbvh_vertex_iter_begin (ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { - /* Test to see if the vertex coordinates are within the spherical brush region. */ - if (!sculpt_brush_test_sq_fn(&test, vd.co)) { - continue; - } - if (BKE_brush_curve_strength(brush, 0.0, cache->radius) <= 0.0f) { - continue; - } - const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : - vd.vert_indices[vd.i]; - /* If the vertex is selected for painting. */ - if (use_vert_sel && !select_vert[v_index]) { - continue; - } - - accum2->len += gmap->vert_to_poly[v_index].size(); - /* if a vertex is within the brush region, then add its color to the blend. */ - for (int j = 0; j < gmap->vert_to_poly[v_index].size(); j++) { - int elem_index; - - if constexpr (domain == ATTR_DOMAIN_CORNER) { - elem_index = gmap->vert_to_loop[v_index][j]; + /* For each vertex */ + PBVHVertexIter vd; + BKE_pbvh_vertex_iter_begin (ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + /* Test to see if the vertex coordinates are within the spherical brush region. */ + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; } - else { - elem_index = v_index; + if (BKE_brush_curve_strength(brush, 0.0, cache->radius) <= 0.0f) { + continue; + } + const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : + vd.vert_indices[vd.i]; + /* If the vertex is selected for painting. */ + if (use_vert_sel && !select_vert[v_index]) { + continue; } - Color *col = lcol + elem_index; + accum2->len += gmap->vert_to_poly[v_index].size(); + /* if a vertex is within the brush region, then add its color to the blend. */ + for (int j = 0; j < gmap->vert_to_poly[v_index].size(); j++) { + int elem_index; - /* Color is squared to compensate the `sqrt` color encoding. */ - accum2->value[0] += col->r * col->r; - accum2->value[1] += col->g * col->g; - accum2->value[2] += col->b * col->b; + if (vpd->domain == ATTR_DOMAIN_CORNER) { + elem_index = gmap->vert_to_loop[v_index][j]; + } + else { + elem_index = v_index; + } + + Color *col = lcol + elem_index; + + /* Color is squared to compensate the `sqrt` color encoding. */ + accum2->value[0] += col->r * col->r; + accum2->value[1] += col->g * col->g; + accum2->value[2] += col->b * col->b; + } } + BKE_pbvh_vertex_iter_end; } - BKE_pbvh_vertex_iter_end; + }); + + Blend accum_len = 0; + Blend accum_value[3] = {0}; + Color blend(0, 0, 0, 0); + + for (int i = 0; i < nodes.size(); i++) { + accum_len += accum[i].len; + accum_value[0] += accum[i].value[0]; + accum_value[1] += accum[i].value[1]; + accum_value[2] += accum[i].value[2]; + } + if (accum_len != 0) { + blend.r = Traits::round(sqrtf(Traits::divide_round(accum_value[0], accum_len))); + blend.g = Traits::round(sqrtf(Traits::divide_round(accum_value[1], accum_len))); + blend.b = Traits::round(sqrtf(Traits::divide_round(accum_value[2], accum_len))); + blend.a = Traits::range; + + vpd->paintcol = blend; } }); - - Blend accum_len = 0; - Blend accum_value[3] = {0}; - Color blend(0, 0, 0, 0); - - for (int i = 0; i < nodes.size(); i++) { - accum_len += accum[i].len; - accum_value[0] += accum[i].value[0]; - accum_value[1] += accum[i].value[1]; - accum_value[2] += accum[i].value[2]; - } - if (accum_len != 0) { - blend.r = Traits::round(sqrtf(Traits::divide_round(accum_value[0], accum_len))); - blend.g = Traits::round(sqrtf(Traits::divide_round(accum_value[1], accum_len))); - blend.b = Traits::round(sqrtf(Traits::divide_round(accum_value[2], accum_len))); - blend.a = Traits::range; - - vpd->paintcol = blend; - } } template @@ -3477,6 +3503,24 @@ static void vpaint_do_draw(bContext *C, const Brush *brush = ob->sculpt->cache->brush; const Scene *scene = CTX_data_scene(C); + const bool has_grids = (pbvh_type == PBVH_GRIDS); + const SculptVertexPaintGeomMap *gmap = &ss->mode.vpaint.gmap; + + const StrokeCache *cache = ss->cache; + float brush_size_pressure, brush_alpha_value, brush_alpha_pressure; + get_brush_alpha_data( + scene, ss, brush, &brush_size_pressure, &brush_alpha_value, &brush_alpha_pressure); + const bool use_normal = vwpaint_use_normal(vp); + const bool use_vert_sel = (me->editflag & (ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL)) != + 0; + const bool use_face_sel = (me->editflag & ME_EDIT_PAINT_FACE_SEL) != 0; + + SculptBrushTest test; + SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( + ss, &test, brush->falloff_shape); + const float *sculpt_normal_frontface = SCULPT_brush_frontface_normal_from_falloff_shape( + ss, brush->falloff_shape); + GMutableSpan previous_color = ss->cache->prev_colors_vpaint; const blender::VArray select_vert = *me->attributes().lookup_or_default( @@ -3486,25 +3530,7 @@ static void vpaint_do_draw(bContext *C, blender::threading::parallel_for(nodes.index_range(), 1LL, [&](IndexRange range) { for (int n : range) { - const bool has_grids = (pbvh_type == PBVH_GRIDS); - const SculptVertexPaintGeomMap *gmap = &ss->mode.vpaint.gmap; - - const StrokeCache *cache = ss->cache; - float brush_size_pressure, brush_alpha_value, brush_alpha_pressure; - get_brush_alpha_data( - scene, ss, brush, &brush_size_pressure, &brush_alpha_value, &brush_alpha_pressure); - const bool use_normal = vwpaint_use_normal(vp); - const bool use_vert_sel = (me->editflag & - (ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL)) != 0; - const bool use_face_sel = (me->editflag & ME_EDIT_PAINT_FACE_SEL) != 0; - - SculptBrushTest test; - SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( - ss, &test, brush->falloff_shape); - const float *sculpt_normal_frontface = SCULPT_brush_frontface_normal_from_falloff_shape( - ss, brush->falloff_shape); - - Color paintcol = vpd->paintcol; + ColorPaint4f paintcol = vpd->paintcol; /* For each vertex */ PBVHVertexIter vd; @@ -3536,68 +3562,71 @@ static void vpaint_do_draw(bContext *C, } const float brush_fade = BKE_brush_curve_strength(brush, sqrtf(test.dist), cache->radius); - Color color_final = paintcol; + to_static_color_type(vpd->type, [&](auto dummy) { + using Color = decltype(dummy); + Color color_final = paintcol; - /* If we're painting with a texture, sample the texture color and alpha. */ - float tex_alpha = 1.0; - if (vpd->is_texbrush) { - /* NOTE: we may want to paint alpha as vertex color alpha. */ - tex_alpha = paint_and_tex_color_alpha( - vp, vpd, vpd->vertexcosnos[v_index].co, &color_final); - } - - Color color_orig(0, 0, 0, 0); - - if constexpr (domain == ATTR_DOMAIN_POINT) { - int v_index = vd.index; - - if (previous_color != nullptr) { - /* Get the previous loop color */ - if (isZero(previous_color[v_index])) { - previous_color[v_index] = lcol[v_index]; - } - color_orig = previous_color[v_index]; + /* If we're painting with a texture, sample the texture color and alpha. */ + float tex_alpha = 1.0; + if (vpd->is_texbrush) { + /* NOTE: we may want to paint alpha as vertex color alpha. */ + tex_alpha = paint_and_tex_color_alpha( + vp, vpd, vpd->vertexcosnos[v_index].co, &color_final); } - const float final_alpha = Traits::frange * brush_fade * brush_strength * tex_alpha * - brush_alpha_pressure * grid_alpha; - lcol[v_index] = vpaint_blend(vp, - lcol[v_index], - color_orig, - color_final, - final_alpha, - Traits::range * brush_strength); - } - else { - /* For each poly owning this vert, paint each loop belonging to this vert. */ - for (const int j : gmap->vert_to_poly[v_index].index_range()) { - const int p_index = gmap->vert_to_poly[v_index][j]; - const int l_index = gmap->vert_to_loop[v_index][j]; - BLI_assert(ss->corner_verts[l_index] == v_index); - if (use_face_sel && !select_poly[p_index]) { - continue; - } - Color color_orig = Color(0, 0, 0, 0); /* unused when array is nullptr */ + Color color_orig(0, 0, 0, 0); + + if (vpd->domain == ATTR_DOMAIN_POINT) { + int v_index = vd.index; if (previous_color != nullptr) { /* Get the previous loop color */ - if (isZero(previous_color[l_index])) { - previous_color[l_index] = lcol[l_index]; + if (isZero(previous_color[v_index])) { + previous_color[v_index] = lcol[v_index]; } - color_orig = previous_color[l_index]; + color_orig = previous_color[v_index]; } const float final_alpha = Traits::frange * brush_fade * brush_strength * tex_alpha * brush_alpha_pressure * grid_alpha; - /* Mix the new color with the original based on final_alpha. */ - lcol[l_index] = vpaint_blend(vp, - lcol[l_index], + lcol[v_index] = vpaint_blend(vp, + lcol[v_index], color_orig, color_final, final_alpha, Traits::range * brush_strength); } - } + else { + /* For each poly owning this vert, paint each loop belonging to this vert. */ + for (const int j : gmap->vert_to_poly[v_index].index_range()) { + const int p_index = gmap->vert_to_poly[v_index][j]; + const int l_index = gmap->vert_to_loop[v_index][j]; + BLI_assert(ss->corner_verts[l_index] == v_index); + if (use_face_sel && !select_poly[p_index]) { + continue; + } + Color color_orig = Color(0, 0, 0, 0); /* unused when array is nullptr */ + + if (previous_color != nullptr) { + /* Get the previous loop color */ + if (isZero(previous_color[l_index])) { + previous_color[l_index] = lcol[l_index]; + } + color_orig = previous_color[l_index]; + } + const float final_alpha = Traits::frange * brush_fade * brush_strength * tex_alpha * + brush_alpha_pressure * grid_alpha; + + /* Mix the new color with the original based on final_alpha. */ + lcol[l_index] = vpaint_blend(vp, + lcol[l_index], + color_orig, + color_final, + final_alpha, + Traits::range * brush_strength); + } + } + }); } BKE_pbvh_vertex_iter_end; } -- 2.30.2 From 998e7f644f6f20bce89e3d53b69e0b996379f7b5 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 10 Jul 2023 08:35:55 +0200 Subject: [PATCH 079/115] Fix: Eevee-next Compiler issue NVIDIA This PR fixes a compiler issue when using NVIDIA. It was introduced when adding the reflection probes. NVIDIA compiler doesn't like to access elements in a bound resource and pass it directly as a parameter. It should first be added as a local variable. Pull Request: https://projects.blender.org/blender/blender/pulls/109891 --- .../shaders/eevee_reflection_probe_eval_lib.glsl | 10 +++++----- .../eevee_next/shaders/eevee_reflection_probe_lib.glsl | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_eval_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_eval_lib.glsl index 4214b007525..f1b2835952e 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_eval_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_eval_lib.glsl @@ -79,15 +79,15 @@ void reflection_probes_eval(ClosureReflection reflection, vec3 P, vec3 V, inout int closest_reflection_probe = reflection_probes_find_closest(P); vec4 light_color = vec4(0.0); if (closest_reflection_probe != -1) { - light_color = reflection_probe_eval( - reflection, P, V, reflection_probe_buf[closest_reflection_probe]); + ReflectionProbeData probe_data = reflection_probe_buf[closest_reflection_probe]; + light_color = reflection_probe_eval(reflection, P, V, probe_data); } /* Mix world lighting. */ if (light_color.a != 1.0) { - light_color.rgb = mix(reflection_probe_eval(reflection, P, V, reflection_probe_buf[0]).rgb, - light_color.rgb, - light_color.a); + ReflectionProbeData probe_data = reflection_probe_buf[0]; + light_color.rgb = mix( + reflection_probe_eval(reflection, P, V, probe_data).rgb, light_color.rgb, light_color.a); } out_specular += light_color.rgb; diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_lib.glsl index 6a50f3a2529..bd32470f221 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_reflection_probe_lib.glsl @@ -13,5 +13,6 @@ vec4 reflection_probes_sample(vec3 L, float lod, ReflectionProbeData probe_data) vec3 reflection_probes_world_sample(vec3 L, float lod) { - return reflection_probes_sample(L, lod, reflection_probe_buf[0]).rgb; + ReflectionProbeData probe_data = reflection_probe_buf[0]; + return reflection_probes_sample(L, lod, probe_data).rgb; } \ No newline at end of file -- 2.30.2 From 9314f97afd72fe9bfa3316f2604e904ea5bbb671 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 10 Jul 2023 10:11:43 +0200 Subject: [PATCH 080/115] Fix #109887: Adding driver from python might crash Originally was noticed when adding drivers to a rigid body., but it could potentially happen with any configuration. The reason for the crash was that the ID which was modified was not tagged as such. Modifying drivers from the interface are likely tagging for updates from the operator. This change makes it so the python function also does tagging. It is not really how one would design the system nowadays, but it is how the Blender historically handles such cases. A bigger refactor is possible to move tags to the places where modification actually happens, but it seems to be a better idea to tackle it as a separate project which will be considered no-functional-changes. Pull Request: https://projects.blender.org/blender/blender/pulls/109895 --- source/blender/python/intern/bpy_rna_anim.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/blender/python/intern/bpy_rna_anim.c b/source/blender/python/intern/bpy_rna_anim.c index 71106a0f486..4ad40559d61 100644 --- a/source/blender/python/intern/bpy_rna_anim.c +++ b/source/blender/python/intern/bpy_rna_anim.c @@ -47,6 +47,7 @@ #include "../generic/py_capi_rna.h" #include "../generic/python_utildefines.h" +#include "DEG_depsgraph.h" #include "DEG_depsgraph_build.h" /* for keyframes and drivers */ @@ -588,6 +589,7 @@ PyObject *pyrna_struct_driver_add(BPy_StructRNA *self, PyObject *args) bContext *context = BPY_context_get(); WM_event_add_notifier(BPY_context_get(), NC_ANIMATION | ND_FCURVES_ORDER, NULL); + DEG_id_tag_update(id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(CTX_data_main(context)); } else { -- 2.30.2 From 18efd11369840a8289f7c373df14de96aad0d6e0 Mon Sep 17 00:00:00 2001 From: rBrenick Date: Mon, 10 Jul 2023 10:20:09 +0200 Subject: [PATCH 081/115] UI: Grey out ShapeKey list entry on mute At a glance, it can be hard to see if a Shape Key has been muted or not. This change greys out all the UI elements, instead of just the current value number. All the functionality still works the same, purely a visual change. Pull Request: https://projects.blender.org/blender/blender/pulls/109857 --- scripts/startup/bl_ui/properties_data_mesh.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/startup/bl_ui/properties_data_mesh.py b/scripts/startup/bl_ui/properties_data_mesh.py index 06019471948..21904d0f5ff 100644 --- a/scripts/startup/bl_ui/properties_data_mesh.py +++ b/scripts/startup/bl_ui/properties_data_mesh.py @@ -124,7 +124,7 @@ class MESH_UL_shape_keys(UIList): row = split.row(align=True) row.emboss = 'NONE_OR_STATUS' if key_block.mute or (obj.mode == 'EDIT' and not (obj.use_shape_key_edit_mode and obj.type == 'MESH')): - row.active = False + split.active = False if not item.id_data.use_relative: row.prop(key_block, "frame", text="") elif index > 0: -- 2.30.2 From 8199cce0c58a8352e80c957c62ae2616fefa5986 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 10 Jul 2023 10:30:52 +0200 Subject: [PATCH 082/115] Fix: Reflection Probe Negative Shifting When using many reflection probes with different subdivisions it can happen that the reflection probe uses texture space that is already been allocated for another probe. The cause for that is that negative shift operations result into undefined behavior, this was fixed previously by clamping the number of bit shifts to perform, but ignoring to shift into the other direction This change also includes `ProbeLocationFinder.print_debug` for future debugging. Pull Request: https://projects.blender.org/blender/blender/pulls/109823 --- .../eevee_next/eevee_reflection_probes.cc | 56 ++++++++++++++----- 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/source/blender/draw/engines/eevee_next/eevee_reflection_probes.cc b/source/blender/draw/engines/eevee_next/eevee_reflection_probes.cc index 5c9b7ed1e9e..72efc6745cb 100644 --- a/source/blender/draw/engines/eevee_next/eevee_reflection_probes.cc +++ b/source/blender/draw/engines/eevee_next/eevee_reflection_probes.cc @@ -189,6 +189,35 @@ class ProbeLocationFinder { taken_spots_.resize(num_spots, false); } + void print_debug() const + { + std::ostream &os = std::cout; + int layer = 0; + int row = 0; + int column = 0; + + os << "subdivision " << subdivision_level_ << "\n"; + + for (bool spot_taken : taken_spots_) { + if (row == 0 && column == 0) { + os << "layer " << layer << "\n"; + } + + os << (spot_taken ? '1' : '0'); + + column++; + if (column == probes_per_dimension_) { + os << "\n"; + column = 0; + row++; + } + if (row == probes_per_dimension_) { + row = 0; + layer++; + } + } + } + /** * Mark space to be occupied by the given probe_data. * @@ -197,19 +226,20 @@ class ProbeLocationFinder { */ void mark_space_used(const ReflectionProbeData &probe_data) { - /* Number of spots that the probe data will occupied in a single dimension. */ - int clamped_subdivision_shift = max_ii(probe_data.layer_subdivision - subdivision_level_, 0); - int spots_per_dimension = 1 << max_ii(subdivision_level_ - probe_data.layer_subdivision, 0); - int probes_per_dimension_in_probe_data = 1 << probe_data.layer_subdivision; - int2 pos_in_probe_data = int2(probe_data.area_index % probes_per_dimension_in_probe_data, - probe_data.area_index / probes_per_dimension_in_probe_data); - int2 pos_in_location_finder = int2(pos_in_probe_data.x >> clamped_subdivision_shift, - pos_in_probe_data.y >> clamped_subdivision_shift); - int layer_offset = probe_data.layer * probes_per_layer_; - for (int y : IndexRange(spots_per_dimension)) { - for (int x : IndexRange(spots_per_dimension)) { - int2 pos = pos_in_location_finder + int2(x, y); - int area_index = pos.x + pos.y * probes_per_dimension_; + const int shift_right = max_ii(probe_data.layer_subdivision - subdivision_level_, 0); + const int shift_left = max_ii(subdivision_level_ - probe_data.layer_subdivision, 0); + const int spots_per_dimension = 1 << shift_left; + const int probes_per_dimension_in_probe_data = 1 << probe_data.layer_subdivision; + const int2 pos_in_probe_data = int2(probe_data.area_index % probes_per_dimension_in_probe_data, + probe_data.area_index / + probes_per_dimension_in_probe_data); + const int2 pos_in_location_finder = int2((pos_in_probe_data.x >> shift_right) << shift_left, + (pos_in_probe_data.y >> shift_right) << shift_left); + const int layer_offset = probe_data.layer * probes_per_layer_; + for (const int y : IndexRange(spots_per_dimension)) { + for (const int x : IndexRange(spots_per_dimension)) { + const int2 pos = pos_in_location_finder + int2(x, y); + const int area_index = pos.x + pos.y * probes_per_dimension_; taken_spots_[area_index + layer_offset].set(); } } -- 2.30.2 From 080ab8b8b63928a8d64e80303b4a0fff10cb945c Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 10 Jul 2023 10:43:28 +0200 Subject: [PATCH 083/115] Fix: Usage of Incorrect Compile Directive The WITH_VULKAN_BACKEND/WITH_METAL_BACKEND should be included per library. However when doing this we used an none existing compile directive for WITH_METAL_BACKEND. This wasn't detected as WITH_METAL_BACKEND is also defined globally. Pull Request: https://projects.blender.org/blender/blender/pulls/109896 --- source/blender/makesrna/intern/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt index d0b9be2dc01..fb40aedd0eb 100644 --- a/source/blender/makesrna/intern/CMakeLists.txt +++ b/source/blender/makesrna/intern/CMakeLists.txt @@ -411,8 +411,8 @@ if(WITH_XR_OPENXR) add_definitions(-DWITH_XR_OPENXR) endif() -if(WITH_VULKAN_METAL) - add_definitions(-DWITH_VULKAN_METAL) +if(WITH_METAL_BACKEND) + add_definitions(-DWITH_METAL_BACKEND) endif() if(WITH_VULKAN_BACKEND) -- 2.30.2 From fa4def46c86179232aad40038cfe7b274d70cbe6 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 10 Jul 2023 11:18:22 +0200 Subject: [PATCH 084/115] Cleanup: Remove Unused use_ambient_occusion Property `use_ambient_occlusion` is a legacy property and not connected to anything. The clip editor still write to it for enabling the ambient occlusion renderpass. This change will remove the legaccy option and won't enable ambient occlusion pass anymore due to visual and performance impact. Pull Request: https://projects.blender.org/blender/blender/pulls/109783 --- scripts/startup/bl_operators/clip.py | 3 +-- source/blender/makesdna/DNA_world_types.h | 2 +- source/blender/makesrna/intern/rna_world.cc | 8 -------- 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/scripts/startup/bl_operators/clip.py b/scripts/startup/bl_operators/clip.py index f7c4c47ccb9..9cc1c268765 100644 --- a/scripts/startup/bl_operators/clip.py +++ b/scripts/startup/bl_operators/clip.py @@ -564,8 +564,7 @@ class CLIP_OT_setup_tracking_scene(Operator): world = bpy.data.worlds.new(name="World") scene.world = world - # Having AO enabled is nice for shadow catcher. - world.light_settings.use_ambient_occlusion = True + # Setup ambient occlusion parameters for convenience. world.light_settings.distance = 1.0 if hasattr(scene, "cycles"): world.light_settings.ao_factor = 0.05 diff --git a/source/blender/makesdna/DNA_world_types.h b/source/blender/makesdna/DNA_world_types.h index 639517fb349..013abb1d592 100644 --- a/source/blender/makesdna/DNA_world_types.h +++ b/source/blender/makesdna/DNA_world_types.h @@ -97,7 +97,7 @@ enum { WO_MODE_UNUSED_3 = 1 << 3, /* cleared */ WO_MODE_UNUSED_4 = 1 << 4, /* cleared */ WO_MODE_UNUSED_5 = 1 << 5, /* cleared */ - WO_AMB_OCC = 1 << 6, + WO_MODE_UNUSED_6 = 1 << 6, /* cleared */ WO_MODE_UNUSED_7 = 1 << 7, /* cleared */ }; diff --git a/source/blender/makesrna/intern/rna_world.cc b/source/blender/makesrna/intern/rna_world.cc index 85914039fcc..bc95384e94a 100644 --- a/source/blender/makesrna/intern/rna_world.cc +++ b/source/blender/makesrna/intern/rna_world.cc @@ -130,14 +130,6 @@ static void rna_def_lighting(BlenderRNA *brna) RNA_def_struct_ui_text(srna, "Lighting", "Lighting for a World data-block"); /* ambient occlusion */ - prop = RNA_def_property(srna, "use_ambient_occlusion", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "mode", WO_AMB_OCC); - RNA_def_property_ui_text( - prop, - "Use Ambient Occlusion", - "Use Ambient Occlusion to add shadowing based on distance between objects"); - RNA_def_property_update(prop, 0, "rna_World_update"); - prop = RNA_def_property(srna, "ao_factor", PROP_FLOAT, PROP_FACTOR); RNA_def_property_float_sdna(prop, nullptr, "aoenergy"); RNA_def_property_range(prop, 0, INT_MAX); -- 2.30.2 From ab12d2836bb681a70012b5127bc434e3acd1883b Mon Sep 17 00:00:00 2001 From: Weizhen Huang Date: Mon, 10 Jul 2023 12:20:47 +0200 Subject: [PATCH 085/115] Cycles: add texture to sun light MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Using area-preserving mapping from cone to disk. Has somewhat distortion near 90°. The texture rotates with the transformation of the light object, can have negative and non-uniform scaling. Pull Request: https://projects.blender.org/blender/blender/pulls/109842 --- intern/cycles/kernel/light/distant.h | 28 +++++++++++++++++++++++++--- intern/cycles/kernel/light/light.h | 1 - intern/cycles/kernel/types.h | 2 ++ intern/cycles/scene/light.cpp | 1 + 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/intern/cycles/kernel/light/distant.h b/intern/cycles/kernel/light/distant.h index 0f1b2ea0179..ab9962c6b11 100644 --- a/intern/cycles/kernel/light/distant.h +++ b/intern/cycles/kernel/light/distant.h @@ -10,6 +10,27 @@ CCL_NAMESPACE_BEGIN +ccl_device_inline void distant_light_uv(const ccl_global KernelLight *klight, + const float3 D, + ccl_private float *u, + ccl_private float *v) +{ + /* Map direction (x, y, z) to disk [-0.5, 0.5]^2: + * r^2 = (1 - z) / (1 - cos(klight->distant.angle)) + * u_ = 0.5 * x * r / sin_angle(D, -klight->co) + * v_ = 0.5 * y * r / sin_angle(D, -klight->co) */ + const float fac = klight->distant.half_inv_sin_half_angle / len(D - klight->co); + + /* Get u axis and v axis. */ + const Transform itfm = klight->itfm; + const float u_ = dot(D, float4_to_float3(itfm.x)) * fac; + const float v_ = dot(D, float4_to_float3(itfm.y)) * fac; + + /* NOTE: Return barycentric coordinates in the same notation as Embree and OptiX. */ + *u = v_ + 0.5f; + *v = -u_ - v_; +} + ccl_device_inline bool distant_light_sample(const ccl_global KernelLight *klight, const float2 rand, ccl_private LightSample *ls) @@ -24,6 +45,8 @@ ccl_device_inline bool distant_light_sample(const ccl_global KernelLight *klight ls->eval_fac = klight->distant.eval_fac; + distant_light_uv(klight, ls->D, &ls->u, &ls->v); + return true; } @@ -92,9 +115,6 @@ ccl_device bool distant_light_sample_from_intersection(KernelGlobals kg, ls->object = PRIM_NONE; ls->prim = PRIM_NONE; ls->lamp = lamp; - /* todo: missing texture coordinates */ - ls->u = 0.0f; - ls->v = 0.0f; ls->t = FLT_MAX; ls->P = -ray_D; ls->Ng = -ray_D; @@ -104,6 +124,8 @@ ccl_device bool distant_light_sample_from_intersection(KernelGlobals kg, ls->pdf = klight->distant.pdf; ls->eval_fac = klight->distant.eval_fac; + distant_light_uv(klight, ray_D, &ls->u, &ls->v); + return true; } diff --git a/intern/cycles/kernel/light/light.h b/intern/cycles/kernel/light/light.h index b3f5b3e9b41..033c16e1120 100644 --- a/intern/cycles/kernel/light/light.h +++ b/intern/cycles/kernel/light/light.h @@ -462,7 +462,6 @@ ccl_device bool light_sample_from_intersection(KernelGlobals kg, ls->object = isect->object; ls->prim = isect->prim; ls->lamp = lamp; - /* todo: missing texture coordinates */ ls->t = isect->t; ls->P = ray_P + ray_D * ls->t; ls->D = ray_D; diff --git a/intern/cycles/kernel/types.h b/intern/cycles/kernel/types.h index 3fe479c6bac..3330dd6e7a7 100644 --- a/intern/cycles/kernel/types.h +++ b/intern/cycles/kernel/types.h @@ -1379,8 +1379,10 @@ typedef struct KernelAreaLight { typedef struct KernelDistantLight { float angle; float one_minus_cosangle; + float half_inv_sin_half_angle; float pdf; float eval_fac; + float pad[3]; } KernelDistantLight; typedef struct KernelLight { diff --git a/intern/cycles/scene/light.cpp b/intern/cycles/scene/light.cpp index 41cf86327c9..9afca00b48f 100644 --- a/intern/cycles/scene/light.cpp +++ b/intern/cycles/scene/light.cpp @@ -1253,6 +1253,7 @@ void LightManager::device_update_lights(Device *device, DeviceScene *dscene, Sce klights[light_index].distant.eval_fac = (light->normalize && angle > 0) ? M_1_PI_F / sqr(sinf(angle)) : 1.0f; + klights[light_index].distant.half_inv_sin_half_angle = 0.5f / sinf(0.5f * angle); } else if (light->light_type == LIGHT_BACKGROUND) { uint visibility = scene->background->get_visibility(); -- 2.30.2 From bfae400ea55b75be6389c3b18179f0b30595a367 Mon Sep 17 00:00:00 2001 From: Almaz-Shinbay Date: Mon, 10 Jul 2023 12:37:15 +0200 Subject: [PATCH 086/115] Outliner: Port edit bone elements to new tree-element code design No user visible changes expected. Part of #96713, continuation of work started in 249e4df110 and 2e221de4ce. Refer to these for a motivation and design overview. Adds a new class for edit bone elements. Pull Request: https://projects.blender.org/blender/blender/pulls/109793 --- .../editors/space_outliner/CMakeLists.txt | 2 ++ .../editors/space_outliner/outliner_intern.hh | 5 ++++ .../editors/space_outliner/outliner_tree.cc | 6 ++++- .../space_outliner/tree/tree_element.cc | 6 +++++ .../tree/tree_element_edit_bone.cc | 24 ++++++++++++++++++ .../tree/tree_element_edit_bone.hh | 25 +++++++++++++++++++ .../tree/tree_element_id_armature.cc | 5 ++-- 7 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 source/blender/editors/space_outliner/tree/tree_element_edit_bone.cc create mode 100644 source/blender/editors/space_outliner/tree/tree_element_edit_bone.hh diff --git a/source/blender/editors/space_outliner/CMakeLists.txt b/source/blender/editors/space_outliner/CMakeLists.txt index 7467de90295..cfd10ec134c 100644 --- a/source/blender/editors/space_outliner/CMakeLists.txt +++ b/source/blender/editors/space_outliner/CMakeLists.txt @@ -56,6 +56,7 @@ set(SRC tree/tree_element_bone.cc tree/tree_element_collection.cc tree/tree_element_driver.cc + tree/tree_element_edit_bone.cc tree/tree_element_gpencil_layer.cc tree/tree_element_id.cc tree/tree_element_id_armature.cc @@ -86,6 +87,7 @@ set(SRC tree/tree_element_bone.hh tree/tree_element_collection.hh tree/tree_element_driver.hh + tree/tree_element_edit_bone.hh tree/tree_element_gpencil_layer.hh tree/tree_element_id.hh tree/tree_element_id_armature.hh diff --git a/source/blender/editors/space_outliner/outliner_intern.hh b/source/blender/editors/space_outliner/outliner_intern.hh index 0c81fa90ba0..5ab885e524d 100644 --- a/source/blender/editors/space_outliner/outliner_intern.hh +++ b/source/blender/editors/space_outliner/outliner_intern.hh @@ -292,6 +292,11 @@ struct BoneElementCreateData { Bone *bone; }; +struct EditBoneElementCreateData { + ID *armature_id; + EditBone *ebone; +}; + TreeTraversalAction outliner_collect_selected_collections(TreeElement *te, void *customdata); TreeTraversalAction outliner_collect_selected_objects(TreeElement *te, void *customdata); diff --git a/source/blender/editors/space_outliner/outliner_tree.cc b/source/blender/editors/space_outliner/outliner_tree.cc index 80db1324507..f52df941f53 100644 --- a/source/blender/editors/space_outliner/outliner_tree.cc +++ b/source/blender/editors/space_outliner/outliner_tree.cc @@ -242,6 +242,9 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner, else if (type == TSE_BONE) { id = static_cast(idv)->armature_id; } + else if (type == TSE_EBONE) { + id = static_cast(idv)->armature_id; + } /* exceptions */ if (ELEM(type, TSE_ID_BASE, TSE_GENERIC_LABEL)) { @@ -297,7 +300,7 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner, else if (ELEM(type, TSE_ID_BASE, TSE_GENERIC_LABEL)) { /* pass */ } - else if (type == TSE_BONE) { + else if (ELEM(type, TSE_BONE, TSE_EBONE)) { /* pass */ } else if (type == TSE_SOME_ID) { @@ -337,6 +340,7 @@ TreeElement *outliner_add_element(SpaceOutliner *space_outliner, TSE_ANIM_DATA, TSE_BONE, TSE_DRIVER_BASE, + TSE_EBONE, TSE_NLA, TSE_NLA_ACTION, TSE_NLA_TRACK, diff --git a/source/blender/editors/space_outliner/tree/tree_element.cc b/source/blender/editors/space_outliner/tree/tree_element.cc index 083e27d57c7..c7cb80f520d 100644 --- a/source/blender/editors/space_outliner/tree/tree_element.cc +++ b/source/blender/editors/space_outliner/tree/tree_element.cc @@ -21,6 +21,7 @@ #include "tree_element_bone.hh" #include "tree_element_collection.hh" #include "tree_element_driver.hh" +#include "tree_element_edit_bone.hh" #include "tree_element_gpencil_layer.hh" #include "tree_element_id.hh" #include "tree_element_label.hh" @@ -108,6 +109,11 @@ std::unique_ptr AbstractTreeElement::createFromType(const i return std::make_unique( legacy_te, *bone_data->armature_id, *bone_data->bone); } + case TSE_EBONE: { + EditBoneElementCreateData *ebone_data = static_cast(idv); + return std::make_unique( + legacy_te, *ebone_data->armature_id, *ebone_data->ebone); + } default: break; } diff --git a/source/blender/editors/space_outliner/tree/tree_element_edit_bone.cc b/source/blender/editors/space_outliner/tree/tree_element_edit_bone.cc new file mode 100644 index 00000000000..28e8e200759 --- /dev/null +++ b/source/blender/editors/space_outliner/tree/tree_element_edit_bone.cc @@ -0,0 +1,24 @@ +/* SPDX-FileCopyrightText: 2023 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup spoutliner + */ + +#include "BKE_armature.h" + +#include "../outliner_intern.hh" + +#include "tree_element_edit_bone.hh" + +namespace blender::ed::outliner { + +TreeElementEditBone::TreeElementEditBone(TreeElement &legacy_te, ID &armature_id, EditBone &ebone) + : AbstractTreeElement(legacy_te), armature_id_(armature_id), ebone_(ebone) +{ + legacy_te.directdata = &ebone; + legacy_te.name = ebone.name; +} + +} // namespace blender::ed::outliner diff --git a/source/blender/editors/space_outliner/tree/tree_element_edit_bone.hh b/source/blender/editors/space_outliner/tree/tree_element_edit_bone.hh new file mode 100644 index 00000000000..abf9f539824 --- /dev/null +++ b/source/blender/editors/space_outliner/tree/tree_element_edit_bone.hh @@ -0,0 +1,25 @@ +/* SPDX-FileCopyrightText: 2023 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** \file + * \ingroup spoutliner + */ + +#pragma once + +#include "tree_element.hh" + +struct EditBone; + +namespace blender::ed::outliner { + +class TreeElementEditBone final : public AbstractTreeElement { + ID &armature_id_; + EditBone &ebone_; + + public: + TreeElementEditBone(TreeElement &legacy_te, ID &armature_id, EditBone &ebone); +}; + +} // namespace blender::ed::outliner diff --git a/source/blender/editors/space_outliner/tree/tree_element_id_armature.cc b/source/blender/editors/space_outliner/tree/tree_element_id_armature.cc index 5974961bde0..86c2c81e8f6 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_id_armature.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_id_armature.cc @@ -52,10 +52,9 @@ void TreeElementIDArmature::expand_edit_bones(SpaceOutliner &space_outiner) cons { int a = 0; LISTBASE_FOREACH_INDEX (EditBone *, ebone, arm_.edbo, a) { + EditBoneElementCreateData ebone_data = {&arm_.id, ebone}; TreeElement *ten = outliner_add_element( - &space_outiner, &legacy_te_.subtree, &arm_.id, &legacy_te_, TSE_EBONE, a); - ten->directdata = ebone; - ten->name = ebone->name; + &space_outiner, &legacy_te_.subtree, &ebone_data, &legacy_te_, TSE_EBONE, a); ebone->temp.p = ten; } /* make hierarchy */ -- 2.30.2 From f2705dd9133a2594a152a6e1d48580e9c35d746e Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 10 Jul 2023 12:41:44 +0200 Subject: [PATCH 087/115] Fix #109683: Cycles and Eevee missing AOVs when no closure connected No reason to skip these, and this will be useful for faster shader node preview rendering based on AOVs. Pull Request: https://projects.blender.org/blender/blender/pulls/109709 --- intern/cycles/scene/svm.cpp | 49 +++++++++---------- source/blender/gpu/intern/gpu_codegen.cc | 35 ++++++++++--- .../blender/nodes/shader/node_shader_tree.cc | 15 +++--- 3 files changed, 60 insertions(+), 39 deletions(-) diff --git a/intern/cycles/scene/svm.cpp b/intern/cycles/scene/svm.cpp index dda586cb2cd..f3391bd639e 100644 --- a/intern/cycles/scene/svm.cpp +++ b/intern/cycles/scene/svm.cpp @@ -774,39 +774,38 @@ void SVMCompiler::compile_type(Shader *shader, ShaderGraph *graph, ShaderType ty if (shader->reference_count()) { CompilerState state(graph); - if (clin->link) { - bool generate = false; - switch (type) { - case SHADER_TYPE_SURFACE: /* generate surface shader */ - generate = true; + switch (type) { + case SHADER_TYPE_SURFACE: /* generate surface shader */ + find_aov_nodes_and_dependencies(state.aov_nodes, graph, &state); + if (clin->link || state.aov_nodes.size() > 0) { shader->has_surface = true; state.node_feature_mask = KERNEL_FEATURE_NODE_MASK_SURFACE; - break; - case SHADER_TYPE_VOLUME: /* generate volume shader */ - generate = true; + } + break; + case SHADER_TYPE_VOLUME: /* generate volume shader */ + if (clin->link) { shader->has_volume = true; state.node_feature_mask = KERNEL_FEATURE_NODE_MASK_VOLUME; - break; - case SHADER_TYPE_DISPLACEMENT: /* generate displacement shader */ - generate = true; + } + break; + case SHADER_TYPE_DISPLACEMENT: /* generate displacement shader */ + if (clin->link) { shader->has_displacement = true; state.node_feature_mask = KERNEL_FEATURE_NODE_MASK_DISPLACEMENT; - break; - case SHADER_TYPE_BUMP: /* generate bump shader */ - generate = true; - state.node_feature_mask = KERNEL_FEATURE_NODE_MASK_BUMP; - break; - default: - break; - } - - if (generate) { - if (type == SHADER_TYPE_SURFACE) { - find_aov_nodes_and_dependencies(state.aov_nodes, graph, &state); } - generate_multi_closure(clin->link->parent, clin->link->parent, &state); - } + break; + case SHADER_TYPE_BUMP: /* generate bump shader */ + if (clin->link) { + state.node_feature_mask = KERNEL_FEATURE_NODE_MASK_BUMP; + } + break; + default: + break; + } + + if (clin->link) { + generate_multi_closure(clin->link->parent, clin->link->parent, &state); } /* compile output node */ diff --git a/source/blender/gpu/intern/gpu_codegen.cc b/source/blender/gpu/intern/gpu_codegen.cc index 4870c8c9b15..b6071f94c68 100644 --- a/source/blender/gpu/intern/gpu_codegen.cc +++ b/source/blender/gpu/intern/gpu_codegen.cc @@ -323,7 +323,9 @@ class GPUCodegen { void set_unique_ids(); void node_serialize(std::stringstream &eval_ss, const GPUNode *node); - char *graph_serialize(eGPUNodeTag tree_tag, GPUNodeLink *output_link); + char *graph_serialize(eGPUNodeTag tree_tag, + GPUNodeLink *output_link, + const char *output_default = nullptr); char *graph_serialize(eGPUNodeTag tree_tag); static char *extract_c_str(std::stringstream &stream) @@ -578,13 +580,16 @@ void GPUCodegen::node_serialize(std::stringstream &eval_ss, const GPUNode *node) nodes_total_++; } -char *GPUCodegen::graph_serialize(eGPUNodeTag tree_tag, GPUNodeLink *output_link) +char *GPUCodegen::graph_serialize(eGPUNodeTag tree_tag, + GPUNodeLink *output_link, + const char *output_default) { - if (output_link == nullptr) { + if (output_link == nullptr && output_default == nullptr) { return nullptr; } std::stringstream eval_ss; + bool has_nodes = false; /* NOTE: The node order is already top to bottom (or left to right in node editor) * because of the evaluation order inside ntreeExecGPUNodes(). */ LISTBASE_FOREACH (GPUNode *, node, &graph.nodes) { @@ -592,8 +597,20 @@ char *GPUCodegen::graph_serialize(eGPUNodeTag tree_tag, GPUNodeLink *output_link continue; } node_serialize(eval_ss, node); + has_nodes = true; + } + + if (!has_nodes) { + return nullptr; + } + + if (output_link) { + eval_ss << "return " << output_link->output << ";\n"; + } + else { + /* Default output in case there are only AOVs. */ + eval_ss << "return " << output_default << ";\n"; } - eval_ss << "return " << output_link->output << ";\n"; char *eval_c_str = extract_c_str(eval_ss); BLI_hash_mm2a_add(&hm2a_, (uchar *)eval_c_str, eval_ss.str().size()); @@ -667,10 +684,12 @@ void GPUCodegen::generate_graphs() { set_unique_ids(); - output.surface = graph_serialize(GPU_NODE_TAG_SURFACE | GPU_NODE_TAG_AOV, graph.outlink_surface); - output.volume = graph_serialize(GPU_NODE_TAG_VOLUME, graph.outlink_volume); - output.displacement = graph_serialize(GPU_NODE_TAG_DISPLACEMENT, graph.outlink_displacement); - output.thickness = graph_serialize(GPU_NODE_TAG_THICKNESS, graph.outlink_thickness); + output.surface = graph_serialize( + GPU_NODE_TAG_SURFACE | GPU_NODE_TAG_AOV, graph.outlink_surface, "CLOSURE_DEFAULT"); + output.volume = graph_serialize(GPU_NODE_TAG_VOLUME, graph.outlink_volume, "CLOSURE_DEFAULT"); + output.displacement = graph_serialize( + GPU_NODE_TAG_DISPLACEMENT, graph.outlink_displacement, nullptr); + output.thickness = graph_serialize(GPU_NODE_TAG_THICKNESS, graph.outlink_thickness, nullptr); if (!BLI_listbase_is_empty(&graph.outlink_compositor)) { output.composite = graph_serialize(GPU_NODE_TAG_COMPOSITOR); } diff --git a/source/blender/nodes/shader/node_shader_tree.cc b/source/blender/nodes/shader/node_shader_tree.cc index 80f96f02865..0c2585b9c60 100644 --- a/source/blender/nodes/shader/node_shader_tree.cc +++ b/source/blender/nodes/shader/node_shader_tree.cc @@ -1113,9 +1113,10 @@ static void ntree_shader_pruned_unused(bNodeTree *ntree, bNode *output_node) } /* Avoid deleting the output node if it is the only node in the tree. */ - output_node->runtime->tmp_flag = 1; - - blender::bke::nodeChainIterBackwards(ntree, output_node, ntree_branch_node_tag, nullptr, 0); + if (output_node) { + output_node->runtime->tmp_flag = 1; + blender::bke::nodeChainIterBackwards(ntree, output_node, ntree_branch_node_tag, nullptr, 0); + } LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { if (node->type == SH_NODE_OUTPUT_AOV) { @@ -1149,10 +1150,12 @@ void ntreeGPUMaterialNodes(bNodeTree *localtree, GPUMaterial *mat) /* Tree is valid if it contains no undefined implicit socket type cast. */ bool valid_tree = ntree_shader_implicit_closure_cast(localtree); - if (valid_tree && output != nullptr) { + if (valid_tree) { ntree_shader_pruned_unused(localtree, output); - ntree_shader_shader_to_rgba_branch(localtree, output); - ntree_shader_weight_tree_invert(localtree, output); + if (output != nullptr) { + ntree_shader_shader_to_rgba_branch(localtree, output); + ntree_shader_weight_tree_invert(localtree, output); + } } exec = ntreeShaderBeginExecTree(localtree); -- 2.30.2 From f07fee01887e09d25ddd03c71db55316fc4a5a50 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Mon, 10 Jul 2023 12:43:58 +0200 Subject: [PATCH 088/115] UI Translations: Add bunch of nissing error messages from IO C++ code and modifiers. Also fix some incorrect usages of `N_` macro instead of `TIP_` one (these error messages typically need to get translated explicitely, not only marked for extraction). --- .../io/alembic/intern/abc_reader_camera.cc | 6 ++-- .../io/alembic/intern/abc_reader_curves.cc | 8 ++--- .../io/alembic/intern/abc_reader_mesh.cc | 30 +++++++++---------- .../io/alembic/intern/abc_reader_nurbs.cc | 6 ++-- .../io/alembic/intern/abc_reader_points.cc | 8 ++--- .../io/alembic/intern/abc_reader_transform.cc | 6 ++-- .../blender/io/alembic/intern/alembic_capi.cc | 4 ++- .../blender/io/usd/intern/usd_capi_import.cc | 4 ++- .../modifiers/intern/MOD_meshcache_mdd.cc | 20 +++++++------ .../modifiers/intern/MOD_meshcache_pc2.cc | 16 +++++----- source/blender/render/intern/render_result.cc | 2 +- 11 files changed, 59 insertions(+), 51 deletions(-) diff --git a/source/blender/io/alembic/intern/abc_reader_camera.cc b/source/blender/io/alembic/intern/abc_reader_camera.cc index 6a11b19740b..aba0b43c1b8 100644 --- a/source/blender/io/alembic/intern/abc_reader_camera.cc +++ b/source/blender/io/alembic/intern/abc_reader_camera.cc @@ -49,14 +49,14 @@ bool AbcCameraReader::accepts_object_type( const char **err_str) const { if (!Alembic::AbcGeom::ICamera::matches(alembic_header)) { - *err_str = N_( + *err_str = TIP_( "Object type mismatch, Alembic object path pointed to Camera when importing, but not any " - "more."); + "more"); return false; } if (ob->type != OB_CAMERA) { - *err_str = N_("Object type mismatch, Alembic object path points to Camera."); + *err_str = TIP_("Object type mismatch, Alembic object path points to Camera"); return false; } diff --git a/source/blender/io/alembic/intern/abc_reader_curves.cc b/source/blender/io/alembic/intern/abc_reader_curves.cc index 02f814a3ce1..9d814ef5b04 100644 --- a/source/blender/io/alembic/intern/abc_reader_curves.cc +++ b/source/blender/io/alembic/intern/abc_reader_curves.cc @@ -63,14 +63,14 @@ bool AbcCurveReader::accepts_object_type( const char **err_str) const { if (!Alembic::AbcGeom::ICurves::matches(alembic_header)) { - *err_str = N_( + *err_str = TIP_( "Object type mismatch, Alembic object path pointed to Curves when importing, but not any " - "more."); + "more"); return false; } if (ob->type != OB_CURVES_LEGACY) { - *err_str = N_("Object type mismatch, Alembic object path points to Curves."); + *err_str = TIP_("Object type mismatch, Alembic object path points to Curves"); return false; } @@ -274,7 +274,7 @@ Mesh *AbcCurveReader::read_mesh(Mesh *existing_mesh, sample = m_curves_schema.getValue(sample_sel); } catch (Alembic::Util::Exception &ex) { - *err_str = "Error reading curve sample; more detail on the console"; + *err_str = TIP_("Error reading curve sample; more detail on the console"); printf("Alembic: error reading curve sample for '%s/%s' at time %f: %s\n", m_iobject.getFullName().c_str(), m_curves_schema.getName().c_str(), diff --git a/source/blender/io/alembic/intern/abc_reader_mesh.cc b/source/blender/io/alembic/intern/abc_reader_mesh.cc index 41e36cec186..e6ed81b4661 100644 --- a/source/blender/io/alembic/intern/abc_reader_mesh.cc +++ b/source/blender/io/alembic/intern/abc_reader_mesh.cc @@ -669,14 +669,14 @@ bool AbcMeshReader::accepts_object_type( const char **err_str) const { if (!Alembic::AbcGeom::IPolyMesh::matches(alembic_header)) { - *err_str = N_( + *err_str = TIP_( "Object type mismatch, Alembic object path pointed to PolyMesh when importing, but not " - "any more."); + "any more"); return false; } if (ob->type != OB_MESH) { - *err_str = N_("Object type mismatch, Alembic object path points to PolyMesh."); + *err_str = TIP_("Object type mismatch, Alembic object path points to PolyMesh"); return false; } @@ -759,7 +759,7 @@ Mesh *AbcMeshReader::read_mesh(Mesh *existing_mesh, } catch (Alembic::Util::Exception &ex) { if (err_str != nullptr) { - *err_str = "Error reading mesh sample; more detail on the console"; + *err_str = TIP_("Error reading mesh sample; more detail on the console"); } printf("Alembic: error reading mesh sample for '%s/%s' at time %f: %s\n", m_iobject.getFullName().c_str(), @@ -779,7 +779,7 @@ Mesh *AbcMeshReader::read_mesh(Mesh *existing_mesh, /* This is the same test as in poly_to_tri_count(). */ if (poly_count > 0 && loop_count < poly_count * 2) { if (err_str != nullptr) { - *err_str = "Invalid mesh; more detail on the console"; + *err_str = TIP_("Invalid mesh; more detail on the console"); } printf("Alembic: invalid mesh sample for '%s/%s' at time %f, less than 2 loops per face\n", m_iobject.getFullName().c_str(), @@ -812,9 +812,9 @@ Mesh *AbcMeshReader::read_mesh(Mesh *existing_mesh, settings.read_flag = MOD_MESHSEQ_READ_VERT; if (err_str) { - *err_str = - "Topology has changed, perhaps by triangulating the" - " mesh. Only vertices will be read!"; + *err_str = TIP_( + "Topology has changed, perhaps by triangulating the mesh. Only vertices will be " + "read!"); } } } @@ -1050,14 +1050,14 @@ bool AbcSubDReader::accepts_object_type( const char **err_str) const { if (!Alembic::AbcGeom::ISubD::matches(alembic_header)) { - *err_str = N_( + *err_str = TIP_( "Object type mismatch, Alembic object path pointed to SubD when importing, but not any " - "more."); + "more"); return false; } if (ob->type != OB_MESH) { - *err_str = N_("Object type mismatch, Alembic object path points to SubD."); + *err_str = TIP_("Object type mismatch, Alembic object path points to SubD"); return false; } @@ -1115,7 +1115,7 @@ Mesh *AbcSubDReader::read_mesh(Mesh *existing_mesh, } catch (Alembic::Util::Exception &ex) { if (err_str != nullptr) { - *err_str = "Error reading mesh sample; more detail on the console"; + *err_str = TIP_("Error reading mesh sample; more detail on the console"); } printf("Alembic: error reading mesh sample for '%s/%s' at time %f: %s\n", m_iobject.getFullName().c_str(), @@ -1152,9 +1152,9 @@ Mesh *AbcSubDReader::read_mesh(Mesh *existing_mesh, settings.read_flag = MOD_MESHSEQ_READ_VERT; if (err_str) { - *err_str = - "Topology has changed, perhaps by triangulating the" - " mesh. Only vertices will be read!"; + *err_str = TIP_( + "Topology has changed, perhaps by triangulating the mesh. Only vertices will be " + "read!"); } } } diff --git a/source/blender/io/alembic/intern/abc_reader_nurbs.cc b/source/blender/io/alembic/intern/abc_reader_nurbs.cc index 8ad3a5233f5..8d6196796c2 100644 --- a/source/blender/io/alembic/intern/abc_reader_nurbs.cc +++ b/source/blender/io/alembic/intern/abc_reader_nurbs.cc @@ -67,14 +67,14 @@ bool AbcNurbsReader::accepts_object_type( const char **err_str) const { if (!Alembic::AbcGeom::INuPatch::matches(alembic_header)) { - *err_str = N_( + *err_str = TIP_( "Object type mismatch, Alembic object path pointed to NURBS when importing, but not any " - "more."); + "more"); return false; } if (ob->type != OB_CURVES_LEGACY) { - *err_str = N_("Object type mismatch, Alembic object path points to NURBS."); + *err_str = TIP_("Object type mismatch, Alembic object path points to NURBS"); return false; } diff --git a/source/blender/io/alembic/intern/abc_reader_points.cc b/source/blender/io/alembic/intern/abc_reader_points.cc index fad932abc73..b3b9a6ea87b 100644 --- a/source/blender/io/alembic/intern/abc_reader_points.cc +++ b/source/blender/io/alembic/intern/abc_reader_points.cc @@ -52,14 +52,14 @@ bool AbcPointsReader::accepts_object_type( const char **err_str) const { if (!Alembic::AbcGeom::IPoints::matches(alembic_header)) { - *err_str = N_( + *err_str = TIP_( "Object type mismatch, Alembic object path pointed to Points when importing, but not any " - "more."); + "more"); return false; } if (ob->type != OB_MESH) { - *err_str = N_("Object type mismatch, Alembic object path points to Points."); + *err_str = TIP_("Object type mismatch, Alembic object path points to Points"); return false; } @@ -123,7 +123,7 @@ Mesh *AbcPointsReader::read_mesh(Mesh *existing_mesh, sample = m_schema.getValue(sample_sel); } catch (Alembic::Util::Exception &ex) { - *err_str = "Error reading points sample; more detail on the console"; + *err_str = TIP_("Error reading points sample; more detail on the console"); printf("Alembic: error reading points sample for '%s/%s' at time %f: %s\n", m_iobject.getFullName().c_str(), m_schema.getName().c_str(), diff --git a/source/blender/io/alembic/intern/abc_reader_transform.cc b/source/blender/io/alembic/intern/abc_reader_transform.cc index 671d239605d..17615809183 100644 --- a/source/blender/io/alembic/intern/abc_reader_transform.cc +++ b/source/blender/io/alembic/intern/abc_reader_transform.cc @@ -45,14 +45,14 @@ bool AbcEmptyReader::accepts_object_type( const char **err_str) const { if (!Alembic::AbcGeom::IXform::matches(alembic_header)) { - *err_str = N_( + *err_str = TIP_( "Object type mismatch, Alembic object path pointed to XForm when importing, but not any " - "more."); + "more"); return false; } if (ob->type != OB_EMPTY) { - *err_str = N_("Object type mismatch, Alembic object path points to XForm."); + *err_str = TIP_("Object type mismatch, Alembic object path points to XForm"); return false; } diff --git a/source/blender/io/alembic/intern/alembic_capi.cc b/source/blender/io/alembic/intern/alembic_capi.cc index 553d3c52a46..a778d0c8123 100644 --- a/source/blender/io/alembic/intern/alembic_capi.cc +++ b/source/blender/io/alembic/intern/alembic_capi.cc @@ -54,6 +54,8 @@ #include "BLI_string.h" #include "BLI_timeit.hh" +#include "BLT_translation.h" + #include "WM_api.h" #include "WM_types.h" @@ -773,7 +775,7 @@ static AbcObjectReader *get_abc_reader(CacheReader *reader, Object *ob, const ch IObject iobject = abc_reader->iobject(); if (!iobject.valid()) { - *err_str = "Invalid object: verify object path"; + *err_str = TIP_("Invalid object: verify object path"); return nullptr; } diff --git a/source/blender/io/usd/intern/usd_capi_import.cc b/source/blender/io/usd/intern/usd_capi_import.cc index b31012282df..b1be5a356a5 100644 --- a/source/blender/io/usd/intern/usd_capi_import.cc +++ b/source/blender/io/usd/intern/usd_capi_import.cc @@ -32,6 +32,8 @@ #include "BLI_string.h" #include "BLI_timeit.hh" +#include "BLT_translation.h" + #include "DEG_depsgraph.h" #include "DEG_depsgraph_build.h" #include "DEG_depsgraph_query.h" @@ -479,7 +481,7 @@ static USDPrimReader *get_usd_reader(CacheReader *reader, pxr::UsdPrim iobject = usd_reader->prim(); if (!iobject.IsValid()) { - *err_str = "Invalid object: verify object path"; + *err_str = TIP_("Invalid object: verify object path"); return nullptr; } diff --git a/source/blender/modifiers/intern/MOD_meshcache_mdd.cc b/source/blender/modifiers/intern/MOD_meshcache_mdd.cc index 3a2a572a59f..7bcfef25309 100644 --- a/source/blender/modifiers/intern/MOD_meshcache_mdd.cc +++ b/source/blender/modifiers/intern/MOD_meshcache_mdd.cc @@ -21,6 +21,8 @@ # include "BLI_winstuff.h" #endif +#include "BLT_translation.h" + #include "DNA_modifier_types.h" #include "MOD_meshcache_util.hh" /* own include */ @@ -36,7 +38,7 @@ static bool meshcache_read_mdd_head(FILE *fp, const char **err_str) { if (!fread(mdd_head, sizeof(*mdd_head), 1, fp)) { - *err_str = "Missing header"; + *err_str = TIP_("Missing header"); return false; } @@ -45,12 +47,12 @@ static bool meshcache_read_mdd_head(FILE *fp, #endif if (mdd_head->verts_tot != verts_tot) { - *err_str = "Vertex count mismatch"; + *err_str = TIP_("Vertex count mismatch"); return false; } if (mdd_head->frame_tot <= 0) { - *err_str = "Invalid frame total"; + *err_str = TIP_("Invalid frame total"); return false; } /* Intentionally don't seek back. */ @@ -114,7 +116,7 @@ static bool meshcache_read_mdd_range_from_time(FILE *fp, } if (frames_num_read != frames_num_expect) { - *err_str = errno ? strerror(errno) : "Timestamp read failed"; + *err_str = errno ? strerror(errno) : TIP_("Timestamp read failed"); return false; } @@ -150,12 +152,12 @@ bool MOD_meshcache_read_mdd_index(FILE *fp, } if (BLI_fseek(fp, mdd_head.frame_tot * sizeof(int), SEEK_CUR) != 0) { - *err_str = "Header seek failed"; + *err_str = TIP_("Header seek failed"); return false; } if (BLI_fseek(fp, sizeof(float[3]) * index * mdd_head.verts_tot, SEEK_CUR) != 0) { - *err_str = "Failed to seek frame"; + *err_str = TIP_("Failed to seek frame"); return false; } @@ -177,7 +179,7 @@ bool MOD_meshcache_read_mdd_index(FILE *fp, #else /* no blending */ if (!fread(vertexCos, sizeof(float[3]), mdd_head.verts_tot, f)) { - *err_str = errno ? strerror(errno) : "Failed to read frame"; + *err_str = errno ? strerror(errno) : TIP_("Failed to read frame"); return false; } # ifdef __LITTLE_ENDIAN__ @@ -206,7 +208,7 @@ bool MOD_meshcache_read_mdd_index(FILE *fp, } if (verts_read_num != mdd_head.verts_tot) { - *err_str = errno ? strerror(errno) : "Vertex coordinate read failed"; + *err_str = errno ? strerror(errno) : TIP_("Vertex coordinate read failed"); return false; } @@ -272,7 +274,7 @@ bool MOD_meshcache_read_mdd_times(const char *filepath, bool ok; if (fp == nullptr) { - *err_str = errno ? strerror(errno) : "Unknown error opening file"; + *err_str = errno ? strerror(errno) : TIP_("Unknown error opening file"); return false; } diff --git a/source/blender/modifiers/intern/MOD_meshcache_pc2.cc b/source/blender/modifiers/intern/MOD_meshcache_pc2.cc index c8c812427ad..7c9b8bc3303 100644 --- a/source/blender/modifiers/intern/MOD_meshcache_pc2.cc +++ b/source/blender/modifiers/intern/MOD_meshcache_pc2.cc @@ -21,6 +21,8 @@ # include "BLI_winstuff.h" #endif +#include "BLT_translation.h" + #include "DNA_modifier_types.h" #include "MOD_meshcache_util.hh" /* own include */ @@ -40,12 +42,12 @@ static bool meshcache_read_pc2_head(FILE *fp, const char **err_str) { if (!fread(pc2_head, sizeof(*pc2_head), 1, fp)) { - *err_str = "Missing header"; + *err_str = TIP_("Missing header"); return false; } if (!STREQ(pc2_head->header, "POINTCACHE2")) { - *err_str = "Invalid header"; + *err_str = TIP_("Invalid header"); return false; } @@ -55,12 +57,12 @@ static bool meshcache_read_pc2_head(FILE *fp, #endif if (pc2_head->verts_tot != verts_tot) { - *err_str = "Vertex count mismatch"; + *err_str = TIP_("Vertex count mismatch"); return false; } if (pc2_head->frame_tot <= 0) { - *err_str = "Invalid frame total"; + *err_str = TIP_("Invalid frame total"); return false; } /* Intentionally don't seek back. */ @@ -135,7 +137,7 @@ bool MOD_meshcache_read_pc2_index(FILE *fp, } if (BLI_fseek(fp, sizeof(float[3]) * index * pc2_head.verts_tot, SEEK_CUR) != 0) { - *err_str = "Failed to seek frame"; + *err_str = TIP_("Failed to seek frame"); return false; } @@ -175,7 +177,7 @@ bool MOD_meshcache_read_pc2_index(FILE *fp, } if (verts_read_num != pc2_head.verts_tot) { - *err_str = errno ? strerror(errno) : "Vertex coordinate read failed"; + *err_str = errno ? strerror(errno) : TIP_("Vertex coordinate read failed"); return false; } @@ -241,7 +243,7 @@ bool MOD_meshcache_read_pc2_times(const char *filepath, bool ok; if (fp == nullptr) { - *err_str = errno ? strerror(errno) : "Unknown error opening file"; + *err_str = errno ? strerror(errno) : TIP_("Unknown error opening file"); return false; } diff --git a/source/blender/render/intern/render_result.cc b/source/blender/render/intern/render_result.cc index 686f46cc340..2ac427ffcf6 100644 --- a/source/blender/render/intern/render_result.cc +++ b/source/blender/render/intern/render_result.cc @@ -842,7 +842,7 @@ bool render_result_exr_file_read_path(RenderResult *rr, if (rectx != expected_rectx || recty != expected_recty) { BKE_reportf(reports, RPT_ERROR, - "reading render result: dimensions don't match, expected %dx%d", + "Reading render result: dimensions don't match, expected %dx%d", expected_rectx, expected_recty); IMB_exr_close(exrhandle); -- 2.30.2 From 2f5245b4340ac790a8fe7f18e606be2294a5c1bd Mon Sep 17 00:00:00 2001 From: Damien Picard Date: Sun, 9 Jul 2023 17:22:24 +0200 Subject: [PATCH 089/115] I18n: extract single message from multiview stereo The "Single file with all the views" message was not extracted because it is an enum item that was not exposed to the RNA, but only selectable in some cases depending on the `RNA_def_property_enum_funcs()`. This commit changes the `RNA_def_property_enum_items()` so that this enum item is exposed to the RNA. Pull Request: https://projects.blender.org/blender/blender/pulls/109876 --- source/blender/makesrna/intern/rna_scene.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/makesrna/intern/rna_scene.cc b/source/blender/makesrna/intern/rna_scene.cc index 3194b181adc..09879c9b558 100644 --- a/source/blender/makesrna/intern/rna_scene.cc +++ b/source/blender/makesrna/intern/rna_scene.cc @@ -5986,7 +5986,7 @@ static void rna_def_scene_image_format_data(BlenderRNA *brna) /* multiview */ prop = RNA_def_property(srna, "views_format", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, nullptr, "views_format"); - RNA_def_property_enum_items(prop, rna_enum_views_format_items); + RNA_def_property_enum_items(prop, rna_enum_views_format_multiview_items); RNA_def_property_enum_funcs( prop, nullptr, nullptr, "rna_ImageFormatSettings_views_format_itemf"); RNA_def_property_ui_text(prop, "Views Format", "Format of multiview media"); -- 2.30.2 From d94edda4fd3ffef552f8b485bff3d4028c60d7bf Mon Sep 17 00:00:00 2001 From: Julian Eisel Date: Mon, 10 Jul 2023 12:53:41 +0200 Subject: [PATCH 090/115] UI: Improve region resize edge detection for transparent regions For overlapping regions, we currently offset the edge for resizing regions a bit towards the contents. This makes sense for example in the sidebar, where the region background is fully transparent by default, and users expect the edge to be where the visible contents begin. This was an issue in #104831 for two reasons: - Although the region overlaps, we decided to make it fully opaque by default. The offset is still applied, making the edge detection feel broken. - The offset would also be applied to header-like regions, where there is not much padding between the edge and the content. So the edge to resize the region would overlap buttons. 2 changes to address this: - Only apply the offset if the region background is transparent-ish, with a rather arbitrary alpha threshold. - Do not apply the offset for header-like regions. Pull Request: https://projects.blender.org/blender/blender/pulls/109753 --- source/blender/editors/screen/area.cc | 38 +++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/screen/area.cc b/source/blender/editors/screen/area.cc index ddfb0d36ce1..77bd2d5b572 100644 --- a/source/blender/editors/screen/area.cc +++ b/source/blender/editors/screen/area.cc @@ -930,13 +930,41 @@ static void fullscreen_azone_init(ScrArea *area, ARegion *region) BLI_rcti_init(&az->rect, az->x1, az->x2, az->y1, az->y2); } +/** + * Return true if the background color alpha is close to fully transparent. That is, a value of + * less than 50 on a [0-255] scale (rather arbitrary threshold). Assumes the region uses #TH_BACK + * for its background. + */ +static bool region_background_is_transparent(const ScrArea *area, const ARegion *region) +{ + /* Ensure the right theme is active, may not be the case on startup, for example. */ + bThemeState theme_state; + UI_Theme_Store(&theme_state); + UI_SetTheme(area->spacetype, region->regiontype); + + uchar back[4]; + UI_GetThemeColor4ubv(TH_BACK, back); + + UI_Theme_Restore(&theme_state); + + return back[3] < 50; +} + #define AZONEPAD_EDGE (0.1f * U.widget_unit) #define AZONEPAD_ICON (0.45f * U.widget_unit) -static void region_azone_edge(AZone *az, ARegion *region) +static void region_azone_edge(const ScrArea *area, AZone *az, const ARegion *region) { - /* If region is overlapped (transparent background), move #AZone to content. - * Note this is an arbitrary amount that matches nicely with numbers elsewhere. */ - int overlap_padding = (region->overlap) ? int(0.4f * U.widget_unit) : 0; + /* If there is no visible region background, users typically expect the #AZone to be closer to + * the content, so move it a bit. */ + const int overlap_padding = + /* Header-like regions are usually thin and there's not much padding around them, + * applying an offset would make the edge overlap buttons.*/ + (!RGN_TYPE_IS_HEADER_ANY(region->regiontype) && + /* Is the region background transparent? */ + region->overlap && region_background_is_transparent(area, region)) ? + /* Note that this is an arbitrary amount that matches nicely with numbers elsewhere. */ + int(0.4f * U.widget_unit) : + 0; switch (az->edge) { case AE_TOP_TO_BOTTOMRIGHT: @@ -1053,7 +1081,7 @@ static void region_azone_edge_init(ScrArea *area, region_azone_tab_plus(area, az, region); } else { - region_azone_edge(az, region); + region_azone_edge(area, az, region); } } -- 2.30.2 From 9f0720fa2d6be7231cfa193a86fa0b35b969db9d Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Mon, 10 Jul 2023 07:00:58 -0400 Subject: [PATCH 091/115] Progress --- .../editors/sculpt_paint/paint_vertex.cc | 1506 ++++++++--------- 1 file changed, 730 insertions(+), 776 deletions(-) diff --git a/source/blender/editors/sculpt_paint/paint_vertex.cc b/source/blender/editors/sculpt_paint/paint_vertex.cc index 4a6a13500c8..6fd4b212d47 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.cc +++ b/source/blender/editors/sculpt_paint/paint_vertex.cc @@ -2981,6 +2981,7 @@ static void do_vpaint_brush_blur_loops(bContext *C, to_static_color_type(vpd->type, [&](auto dummy) { using Color = decltype(dummy); + // using Traits = using Blend = typename Traits::BlendType; /* Get the average poly color */ Color color_final(0, 0, 0, 0); @@ -3028,59 +3029,25 @@ static void do_vpaint_brush_blur_loops(bContext *C, } Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ - if (previous_color != nullptr) { + if (!previous_color.is_empty()) { /* Get the previous loop color */ if (isZero(previous_color[l_index])) { previous_color[l_index] = lcol[l_index]; } + color_orig = previous_color[l_index]; } - - if (total_hit_loops == 0) { - continue; - } - - /* Use rgb^2 color averaging. */ - Color *col = &; - - color_final.r = Traits::round(sqrtf(Traits::divide_round(blend[0], total_hit_loops))); - color_final.g = Traits::round(sqrtf(Traits::divide_round(blend[1], total_hit_loops))); - color_final.b = Traits::round(sqrtf(Traits::divide_round(blend[2], total_hit_loops))); - color_final.a = Traits::round(sqrtf(Traits::divide_round(blend[3], total_hit_loops))); - - /* For each poly owning this vert, - * paint each loop belonging to this vert. */ - for (const int j : gmap->vert_to_poly[v_index].index_range()) { - const int p_index = gmap->vert_to_poly[v_index][j]; - const int l_index = gmap->vert_to_loop[v_index][j]; - BLI_assert(ss->corner_verts[l_index] == v_index); - if (use_face_sel && !select_poly[p_index]) { - continue; - } - Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ - - if (previous_color != nullptr) { - /* Get the previous loop color */ - if (isZero(previous_color[l_index])) { - previous_color[l_index] = lcol[l_index]; - } - color_orig = previous_color[l_index]; - } - const float final_alpha = Traits::range * brush_fade * brush_strength * - brush_alpha_pressure * grid_alpha; - /* Mix the new color with the original - * based on the brush strength and the curve. */ - lcol[l_index] = vpaint_blend(vp, - lcol[l_index], - color_orig, - *col, - final_alpha, - Traits::range * brush_strength); - } - }); + const float final_alpha = Traits::range * brush_fade * brush_strength * + brush_alpha_pressure * grid_alpha; + /* Mix the new color with the original + * based on the brush strength and the curve. */ + lcol[l_index] = vpaint_blend( + vp, lcol[l_index], color_orig, *col, final_alpha, Traits::range * brush_strength); + } + }); } BKE_pbvh_vertex_iter_end; - }; - }); + }; + }); } static void do_vpaint_brush_blur_verts(bContext *C, @@ -3092,136 +3059,130 @@ static void do_vpaint_brush_blur_verts(bContext *C, Span nodes, GMutableSpan lcol) { - SculptSession *ss = ob->sculpt; + SculptSession *ss = ob->sculpt; - const Brush *brush = ob->sculpt->cache->brush; - const Scene *scene = CTX_data_scene(C); + const Brush *brush = ob->sculpt->cache->brush; + const Scene *scene = CTX_data_scene(C); - GMutableSpan previous_color = ss->cache->prev_colors_vpaint; + GMutableSpan previous_color = ss->cache->prev_colors_vpaint; - const blender::VArray select_vert = *me->attributes().lookup_or_default( - ".select_vert", ATTR_DOMAIN_POINT, false); - const blender::VArray select_poly = *me->attributes().lookup_or_default( - ".select_poly", ATTR_DOMAIN_FACE, false); + const blender::VArray select_vert = *me->attributes().lookup_or_default( + ".select_vert", ATTR_DOMAIN_POINT, false); + const blender::VArray select_poly = *me->attributes().lookup_or_default( + ".select_poly", ATTR_DOMAIN_FACE, false); - blender::threading::parallel_for(nodes.index_range(), 1LL, [&](IndexRange range) { - for (int n : range) { - const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh); - const bool has_grids = (pbvh_type == PBVH_GRIDS); + blender::threading::parallel_for(nodes.index_range(), 1LL, [&](IndexRange range) { + for (int n : range) { + const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh); + const bool has_grids = (pbvh_type == PBVH_GRIDS); - const SculptVertexPaintGeomMap *gmap = &ss->mode.vpaint.gmap; - const StrokeCache *cache = ss->cache; - float brush_size_pressure, brush_alpha_value, brush_alpha_pressure; - get_brush_alpha_data( - scene, ss, brush, &brush_size_pressure, &brush_alpha_value, &brush_alpha_pressure); - const bool use_normal = vwpaint_use_normal(vp); - const bool use_vert_sel = (me->editflag & - (ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL)) != 0; - const bool use_face_sel = (me->editflag & ME_EDIT_PAINT_FACE_SEL) != 0; + const SculptVertexPaintGeomMap *gmap = &ss->mode.vpaint.gmap; + const StrokeCache *cache = ss->cache; + float brush_size_pressure, brush_alpha_value, brush_alpha_pressure; + get_brush_alpha_data( + scene, ss, brush, &brush_size_pressure, &brush_alpha_value, &brush_alpha_pressure); + const bool use_normal = vwpaint_use_normal(vp); + const bool use_vert_sel = (me->editflag & + (ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL)) != 0; + const bool use_face_sel = (me->editflag & ME_EDIT_PAINT_FACE_SEL) != 0; - SculptBrushTest test; - SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( - ss, &test, brush->falloff_shape); - const float *sculpt_normal_frontface = SCULPT_brush_frontface_normal_from_falloff_shape( - ss, brush->falloff_shape); + SculptBrushTest test; + SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( + ss, &test, brush->falloff_shape); + const float *sculpt_normal_frontface = SCULPT_brush_frontface_normal_from_falloff_shape( + ss, brush->falloff_shape); - /* For each vertex */ - PBVHVertexIter vd; - BKE_pbvh_vertex_iter_begin (ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { - /* Test to see if the vertex coordinates are within the spherical brush region. */ - if (!sculpt_brush_test_sq_fn(&test, vd.co)) { - continue; - } - /* For grid based pbvh, take the vert whose loop corresponds to the current grid. - * Otherwise, take the current vert. */ - const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : - vd.vert_indices[vd.i]; - const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f; + /* For each vertex */ + PBVHVertexIter vd; + BKE_pbvh_vertex_iter_begin (ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + /* Test to see if the vertex coordinates are within the spherical brush region. */ + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + /* For grid based pbvh, take the vert whose loop corresponds to the current grid. + * Otherwise, take the current vert. */ + const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : + vd.vert_indices[vd.i]; + const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f; - /* If the vertex is selected for painting. */ - if (use_vert_sel && !select_vert[v_index]) { - continue; - } + /* If the vertex is selected for painting. */ + if (use_vert_sel && !select_vert[v_index]) { + continue; + } - float brush_strength = cache->bstrength; - const float angle_cos = (use_normal && vd.no) ? - dot_v3v3(sculpt_normal_frontface, vd.no) : - 1.0f; - if (!test_brush_angle_falloff( - *brush, vpd->normal_angle_precalc, angle_cos, &brush_strength)) { - continue; - } - const float brush_fade = BKE_brush_curve_strength( - brush, sqrtf(test.dist), cache->radius); + float brush_strength = cache->bstrength; + const float angle_cos = (use_normal && vd.no) ? dot_v3v3(sculpt_normal_frontface, vd.no) : + 1.0f; + if (!test_brush_angle_falloff( + *brush, vpd->normal_angle_precalc, angle_cos, &brush_strength)) { + continue; + } + const float brush_fade = BKE_brush_curve_strength(brush, sqrtf(test.dist), cache->radius); - /* Get the average poly color */ - to_static_color_type(vpd->type, [&](auto dummy) { - using Color = decltype(dummy); - using Blend = typename Traits::BlendType; - Color color_final(0, 0, 0, 0); + /* Get the average poly color */ + to_static_color_type(vpd->type, [&](auto dummy) { + using Color = decltype(dummy); + using Blend = typename Traits::BlendType; + Color color_final(0, 0, 0, 0); - int total_hit_loops = 0; - Blend blend[4] = {0}; + int total_hit_loops = 0; + Blend blend[4] = {0}; - for (const int p_index : gmap->vert_to_poly[v_index]) { - if (use_face_sel && !select_poly[p_index]) { - continue; - } - const blender::IndexRange poly = ss->polys[p_index]; - total_hit_loops += poly.size(); - for (const int vert : ss->corner_verts.slice(poly)) { - Color *col = lcol + vert; - - /* Color is squared to compensate the `sqrt` color encoding. */ - blend[0] += (Blend)col->r * (Blend)col->r; - blend[1] += (Blend)col->g * (Blend)col->g; - blend[2] += (Blend)col->b * (Blend)col->b; - blend[3] += (Blend)col->a * (Blend)col->a; - } - } - - if (total_hit_loops == 0) { + for (const int p_index : gmap->vert_to_poly[v_index]) { + if (use_face_sel && !select_poly[p_index]) { continue; } - /* Use rgb^2 color averaging. */ - Color *col = &color_final; + const blender::IndexRange poly = ss->polys[p_index]; + total_hit_loops += poly.size(); + for (const int vert : ss->corner_verts.slice(poly)) { + Color *col = lcol + vert; - color_final.r = Traits::round(sqrtf(Traits::divide_round(blend[0], total_hit_loops))); - color_final.g = Traits::round(sqrtf(Traits::divide_round(blend[1], total_hit_loops))); - color_final.b = Traits::round(sqrtf(Traits::divide_round(blend[2], total_hit_loops))); - color_final.a = Traits::round(sqrtf(Traits::divide_round(blend[3], total_hit_loops))); - - /* For each poly owning this vert, - * paint each loop belonging to this vert. */ - for (const int p_index : gmap->vert_to_poly[v_index]) { - if (use_face_sel && !select_poly[p_index]) { - continue; - } - Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ - - if (previous_color != nullptr) { - /* Get the previous loop color */ - if (isZero(previous_color[v_index])) { - previous_color[v_index] = lcol[v_index]; - } - color_orig = previous_color[v_index]; - } - const float final_alpha = Traits::range * brush_fade * brush_strength * - brush_alpha_pressure * grid_alpha; - /* Mix the new color with the original - * based on the brush strength and the curve. */ - lcol[v_index] = vpaint_blend(vp, - lcol[v_index], - color_orig, - *col, - final_alpha, - Traits::range * brush_strength); + /* Color is squared to compensate the `sqrt` color encoding. */ + blend[0] += (Blend)col->r * (Blend)col->r; + blend[1] += (Blend)col->g * (Blend)col->g; + blend[2] += (Blend)col->b * (Blend)col->b; + blend[3] += (Blend)col->a * (Blend)col->a; } - }); - } - BKE_pbvh_vertex_iter_end; - }; - }); + } + + if (total_hit_loops == 0) { + continue; + } + /* Use rgb^2 color averaging. */ + Color *col = &color_final; + + color_final.r = Traits::round(sqrtf(Traits::divide_round(blend[0], total_hit_loops))); + color_final.g = Traits::round(sqrtf(Traits::divide_round(blend[1], total_hit_loops))); + color_final.b = Traits::round(sqrtf(Traits::divide_round(blend[2], total_hit_loops))); + color_final.a = Traits::round(sqrtf(Traits::divide_round(blend[3], total_hit_loops))); + + /* For each poly owning this vert, + * paint each loop belonging to this vert. */ + for (const int p_index : gmap->vert_to_poly[v_index]) { + if (use_face_sel && !select_poly[p_index]) { + continue; + } + Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ + + if (!previous_color.is_empty()) { + /* Get the previous loop color */ + if (isZero(previous_color[v_index])) { + previous_color[v_index] = lcol[v_index]; + } + color_orig = previous_color[v_index]; + } + const float final_alpha = Traits::range * brush_fade * brush_strength * + brush_alpha_pressure * grid_alpha; + /* Mix the new color with the original + * based on the brush strength and the curve. */ + lcol[v_index] = vpaint_blend( + vp, lcol[v_index], color_orig, *col, final_alpha, Traits::range * brush_strength); + } + }); + } + BKE_pbvh_vertex_iter_end; + }; + }); } static void do_vpaint_brush_smear(bContext *C, @@ -3233,186 +3194,183 @@ static void do_vpaint_brush_smear(bContext *C, Span nodes, GMutableSpan lcol) { - SculptSession *ss = ob->sculpt; + SculptSession *ss = ob->sculpt; - const SculptVertexPaintGeomMap *gmap = &ss->mode.vpaint.gmap; - const StrokeCache *cache = ss->cache; - if (!cache->is_last_valid) { - return; - } - const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh); - const bool has_grids = (pbvh_type == PBVH_GRIDS); + const SculptVertexPaintGeomMap *gmap = &ss->mode.vpaint.gmap; + const StrokeCache *cache = ss->cache; + if (!cache->is_last_valid) { + return; + } + const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh); + const bool has_grids = (pbvh_type == PBVH_GRIDS); - const Brush *brush = ob->sculpt->cache->brush; - const Scene *scene = CTX_data_scene(C); - GMutableSpan color_curr = vpd->smear.color_curr; - GMutableSpan color_prev_smear = vpd->smear.color_prev; - GMutableSpan color_prev = ss->cache->prev_colors_vpaint; + const Brush *brush = ob->sculpt->cache->brush; + const Scene *scene = CTX_data_scene(C); + GMutableSpan color_curr = vpd->smear.color_curr; + GMutableSpan color_prev_smear = vpd->smear.color_prev; + GMutableSpan color_prev = ss->cache->prev_colors_vpaint; - float brush_size_pressure, brush_alpha_value, brush_alpha_pressure; + float brush_size_pressure, brush_alpha_value, brush_alpha_pressure; - get_brush_alpha_data( - scene, ss, brush, &brush_size_pressure, &brush_alpha_value, &brush_alpha_pressure); - const bool use_normal = vwpaint_use_normal(vp); - const bool use_vert_sel = (me->editflag & (ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL)) != - 0; - const bool use_face_sel = (me->editflag & ME_EDIT_PAINT_FACE_SEL) != 0; + get_brush_alpha_data( + scene, ss, brush, &brush_size_pressure, &brush_alpha_value, &brush_alpha_pressure); + const bool use_normal = vwpaint_use_normal(vp); + const bool use_vert_sel = (me->editflag & (ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL)) != + 0; + const bool use_face_sel = (me->editflag & ME_EDIT_PAINT_FACE_SEL) != 0; - float brush_dir[3]; - sub_v3_v3v3(brush_dir, cache->location, cache->last_location); - project_plane_v3_v3v3(brush_dir, brush_dir, cache->view_normal); - if (normalize_v3(brush_dir) == 0.0f) { - return; - } + float brush_dir[3]; + sub_v3_v3v3(brush_dir, cache->location, cache->last_location); + project_plane_v3_v3v3(brush_dir, brush_dir, cache->view_normal); + if (normalize_v3(brush_dir) == 0.0f) { + return; + } - SculptBrushTest test; - SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( - ss, &test, brush->falloff_shape); - const float *sculpt_normal_frontface = SCULPT_brush_frontface_normal_from_falloff_shape( - ss, brush->falloff_shape); + SculptBrushTest test; + SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( + ss, &test, brush->falloff_shape); + const float *sculpt_normal_frontface = SCULPT_brush_frontface_normal_from_falloff_shape( + ss, brush->falloff_shape); - const blender::VArray select_vert = *me->attributes().lookup_or_default( - ".select_vert", ATTR_DOMAIN_POINT, false); - const blender::VArray select_poly = *me->attributes().lookup_or_default( - ".select_poly", ATTR_DOMAIN_FACE, false); + const blender::VArray select_vert = *me->attributes().lookup_or_default( + ".select_vert", ATTR_DOMAIN_POINT, false); + const blender::VArray select_poly = *me->attributes().lookup_or_default( + ".select_poly", ATTR_DOMAIN_FACE, false); - blender::threading::parallel_for(nodes.index_range(), 1LL, [&](IndexRange range) { - for (int n : range) { + blender::threading::parallel_for(nodes.index_range(), 1LL, [&](IndexRange range) { + for (int n : range) { + /* For each vertex */ + PBVHVertexIter vd; + BKE_pbvh_vertex_iter_begin (ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + /* Test to see if the vertex coordinates are within the spherical brush region. */ + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + /* For grid based pbvh, take the vert whose loop corresponds to the current grid. + * Otherwise, take the current vert. */ + const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : + vd.vert_indices[vd.i]; + const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f; + const float3 &mv_curr = &ss->vert_positions[v_index]; - /* For each vertex */ - PBVHVertexIter vd; - BKE_pbvh_vertex_iter_begin (ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { - /* Test to see if the vertex coordinates are within the spherical brush region. */ - if (!sculpt_brush_test_sq_fn(&test, vd.co)) { - continue; - } - /* For grid based pbvh, take the vert whose loop corresponds to the current grid. - * Otherwise, take the current vert. */ - const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : - vd.vert_indices[vd.i]; - const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f; - const float3 &mv_curr = &ss->vert_positions[v_index]; + /* if the vertex is selected for painting. */ + if (use_vert_sel && !select_vert[v_index]) { + continue; + } - /* if the vertex is selected for painting. */ - if (use_vert_sel && !select_vert[v_index]) { - continue; - } + /* Calculate the dot prod. between ray norm on surf and current vert + * (ie splash prevention factor), and only paint front facing verts. */ + float brush_strength = cache->bstrength; + const float angle_cos = (use_normal && vd.no) ? dot_v3v3(sculpt_normal_frontface, vd.no) : + 1.0f; + if (!test_brush_angle_falloff( + *brush, vpd->normal_angle_precalc, angle_cos, &brush_strength)) { + continue; + } + const float brush_fade = BKE_brush_curve_strength(brush, sqrtf(test.dist), cache->radius); - /* Calculate the dot prod. between ray norm on surf and current vert - * (ie splash prevention factor), and only paint front facing verts. */ - float brush_strength = cache->bstrength; - const float angle_cos = (use_normal && vd.no) ? - dot_v3v3(sculpt_normal_frontface, vd.no) : - 1.0f; - if (!test_brush_angle_falloff( - *brush, vpd->normal_angle_precalc, angle_cos, &brush_strength)) { - continue; - } - const float brush_fade = BKE_brush_curve_strength( - brush, sqrtf(test.dist), cache->radius); + bool do_color = false; + /* Minimum dot product between brush direction and current + * to neighbor direction is 0.0, meaning orthogonal. */ + float stroke_dot_max = 0.0f; - bool do_color = false; - /* Minimum dot product between brush direction and current - * to neighbor direction is 0.0, meaning orthogonal. */ - float stroke_dot_max = 0.0f; + /* Get the color of the loop in the opposite + * direction of the brush movement */ + to_static_color_type(vpd->type, [&](auto dummy) { + using Color = decltype(dummy); + Color color_final(0, 0, 0, 0); - /* Get the color of the loop in the opposite - * direction of the brush movement */ - to_static_color_type(vpd->type, [&](auto dummy) { - using Color = decltype(dummy); - Color color_final(0, 0, 0, 0); - - for (const int j : gmap->vert_to_poly[v_index].index_range()) { - const int p_index = gmap->vert_to_poly[v_index][j]; - const int l_index = gmap->vert_to_loop[v_index][j]; - BLI_assert(ss->corner_verts[l_index] == v_index); - UNUSED_VARS_NDEBUG(l_index); - if (use_face_sel && !select_poly[p_index]) { + for (const int j : gmap->vert_to_poly[v_index].index_range()) { + const int p_index = gmap->vert_to_poly[v_index][j]; + const int l_index = gmap->vert_to_loop[v_index][j]; + BLI_assert(ss->corner_verts[l_index] == v_index); + UNUSED_VARS_NDEBUG(l_index); + if (use_face_sel && !select_poly[p_index]) { + continue; + } + for (const int corner : ss->polys[p_index]) { + const int v_other_index = ss->corner_verts[corner]; + if (v_other_index == v_index) { continue; } - for (const int corner : ss->polys[p_index]) { - const int v_other_index = ss->corner_verts[corner]; - if (v_other_index == v_index) { - continue; - } - /* Get the direction from the - * selected vert to the neighbor. */ - float other_dir[3]; - sub_v3_v3v3(other_dir, mv_curr, ss->vert_positions[v_other_index]); - project_plane_v3_v3v3(other_dir, other_dir, cache->view_normal); + /* Get the direction from the + * selected vert to the neighbor. */ + float other_dir[3]; + sub_v3_v3v3(other_dir, mv_curr, ss->vert_positions[v_other_index]); + project_plane_v3_v3v3(other_dir, other_dir, cache->view_normal); - normalize_v3(other_dir); + normalize_v3(other_dir); - const float stroke_dot = dot_v3v3(other_dir, brush_dir); - int elem_index; + const float stroke_dot = dot_v3v3(other_dir, brush_dir); + int elem_index; - if (domain == ATTR_DOMAIN_POINT) { - elem_index = v_other_index; - } - else { - elem_index = corner; - } + if (domain == ATTR_DOMAIN_POINT) { + elem_index = v_other_index; + } + else { + elem_index = corner; + } - if (stroke_dot > stroke_dot_max) { - stroke_dot_max = stroke_dot; - color_final = color_prev_smear[elem_index]; - do_color = true; - } + if (stroke_dot > stroke_dot_max) { + stroke_dot_max = stroke_dot; + color_final = color_prev_smear[elem_index]; + do_color = true; } } + } - if (!do_color) { + if (!do_color) { + continue; + } + + const float final_alpha = Traits::range * brush_fade * brush_strength * + brush_alpha_pressure * grid_alpha; + + /* For each poly owning this vert, + * paint each loop belonging to this vert. */ + for (const int j : gmap->vert_to_poly[v_index].index_range()) { + const int p_index = gmap->vert_to_poly[v_index][j]; + + int elem_index; + if (vpd->domain == ATTR_DOMAIN_POINT) { + elem_index = v_index; + } + else { + const int l_index = gmap->vert_to_loop[v_index][j]; + elem_index = l_index; + BLI_assert(ss->corner_verts[l_index] == v_index); + } + if (use_face_sel && !select_poly[p_index]) { continue; } - const float final_alpha = Traits::range * brush_fade * brush_strength * - brush_alpha_pressure * grid_alpha; - - /* For each poly owning this vert, - * paint each loop belonging to this vert. */ - for (const int j : gmap->vert_to_poly[v_index].index_range()) { - const int p_index = gmap->vert_to_poly[v_index][j]; - - int elem_index; - if (vpd->domain == ATTR_DOMAIN_POINT) { - elem_index = v_index; - } - else { - const int l_index = gmap->vert_to_loop[v_index][j]; - elem_index = l_index; - BLI_assert(ss->corner_verts[l_index] == v_index); - } - if (use_face_sel && !select_poly[p_index]) { - continue; - } + /* Get the previous element color */ + Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ + if (color_prev != nullptr) { /* Get the previous element color */ - Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ - - if (color_prev != nullptr) { - /* Get the previous element color */ - if (isZero(color_prev[elem_index])) { - color_prev[elem_index] = lcol[elem_index]; - } - color_orig = color_prev[elem_index]; + if (isZero(color_prev[elem_index])) { + color_prev[elem_index] = lcol[elem_index]; } - /* Mix the new color with the original - * based on the brush strength and the curve. */ - lcol[elem_index] = vpaint_blend(vp, - lcol[elem_index], - color_orig, - color_final, - final_alpha, - Traits::range * brush_strength); - - color_curr[elem_index] = lcol[elem_index]; + color_orig = color_prev[elem_index]; } - }); - } - BKE_pbvh_vertex_iter_end; + /* Mix the new color with the original + * based on the brush strength and the curve. */ + lcol[elem_index] = vpaint_blend(vp, + lcol[elem_index], + color_orig, + color_final, + final_alpha, + Traits::range * brush_strength); + + color_curr[elem_index] = lcol[elem_index]; + } + }); } - }); + BKE_pbvh_vertex_iter_end; + } + }); } static void calculate_average_color(VPaintData *vpd, @@ -3422,94 +3380,93 @@ static void calculate_average_color(VPaintData *vpd, GMutableSpan lcol, Span nodes) { - SculptSession *ss = ob->sculpt; - const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh); - const bool has_grids = (pbvh_type == PBVH_GRIDS); - const SculptVertexPaintGeomMap *gmap = &ss->mode.vpaint.gmap; + SculptSession *ss = ob->sculpt; + const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh); + const bool has_grids = (pbvh_type == PBVH_GRIDS); + const SculptVertexPaintGeomMap *gmap = &ss->mode.vpaint.gmap; - StrokeCache *cache = ss->cache; - const bool use_vert_sel = (me->editflag & (ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL)) != - 0; + StrokeCache *cache = ss->cache; + const bool use_vert_sel = (me->editflag & (ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL)) != + 0; - SculptBrushTest test; - SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( - ss, &test, brush->falloff_shape); + SculptBrushTest test; + SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( + ss, &test, brush->falloff_shape); - const blender::VArray select_vert = *me->attributes().lookup_or_default( - ".select_vert", ATTR_DOMAIN_POINT, false); + const blender::VArray select_vert = *me->attributes().lookup_or_default( + ".select_vert", ATTR_DOMAIN_POINT, false); - to_static_color_type(vpd->type, [&](auto dummy) { - using Color = decltype(dummy); - using Blend = typename Traits::BlendType; + to_static_color_type(vpd->type, [&](auto dummy) { + using Color = decltype(dummy); + using Blend = typename Traits::BlendType; - VPaintAverageAccum *accum = (VPaintAverageAccum *)MEM_mallocN( - sizeof(*accum) * nodes.size(), __func__); - blender::threading::parallel_for(nodes.index_range(), 1LL, [&](IndexRange range) { - for (int n : range) { - VPaintAverageAccum *accum2 = accum + n; - accum2->len = 0; - memset(accum2->value, 0, sizeof(accum2->value)); + Array> accum(nodes.size()); + blender::threading::parallel_for(nodes.index_range(), 1LL, [&](IndexRange range) { + for (int n : range) { + VPaintAverageAccum &accum2 = accum[n]; + accum2.len = 0; + memset(accum2.value, 0, sizeof(accum2.value)); - /* For each vertex */ - PBVHVertexIter vd; - BKE_pbvh_vertex_iter_begin (ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { - /* Test to see if the vertex coordinates are within the spherical brush region. */ - if (!sculpt_brush_test_sq_fn(&test, vd.co)) { - continue; - } - if (BKE_brush_curve_strength(brush, 0.0, cache->radius) <= 0.0f) { - continue; - } - const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : - vd.vert_indices[vd.i]; - /* If the vertex is selected for painting. */ - if (use_vert_sel && !select_vert[v_index]) { - continue; - } - - accum2->len += gmap->vert_to_poly[v_index].size(); - /* if a vertex is within the brush region, then add its color to the blend. */ - for (int j = 0; j < gmap->vert_to_poly[v_index].size(); j++) { - int elem_index; - - if (vpd->domain == ATTR_DOMAIN_CORNER) { - elem_index = gmap->vert_to_loop[v_index][j]; - } - else { - elem_index = v_index; - } - - Color *col = lcol + elem_index; - - /* Color is squared to compensate the `sqrt` color encoding. */ - accum2->value[0] += col->r * col->r; - accum2->value[1] += col->g * col->g; - accum2->value[2] += col->b * col->b; - } + /* For each vertex */ + PBVHVertexIter vd; + BKE_pbvh_vertex_iter_begin (ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + /* Test to see if the vertex coordinates are within the spherical brush region. */ + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + if (BKE_brush_curve_strength(brush, 0.0, cache->radius) <= 0.0f) { + continue; + } + const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : + vd.vert_indices[vd.i]; + /* If the vertex is selected for painting. */ + if (use_vert_sel && !select_vert[v_index]) { + continue; + } + + accum2.len += gmap->vert_to_poly[v_index].size(); + /* if a vertex is within the brush region, then add its color to the blend. */ + for (int j = 0; j < gmap->vert_to_poly[v_index].size(); j++) { + int elem_index; + + if (vpd->domain == ATTR_DOMAIN_CORNER) { + elem_index = gmap->vert_to_loop[v_index][j]; + } + else { + elem_index = v_index; + } + + Color *col = lcol + elem_index; + + /* Color is squared to compensate the `sqrt` color encoding. */ + accum2.value[0] += col->r * col->r; + accum2.value[1] += col->g * col->g; + accum2.value[2] += col->b * col->b; } - BKE_pbvh_vertex_iter_end; } - }); - - Blend accum_len = 0; - Blend accum_value[3] = {0}; - Color blend(0, 0, 0, 0); - - for (int i = 0; i < nodes.size(); i++) { - accum_len += accum[i].len; - accum_value[0] += accum[i].value[0]; - accum_value[1] += accum[i].value[1]; - accum_value[2] += accum[i].value[2]; - } - if (accum_len != 0) { - blend.r = Traits::round(sqrtf(Traits::divide_round(accum_value[0], accum_len))); - blend.g = Traits::round(sqrtf(Traits::divide_round(accum_value[1], accum_len))); - blend.b = Traits::round(sqrtf(Traits::divide_round(accum_value[2], accum_len))); - blend.a = Traits::range; - - vpd->paintcol = blend; + BKE_pbvh_vertex_iter_end; } }); + + Blend accum_len = 0; + Blend accum_value[3] = {0}; + Color blend(0, 0, 0, 0); + + for (int i = 0; i < nodes.size(); i++) { + accum_len += accum[i].len; + accum_value[0] += accum[i].value[0]; + accum_value[1] += accum[i].value[1]; + accum_value[2] += accum[i].value[2]; + } + if (accum_len != 0) { + blend.r = Traits::round(sqrtf(Traits::divide_round(accum_value[0], accum_len))); + blend.g = Traits::round(sqrtf(Traits::divide_round(accum_value[1], accum_len))); + blend.b = Traits::round(sqrtf(Traits::divide_round(accum_value[2], accum_len))); + blend.a = Traits::range; + + vpd->paintcol = blend; + } + }); } template @@ -3518,16 +3475,16 @@ static float paint_and_tex_color_alpha(VPaint *vp, const float v_co[3], Color *r_color) { - ColorPaint4f rgba; - ColorPaint4f rgba_br = toFloat(*r_color); + ColorPaint4f rgba; + ColorPaint4f rgba_br = toFloat(*r_color); - paint_and_tex_color_alpha_intern(vp, &vpd->vc, v_co, &rgba.r); + paint_and_tex_color_alpha_intern(vp, &vpd->vc, v_co, &rgba.r); - rgb_uchar_to_float(&rgba_br.r, (const uchar *)&vpd->paintcol); - mul_v3_v3(rgba_br, rgba); + rgb_uchar_to_float(&rgba_br.r, (const uchar *)&vpd->paintcol); + mul_v3_v3(rgba_br, rgba); - *r_color = fromFloat(rgba_br); - return rgba[3]; + *r_color = fromFloat(rgba_br); + return rgba[3]; } static void vpaint_do_draw(bContext *C, @@ -3539,142 +3496,140 @@ static void vpaint_do_draw(bContext *C, Span nodes, GMutableSpan lcol) { - SculptSession *ss = ob->sculpt; - const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh); + SculptSession *ss = ob->sculpt; + const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh); - const Brush *brush = ob->sculpt->cache->brush; - const Scene *scene = CTX_data_scene(C); + const Brush *brush = ob->sculpt->cache->brush; + const Scene *scene = CTX_data_scene(C); - const bool has_grids = (pbvh_type == PBVH_GRIDS); - const SculptVertexPaintGeomMap *gmap = &ss->mode.vpaint.gmap; + const bool has_grids = (pbvh_type == PBVH_GRIDS); + const SculptVertexPaintGeomMap *gmap = &ss->mode.vpaint.gmap; - const StrokeCache *cache = ss->cache; - float brush_size_pressure, brush_alpha_value, brush_alpha_pressure; - get_brush_alpha_data( - scene, ss, brush, &brush_size_pressure, &brush_alpha_value, &brush_alpha_pressure); - const bool use_normal = vwpaint_use_normal(vp); - const bool use_vert_sel = (me->editflag & (ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL)) != - 0; - const bool use_face_sel = (me->editflag & ME_EDIT_PAINT_FACE_SEL) != 0; + const StrokeCache *cache = ss->cache; + float brush_size_pressure, brush_alpha_value, brush_alpha_pressure; + get_brush_alpha_data( + scene, ss, brush, &brush_size_pressure, &brush_alpha_value, &brush_alpha_pressure); + const bool use_normal = vwpaint_use_normal(vp); + const bool use_vert_sel = (me->editflag & (ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL)) != + 0; + const bool use_face_sel = (me->editflag & ME_EDIT_PAINT_FACE_SEL) != 0; - SculptBrushTest test; - SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( - ss, &test, brush->falloff_shape); - const float *sculpt_normal_frontface = SCULPT_brush_frontface_normal_from_falloff_shape( - ss, brush->falloff_shape); + SculptBrushTest test; + SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( + ss, &test, brush->falloff_shape); + const float *sculpt_normal_frontface = SCULPT_brush_frontface_normal_from_falloff_shape( + ss, brush->falloff_shape); - GMutableSpan previous_color = ss->cache->prev_colors_vpaint; + const ColorPaint4f paintcol = vpd->paintcol; - const blender::VArray select_vert = *me->attributes().lookup_or_default( - ".select_vert", ATTR_DOMAIN_POINT, false); - const blender::VArray select_poly = *me->attributes().lookup_or_default( - ".select_poly", ATTR_DOMAIN_FACE, false); + GMutableSpan previous_color = ss->cache->prev_colors_vpaint; - blender::threading::parallel_for(nodes.index_range(), 1LL, [&](IndexRange range) { - for (int n : range) { - ColorPaint4f paintcol = vpd->paintcol; + const blender::VArray select_vert = *me->attributes().lookup_or_default( + ".select_vert", ATTR_DOMAIN_POINT, false); + const blender::VArray select_poly = *me->attributes().lookup_or_default( + ".select_poly", ATTR_DOMAIN_FACE, false); - /* For each vertex */ - PBVHVertexIter vd; - BKE_pbvh_vertex_iter_begin (ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { - /* Test to see if the vertex coordinates are within the spherical brush region. */ - if (!sculpt_brush_test_sq_fn(&test, vd.co)) { - continue; - } - /* NOTE: Grids are 1:1 with corners (aka loops). - * For grid based pbvh, take the vert whose loop corresponds to the current grid. - * Otherwise, take the current vert. */ - const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : - vd.vert_indices[vd.i]; - /* If the vertex is selected for painting. */ - if (use_vert_sel && !select_vert[v_index]) { - continue; + blender::threading::parallel_for(nodes.index_range(), 1LL, [&](IndexRange range) { + for (int n : range) { + /* For each vertex */ + PBVHVertexIter vd; + BKE_pbvh_vertex_iter_begin (ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + /* Test to see if the vertex coordinates are within the spherical brush region. */ + if (!sculpt_brush_test_sq_fn(&test, vd.co)) { + continue; + } + /* NOTE: Grids are 1:1 with corners (aka loops). + * For grid based pbvh, take the vert whose loop corresponds to the current grid. + * Otherwise, take the current vert. */ + const int v_index = has_grids ? ss->corner_verts[vd.grid_indices[vd.g]] : + vd.vert_indices[vd.i]; + /* If the vertex is selected for painting. */ + if (use_vert_sel && !select_vert[v_index]) { + continue; + } + + const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f; + + /* Calc the dot prod. between ray norm on surf and current vert + * (ie splash prevention factor), and only paint front facing verts. */ + float brush_strength = cache->bstrength; + const float angle_cos = (use_normal && vd.no) ? dot_v3v3(sculpt_normal_frontface, vd.no) : + 1.0f; + if (!test_brush_angle_falloff( + *brush, vpd->normal_angle_precalc, angle_cos, &brush_strength)) { + continue; + } + const float brush_fade = BKE_brush_curve_strength(brush, sqrtf(test.dist), cache->radius); + + to_static_color_type(vpd->type, [&](auto dummy) { + using Color = decltype(dummy); + Color color_final = paintcol; + + /* If we're painting with a texture, sample the texture color and alpha. */ + float tex_alpha = 1.0; + if (vpd->is_texbrush) { + /* NOTE: we may want to paint alpha as vertex color alpha. */ + tex_alpha = paint_and_tex_color_alpha( + vp, vpd, vpd->vertexcosnos[v_index].co, &color_final); } - const float grid_alpha = has_grids ? 1.0f / vd.gridsize : 1.0f; + Color color_orig(0, 0, 0, 0); - /* Calc the dot prod. between ray norm on surf and current vert - * (ie splash prevention factor), and only paint front facing verts. */ - float brush_strength = cache->bstrength; - const float angle_cos = (use_normal && vd.no) ? - dot_v3v3(sculpt_normal_frontface, vd.no) : - 1.0f; - if (!test_brush_angle_falloff( - *brush, vpd->normal_angle_precalc, angle_cos, &brush_strength)) { - continue; - } - const float brush_fade = BKE_brush_curve_strength( - brush, sqrtf(test.dist), cache->radius); + if (vpd->domain == ATTR_DOMAIN_POINT) { + int v_index = vd.index; - to_static_color_type(vpd->type, [&](auto dummy) { - using Color = decltype(dummy); - Color color_final = paintcol; - - /* If we're painting with a texture, sample the texture color and alpha. */ - float tex_alpha = 1.0; - if (vpd->is_texbrush) { - /* NOTE: we may want to paint alpha as vertex color alpha. */ - tex_alpha = paint_and_tex_color_alpha( - vp, vpd, vpd->vertexcosnos[v_index].co, &color_final); + if (!previous_color.is_empty()) { + /* Get the previous loop color */ + if (isZero(previous_color[v_index])) { + previous_color[v_index] = lcol[v_index]; + } + color_orig = previous_color[v_index]; } + const float final_alpha = Traits::frange * brush_fade * brush_strength * tex_alpha * + brush_alpha_pressure * grid_alpha; - Color color_orig(0, 0, 0, 0); + lcol[v_index] = vpaint_blend(vp, + lcol[v_index], + color_orig, + color_final, + final_alpha, + Traits::range * brush_strength); + } + else { + /* For each poly owning this vert, paint each loop belonging to this vert. */ + for (const int j : gmap->vert_to_poly[v_index].index_range()) { + const int p_index = gmap->vert_to_poly[v_index][j]; + const int l_index = gmap->vert_to_loop[v_index][j]; + BLI_assert(ss->corner_verts[l_index] == v_index); + if (use_face_sel && !select_poly[p_index]) { + continue; + } + Color color_orig = Color(0, 0, 0, 0); /* unused when array is nullptr */ - if (vpd->domain == ATTR_DOMAIN_POINT) { - int v_index = vd.index; - - if (previous_color != nullptr) { + if (!previous_color.is_empty()) { /* Get the previous loop color */ - if (isZero(previous_color[v_index])) { - previous_color[v_index] = lcol[v_index]; + if (isZero(previous_color[l_index])) { + previous_color[l_index] = lcol[l_index]; } - color_orig = previous_color[v_index]; + color_orig = previous_color[l_index]; } const float final_alpha = Traits::frange * brush_fade * brush_strength * tex_alpha * brush_alpha_pressure * grid_alpha; - lcol[v_index] = vpaint_blend(vp, - lcol[v_index], + /* Mix the new color with the original based on final_alpha. */ + lcol[l_index] = vpaint_blend(vp, + lcol[l_index], color_orig, color_final, final_alpha, Traits::range * brush_strength); } - else { - /* For each poly owning this vert, paint each loop belonging to this vert. */ - for (const int j : gmap->vert_to_poly[v_index].index_range()) { - const int p_index = gmap->vert_to_poly[v_index][j]; - const int l_index = gmap->vert_to_loop[v_index][j]; - BLI_assert(ss->corner_verts[l_index] == v_index); - if (use_face_sel && !select_poly[p_index]) { - continue; - } - Color color_orig = Color(0, 0, 0, 0); /* unused when array is nullptr */ - - if (previous_color != nullptr) { - /* Get the previous loop color */ - if (isZero(previous_color[l_index])) { - previous_color[l_index] = lcol[l_index]; - } - color_orig = previous_color[l_index]; - } - const float final_alpha = Traits::frange * brush_fade * brush_strength * - tex_alpha * brush_alpha_pressure * grid_alpha; - - /* Mix the new color with the original based on final_alpha. */ - lcol[l_index] = vpaint_blend(vp, - lcol[l_index], - color_orig, - color_final, - final_alpha, - Traits::range * brush_strength); - } - } - }); - } - BKE_pbvh_vertex_iter_end; + } + }); } - }); + BKE_pbvh_vertex_iter_end; + } + }); } static void vpaint_do_blur(bContext *C, @@ -3686,12 +3641,12 @@ static void vpaint_do_blur(bContext *C, Span nodes, GMutableSpan lcol) { - if (vpd->domain == ATTR_DOMAIN_POINT) { - do_vpaint_brush_blur_verts(C, sd, vp, vpd, ob, me, nodes, lcol); - } - else { - do_vpaint_brush_blur_loops(C, sd, vp, vpd, ob, me, nodes, lcol); - } + if (vpd->domain == ATTR_DOMAIN_POINT) { + do_vpaint_brush_blur_verts(C, sd, vp, vpd, ob, me, nodes, lcol); + } + else { + do_vpaint_brush_blur_loops(C, sd, vp, vpd, ob, me, nodes, lcol); + } } static void vpaint_paint_leaves(bContext *C, @@ -3703,28 +3658,28 @@ static void vpaint_paint_leaves(bContext *C, GMutableSpan lcol, Span nodes) { - for (PBVHNode *node : nodes) { - SCULPT_undo_push_node(ob, node, SCULPT_UNDO_COLOR); - } + for (PBVHNode *node : nodes) { + SCULPT_undo_push_node(ob, node, SCULPT_UNDO_COLOR); + } - const Brush *brush = ob->sculpt->cache->brush; + const Brush *brush = ob->sculpt->cache->brush; - switch ((eBrushVertexPaintTool)brush->vertexpaint_tool) { - case VPAINT_TOOL_AVERAGE: - calculate_average_color(vpd, ob, me, brush, lcol, nodes); - break; - case VPAINT_TOOL_DRAW: - vpaint_do_draw(C, sd, vp, vpd, ob, me, nodes, lcol); - break; - case VPAINT_TOOL_BLUR: - vpaint_do_blur(C, sd, vp, vpd, ob, me, nodes, lcol); - break; - case VPAINT_TOOL_SMEAR: - do_vpaint_brush_smear(C, sd, vp, vpd, ob, me, nodes, lcol); - break; - default: - break; - } + switch ((eBrushVertexPaintTool)brush->vertexpaint_tool) { + case VPAINT_TOOL_AVERAGE: + calculate_average_color(vpd, ob, me, brush, lcol, nodes); + break; + case VPAINT_TOOL_DRAW: + vpaint_do_draw(C, sd, vp, vpd, ob, me, nodes, lcol); + break; + case VPAINT_TOOL_BLUR: + vpaint_do_blur(C, sd, vp, vpd, ob, me, nodes, lcol); + break; + case VPAINT_TOOL_SMEAR: + do_vpaint_brush_smear(C, sd, vp, vpd, ob, me, nodes, lcol); + break; + default: + break; + } } static void vpaint_do_paint(bContext *C, @@ -3739,20 +3694,20 @@ static void vpaint_do_paint(bContext *C, const int i, const float angle) { - SculptSession *ss = ob->sculpt; - ss->cache->radial_symmetry_pass = i; - SCULPT_cache_calc_brushdata_symm(ss->cache, symm, axis, angle); + SculptSession *ss = ob->sculpt; + ss->cache->radial_symmetry_pass = i; + SCULPT_cache_calc_brushdata_symm(ss->cache, symm, axis, angle); - Vector nodes = vwpaint_pbvh_gather_generic(ob, vp, sd, brush); + Vector nodes = vwpaint_pbvh_gather_generic(ob, vp, sd, brush); - bke::GSpanAttributeWriter attribute = me->attributes_for_write().lookup_for_write_span( - me->active_color_attribute); - BLI_assert(attribute.domain == domain); + bke::GSpanAttributeWriter attribute = me->attributes_for_write().lookup_for_write_span( + me->active_color_attribute); + BLI_assert(attribute.domain == domain); - /* Paint those leaves. */ - vpaint_paint_leaves(C, sd, vp, vpd, ob, me, attribute.span, nodes); + /* Paint those leaves. */ + vpaint_paint_leaves(C, sd, vp, vpd, ob, me, attribute.span, nodes); - attribute.finish(); + attribute.finish(); } static void vpaint_do_radial_symmetry(bContext *C, @@ -3765,10 +3720,10 @@ static void vpaint_do_radial_symmetry(bContext *C, const ePaintSymmetryFlags symm, const int axis) { - for (int i = 1; i < vp->radial_symm[axis - 'X']; i++) { - const float angle = (2.0 * M_PI) * i / vp->radial_symm[axis - 'X']; - vpaint_do_paint(C, sd, vp, vpd, ob, me, brush, symm, axis, i, angle); - } + for (int i = 1; i < vp->radial_symm[axis - 'X']; i++) { + const float angle = (2.0 * M_PI) * i / vp->radial_symm[axis - 'X']; + vpaint_do_paint(C, sd, vp, vpd, ob, me, brush, symm, axis, i, angle); + } } /* near duplicate of: sculpt.cc's, @@ -3776,49 +3731,49 @@ static void vpaint_do_radial_symmetry(bContext *C, static void vpaint_do_symmetrical_brush_actions( bContext *C, Sculpt *sd, VPaint *vp, VPaintData *vpd, Object *ob) { - Brush *brush = BKE_paint_brush(&vp->paint); - Mesh *me = (Mesh *)ob->data; - SculptSession *ss = ob->sculpt; - StrokeCache *cache = ss->cache; - const char symm = SCULPT_mesh_symmetry_xyz_get(ob); - int i = 0; + Brush *brush = BKE_paint_brush(&vp->paint); + Mesh *me = (Mesh *)ob->data; + SculptSession *ss = ob->sculpt; + StrokeCache *cache = ss->cache; + const char symm = SCULPT_mesh_symmetry_xyz_get(ob); + int i = 0; - /* initial stroke */ - const ePaintSymmetryFlags initial_symm = ePaintSymmetryFlags(0); - cache->mirror_symmetry_pass = ePaintSymmetryFlags(0); - vpaint_do_paint(C, sd, vp, vpd, ob, me, brush, initial_symm, 'X', 0, 0); - vpaint_do_radial_symmetry(C, sd, vp, vpd, ob, me, brush, initial_symm, 'X'); - vpaint_do_radial_symmetry(C, sd, vp, vpd, ob, me, brush, initial_symm, 'Y'); - vpaint_do_radial_symmetry(C, sd, vp, vpd, ob, me, brush, initial_symm, 'Z'); + /* initial stroke */ + const ePaintSymmetryFlags initial_symm = ePaintSymmetryFlags(0); + cache->mirror_symmetry_pass = ePaintSymmetryFlags(0); + vpaint_do_paint(C, sd, vp, vpd, ob, me, brush, initial_symm, 'X', 0, 0); + vpaint_do_radial_symmetry(C, sd, vp, vpd, ob, me, brush, initial_symm, 'X'); + vpaint_do_radial_symmetry(C, sd, vp, vpd, ob, me, brush, initial_symm, 'Y'); + vpaint_do_radial_symmetry(C, sd, vp, vpd, ob, me, brush, initial_symm, 'Z'); - cache->symmetry = symm; + cache->symmetry = symm; - /* symm is a bit combination of XYZ - 1 is mirror - * X; 2 is Y; 3 is XY; 4 is Z; 5 is XZ; 6 is YZ; 7 is XYZ */ - for (i = 1; i <= symm; i++) { - if (symm & i && (symm != 5 || i != 3) && (symm != 6 || !ELEM(i, 3, 5))) { - const ePaintSymmetryFlags symm_pass = ePaintSymmetryFlags(i); - cache->mirror_symmetry_pass = symm_pass; - cache->radial_symmetry_pass = 0; - SCULPT_cache_calc_brushdata_symm(cache, symm_pass, 0, 0); + /* symm is a bit combination of XYZ - 1 is mirror + * X; 2 is Y; 3 is XY; 4 is Z; 5 is XZ; 6 is YZ; 7 is XYZ */ + for (i = 1; i <= symm; i++) { + if (symm & i && (symm != 5 || i != 3) && (symm != 6 || !ELEM(i, 3, 5))) { + const ePaintSymmetryFlags symm_pass = ePaintSymmetryFlags(i); + cache->mirror_symmetry_pass = symm_pass; + cache->radial_symmetry_pass = 0; + SCULPT_cache_calc_brushdata_symm(cache, symm_pass, 0, 0); - if (i & (1 << 0)) { - vpaint_do_paint(C, sd, vp, vpd, ob, me, brush, symm_pass, 'X', 0, 0); - vpaint_do_radial_symmetry(C, sd, vp, vpd, ob, me, brush, symm_pass, 'X'); - } - if (i & (1 << 1)) { - vpaint_do_paint(C, sd, vp, vpd, ob, me, brush, symm_pass, 'Y', 0, 0); - vpaint_do_radial_symmetry(C, sd, vp, vpd, ob, me, brush, symm_pass, 'Y'); - } - if (i & (1 << 2)) { - vpaint_do_paint(C, sd, vp, vpd, ob, me, brush, symm_pass, 'Z', 0, 0); - vpaint_do_radial_symmetry(C, sd, vp, vpd, ob, me, brush, symm_pass, 'Z'); - } + if (i & (1 << 0)) { + vpaint_do_paint(C, sd, vp, vpd, ob, me, brush, symm_pass, 'X', 0, 0); + vpaint_do_radial_symmetry(C, sd, vp, vpd, ob, me, brush, symm_pass, 'X'); + } + if (i & (1 << 1)) { + vpaint_do_paint(C, sd, vp, vpd, ob, me, brush, symm_pass, 'Y', 0, 0); + vpaint_do_radial_symmetry(C, sd, vp, vpd, ob, me, brush, symm_pass, 'Y'); + } + if (i & (1 << 2)) { + vpaint_do_paint(C, sd, vp, vpd, ob, me, brush, symm_pass, 'Z', 0, 0); + vpaint_do_radial_symmetry(C, sd, vp, vpd, ob, me, brush, symm_pass, 'Z'); } } + } - copy_v3_v3(cache->true_last_location, cache->true_location); - cache->is_last_valid = true; + copy_v3_v3(cache->true_last_location, cache->true_location); + cache->is_last_valid = true; } static void vpaint_stroke_update_step(bContext *C, @@ -3826,160 +3781,160 @@ static void vpaint_stroke_update_step(bContext *C, PaintStroke *stroke, PointerRNA *itemptr) { - Scene *scene = CTX_data_scene(C); - ToolSettings *ts = CTX_data_tool_settings(C); - VPaintData *vpd = static_cast(paint_stroke_mode_data(stroke)); - VPaint *vp = ts->vpaint; - ViewContext *vc = &vpd->vc; - Object *ob = vc->obact; - SculptSession *ss = ob->sculpt; - Sculpt *sd = CTX_data_tool_settings(C)->sculpt; + Scene *scene = CTX_data_scene(C); + ToolSettings *ts = CTX_data_tool_settings(C); + VPaintData *vpd = static_cast(paint_stroke_mode_data(stroke)); + VPaint *vp = ts->vpaint; + ViewContext *vc = &vpd->vc; + Object *ob = vc->obact; + SculptSession *ss = ob->sculpt; + Sculpt *sd = CTX_data_tool_settings(C)->sculpt; - vwpaint_update_cache_variants(C, vp, ob, itemptr); + vwpaint_update_cache_variants(C, vp, ob, itemptr); - float mat[4][4]; + float mat[4][4]; - ED_view3d_init_mats_rv3d(ob, vc->rv3d); + ED_view3d_init_mats_rv3d(ob, vc->rv3d); - /* load projection matrix */ - mul_m4_m4m4(mat, vc->rv3d->persmat, ob->object_to_world); + /* load projection matrix */ + mul_m4_m4m4(mat, vc->rv3d->persmat, ob->object_to_world); - swap_m4m4(vc->rv3d->persmat, mat); + swap_m4m4(vc->rv3d->persmat, mat); - vpaint_do_symmetrical_brush_actions(C, sd, vp, vpd, ob); + vpaint_do_symmetrical_brush_actions(C, sd, vp, vpd, ob); - swap_m4m4(vc->rv3d->persmat, mat); + swap_m4m4(vc->rv3d->persmat, mat); - BKE_mesh_batch_cache_dirty_tag((Mesh *)ob->data, BKE_MESH_BATCH_DIRTY_ALL); + BKE_mesh_batch_cache_dirty_tag((Mesh *)ob->data, BKE_MESH_BATCH_DIRTY_ALL); - if (vp->paint.brush->vertexpaint_tool == VPAINT_TOOL_SMEAR) { - vpd->smear.color_prev = vpd->smear.color_curr; - } + if (vp->paint.brush->vertexpaint_tool == VPAINT_TOOL_SMEAR) { + vpd->smear.color_prev = vpd->smear.color_curr; + } - /* Calculate pivot for rotation around selection if needed. - * also needed for "Frame Selected" on last stroke. */ - float loc_world[3]; - mul_v3_m4v3(loc_world, ob->object_to_world, ss->cache->true_location); - paint_last_stroke_update(scene, loc_world); + /* Calculate pivot for rotation around selection if needed. + * also needed for "Frame Selected" on last stroke. */ + float loc_world[3]; + mul_v3_m4v3(loc_world, ob->object_to_world, ss->cache->true_location); + paint_last_stroke_update(scene, loc_world); - ED_region_tag_redraw(vc->region); + ED_region_tag_redraw(vc->region); - DEG_id_tag_update((ID *)ob->data, ID_RECALC_GEOMETRY); + DEG_id_tag_update((ID *)ob->data, ID_RECALC_GEOMETRY); } static void vpaint_stroke_done(const bContext *C, PaintStroke *stroke) { - VPaintData *vpd = static_cast(paint_stroke_mode_data(stroke)); - Object *ob = vpd->vc.obact; + VPaintData *vpd = static_cast(paint_stroke_mode_data(stroke)); + Object *ob = vpd->vc.obact; - if (vpd->is_texbrush) { - ED_vpaint_proj_handle_free(vpd->vp_handle); - } + if (vpd->is_texbrush) { + ED_vpaint_proj_handle_free(vpd->vp_handle); + } - MEM_delete(vpd); + MEM_delete(vpd); - SculptSession *ss = ob->sculpt; + SculptSession *ss = ob->sculpt; - if (ss->cache->alt_smooth) { - ToolSettings *ts = CTX_data_tool_settings(C); - VPaint *vp = ts->vpaint; - smooth_brush_toggle_off(C, &vp->paint, ss->cache); - } + if (ss->cache->alt_smooth) { + ToolSettings *ts = CTX_data_tool_settings(C); + VPaint *vp = ts->vpaint; + smooth_brush_toggle_off(C, &vp->paint, ss->cache); + } - WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob); + WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob); - SCULPT_undo_push_end(ob); + SCULPT_undo_push_end(ob); - SCULPT_cache_free(ob->sculpt->cache); - ob->sculpt->cache = nullptr; + SCULPT_cache_free(ob->sculpt->cache); + ob->sculpt->cache = nullptr; } static int vpaint_invoke(bContext *C, wmOperator *op, const wmEvent *event) { - int retval; + int retval; - op->customdata = paint_stroke_new(C, - op, - SCULPT_stroke_get_location, - vpaint_stroke_test_start, - vpaint_stroke_update_step, - nullptr, - vpaint_stroke_done, - event->type); + op->customdata = paint_stroke_new(C, + op, + SCULPT_stroke_get_location, + vpaint_stroke_test_start, + vpaint_stroke_update_step, + nullptr, + vpaint_stroke_done, + event->type); - Object *ob = CTX_data_active_object(C); + Object *ob = CTX_data_active_object(C); - if (SCULPT_has_loop_colors(ob) && ob->sculpt->pbvh) { - BKE_pbvh_ensure_node_loops(ob->sculpt->pbvh); - } + if (SCULPT_has_loop_colors(ob) && ob->sculpt->pbvh) { + BKE_pbvh_ensure_node_loops(ob->sculpt->pbvh); + } - SCULPT_undo_push_begin_ex(ob, "Vertex Paint"); + SCULPT_undo_push_begin_ex(ob, "Vertex Paint"); - if ((retval = op->type->modal(C, op, event)) == OPERATOR_FINISHED) { - paint_stroke_free(C, op, (PaintStroke *)op->customdata); - return OPERATOR_FINISHED; - } + if ((retval = op->type->modal(C, op, event)) == OPERATOR_FINISHED) { + paint_stroke_free(C, op, (PaintStroke *)op->customdata); + return OPERATOR_FINISHED; + } - /* add modal handler */ - WM_event_add_modal_handler(C, op); + /* add modal handler */ + WM_event_add_modal_handler(C, op); - OPERATOR_RETVAL_CHECK(retval); - BLI_assert(retval == OPERATOR_RUNNING_MODAL); + OPERATOR_RETVAL_CHECK(retval); + BLI_assert(retval == OPERATOR_RUNNING_MODAL); - return OPERATOR_RUNNING_MODAL; + return OPERATOR_RUNNING_MODAL; } static int vpaint_exec(bContext *C, wmOperator *op) { - op->customdata = paint_stroke_new(C, - op, - SCULPT_stroke_get_location, - vpaint_stroke_test_start, - vpaint_stroke_update_step, - nullptr, - vpaint_stroke_done, - 0); + op->customdata = paint_stroke_new(C, + op, + SCULPT_stroke_get_location, + vpaint_stroke_test_start, + vpaint_stroke_update_step, + nullptr, + vpaint_stroke_done, + 0); - /* frees op->customdata */ - paint_stroke_exec(C, op, (PaintStroke *)op->customdata); + /* frees op->customdata */ + paint_stroke_exec(C, op, (PaintStroke *)op->customdata); - return OPERATOR_FINISHED; + return OPERATOR_FINISHED; } static void vpaint_cancel(bContext *C, wmOperator *op) { - Object *ob = CTX_data_active_object(C); - if (ob->sculpt->cache) { - SCULPT_cache_free(ob->sculpt->cache); - ob->sculpt->cache = nullptr; - } + Object *ob = CTX_data_active_object(C); + if (ob->sculpt->cache) { + SCULPT_cache_free(ob->sculpt->cache); + ob->sculpt->cache = nullptr; + } - paint_stroke_cancel(C, op, (PaintStroke *)op->customdata); + paint_stroke_cancel(C, op, (PaintStroke *)op->customdata); } static int vpaint_modal(bContext *C, wmOperator *op, const wmEvent *event) { - return paint_stroke_modal(C, op, event, (PaintStroke **)&op->customdata); + return paint_stroke_modal(C, op, event, (PaintStroke **)&op->customdata); } void PAINT_OT_vertex_paint(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Vertex Paint"; - ot->idname = "PAINT_OT_vertex_paint"; - ot->description = "Paint a stroke in the active color attribute layer"; + /* identifiers */ + ot->name = "Vertex Paint"; + ot->idname = "PAINT_OT_vertex_paint"; + ot->description = "Paint a stroke in the active color attribute layer"; - /* api callbacks */ - ot->invoke = vpaint_invoke; - ot->modal = vpaint_modal; - ot->exec = vpaint_exec; - ot->poll = vertex_paint_poll; - ot->cancel = vpaint_cancel; + /* api callbacks */ + ot->invoke = vpaint_invoke; + ot->modal = vpaint_modal; + ot->exec = vpaint_exec; + ot->poll = vertex_paint_poll; + ot->cancel = vpaint_cancel; - /* flags */ - ot->flag = OPTYPE_UNDO | OPTYPE_BLOCKING; + /* flags */ + ot->flag = OPTYPE_UNDO | OPTYPE_BLOCKING; - paint_stroke_operator_properties(ot); + paint_stroke_operator_properties(ot); } /** \} */ @@ -3995,21 +3950,21 @@ static void fill_bm_face_or_corner_attribute(BMesh &bm, const int cd_offset, const bool use_vert_sel) { - BMFace *f; - BMIter iter; - BM_ITER_MESH (f, &iter, &bm, BM_FACES_OF_MESH) { - BMLoop *l = f->l_first; - do { - if (!(use_vert_sel && !BM_elem_flag_test(l->v, BM_ELEM_SELECT))) { - if (domain == ATTR_DOMAIN_CORNER) { - *static_cast(BM_ELEM_CD_GET_VOID_P(l, cd_offset)) = value; - } - else if (domain == ATTR_DOMAIN_POINT) { - *static_cast(BM_ELEM_CD_GET_VOID_P(l->v, cd_offset)) = value; - } + BMFace *f; + BMIter iter; + BM_ITER_MESH (f, &iter, &bm, BM_FACES_OF_MESH) { + BMLoop *l = f->l_first; + do { + if (!(use_vert_sel && !BM_elem_flag_test(l->v, BM_ELEM_SELECT))) { + if (domain == ATTR_DOMAIN_CORNER) { + *static_cast(BM_ELEM_CD_GET_VOID_P(l, cd_offset)) = value; } - } while ((l = l->next) != f->l_first); - } + else if (domain == ATTR_DOMAIN_POINT) { + *static_cast(BM_ELEM_CD_GET_VOID_P(l->v, cd_offset)) = value; + } + } + } while ((l = l->next) != f->l_first); + } } template @@ -4020,33 +3975,33 @@ static void fill_mesh_face_or_corner_attribute(Mesh &mesh, const bool use_vert_sel, const bool use_face_sel) { - const VArray select_vert = *mesh.attributes().lookup_or_default( - ".select_vert", ATTR_DOMAIN_POINT, false); - const VArray select_poly = *mesh.attributes().lookup_or_default( - ".select_poly", ATTR_DOMAIN_FACE, false); + const VArray select_vert = *mesh.attributes().lookup_or_default( + ".select_vert", ATTR_DOMAIN_POINT, false); + const VArray select_poly = *mesh.attributes().lookup_or_default( + ".select_poly", ATTR_DOMAIN_FACE, false); - const OffsetIndices polys = mesh.polys(); - const Span corner_verts = mesh.corner_verts(); + const OffsetIndices polys = mesh.polys(); + const Span corner_verts = mesh.corner_verts(); - for (const int i : polys.index_range()) { - if (use_face_sel && !select_poly[i]) { + for (const int i : polys.index_range()) { + if (use_face_sel && !select_poly[i]) { + continue; + } + for (const int corner : polys[i]) { + const int vert = corner_verts[corner]; + if (use_vert_sel && !select_vert[vert]) { continue; } - for (const int corner : polys[i]) { - const int vert = corner_verts[corner]; - if (use_vert_sel && !select_vert[vert]) { - continue; - } - if (domain == ATTR_DOMAIN_CORNER) { - data[corner] = value; - } - else { - data[vert] = value; - } + if (domain == ATTR_DOMAIN_CORNER) { + data[corner] = value; + } + else { + data[vert] = value; } } + } - BKE_mesh_tessface_clear(&mesh); + BKE_mesh_tessface_clear(&mesh); } static void fill_mesh_color(Mesh &mesh, @@ -4055,43 +4010,43 @@ static void fill_mesh_color(Mesh &mesh, const bool use_vert_sel, const bool use_face_sel) { - if (mesh.edit_mesh) { - BMesh *bm = mesh.edit_mesh->bm; - const std::string name = attribute_name; - const CustomDataLayer *layer = BKE_id_attributes_color_find(&mesh.id, name.c_str()); - const eAttrDomain domain = BKE_id_attribute_domain(&mesh.id, layer); - if (layer->type == CD_PROP_COLOR) { - fill_bm_face_or_corner_attribute( - *bm, color, domain, layer->offset, use_vert_sel); - } - else if (layer->type == CD_PROP_BYTE_COLOR) { - fill_bm_face_or_corner_attribute( - *bm, color.encode(), domain, layer->offset, use_vert_sel); - } + if (mesh.edit_mesh) { + BMesh *bm = mesh.edit_mesh->bm; + const std::string name = attribute_name; + const CustomDataLayer *layer = BKE_id_attributes_color_find(&mesh.id, name.c_str()); + const eAttrDomain domain = BKE_id_attribute_domain(&mesh.id, layer); + if (layer->type == CD_PROP_COLOR) { + fill_bm_face_or_corner_attribute( + *bm, color, domain, layer->offset, use_vert_sel); } - else { - bke::GSpanAttributeWriter attribute = mesh.attributes_for_write().lookup_for_write_span( - attribute_name); - if (attribute.span.type().is()) { - fill_mesh_face_or_corner_attribute( - mesh, - color, - attribute.domain, - attribute.span.typed().cast(), - use_vert_sel, - use_face_sel); - } - else if (attribute.span.type().is()) { - fill_mesh_face_or_corner_attribute( - mesh, - color.encode(), - attribute.domain, - attribute.span.typed().cast(), - use_vert_sel, - use_face_sel); - } - attribute.finish(); + else if (layer->type == CD_PROP_BYTE_COLOR) { + fill_bm_face_or_corner_attribute( + *bm, color.encode(), domain, layer->offset, use_vert_sel); } + } + else { + bke::GSpanAttributeWriter attribute = mesh.attributes_for_write().lookup_for_write_span( + attribute_name); + if (attribute.span.type().is()) { + fill_mesh_face_or_corner_attribute( + mesh, + color, + attribute.domain, + attribute.span.typed().cast(), + use_vert_sel, + use_face_sel); + } + else if (attribute.span.type().is()) { + fill_mesh_face_or_corner_attribute( + mesh, + color.encode(), + attribute.domain, + attribute.span.typed().cast(), + use_vert_sel, + use_face_sel); + } + attribute.finish(); + } } /** @@ -4101,58 +4056,57 @@ static bool paint_object_attributes_active_color_fill_ex(Object *ob, ColorPaint4f fill_color, bool only_selected = true) { - Mesh *me = BKE_mesh_from_object(ob); - if (!me) { - return false; - } + Mesh *me = BKE_mesh_from_object(ob); + if (!me) { + return false; + } - const bool use_face_sel = only_selected ? (me->editflag & ME_EDIT_PAINT_FACE_SEL) != 0 : false; - const bool use_vert_sel = only_selected ? (me->editflag & ME_EDIT_PAINT_VERT_SEL) != 0 : false; - fill_mesh_color(*me, fill_color, me->active_color_attribute, use_vert_sel, use_face_sel); + const bool use_face_sel = only_selected ? (me->editflag & ME_EDIT_PAINT_FACE_SEL) != 0 : false; + const bool use_vert_sel = only_selected ? (me->editflag & ME_EDIT_PAINT_VERT_SEL) != 0 : false; + fill_mesh_color(*me, fill_color, me->active_color_attribute, use_vert_sel, use_face_sel); - DEG_id_tag_update(&me->id, ID_RECALC_COPY_ON_WRITE); + DEG_id_tag_update(&me->id, ID_RECALC_COPY_ON_WRITE); - /* NOTE: Original mesh is used for display, so tag it directly here. */ - BKE_mesh_batch_cache_dirty_tag(me, BKE_MESH_BATCH_DIRTY_ALL); + /* NOTE: Original mesh is used for display, so tag it directly here. */ + BKE_mesh_batch_cache_dirty_tag(me, BKE_MESH_BATCH_DIRTY_ALL); - return true; + return true; } bool BKE_object_attributes_active_color_fill(Object *ob, const float fill_color[4], bool only_selected) { - return paint_object_attributes_active_color_fill_ex( - ob, ColorPaint4f(fill_color), only_selected); + return paint_object_attributes_active_color_fill_ex(ob, ColorPaint4f(fill_color), only_selected); } static int vertex_color_set_exec(bContext *C, wmOperator * /*op*/) { - Scene *scene = CTX_data_scene(C); - Object *obact = CTX_data_active_object(C); + Scene *scene = CTX_data_scene(C); + Object *obact = CTX_data_active_object(C); - ColorPaint4f paintcol = vpaint_get_current_col(scene, scene->toolsettings->vpaint, false); + ColorPaint4f paintcol = vpaint_get_current_col(scene, scene->toolsettings->vpaint, false); - if (paint_object_attributes_active_color_fill_ex(obact, paintcol)) { - WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obact); - return OPERATOR_FINISHED; - } - return OPERATOR_CANCELLED; + if (paint_object_attributes_active_color_fill_ex(obact, paintcol)) { + WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obact); + return OPERATOR_FINISHED; + } + return OPERATOR_CANCELLED; } void PAINT_OT_vertex_color_set(wmOperatorType *ot) { - /* identifiers */ - ot->name = "Set Vertex Colors"; - ot->idname = "PAINT_OT_vertex_color_set"; - ot->description = "Fill the active vertex color layer with the current paint color"; + /* identifiers */ + ot->name = "Set Vertex Colors"; + ot->idname = "PAINT_OT_vertex_color_set"; + ot->description = "Fill the active vertex color layer with the current paint color"; - /* api callbacks */ - ot->exec = vertex_color_set_exec; - ot->poll = vertex_paint_mode_poll; + /* api callbacks */ + ot->exec = vertex_color_set_exec; + ot->poll = vertex_paint_mode_poll; - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } - /** \} */ +/** \} */ -- 2.30.2 From ff4eaeef48938f0b96f9ec9eade32e29f62a9356 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Mon, 10 Jul 2023 13:14:15 +0200 Subject: [PATCH 092/115] Cleanup: move MOD_nodes.h to C++ All files that use it are in C++ now. --- source/blender/blenkernel/intern/node_tree_update.cc | 2 +- source/blender/editors/object/object_relations.cc | 2 +- source/blender/makesrna/intern/rna_modifier.cc | 2 +- source/blender/modifiers/CMakeLists.txt | 2 +- source/blender/modifiers/{MOD_nodes.h => MOD_nodes.hh} | 10 +--------- source/blender/modifiers/intern/MOD_nodes.cc | 2 +- 6 files changed, 6 insertions(+), 14 deletions(-) rename source/blender/modifiers/{MOD_nodes.h => MOD_nodes.hh} (70%) diff --git a/source/blender/blenkernel/intern/node_tree_update.cc b/source/blender/blenkernel/intern/node_tree_update.cc index 401714547ed..ed84a95c5ad 100644 --- a/source/blender/blenkernel/intern/node_tree_update.cc +++ b/source/blender/blenkernel/intern/node_tree_update.cc @@ -25,7 +25,7 @@ #include "BKE_node_tree_anonymous_attributes.hh" #include "BKE_node_tree_update.h" -#include "MOD_nodes.h" +#include "MOD_nodes.hh" #include "NOD_node_declaration.hh" #include "NOD_socket.hh" diff --git a/source/blender/editors/object/object_relations.cc b/source/blender/editors/object/object_relations.cc index 758b893e391..eddfc0d7847 100644 --- a/source/blender/editors/object/object_relations.cc +++ b/source/blender/editors/object/object_relations.cc @@ -100,7 +100,7 @@ #include "ED_screen.h" #include "ED_view3d.h" -#include "MOD_nodes.h" +#include "MOD_nodes.hh" #include "object_intern.h" diff --git a/source/blender/makesrna/intern/rna_modifier.cc b/source/blender/makesrna/intern/rna_modifier.cc index c5fe1103bc2..9be3a0b1666 100644 --- a/source/blender/makesrna/intern/rna_modifier.cc +++ b/source/blender/makesrna/intern/rna_modifier.cc @@ -46,7 +46,7 @@ #include "WM_api.h" #include "WM_types.h" -#include "MOD_nodes.h" +#include "MOD_nodes.hh" const EnumPropertyItem rna_enum_object_modifier_type_items[] = { RNA_ENUM_ITEM_HEADING(N_("Modify"), nullptr), diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt index fdc6dcde632..59492773fd4 100644 --- a/source/blender/modifiers/CMakeLists.txt +++ b/source/blender/modifiers/CMakeLists.txt @@ -103,7 +103,7 @@ set(SRC intern/MOD_wireframe.cc MOD_modifiertypes.hh - MOD_nodes.h + MOD_nodes.hh intern/MOD_meshcache_util.hh intern/MOD_solidify_util.hh intern/MOD_ui_common.hh diff --git a/source/blender/modifiers/MOD_nodes.h b/source/blender/modifiers/MOD_nodes.hh similarity index 70% rename from source/blender/modifiers/MOD_nodes.h rename to source/blender/modifiers/MOD_nodes.hh index e732a2d24bd..4024d6ec2bb 100644 --- a/source/blender/modifiers/MOD_nodes.h +++ b/source/blender/modifiers/MOD_nodes.hh @@ -7,17 +7,9 @@ struct NodesModifierData; struct Object; -#ifdef __cplusplus -extern "C" { -#endif - /** * Rebuild the list of properties based on the sockets exposed as the modifier's node group * inputs. If any properties correspond to the old properties by name and type, carry over * the values. */ -void MOD_nodes_update_interface(struct Object *object, struct NodesModifierData *nmd); - -#ifdef __cplusplus -} -#endif +void MOD_nodes_update_interface(Object *object, NodesModifierData *nmd); diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc index 396a410be65..1be2ec91596 100644 --- a/source/blender/modifiers/intern/MOD_nodes.cc +++ b/source/blender/modifiers/intern/MOD_nodes.cc @@ -78,7 +78,7 @@ #include "DEG_depsgraph_query.h" #include "MOD_modifiertypes.hh" -#include "MOD_nodes.h" +#include "MOD_nodes.hh" #include "MOD_ui_common.hh" #include "ED_object.h" -- 2.30.2 From ba82b9c47e625eed3dfc0aac42ff02c88dea416f Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 10 Jul 2023 13:40:47 +0200 Subject: [PATCH 093/115] Fix: Eevee-next Looses Reflective World Light When Switching Shading Modes When switching shading between material preview and solid modes, the world reflective light could become uninitialized. The reason was that the world was only updated when they actually changed. When switching it might not be the case that the world changed and the world probe wasn't uploaded to the texture. This fix will reduce the locations where this information was stored (removing the `do_world_update` attribute in `ReflectionProbeModule`). It also doesn't reset the `do_render` flag during syncing, but post- pone it to the actual drawing. Pull Request: https://projects.blender.org/blender/blender/pulls/109901 --- .../engines/eevee_next/eevee_reflection_probes.cc | 15 +++++++++++++-- .../engines/eevee_next/eevee_reflection_probes.hh | 15 +++------------ 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/source/blender/draw/engines/eevee_next/eevee_reflection_probes.cc b/source/blender/draw/engines/eevee_next/eevee_reflection_probes.cc index 72efc6745cb..d638ff5a8bf 100644 --- a/source/blender/draw/engines/eevee_next/eevee_reflection_probes.cc +++ b/source/blender/draw/engines/eevee_next/eevee_reflection_probes.cc @@ -83,7 +83,7 @@ int ReflectionProbeModule::needed_layers_get() const return max_layer + 1; } -void ReflectionProbeModule::sync(const ReflectionProbe &probe) +void ReflectionProbeModule::sync(ReflectionProbe &probe) { switch (probe.type) { case ReflectionProbe::Type::World: { @@ -92,6 +92,7 @@ void ReflectionProbeModule::sync(const ReflectionProbe &probe) case ReflectionProbe::Type::Probe: { if (probe.do_render) { upload_dummy_texture(probe); + probe.do_render = false; } break; } @@ -337,7 +338,6 @@ void ReflectionProbeModule::end_sync() break; } probe.do_update_data = false; - probe.do_render = false; } if (regenerate_mipmaps) { @@ -404,6 +404,17 @@ void ReflectionProbeModule::recalc_lod_factors() probe_data.lod_factor = lod_factor; } } +bool ReflectionProbeModule::do_world_update_get() const +{ + const ReflectionProbe &world_probe = probes_.lookup(world_object_key_); + return world_probe.do_render; +} + +void ReflectionProbeModule::do_world_update_set(bool value) +{ + ReflectionProbe &world_probe = probes_.lookup(world_object_key_); + world_probe.do_render = value; +} /* -------------------------------------------------------------------- */ /** \name Debugging diff --git a/source/blender/draw/engines/eevee_next/eevee_reflection_probes.hh b/source/blender/draw/engines/eevee_next/eevee_reflection_probes.hh index fb2780a16c8..74790c10bcb 100644 --- a/source/blender/draw/engines/eevee_next/eevee_reflection_probes.hh +++ b/source/blender/draw/engines/eevee_next/eevee_reflection_probes.hh @@ -92,8 +92,6 @@ class ReflectionProbeModule { PassSimple remap_ps_ = {"Probe.CubemapToOctahedral"}; - bool do_world_update_ = false; - int3 dispatch_probe_pack_ = int3(0); public: @@ -111,15 +109,13 @@ class ReflectionProbeModule { pass->bind_ssbo(REFLECTION_PROBE_BUF_SLOT, data_buf_); } - void do_world_update_set(bool value) - { - do_world_update_ = value; - } + bool do_world_update_get() const; + void do_world_update_set(bool value); void debug_print() const; private: - void sync(const ReflectionProbe &cubemap); + void sync(ReflectionProbe &cubemap); ReflectionProbe &find_or_insert(ObjectHandle &ob_handle, int subdivision_level); /** Get the number of layers that is needed to store probes. */ @@ -146,11 +142,6 @@ class ReflectionProbeModule { void upload_dummy_texture(const ReflectionProbe &probe); - bool do_world_update_get() const - { - return do_world_update_; - } - void remap_to_octahedral_projection(); /* Capture View requires access to the cube-maps texture for frame-buffer configuration. */ -- 2.30.2 From c78b6e99540e669a08fa96e5d8ec6c7f3508508b Mon Sep 17 00:00:00 2001 From: Iliya Katueshenock Date: Mon, 10 Jul 2023 13:47:29 +0200 Subject: [PATCH 094/115] Geometry Nodes: Improve Blur node face domain performance Slight speed up of face topology building for blur node. Avoid using increment and replacing by adding size. Multi-threading for accumulating offsets. Early returns in one place places. In a test with a large grid, the node became 36% faster, with 13 out of 40 ms saved from the topology building. Pull Request: https://projects.blender.org/blender/blender/pulls/109764 --- .../geometry/nodes/node_geo_blur_attribute.cc | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc b/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc index b34ac785051..29205bf05fd 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc @@ -197,27 +197,30 @@ static void build_face_to_face_by_edge_map(const OffsetIndices polys, Array &r_offsets, Array &r_indices) { - Array edge_to_poly_offsets; + Array edge_to_poly_offset_data; Array edge_to_poly_indices; const GroupedSpan edge_to_poly_map = bke::mesh::build_edge_to_poly_map( - polys, corner_edges, edges_num, edge_to_poly_offsets, edge_to_poly_indices); + polys, corner_edges, edges_num, edge_to_poly_offset_data, edge_to_poly_indices); + const OffsetIndices edge_to_poly_offsets(edge_to_poly_offset_data); r_offsets = Array(polys.size() + 1, 0); - for (const int poly_i : polys.index_range()) { - for (const int edge : corner_edges.slice(polys[poly_i])) { - for (const int neighbor : edge_to_poly_map[edge]) { - if (neighbor != poly_i) { - r_offsets[poly_i]++; - } + threading::parallel_for(polys.index_range(), 4096, [&](const IndexRange range) { + for (const int poly_i : range) { + for (const int edge : corner_edges.slice(polys[poly_i])) { + /* Subtract polygon itself from the number of polygons connected to the edge. */ + r_offsets[poly_i] += edge_to_poly_offsets[edge].size() - 1; } } - } - const OffsetIndices offsets = offset_indices::accumulate_counts_to_offsets(r_offsets); + }); + const OffsetIndices offsets = offset_indices::accumulate_counts_to_offsets(r_offsets); r_indices.reinitialize(offsets.total_size()); threading::parallel_for(polys.index_range(), 1024, [&](IndexRange range) { for (const int poly_i : range) { MutableSpan neighbors = r_indices.as_mutable_span().slice(offsets[poly_i]); + if (neighbors.is_empty()) { + continue; + } int count = 0; for (const int edge : corner_edges.slice(polys[poly_i])) { for (const int neighbor : edge_to_poly_map[edge]) { -- 2.30.2 From 351034891e433e83248203fada4c4a3d55bfae0c Mon Sep 17 00:00:00 2001 From: Joseph Eagar Date: Mon, 10 Jul 2023 04:56:02 -0700 Subject: [PATCH 095/115] Sculpt: Cleanup duplicate code in clay strips brush Clay strips was using it's own brush local matrix, which wasn't quite compatible with texture matrices. This could lead to brush textures not lining up with the stroke dabs. There was also a bug where the stroke was starting 20 pixels into the stroke, which is much higher than necassary to derive the initial rake angle. Notes: * The clay strips brush now uses SCULPT_cube_tip_init to calculate the local brush matrix. * SCULPT_cube_tip_init now accepts custom brush location and radius arguments. * The mouse sample preroll used to calculate initial brush rotation angle is now smaller than the update interval. * Clay strips now supports tip_scale_x, which has also been added to DNA defaults. --- .../startup/bl_ui/properties_paint_common.py | 3 ++ source/blender/blenkernel/BKE_paint.h | 3 +- source/blender/blenkernel/intern/brush.cc | 6 ++-- source/blender/blenkernel/intern/paint.cc | 20 ++++++++--- .../blenloader/intern/versioning_400.cc | 8 +++++ .../editors/sculpt_paint/paint_cursor.cc | 2 +- .../editors/sculpt_paint/paint_stroke.cc | 4 +-- source/blender/editors/sculpt_paint/sculpt.cc | 34 +++++++++++++------ .../sculpt_paint/sculpt_brush_types.cc | 31 +++++++++-------- .../editors/sculpt_paint/sculpt_intern.hh | 10 ++++-- .../sculpt_paint/sculpt_paint_color.cc | 3 +- source/blender/makesdna/DNA_brush_defaults.h | 2 ++ source/blender/makesrna/intern/rna_brush.cc | 2 +- 13 files changed, 87 insertions(+), 41 deletions(-) diff --git a/scripts/startup/bl_ui/properties_paint_common.py b/scripts/startup/bl_ui/properties_paint_common.py index c8f4b222ed2..d95f78a7c41 100644 --- a/scripts/startup/bl_ui/properties_paint_common.py +++ b/scripts/startup/bl_ui/properties_paint_common.py @@ -635,6 +635,9 @@ def brush_settings(layout, context, brush, popover=False): row = layout.row() row.prop(brush, "tip_roundness") + row = layout.row() + row.prop(brush, "tip_scale_x") + elif sculpt_tool == 'ELASTIC_DEFORM': layout.separator() layout.prop(brush, "elastic_deform_type") diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h index 51e53ad541c..66bf8bb3ac7 100644 --- a/source/blender/blenkernel/BKE_paint.h +++ b/source/blender/blenkernel/BKE_paint.h @@ -247,7 +247,8 @@ void BKE_paint_face_set_overlay_color_get(int face_set, int seed, uchar r_color[ bool paint_calculate_rake_rotation(struct UnifiedPaintSettings *ups, struct Brush *brush, const float mouse_pos[2], - ePaintMode paint_mode); + ePaintMode paint_mode, + bool stroke_has_started); void paint_update_brush_rake_rotation(struct UnifiedPaintSettings *ups, struct Brush *brush, float rotation); diff --git a/source/blender/blenkernel/intern/brush.cc b/source/blender/blenkernel/intern/brush.cc index c4e2456652a..f513371c212 100644 --- a/source/blender/blenkernel/intern/brush.cc +++ b/source/blender/blenkernel/intern/brush.cc @@ -527,6 +527,8 @@ static void brush_defaults(Brush *brush) FROM_DEFAULT(mtex); FROM_DEFAULT(mask_mtex); FROM_DEFAULT(falloff_shape); + FROM_DEFAULT(tip_scale_x); + FROM_DEFAULT(tip_roundness); #undef FROM_DEFAULT #undef FROM_DEFAULT_PTR @@ -1939,8 +1941,6 @@ void BKE_brush_sculpt_reset(Brush *br) br->spacing = 10; br->alpha = 1.0f; br->flow = 1.0f; - br->tip_scale_x = 1.0f; - br->tip_roundness = 1.0f; br->density = 1.0f; br->flag &= ~BRUSH_SPACE_ATTEN; zero_v3(br->rgb); @@ -2660,7 +2660,7 @@ bool BKE_brush_has_cube_tip(const Brush *brush, ePaintMode paint_mode) } if (ELEM(brush->sculpt_tool, SCULPT_TOOL_CLAY_STRIPS, SCULPT_TOOL_PAINT) && - brush->tip_roundness < 1.0f) + (brush->tip_roundness < 1.0f || brush->tip_scale_x != 1.0f)) { return true; } diff --git a/source/blender/blenkernel/intern/paint.cc b/source/blender/blenkernel/intern/paint.cc index 59cf478057d..495d0ddbefa 100644 --- a/source/blender/blenkernel/intern/paint.cc +++ b/source/blender/blenkernel/intern/paint.cc @@ -1332,8 +1332,11 @@ float paint_grid_paint_mask(const GridPaintMask *gpm, uint level, uint x, uint y return gpm->data[(y * factor) * gridsize + (x * factor)]; } -/* Threshold to move before updating the brush rotation. */ -#define RAKE_THRESHHOLD 20 +/* Threshold to move before updating the brush rotation, reduces jitter. */ +static float paint_rake_rotation_spacing(UnifiedPaintSettings * /*ups*/, Brush *brush) +{ + return brush->sculpt_tool == SCULPT_TOOL_CLAY_STRIPS ? 1.0f : 20.0f; +} void paint_update_brush_rake_rotation(UnifiedPaintSettings *ups, Brush *brush, float rotation) { @@ -1361,16 +1364,25 @@ static const bool paint_rake_rotation_active(const Brush &brush, ePaintMode pain bool paint_calculate_rake_rotation(UnifiedPaintSettings *ups, Brush *brush, const float mouse_pos[2], - ePaintMode paint_mode) + ePaintMode paint_mode, + bool stroke_has_started) { bool ok = false; if (paint_rake_rotation_active(*brush, paint_mode)) { - const float r = RAKE_THRESHHOLD; + float r = paint_rake_rotation_spacing(ups, brush); float rotation; + /* Use a smaller limit if the stroke hasn't started + * to prevent excessive preroll. + */ + if (!stroke_has_started) { + r = min_ff(r, 4.0f); + } + float dpos[2]; sub_v2_v2v2(dpos, ups->last_rake, mouse_pos); + /* Limit how often we update the angle to prevent jitter. */ if (len_squared_v2(dpos) >= r * r) { rotation = atan2f(dpos[0], dpos[1]); diff --git a/source/blender/blenloader/intern/versioning_400.cc b/source/blender/blenloader/intern/versioning_400.cc index cb748b08d26..92a89587ec2 100644 --- a/source/blender/blenloader/intern/versioning_400.cc +++ b/source/blender/blenloader/intern/versioning_400.cc @@ -10,6 +10,7 @@ #include "CLG_log.h" +#include "DNA_brush_types.h" #include "DNA_light_types.h" #include "DNA_lightprobe_types.h" #include "DNA_modifier_types.h" @@ -316,6 +317,13 @@ void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain) } } + /* Fix brush->tip_scale_x which should never be zero. */ + LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) { + if (brush->tip_scale_x == 0.0f) { + brush->tip_scale_x = 1.0f; + } + } + /** * Versioning code until next subversion bump goes here. * diff --git a/source/blender/editors/sculpt_paint/paint_cursor.cc b/source/blender/editors/sculpt_paint/paint_cursor.cc index e6037b31043..38e8c7eb5fc 100644 --- a/source/blender/editors/sculpt_paint/paint_cursor.cc +++ b/source/blender/editors/sculpt_paint/paint_cursor.cc @@ -1870,7 +1870,7 @@ static void paint_cursor_update_rake_rotation(PaintCursorContext *pcontext) * For line strokes, such interference is visible. */ if (!pcontext->ups->stroke_active) { paint_calculate_rake_rotation( - pcontext->ups, pcontext->brush, pcontext->translation, pcontext->mode); + pcontext->ups, pcontext->brush, pcontext->translation, pcontext->mode, true); } } diff --git a/source/blender/editors/sculpt_paint/paint_stroke.cc b/source/blender/editors/sculpt_paint/paint_stroke.cc index f24ebc5e7eb..66b1ee3abdc 100644 --- a/source/blender/editors/sculpt_paint/paint_stroke.cc +++ b/source/blender/editors/sculpt_paint/paint_stroke.cc @@ -444,7 +444,7 @@ static bool paint_brush_update(bContext *C, } /* curve strokes do their own rake calculation */ else if (!(brush->flag & BRUSH_CURVE)) { - if (!paint_calculate_rake_rotation(ups, brush, mouse_init, mode)) { + if (!paint_calculate_rake_rotation(ups, brush, mouse_init, mode, stroke->rake_started)) { /* Not enough motion to define an angle. */ if (!stroke->rake_started) { is_dry_run = true; @@ -1575,7 +1575,7 @@ int paint_stroke_modal(bContext *C, wmOperator *op, const wmEvent *event, PaintS { copy_v2_v2(stroke->ups->last_rake, stroke->last_mouse_position); } - paint_calculate_rake_rotation(stroke->ups, br, mouse, mode); + paint_calculate_rake_rotation(stroke->ups, br, mouse, mode, true); } } else if (first_modal || diff --git a/source/blender/editors/sculpt_paint/sculpt.cc b/source/blender/editors/sculpt_paint/sculpt.cc index 5d36582c200..bf635e06694 100644 --- a/source/blender/editors/sculpt_paint/sculpt.cc +++ b/source/blender/editors/sculpt_paint/sculpt.cc @@ -1809,7 +1809,8 @@ bool SCULPT_brush_test_circle_sq(SculptBrushTest *test, const float co[3]) bool SCULPT_brush_test_cube(SculptBrushTest *test, const float co[3], const float local[4][4], - const float roundness) + const float roundness, + const float /*tip_scale_x*/) { float side = 1.0f; float local_co[3]; @@ -2984,7 +2985,9 @@ static void calc_local_y(ViewContext *vc, const float center[3], float y[3]) static void calc_brush_local_mat(const float rotation, Object *ob, float local_mat[4][4], - float local_mat_inv[4][4]) + float local_mat_inv[4][4], + const float *co, + const float *no) { const StrokeCache *cache = ob->sculpt->cache; float tmat[4][4]; @@ -2993,6 +2996,13 @@ static void calc_brush_local_mat(const float rotation, float angle, v[3]; float up[3]; + if (!co) { + co = cache->location; + } + if (!no) { + no = cache->sculpt_normal; + } + /* Ensure `ob->world_to_object` is up to date. */ invert_m4_m4(ob->world_to_object, ob->object_to_world); @@ -3003,20 +3013,20 @@ static void calc_brush_local_mat(const float rotation, mat[3][3] = 1.0f; /* Get view's up vector in object-space. */ - calc_local_y(cache->vc, cache->location, up); + calc_local_y(cache->vc, co, up); /* Calculate the X axis of the local matrix. */ - cross_v3_v3v3(v, up, cache->sculpt_normal); + cross_v3_v3v3(v, up, no); /* Apply rotation (user angle, rake, etc.) to X axis. */ angle = rotation - cache->special_rotation; - rotate_v3_v3v3fl(mat[0], v, cache->sculpt_normal, angle); + rotate_v3_v3v3fl(mat[0], v, no, angle); /* Get other axes. */ - cross_v3_v3v3(mat[1], cache->sculpt_normal, mat[0]); - copy_v3_v3(mat[2], cache->sculpt_normal); + cross_v3_v3v3(mat[1], no, mat[0]); + copy_v3_v3(mat[2], no); /* Set location. */ - copy_v3_v3(mat[3], cache->location); + copy_v3_v3(mat[3], co); /* Scale by brush radius. */ float radius = cache->radius; @@ -3069,7 +3079,8 @@ static void update_brush_local_mat(Sculpt *sd, Object *ob) if (cache->mirror_symmetry_pass == 0 && cache->radial_symmetry_pass == 0) { const Brush *brush = BKE_paint_brush(&sd->paint); const MTex *mask_tex = BKE_brush_mask_texture_get(brush, OB_MODE_SCULPT); - calc_brush_local_mat(mask_tex->rot, ob, cache->brush_local_mat, cache->brush_local_mat_inv); + calc_brush_local_mat( + mask_tex->rot, ob, cache->brush_local_mat, cache->brush_local_mat_inv, nullptr, nullptr); } } @@ -6411,7 +6422,8 @@ void SCULPT_topology_islands_ensure(Object *ob) ss->islands_valid = true; } -void SCULPT_cube_tip_init(Sculpt * /*sd*/, Object *ob, Brush *brush, float mat[4][4]) +void SCULPT_cube_tip_init( + Sculpt * /*sd*/, Object *ob, Brush *brush, float mat[4][4], const float *co, const float *no) { SculptSession *ss = ob->sculpt; float scale[4][4]; @@ -6419,7 +6431,7 @@ void SCULPT_cube_tip_init(Sculpt * /*sd*/, Object *ob, Brush *brush, float mat[4 float unused[4][4]; zero_m4(mat); - calc_brush_local_mat(0.0, ob, unused, mat); + calc_brush_local_mat(0.0, ob, unused, mat, co, no); /* Note: we ignore the radius scaling done inside of calc_brush_local_mat to * duplicate prior behavior. diff --git a/source/blender/editors/sculpt_paint/sculpt_brush_types.cc b/source/blender/editors/sculpt_paint/sculpt_brush_types.cc index 721980f22fe..43e0dc7276b 100644 --- a/source/blender/editors/sculpt_paint/sculpt_brush_types.cc +++ b/source/blender/editors/sculpt_paint/sculpt_brush_types.cc @@ -1058,7 +1058,7 @@ static void do_clay_strips_brush_task_cb_ex(void *__restrict userdata, data->ob, ss, ss->cache->automasking, &automask_data, data->nodes[n]); BKE_pbvh_vertex_iter_begin (ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) { - if (!SCULPT_brush_test_cube(&test, vd.co, mat, brush->tip_roundness)) { + if (!SCULPT_brush_test_cube(&test, vd.co, mat, brush->tip_roundness, brush->tip_scale_x)) { continue; } @@ -1130,15 +1130,6 @@ void SCULPT_do_clay_strips_brush(Sculpt *sd, Object *ob, Span nodes) copy_v3_v3(area_no, area_no_sp); } - /* Delay the first daub because grab delta is not setup. */ - if (SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache)) { - return; - } - - if (is_zero_v3(ss->cache->grab_delta_symmetry)) { - return; - } - mul_v3_v3v3(temp, area_no_sp, ss->cache->scale); mul_v3_fl(temp, displace); add_v3_v3(area_co, temp); @@ -1155,6 +1146,20 @@ void SCULPT_do_clay_strips_brush(Sculpt *sd, Object *ob, Span nodes) madd_v3_v3v3fl(area_co_displaced, area_co, area_no, -radius * 0.7f); /* Initialize brush local-space matrix. */ + SCULPT_cube_tip_init(sd, ob, brush, mat, area_co, area_no); + + /* Deform the local space in Z to scale the test cube. As the test cube does not have falloff in + * Z this does not produce artifacts in the falloff cube and allows to deform extra vertices + * during big deformation while keeping the surface as uniform as possible. */ + invert_m4(mat); + mul_v3_fl(mat[2], 1.25f); + invert_m4(mat); + +#if 0 /* The original matrix construction code, preserved here for reference. */ + if (is_zero_v3(ss->cache->grab_delta_symmetry)) { + return; + } + cross_v3_v3v3(mat[0], area_no, ss->cache->grab_delta_symmetry); mat[0][3] = 0.0f; cross_v3_v3v3(mat[1], area_no, mat[0]); @@ -1169,12 +1174,8 @@ void SCULPT_do_clay_strips_brush(Sculpt *sd, Object *ob, Span nodes) scale_m4_fl(scale, ss->cache->radius); mul_m4_m4m4(tmat, mat, scale); - /* Deform the local space in Z to scale the test cube. As the test cube does not have falloff in - * Z this does not produce artifacts in the falloff cube and allows to deform extra vertices - * during big deformation while keeping the surface as uniform as possible. */ - mul_v3_fl(tmat[2], 1.25f); - invert_m4_m4(mat, tmat); +#endif SculptThreadedTaskData data{}; data.sd = sd; diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.hh b/source/blender/editors/sculpt_paint/sculpt_intern.hh index cc441c27b19..d1bc497f8a2 100644 --- a/source/blender/editors/sculpt_paint/sculpt_intern.hh +++ b/source/blender/editors/sculpt_paint/sculpt_intern.hh @@ -1232,7 +1232,8 @@ bool SCULPT_brush_test_sphere_fast(const SculptBrushTest *test, const float co[3 bool SCULPT_brush_test_cube(SculptBrushTest *test, const float co[3], const float local[4][4], - float roundness); + const float roundness, + const float tip_scale_x); bool SCULPT_brush_test_circle_sq(SculptBrushTest *test, const float co[3]); /** * Test AABB against sphere. @@ -1257,7 +1258,12 @@ SculptBrushTestFn SCULPT_brush_test_init_with_falloff_shape(SculptSession *ss, char falloff_shape); const float *SCULPT_brush_frontface_normal_from_falloff_shape(SculptSession *ss, char falloff_shape); -void SCULPT_cube_tip_init(Sculpt *sd, Object *ob, Brush *brush, float mat[4][4]); +void SCULPT_cube_tip_init(Sculpt *sd, + Object *ob, + Brush *brush, + float mat[4][4], + const float *co = nullptr, /* Custom brush center. */ + const float *no = nullptr); /* Custom brush normal. */ /** * Return a multiplier for brush strength on a particular vertex. diff --git a/source/blender/editors/sculpt_paint/sculpt_paint_color.cc b/source/blender/editors/sculpt_paint/sculpt_paint_color.cc index 05c8f7894f4..fe4a55093e5 100644 --- a/source/blender/editors/sculpt_paint/sculpt_paint_color.cc +++ b/source/blender/editors/sculpt_paint/sculpt_paint_color.cc @@ -143,7 +143,8 @@ static void do_paint_brush_task_cb_ex(void *__restrict userdata, bool affect_vertex = false; float distance_to_stroke_location = 0.0f; if (brush->tip_roundness < 1.0f) { - affect_vertex = SCULPT_brush_test_cube(&test, vd.co, data->mat, brush->tip_roundness); + affect_vertex = SCULPT_brush_test_cube( + &test, vd.co, data->mat, brush->tip_roundness, brush->tip_scale_x); distance_to_stroke_location = ss->cache->radius * test.dist; } else { diff --git a/source/blender/makesdna/DNA_brush_defaults.h b/source/blender/makesdna/DNA_brush_defaults.h index 26ad33750dc..48f43765b7d 100644 --- a/source/blender/makesdna/DNA_brush_defaults.h +++ b/source/blender/makesdna/DNA_brush_defaults.h @@ -102,6 +102,8 @@ .mtex = _DNA_DEFAULT_MTex, \ .mask_mtex = _DNA_DEFAULT_MTex, \ .falloff_shape = 0,\ + .tip_scale_x = 1.0f,\ + .tip_roundness = 1.0f,\ } /** \} */ diff --git a/source/blender/makesrna/intern/rna_brush.cc b/source/blender/makesrna/intern/rna_brush.cc index 651f12086c2..60016b0f42f 100644 --- a/source/blender/makesrna/intern/rna_brush.cc +++ b/source/blender/makesrna/intern/rna_brush.cc @@ -2864,7 +2864,7 @@ static void rna_def_brush(BlenderRNA *brna) prop = RNA_def_property(srna, "tip_scale_x", PROP_FLOAT, PROP_FACTOR); RNA_def_property_float_sdna(prop, nullptr, "tip_scale_x"); RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.001, 3); + RNA_def_property_ui_range(prop, 0.0001f, 1.0f, 0.001, 3); RNA_def_property_ui_text(prop, "Tip Scale X", "Scale of the brush tip in the X axis"); RNA_def_property_update(prop, 0, "rna_Brush_update"); -- 2.30.2 From 739146bf333cc13f454d86bb8d05df9fc85a90b9 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Mon, 10 Jul 2023 14:17:06 +0200 Subject: [PATCH 096/115] UI Translations and messages fixes. --- scripts/modules/bl_i18n_utils/settings.py | 3 ++- .../modules/bl_i18n_utils/utils_spell_check.py | 17 ++++++++++++++++- scripts/startup/bl_operators/text.py | 2 +- scripts/startup/bl_ui/space_userpref.py | 4 ++-- source/blender/editors/io/io_usd.cc | 2 +- .../tree/tree_element_overrides.cc | 2 +- source/blender/makesrna/intern/rna_curve.cc | 2 +- source/blender/render/intern/render_result.cc | 4 ++-- 8 files changed, 26 insertions(+), 10 deletions(-) diff --git a/scripts/modules/bl_i18n_utils/settings.py b/scripts/modules/bl_i18n_utils/settings.py index 9822c482141..ea09eda461c 100644 --- a/scripts/modules/bl_i18n_utils/settings.py +++ b/scripts/modules/bl_i18n_utils/settings.py @@ -430,6 +430,7 @@ WARN_MSGID_NOT_CAPITALIZED_ALLOWED = { "normal", "on {:%Y-%m-%d}", "or AMD with macOS %s or newer", + "parent", "performance impact!", "positions", "no positions", "read", @@ -446,7 +447,7 @@ WARN_MSGID_NOT_CAPITALIZED_ALLOWED = { "unable to load text", "unable to open the file", "unknown error reading file", - "unknown error stating file", + "unknown error statting file", "unknown error writing file", "unselected", "unsupported font format", diff --git a/scripts/modules/bl_i18n_utils/utils_spell_check.py b/scripts/modules/bl_i18n_utils/utils_spell_check.py index 3f0caf62b1b..968bf922dc6 100644 --- a/scripts/modules/bl_i18n_utils/utils_spell_check.py +++ b/scripts/modules/bl_i18n_utils/utils_spell_check.py @@ -49,6 +49,7 @@ class SpellChecker: "mplayer", "ons", # add-ons "pong", # ping pong + "procedurals", # Used as noun "resumable", "runtimes", "scalable", @@ -195,6 +196,7 @@ class SpellChecker: "remesh", "reprojection", "reproject", "reprojecting", "resample", + "rescale", "resize", "restpose", "resync", "resynced", @@ -259,7 +261,7 @@ class SpellChecker: "unprotect", "unreacted", "unreferenced", - "unregister", + "unregister", "unregistration", "unselect", "unselected", "unselectable", "unsets", "unshadowed", @@ -303,6 +305,7 @@ class SpellChecker: "shaper", "smoothen", "smoothening", "spherize", "spherized", + "statting", # Running `stat` command, yuck! "stitchable", "symmetrize", "trackability", @@ -320,6 +323,7 @@ class SpellChecker: "anim", "aov", "app", + "args", # Arguments "bbox", "bboxes", "bksp", # Backspace "bool", @@ -352,6 +356,7 @@ class SpellChecker: "luma", "mbs", # mouse button 'select'. "mem", + "mul", # Multiplicative etc. "multicam", "num", "ok", @@ -448,6 +453,7 @@ class SpellChecker: "quaternion", "quaternions", "quintic", "samplerate", + "sandboxed", "sawtooth", "scrollback", "scrollbar", @@ -459,6 +465,8 @@ class SpellChecker: "thumbstick", "tooltip", "tooltips", "touchpad", "trackpad", + "trilinear", + "triquadratic", "tuple", "unicode", "viewport", "viewports", @@ -485,6 +493,7 @@ class SpellChecker: "clearcoat", "codec", "codecs", "collada", + "colorspace", "compositing", "crossfade", "cubemap", "cubemaps", @@ -538,6 +547,7 @@ class SpellChecker: "spillmap", "sobel", "stereoscopy", + "surfel", "surfels", # Surface Element "texel", "timecode", "tonemap", @@ -621,6 +631,7 @@ class SpellChecker: "tessface", "tessfaces", "texface", "timeline", "timelines", + "tmpact", # sigh... "tosphere", "uilist", "userpref", @@ -656,6 +667,7 @@ class SpellChecker: "gmp", "hosek", "kutta", + "kuwahara", "lennard", "marsen", # Texel-Marsen-Arsloe "mikktspace", @@ -751,6 +763,7 @@ class SpellChecker: "rdna", "rdp", "rgb", "rgba", + "ris", "rhs", "rv", "sdf", @@ -770,6 +783,7 @@ class SpellChecker: "vmm", "vr", "wxyz", + "xform", "xr", "ycc", "ycca", "yrgb", @@ -840,6 +854,7 @@ class SpellChecker: "tiff", "theora", "usdz", + "vdb", "vorbis", "vp9", "wav", diff --git a/scripts/startup/bl_operators/text.py b/scripts/startup/bl_operators/text.py index 79daac2a436..7acf2ba9ec5 100644 --- a/scripts/startup/bl_operators/text.py +++ b/scripts/startup/bl_operators/text.py @@ -47,7 +47,7 @@ class TEXT_OT_jump_to_file_at_point(Operator): self.report( {'ERROR_INVALID_INPUT'}, "Provide text editor argument format in File Paths/Applications Preferences, " - "see input field tool-tip for more information.", + "see input field tool-tip for more information", ) return {'CANCELLED'} diff --git a/scripts/startup/bl_ui/space_userpref.py b/scripts/startup/bl_ui/space_userpref.py index b2660c00167..13d8c480248 100644 --- a/scripts/startup/bl_ui/space_userpref.py +++ b/scripts/startup/bl_ui/space_userpref.py @@ -643,8 +643,8 @@ class USERPREF_PT_system_os_settings(SystemPanel, CenterAlignMixIn, Panel): def draw_centered(self, _context, layout): if _context.preferences.system.is_microsoft_store_install: - layout.label(text="Microsoft Store installation.") - layout.label(text="Use Windows 'Default Apps' to associate with blend files.") + layout.label(text="Microsoft Store installation") + layout.label(text="Use Windows 'Default Apps' to associate with blend files") else: layout.label(text="Open blend files with this Blender version") split = layout.split(factor=0.5) diff --git a/source/blender/editors/io/io_usd.cc b/source/blender/editors/io/io_usd.cc index bcd3e838798..333d4ad11c7 100644 --- a/source/blender/editors/io/io_usd.cc +++ b/source/blender/editors/io/io_usd.cc @@ -658,7 +658,7 @@ void WM_OT_usd_import(wmOperatorType *ot) nullptr, 0, "Path Mask", - "Import only the primitive at the given path and its descendents. " + "Import only the primitive at the given path and its descendants. " "Multiple paths may be specified in a list delimited by commas or semicolons"); RNA_def_boolean(ot->srna, "import_guide", false, "Guide", "Import guide geometry"); diff --git a/source/blender/editors/space_outliner/tree/tree_element_overrides.cc b/source/blender/editors/space_outliner/tree/tree_element_overrides.cc index e88d348d161..eed078d2ff4 100644 --- a/source/blender/editors/space_outliner/tree/tree_element_overrides.cc +++ b/source/blender/editors/space_outliner/tree/tree_element_overrides.cc @@ -244,7 +244,7 @@ StringRefNull TreeElementOverridesPropertyOperation::getOverrideOperationLabel() case LIBOVERRIDE_OP_ADD: return TIP_("Additive override"); case LIBOVERRIDE_OP_SUBTRACT: - return TIP_("Substractive override"); + return TIP_("Subtractive override"); case LIBOVERRIDE_OP_MULTIPLY: return TIP_("Multiplicative override"); default: diff --git a/source/blender/makesrna/intern/rna_curve.cc b/source/blender/makesrna/intern/rna_curve.cc index 1c5e64e4b06..de098fb1b2d 100644 --- a/source/blender/makesrna/intern/rna_curve.cc +++ b/source/blender/makesrna/intern/rna_curve.cc @@ -1305,7 +1305,7 @@ static void rna_def_font(BlenderRNA * /*brna*/, StructRNA *srna) prop = RNA_def_property(srna, "is_select_smallcaps", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna( prop, nullptr, "editfont->select_char_info_flag", CU_CHINFO_SMALLCAPS); - RNA_def_property_ui_text(prop, "Selected Smallcaps", "Whether the selected text is small caps"); + RNA_def_property_ui_text(prop, "Selected Small Caps", "Whether the selected text is small caps"); RNA_def_property_clear_flag(prop, PROP_EDITABLE); prop = RNA_def_property(srna, "has_selection", PROP_BOOLEAN, PROP_NONE); diff --git a/source/blender/render/intern/render_result.cc b/source/blender/render/intern/render_result.cc index 2ac427ffcf6..96c2789d9c4 100644 --- a/source/blender/render/intern/render_result.cc +++ b/source/blender/render/intern/render_result.cc @@ -877,7 +877,7 @@ bool render_result_exr_file_read_path(RenderResult *rr, else { BKE_reportf(nullptr, RPT_WARNING, - "reading render result: expected channel \"%s.%s\" or \"%s\" not found", + "Reading render result: expected channel \"%s.%s\" or \"%s\" not found", rl->name, fullname, fullname); @@ -886,7 +886,7 @@ bool render_result_exr_file_read_path(RenderResult *rr, else { BKE_reportf(nullptr, RPT_WARNING, - "reading render result: expected channel \"%s.%s\" not found", + "Reading render result: expected channel \"%s.%s\" not found", rl->name, fullname); } -- 2.30.2 From 01ca00e0734707c08d97c74238dee49aedd5c505 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Mon, 10 Jul 2023 14:47:45 +0200 Subject: [PATCH 097/115] I18N: Updated UI translations from SVN trunk (r6625). --- locale/po/ab.po | 2 +- locale/po/ar.po | 84 +- locale/po/ca.po | 2501 ++++++++++++++++++++++++++++++++--------- locale/po/cs.po | 64 +- locale/po/de.po | 72 +- locale/po/es.po | 1081 ++++++++++++++---- locale/po/eu.po | 4 +- locale/po/fa.po | 4 +- locale/po/fi.po | 4 +- locale/po/fr.po | 1905 +++++++++++++++++++++++++++---- locale/po/ha.po | 4 +- locale/po/he.po | 4 +- locale/po/hi.po | 4 +- locale/po/hu.po | 1464 ++++++++++++------------ locale/po/id.po | 4 +- locale/po/it.po | 112 +- locale/po/ja.po | 221 +--- locale/po/ka.po | 120 +- locale/po/ko.po | 124 +- locale/po/ky.po | 4 +- locale/po/nl.po | 16 +- locale/po/pl.po | 4 +- locale/po/pt.po | 120 +- locale/po/pt_BR.po | 120 +- locale/po/ru.po | 128 +-- locale/po/sk.po | 1881 +++++++++++++++++++++++++++---- locale/po/sr.po | 28 +- locale/po/sr@latin.po | 28 +- locale/po/sv.po | 12 +- locale/po/th.po | 16 +- locale/po/tr.po | 4 +- locale/po/uk.po | 128 +-- locale/po/vi.po | 128 +-- locale/po/zh_CN.po | 132 +-- locale/po/zh_TW.po | 92 +- 35 files changed, 7278 insertions(+), 3341 deletions(-) diff --git a/locale/po/ab.po b/locale/po/ab.po index 488ed2ef06f..8b5ffcd5ad0 100644 --- a/locale/po/ab.po +++ b/locale/po/ab.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" "\"POT-Creation-Date: 2019-02-25 20:41:30\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" diff --git a/locale/po/ar.po b/locale/po/ar.po index 6c967dd83ef..f6c6a656cbe 100644 --- a/locale/po/ar.po +++ b/locale/po/ar.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2016-04-23 22:41+0300\n" "Last-Translator: Yousef Harfoush \n" "Language-Team: Yousef Harfoush, Amine Moussaoui \n" @@ -11411,10 +11411,6 @@ msgid "Light color" msgstr "ءﻮﻀﻟﺍ ﻥﻮﻟ" -msgid "Falloff distance - the light is at half the original intensity at this point" -msgstr "ﺔﻄﻘﻨﻟﺍ ﻩﺬﻫ ﺪﻨﻋ ﻪﺗﺪﺷ ﻒﺼﻨﺑ ءﻮﻀﻟﺍ ﻥﻮﻜﻳ - ﻝﺅﺎﻀﺘﻟﺍ ﺔﻓﺎﺴﻣ" - - msgid "Specular Factor" msgstr "ﻖﻳﺮﺒﻟﺍ ﻞﻣﺎﻌﻣ" @@ -11435,42 +11431,6 @@ msgid "Directional area light source" msgstr "ﻪﺠﺘﻣ ﺔﻘﻄﻨﻣ ءﻮﺿ ﺭﺪﺼﻣ" -msgid "Falloff Type" -msgstr "ﻲﺷﻼﺘﻟﺍ ﻉﻮﻧ" - - -msgid "Intensity Decay with distance" -msgstr "ﺔﻓﺎﺴﻤﻟﺎﺑ ﺓﺪّﺸﻟﺍ ﻝﺅﺎﻀﺗ" - - -msgid "Inverse Linear" -msgstr "ﺱﻮﻜﻌﻣ ﻲﻄﺧ" - - -msgid "Inverse Square" -msgstr "ﻲﺴﻜﻋ ﻲﻌﻴﺑﺮﺗ" - - -msgid "Lin/Quad Weighted" -msgstr "ﻲﻌﻴﺑﺮﺗ/ﻲﻄﺧ ﻥﻭﺯﻮﻣ" - - -msgid "Linear Attenuation" -msgstr "ﻲﻄﺧ ﻒﻴﻔﺨﺗ" - - -msgid "Linear distance attenuation" -msgstr "ﺔﻴﻄﺨﻟﺍ ﺔﻓﺎﺴﻤﻟﺍ ﻝﺅﺎﻀﺗ" - - -msgid "Quadratic Attenuation" -msgstr "ﻲﻌﻴﺑﺮﺗ ﻒﻴﻔﺨﺗ" - - -msgid "Quadratic distance attenuation" -msgstr "ﻲﻌﻴﺑﺮﺘﻟﺍ ﺔﻓﺎﺴﻤﻟﺍ ﻲﺷﻼﺗ" - - msgid "Shadow Buffer Bias" msgstr "ﻞﻈﻟﺍ ﺔﻜﺒﺷ ﻑﺍﺮﺤﻧﺇ" @@ -11483,22 +11443,6 @@ msgid "Shadow map clip start, below which objects will not generate shadows" msgstr "ﻝﻼﻇ ﺎﻬﻠﺒﻗ ﺪﻟﻮﺘﻳ ﻦﻟ ﻲﺘﻟﺍ ﻭ ,ﻞﻈﻟﺍ ﺔﻄﻳﺮﺧ ﻢﻴﻠﻘﺗ ﺔﻳﺍﺪﺑ" -msgid "Samples" -msgstr "ﺕﺎﻨﻴﻋ" - - -msgid "Number of shadow buffer samples" -msgstr "ﻞﻈﻟﺍ ﺔﻜﺒﺷ ﺕﺎﻨﻴﻋ ﺩﺪﻋ" - - -msgid "Shadow Buffer Size" -msgstr "ﻞﻈﻟﺍ ﺔﻜﺒﺷ ﻢﺠﺣ" - - -msgid "Resolution of the shadow buffer, higher values give crisper shadows but use more memory" -msgstr "ﺮﺒﻛﺍ ﺓﺮﻛﺍﺫ ﺔﻴﻤﻛ ﻡﺪﺨﺘﺴﺗ ﻦﻜﻟ ﺮﻀﻧﺍ ﻞﻇ ﻲﻄﻌﺗ ﻰﻠﻋﺍ ﻢﻴﻗ ,ﻞﻈﻟﺍ ﺔﻜﺒﺷ ﺔﻗﺩ" - - msgid "Shadow Color" msgstr "ﻞﻈﻟﺍ ﻥﻮﻟ" @@ -17160,6 +17104,10 @@ msgid "Thickness Min" msgstr "ﺔﻛﺎﻤﺳ ﻞﻗﺍ" +msgid "Samples" +msgstr "ﺕﺎﻨﻴﻋ" + + msgid "Number of samples to test per face" msgstr "ﻪﺟﻭ ﻞﻜﻟ ﺔﺻﻮﺤﻔﻤﻟﺍ ﺕﺎﻨﻴﻌﻟﺍ ﺩﺪﻋ" @@ -28016,6 +27964,10 @@ msgid "Detail Flood Fill" msgstr "ﻥﺎﻀﻴﻔﺑ ﻞﻴﺻﺎﻔﺘﻟﺍ ﺊﺒّﻋ" +msgid "Falloff Type" +msgstr "ﻲﺷﻼﺘﻟﺍ ﻉﻮﻧ" + + msgid "Operator" msgstr "ﻞﻣﺎﻋ" @@ -28870,6 +28822,10 @@ msgid "Align UVs along the line defined by the endpoints along the Y axis" msgstr "Y ﺭﻮﺤﻣ ﻝﻮﻃ ﻰﻠﻋ ﺔﻳﺎﻬﻨﻟﺍ ﻁﺎﻘﻨﺑ ﻑﺮّﻌﻤﻟﺍ ﻂﺨﻟﺍ ﻝﻮﻃ ﻰﻠﻋ UV's ـﻟﺍ ﻱﺫﺎﺣ" +msgid "Correct Aspect" +msgstr "ﺐﺳﺎﻨﺘﻟﺍ ﺢﺤﺻ" + + msgctxt "Operator" msgid "Average Islands Scale" msgstr "ﻂﺳﻮﺘﻤﻟﺍ ﺓﺮﻳﺰﺠﻟﺍ ﻢﺠﺣ" @@ -28884,10 +28840,6 @@ msgid "Clip UV coordinates to bounds after unwrapping" msgstr "ﻁﺎﻘﺳﻻﺍ ﺪﻌﺑ ﺩﻭﺪﺤﻠﻟ UV ـﻟﺍ ﺕﺎﻴﺛﺍﺪﺣﺍ ﻢﻠّﻗ" -msgid "Correct Aspect" -msgstr "ﺐﺳﺎﻨﺘﻟﺍ ﺢﺤﺻ" - - msgid "Size of the cube to project on" msgstr "ﻪﻴﻠﻋ ﻂﻘﺴﻤﻟﺍ ﺐﻌﻜﻤﻟﺍ ﻢﺠﺣ" @@ -35962,14 +35914,6 @@ msgid "Length of rays, defines how far away other faces give occlusion effect" msgstr "ﺱﺎﺒﺤﻧﻻﺍ ﺮﻴﺛﺄﺗ ﻯﺮﺧﻷﺍ ﻪﺟﻭﻷﺍ ﻪﻴﻓ ﻲﻄﻌﺗ ﻱﺬﻟﺍ ﺪﻌﺒﻟﺍ ﺩﺪﺤﺗ ،ﺔﻌﺷﻷﺍ ﻝﺍﻮﻃﺃ" -msgid "Use Ambient Occlusion" -msgstr " ﻂﻴﺤﻤﻟﺍ ﺱﺎﺒﺤﻧﻻﺍ ﻡﺪﺨﺘﺳﺇ" - - -msgid "Use Ambient Occlusion to add shadowing based on distance between objects" -msgstr "ﺕﺎﻨﺋﺎﻜﻟﺍ ﻦﻴﺑ ﺔﻓﺎﺴﻤﻟﺍ ﻰﻠﻋ ﺪﻤﺘﻌﻣ ﻞﻴﻠﻈﺗ ﺔﻓﺎﺿﻹ ﻂﻴﺤﻤﻟﺍ ﺱﺎﺒﺤﻧﻻﺍ ﻡﺍﺪﺨﺘﺳﺍ" - - msgid "World Mist" msgstr "ﻢﻟﺎﻋ ﺏﺎﺒﺿ" diff --git a/locale/po/ca.po b/locale/po/ca.po index 169144d56bf..ecd61fcaacd 100644 --- a/locale/po/ca.po +++ b/locale/po/ca.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: \n" "Last-Translator: Joan Pujolar \n" "Language-Team: \n" @@ -1286,6 +1286,10 @@ msgid "Quaternion" msgstr "Quaternió" +msgid "Floating point quaternion rotation" +msgstr "Coma flotant per rotació de quaternió" + + msgid "Domain" msgstr "Domini" @@ -1426,6 +1430,14 @@ msgid "Geometry attribute that stores integer values" msgstr "[Integer Attribute]: Atribut de geometria que emmagatzema valors enters" +msgid "Quaternion Attribute" +msgstr "Atribut de quaternió" + + +msgid "Geometry attribute that stores rotation" +msgstr "[Quaternion Attribute]: Atribut de geometria que emmagatzema la rotació" + + msgid "String Attribute" msgstr "Atribut de cadena" @@ -2011,13 +2023,17 @@ msgstr "Llapis de greix (antic)" msgid "Grease Pencil (legacy) data-blocks" -msgstr "Blocs de dades de llapis de greix (antic)" +msgstr "Llapis de greix (antic) - Blocs de dades" msgid "Grease Pencil" msgstr "Llapis de greix" +msgid "Grease Pencil data-blocks" +msgstr "[Grease Pencil]: Blocs de dades del llapis de greix" + + msgid "Hair Curves" msgstr "Corbes de pèl" @@ -2047,7 +2063,7 @@ msgstr "Document desat" msgid "Has the current session been saved to disk as a .blend file" -msgstr "Sessió actual desada al disc com a document .blend" +msgstr "Té sessió actual desada al disc com a document .blend" msgid "Lattices" @@ -2206,6 +2222,10 @@ msgid "Simulations" msgstr "Simulacions" +msgid "Simulation data-blocks" +msgstr "Simulacions - Blocs de dades" + + msgid "Sounds" msgstr "Sons" @@ -2518,6 +2538,14 @@ msgid "Collection of screens" msgstr "Col·lecció de pantalles" +msgid "Main Simulations" +msgstr "Simulacions principals" + + +msgid "Collection of simulations" +msgstr "Col·lecció de simulacions" + + msgid "Main Sounds" msgstr "Sons principals" @@ -2603,7 +2631,7 @@ msgstr "[Boid Rule]: Nom de la regla d'eixam" msgid "Goal" -msgstr "Objectiu" +msgstr "Destí" msgid "Go to assigned object or loudest assigned signal source" @@ -2795,7 +2823,7 @@ msgstr "[Line]: Segueix el lider en filera" msgid "Goal object" -msgstr "Objecte objectiu" +msgstr "Objecte destí" msgid "Boid Settings" @@ -3384,10 +3412,18 @@ msgid "Bone Matrix" msgstr "Matriu de l'os" +msgid "3×3 bone matrix" +msgstr "Matriu d'os 3x3" + + msgid "Bone Armature-Relative Matrix" msgstr "Matriu d'os relativa a esquelet" +msgid "4×4 bone matrix relative to armature" +msgstr "Matriu d'os 4x4 relativa a l'esquelet" + + msgid "Parent" msgstr "Pare" @@ -3765,7 +3801,7 @@ msgstr "Distància mínima" msgid "Goal distance between curve roots for the Density brush" -msgstr "[Minimum Distance]: Distància dels objectius entre les arrels de corbes per al pinzell de densitat" +msgstr "[Minimum Distance]: Distància buscada dels objectius entre les arrels de corbes per al pinzell de densitat" msgid "Minimum Length" @@ -3793,7 +3829,7 @@ msgstr "[Scale Uniform]: Expandeix o encongeix corbes canviant-ne la mida unifor msgid "Grease Pencil Brush Settings" -msgstr "Llapis de Greix - Configuració del pinzell" +msgstr "Llapis de greix - Configuració del pinzell" msgid "Settings for grease pencil brush" @@ -3973,7 +4009,7 @@ msgstr "Mida de tancament" msgid "Strokes end extension for closing gaps, use zero to disable" -msgstr "[Closure Size]: Extensió final dels traços per a tancar els espais, posar zero per a desactivar" +msgstr "[Closure Size]: Extensió final dels traços per a tancar buits, posar zero per a desactivar" msgid "Direction of the fill" @@ -4121,7 +4157,7 @@ msgstr "[Threshdold]: Llindar per considerar la transparència de color per empl msgid "Grease Pencil Icon" -msgstr "Llapis de Greix - Icona" +msgstr "Llapis de greix - Icona" msgid "Pencil" @@ -4174,7 +4210,7 @@ msgstr "Traç d'esborrador" msgctxt "GPencil" msgid "Grease Pencil Icon" -msgstr "Llapis de Greix - Icona" +msgstr "Llapis de greix - Icona" msgctxt "GPencil" @@ -4639,6 +4675,11 @@ msgid "Path of an object inside of an Alembic archive" msgstr "Camí d'un objecte dins d'un arxiu d'Alembic" +msgctxt "File browser" +msgid "Path" +msgstr "Camí" + + msgid "Object path" msgstr "Camí d'objecte" @@ -5634,6 +5675,22 @@ msgid "The inputs are invalid, or the algorithm has been improperly called" msgstr "[Invalid Input]: Les ingressions no són vàlides, o l'algorisme s'ha invocat incorrectament" +msgid "Collection Child" +msgstr "Col·lecció filla" + + +msgid "Child collection with its collection related settings" +msgstr "Col·lecció filla amb la seva configuració com a col·lecció" + + +msgid "Light Linking" +msgstr "Endoil·luminació" + + +msgid "Light linking settings of the collection object" +msgstr "Paràmetres d'endoil·luminació de l'objecte de la col·lecció" + + msgid "Collection Children" msgstr "Fills de col·lecció" @@ -5642,6 +5699,22 @@ msgid "Collection of child collections" msgstr "[Collection Children]: Col·lecció de col·leccions de fills" +msgid "Collection Light Linking" +msgstr "Endoil·luminació de col·lecció" + + +msgid "Light linking settings of objects and children collections of a collection" +msgstr "Paràmetres d'endoil·luminació d'objectes i col·leccions filles d'una col·lecció" + + +msgid "Link State" +msgstr "Estat receptiu" + + +msgid "Light or shadow receiving state of the object or collection" +msgstr "Estat de receptivitat de llum o d'ombra de l'objecte o col·lecció" + + msgid "Include" msgstr "Incloure" @@ -5650,6 +5723,18 @@ msgid "Exclude" msgstr "Excloure" +msgid "Collection Object" +msgstr "Objecte de col·lecció" + + +msgid "Object of a collection with its collection related settings" +msgstr "Objecte d'una col·lecció amb la seva configuració derivada de la col·lecció" + + +msgid "Light linking settings of the collection" +msgstr "Configuració d'endoil·luminació de la col·lecció" + + msgid "Collection Objects" msgstr "Objectes de col·lecció" @@ -8684,7 +8769,7 @@ msgstr "Segar" msgid "Force the curve view to fit a defined boundary" -msgstr "[Clip]: Força la visualització de corba a limitar-se a un contorn definit" +msgstr "[Clip]: Força la visualització de corba a ajustar-se a un contorn definit" msgid "White Level" @@ -8748,7 +8833,7 @@ msgstr "Mètode" msgid "Curve fitting method" -msgstr "Mètode d'afaiçonament de corba" +msgstr "Mètode d'ajustament de corba" msgid "Refit" @@ -9402,11 +9487,11 @@ msgstr "[Collapse Summary]: Torna a plegar el resum quan es mostra, de manera qu msgid "Display Grease Pencil" -msgstr "Mostrar Llapis de Greix" +msgstr "Mostrar llapis de greix" msgid "Include visualization of Grease Pencil related animation data and frames" -msgstr "[Display Grease Pencil]: Inclou la visualització de les dades d'animació i els fotogrames lligats al llapis de greix" +msgstr "[Display Grease Pencil]: Inclou la visualització de les dades d'animació i els fotogrames lligats al Llapis de greix" msgid "Display Hair" @@ -9811,6 +9896,11 @@ msgid "Font" msgstr "Tipografia" +msgctxt "ID" +msgid "Grease Pencil (legacy)" +msgstr "Llapis de greix (antic)" + + msgctxt "ID" msgid "Grease Pencil" msgstr "Llapis de greix" @@ -10288,6 +10378,31 @@ msgid "Multiplier for wave influence of this brush" msgstr "Multiplicador per a la influència d'ona d'aquest pinzell" +msgctxt "Simulation" +msgid "Wave Type" +msgstr "Tipus d'ona" + + +msgctxt "Simulation" +msgid "Depth Change" +msgstr "Canvi de profunditat" + + +msgctxt "Simulation" +msgid "Obstacle" +msgstr "Obstacle" + + +msgctxt "Simulation" +msgid "Force" +msgstr "Força" + + +msgctxt "Simulation" +msgid "Reflect Only" +msgstr "Només reflectir" + + msgid "Canvas Settings" msgstr "Configuració de llenç" @@ -10556,6 +10671,10 @@ msgid "Anti-Aliasing" msgstr "Antialiàsing" +msgid "Use 5× multisampling to smooth paint edges" +msgstr "[Anti-Aliasing]: Utilitza multimostratge 5x per suavitzar les vores de pintura" + + msgid "Enable to make surface changes disappear over time" msgstr "Permet de fer que els canvis de superfície desapareguin amb el temps" @@ -12090,10 +12209,50 @@ msgid "Adjust the offset to the beginning/end" msgstr "Ajustar el desplaçament a l'inici/final" +msgctxt "ParticleSettings" +msgid "Kink" +msgstr "Torsió" + + msgid "Type of periodic offset on the curve" msgstr "[Kink]: Tipus de desplaçament periòdic sobre la corba" +msgctxt "ParticleSettings" +msgid "None" +msgstr "No-cap" + + +msgctxt "ParticleSettings" +msgid "Braid" +msgstr "Trena" + + +msgctxt "ParticleSettings" +msgid "Curl" +msgstr "Rínxol" + + +msgctxt "ParticleSettings" +msgid "Radial" +msgstr "Radial" + + +msgctxt "ParticleSettings" +msgid "Roll" +msgstr "Gir" + + +msgctxt "ParticleSettings" +msgid "Rotation" +msgstr "Rotació" + + +msgctxt "ParticleSettings" +msgid "Wave" +msgstr "Ona" + + msgid "The distance from which particles are affected fully" msgstr "Distància des de la qual les partícules es veuen afectades completament" @@ -12467,7 +12626,7 @@ msgstr "Mostrar blocs de dades de tipografies" msgid "Show Grease pencil data-blocks" -msgstr "Mostrar blocs de dades de llapis de greix" +msgstr "Mostrar blocs de dades de Llapis de greix" msgid "Show Image data-blocks" @@ -12703,10 +12862,6 @@ msgid "Show scenes" msgstr "Mostrar escenes" -msgid "Show materials, nodetrees, textures and Freestyle's linestyles" -msgstr "Mostra materials, nodes, textures i línies de dibuix manual" - - msgid "Directory" msgstr "Directori" @@ -15209,7 +15364,7 @@ msgstr "Color del vèrtex del punt de traç del llapis de greix" msgid "Grease Pencil Frame" -msgstr "Llapis de Greix - Fotograma" +msgstr "Llapis de greix - Fotograma" msgid "Collection of related sketches on a particular frame" @@ -15289,7 +15444,7 @@ msgstr "Corbes a mà alçada que defineixen l'esbós en aquest fotograma" msgid "Grease Pencil Frames" -msgstr "Llapis de Greix - Fotogrames" +msgstr "Llapis de greix - Fotogrames" msgid "Collection of grease pencil frames" @@ -15297,7 +15452,7 @@ msgstr "Col·lecció de fotogrames de llapis de greix" msgid "Grease Pencil Interpolate Settings" -msgstr "Llapis de Greix - Paràmetres d'interpolació" +msgstr "Llapis de greix - Paràmetres d'interpolació" msgid "Settings for Grease Pencil interpolation tools" @@ -15309,11 +15464,11 @@ msgstr "Corba d'interpolació" msgid "Custom curve to control 'sequence' interpolation between Grease Pencil frames" -msgstr "[Interpolation Curve]: Corba maniobrera per controlar la «seqüència» interpolació entre els fotogrames del llapis de greix" +msgstr "[Interpolation Curve]: Corba maniobrera per controlar la «seqüència» interpolació entre els fotogrames del Llapis de greix" msgid "Grease Pencil Layer" -msgstr "Llapis de Greix - Capa" +msgstr "Llapis de greix - Capa" msgid "Collection of related sketches" @@ -15637,7 +15792,7 @@ msgstr "[ViewLayer]: Inclou només la capa dins d'aquesta capa de visualització msgid "Grease Pencil Masking Layers" -msgstr "Llapis de Greix - Capes màscara" +msgstr "Llapis de greix - Capes màscara" msgid "List of Mask Layers" @@ -15773,7 +15928,7 @@ msgstr "Configuració d'escultura amb llapis-dG" msgid "General properties for Grease Pencil stroke sculpting tools" -msgstr "[GPencil Sculpt Settings]: Propietats generals per a les eines d'escultura amb el traç de llapis de greix" +msgstr "[GPencil Sculpt Settings]: Propietats generals per a les eines d'escultura amb el traç de Llapis de greix" msgid "Threshold for stroke intersections" @@ -15817,7 +15972,7 @@ msgstr "Alinea els traços amb l'orientació actual del cursor 3D" msgid "Custom curve to control falloff of brush effect by Grease Pencil frames" -msgstr "Corba maniobrera per a controlar l'efecte de dissipació de pinzellada per a fotogrames de llapis de greix" +msgstr "Corba maniobrera per a controlar l'efecte de dissipació de pinzellada per a fotogrames de Llapis de greix" msgid "Custom curve to control primitive thickness" @@ -15873,7 +16028,7 @@ msgstr "[Use Curve]: Utilitza la corba per definir el gruix originari del traç" msgid "Grease Pencil Stroke" -msgstr "Llapis de Greix - Traç" +msgstr "Llapis de greix - Traç" msgid "Freehand curve defining part of a sketch" @@ -16041,7 +16196,7 @@ msgstr "[Vertex Fill Color]: Color que s'usa per barrejar-lo amb el color d'empl msgid "Grease Pencil Stroke Point" -msgstr "Llapis de Greix - Punt de traç" +msgstr "Llapis de greix - Punt de traç" msgid "Data point for freehand stroke curve" @@ -16081,7 +16236,7 @@ msgstr "Color utilitzat per a barrejar-lo amb el color del punt per a obtenir el msgid "Grease Pencil Stroke Points" -msgstr "Llapis de Greix - Punts de traç" +msgstr "Llapis de greix - Punts de traç" msgid "Collection of grease pencil stroke points" @@ -16097,7 +16252,7 @@ msgstr "Triangle" msgid "Triangulation data for Grease Pencil fills" -msgstr "Dades de triangulació per als emplenaments del llapis de greix" +msgstr "Dades de triangulació per als emplenaments del Llapis de greix" msgid "First triangle vertex index" @@ -16214,7 +16369,7 @@ msgstr "[Handle All Events]: Quan està ressaltat, no deixis que hi hagi accions msgid "Grab Cursor" -msgstr "Agafar cursor" +msgstr "Capturar cursor" msgid "Tool Property Init" @@ -16395,7 +16550,7 @@ msgstr "[Gizmos]: Llista de flòstics del Mapa de flòstics" msgid "Has Reports" -msgstr "Hi ha informes" +msgstr "Té informes" msgid "GizmoGroup has a set of reports (warnings and errors) from last execution" @@ -16431,7 +16586,7 @@ msgstr "[Gizmo Properties]: Propietats d'ingressió d'un flòstic" msgid "Modifier affecting the Grease Pencil object" -msgstr "Modificador que afecta l'objecte llapis de greix" +msgstr "Modificador que afecta l'objecte Llapis de greix" msgid "Override Modifier" @@ -16515,7 +16670,7 @@ msgstr "[Build]: Crea una multiplicació de traços" msgid "Dot Dash" -msgstr "Punt-guionet " +msgstr "Punt-guionet" msgid "Generate dot-dash styled strokes" @@ -17581,11 +17736,11 @@ msgstr "[Stroke Depth Offset]: Mou els traços lleugerament envers la càmera pe msgid "Grease Pencil layer to which assign the generated strokes" -msgstr "Llapis de Greix - Capa on assignar els traços generats" +msgstr "Llapis de greix - Capa on assignar els traços generats" msgid "Grease Pencil material assigned to the generated strokes" -msgstr "Llapis de Greix - Material assignat als traços generats" +msgstr "Llapis de greix - Material assignat als traços generats" msgid "The thickness for the generated strokes" @@ -17681,7 +17836,7 @@ msgstr "Filtre de senyals de cara" msgid "Filter feature lines using freestyle face marks" -msgstr "[Filter Face Marks]: Filtra les línies destacades usant els senyals de cara manuals" +msgstr "[Filter Face Marks]: Filtra les línies destacades usant marques de cara amb traç manual" msgid "Boundaries" @@ -18716,8 +18871,36 @@ msgid "Grid scale" msgstr "Escala de la graella" +msgid "Collection of related drawings" +msgstr "Col·lecció de dibuixos relacionats" + + +msgid "Set layer visibility" +msgstr "Definir visibilitat de capa" + + +msgid "Grease Pencil Layer Group" +msgstr "Llapis de greix - Grup de capes" + + +msgid "Group of Grease Pencil layers" +msgstr "Grup de capes de Llapis de greix" + + +msgid "Set layer group visibility" +msgstr "Definir visibilitat de grup de capes" + + +msgid "Protect group from further editing and/or frame changes" +msgstr "Protegeix el grup de de més edicions o canvis d'enquadrament" + + +msgid "Group name" +msgstr "Nom del grup" + + msgid "Grease Pencil Layers" -msgstr "Llapis de Greix - Capes" +msgstr "Llapis de greix - Capes" msgid "Collection of grease pencil layers" @@ -18745,7 +18928,7 @@ msgstr "[Active Note]: Nota/Capa a la qual afegir traços d'anotació" msgid "Grease Pencil Mask Layers" -msgstr "Llapis de Greix - Capes màscara" +msgstr "Llapis de greix - Capes màscara" msgid "Collection of grease pencil masking layers" @@ -18760,8 +18943,12 @@ msgid "Active index in layer mask array" msgstr "Índex actiu en la sèrie de capes màscara" +msgid "Collection of Grease Pencil layers" +msgstr "Col·lecció de capes de Llapis de greix" + + msgid "Active Grease Pencil layer" -msgstr "Capa activa de llapis de greix" +msgstr "Capa activa de Llapis de greix" msgid "Editor header containing UI elements" @@ -19533,7 +19720,7 @@ msgstr "Inflar" msgid "Grab" -msgstr "Agafar" +msgstr "Capturar" msgid "Expand" @@ -19852,7 +20039,7 @@ msgstr "Quantitat de pintura que s'aplica per mostra de traç" msgctxt "GPencil" msgid "Grease Pencil Sculpt Paint Tool" -msgstr "Llapis de Greix - Eina d'esculpir pintant" +msgstr "Llapis de greix - Eina d'esculpir pintant" msgid "Smooth stroke points" @@ -19897,7 +20084,7 @@ msgstr "Configuració del llapis-dG" msgctxt "Brush" msgid "Grease Pencil Draw Tool" -msgstr "Llapis de Greix - Eina de dibuix" +msgstr "Llapis de greix - Eina de dibuix" msgctxt "Brush" @@ -19937,7 +20124,7 @@ msgstr "El pinzell és del tipus utilitzat per a fer traços de tint" msgid "Grease Pencil Vertex Paint Tool" -msgstr "Llapis de Greix - Eina de pintar vèrtexs" +msgstr "Llapis de greix - Eina de pintar vèrtexs" msgid "Paint a color on stroke points" @@ -19961,7 +20148,7 @@ msgstr "Substituir el color de punts de traç que ja tenen un color aplicat" msgid "Grease Pencil Weight Paint Tool" -msgstr "Llapis de Greix - Eina de pintar pesos" +msgstr "Llapis de greix - Eina de pintar pesos" msgid "Paint weight in active vertex group" @@ -20840,19 +21027,19 @@ msgstr "[Use Front-Face Falloff]: Fusiona la influència del pinzell seguint el msgid "Grab Active Vertex" -msgstr "Agafar vèrtex actiu" +msgstr "Capturar vèrtex actiu" msgid "Apply the maximum grab strength to the active vertex instead of the cursor location" -msgstr "[Grab Active Vertex]: Aplica la força màxima d'agafament sobre el vèrtex actiu en lloc de la ubicació del cursor" +msgstr "[Grab Active Vertex]: Aplica la força màxima de captura sobre el vèrtex actiu en lloc de la ubicació del cursor" msgid "Grab Silhouette" -msgstr "Silueta d'agafament" +msgstr "Silueta de captura" msgid "Grabs trying to automask the silhouette of the object" -msgstr "[Grab Silhouette]: Agafa tot provant de fer automàscara amb la silueta de l'objecte" +msgstr "[Grab Silhouette]: Captura tot provant de fer automàscara amb la silueta de l'objecte" msgid "Use Pressure for Hardness" @@ -21128,7 +21315,7 @@ msgstr "Eina d'esculpir" msgid "Grab UVs" -msgstr "Agafar UVs" +msgstr "Capturar UVs" msgid "Relax" @@ -21387,7 +21574,7 @@ msgstr "[Passepartout Alpha]: Opacitat (alfa) de la bambolina enfosquida des de msgid "Sensor Fit" -msgstr "Ajustar a sensor" +msgstr "Ajustament en sensor" msgid "Method to fit image and field of view angle inside the sensor" @@ -21598,6 +21785,14 @@ msgid "Collections that are immediate children of this collection" msgstr "Col·leccions que són filles directes d'aquesta col·lecció" +msgid "Children collections their parent-collection-specific settings" +msgstr "Configuració de col·leccions filles específicament lligada a la col·lecció mare" + + +msgid "Objects of the collection with their parent-collection-specific settings" +msgstr "Els objectes de la col·lecció amb els paràmetres específics de la respectiva col·lecció mare" + + msgid "Collection Color" msgstr "Color de col·lecció" @@ -22262,10 +22457,6 @@ msgid "Whether the selected text is italics" msgstr "Si el text seleccionat està en cursiva" -msgid "Selected Smallcaps" -msgstr "Selecció versaleta" - - msgid "Whether the selected text is small caps" msgstr "Si el text seleccionat està en versaleta" @@ -23123,7 +23314,7 @@ msgstr "Mode pintura a traç" msgid "Draw Grease Pencil strokes on click/drag" -msgstr "[Stroke Paint Mode]: Dibuixa els traços de llapis de greix en fer clic/arrossegar" +msgstr "[Stroke Paint Mode]: Dibuixa els traços de Llapis de greix en fer clic/arrossegar" msgid "Stroke Sculpt Mode" @@ -23131,7 +23322,7 @@ msgstr "Mode escultura de traç" msgid "Sculpt Grease Pencil strokes instead of viewport data" -msgstr "[Stroke Paint Mode]: Esculpeix els traços del llapis de greix en lloc de les dades de mirador" +msgstr "[Stroke Paint Mode]: Esculpeix els traços del Llapis de greix en lloc de les dades de mirador" msgid "Stroke Vertex Paint Mode" @@ -23139,7 +23330,7 @@ msgstr "[Stroke Vertex Paint Mode]: Mode pintat de vèrtexs amb traç" msgid "Grease Pencil vertex paint" -msgstr "Llapis de Greix - Pintura de vèrtexs" +msgstr "Llapis de greix - Pintura de vèrtexs" msgid "Stroke Weight Paint Mode" @@ -23147,7 +23338,7 @@ msgstr "Mode pintura de pesos amb traç" msgid "Grease Pencil weight paint" -msgstr "[Stroke Weight Paint Mode]: Pintura de pesos amb llapis de greix" +msgstr "[Stroke Weight Paint Mode]: Pintura de pesos amb Llapis de greix" msgid "Onion Opacity" @@ -23179,7 +23370,7 @@ msgstr "[Mode to display frames]: Fotogrames en l'interval absolut del fotograma msgid "Frames in relative range of the Grease Pencil keyframes" -msgstr "Fotogrames en l'interval relatiu de les fotofites del llapis de greix" +msgstr "Fotogrames en l'interval relatiu de les fotofites del Llapis de greix" msgid "Selected" @@ -23311,7 +23502,7 @@ msgstr "Mode edició de traç" msgid "Edit Grease Pencil strokes instead of viewport data" -msgstr "[Stroke Edit Mode]: Edita els traços del llapis de greix en lloc de les dades del mirador" +msgstr "[Stroke Edit Mode]: Edita els traços del Llapis de greix en lloc de les dades del mirador" msgid "Surface Offset" @@ -23323,7 +23514,19 @@ msgstr "[Stroke Edit Mode]: Quantitat de separació quan es dibuixa en mode supe msgid "Grease Pencil data-block" -msgstr "[Grease Pencil Data]: Bloc de dades del llapis de greix" +msgstr "[Grease Pencil Data]: Bloc de dades del Llapis de greix" + + +msgid "Layer Groups" +msgstr "Grups de capes" + + +msgid "Grease Pencil layer groups" +msgstr "Llapis de greix - Grups de capes" + + +msgid "Grease Pencil layers" +msgstr "Llapis de greix - Capes" msgid "Image data-block referencing an external or packed image" @@ -23591,7 +23794,7 @@ msgstr "[Generated Width]: Amplada d'imatge generada" msgid "Has Data" -msgstr "Consten dades" +msgstr "Té dades" msgid "True if the image data is loaded into memory" @@ -23959,10 +24162,6 @@ msgid "Diffuse reflection multiplier" msgstr "[Diffuse Factor]: Multiplicador de reflex difusiu" -msgid "Falloff distance - the light is at half the original intensity at this point" -msgstr "Distància de decandiment - la llum és a la meitat de la intensitat original en aquest punt" - - msgid "Node tree for node based lights" msgstr "Arbre de nodes per a llums basats en nodes" @@ -24048,14 +24247,6 @@ msgid "Directional area Light" msgstr "[Area Light]: Llum d'àrea direccional" -msgid "Constant Coefficient" -msgstr "Coeficient constant" - - -msgid "Constant distance attenuation coefficient" -msgstr "[Constant Coefficient]: Coeficient d'atenuació de distància constant" - - msgid "Contact Shadow Bias" msgstr "Biaix d'ombra de contacte" @@ -24089,66 +24280,6 @@ msgid "Light energy emitted over the entire area of the light in all directions" msgstr "[Power]: Energia lumínica emesa sobre tota l'àrea de llum en totes les direccions" -msgid "Custom light falloff curve" -msgstr "[Falloff Curve]: Corba maniobrable de decaïment de llum" - - -msgid "Falloff Type" -msgstr "Tipus de decandiment" - - -msgid "Intensity Decay with distance" -msgstr "[Falloff Type]: Disminució de la intensitat amb la distància" - - -msgid "Inverse Linear" -msgstr "Lineal inversa" - - -msgid "Inverse Square" -msgstr "Quadrat invers" - - -msgid "Inverse Coefficients" -msgstr "Coeficients inversos" - - -msgid "Lin/Quad Weighted" -msgstr "Ponderació Lin/Quad" - - -msgid "Linear Attenuation" -msgstr "Atenuació lineal" - - -msgid "Linear distance attenuation" -msgstr "[Linear Attenuation]: Atenuació lineal de la distància" - - -msgid "Linear Coefficient" -msgstr "Coeficient lineal" - - -msgid "Linear distance attenuation coefficient" -msgstr "[Linear Coefficient]: Coeficient lineal d'atenuació de la distància" - - -msgid "Quadratic Attenuation" -msgstr "Atenuació quadràtica" - - -msgid "Quadratic distance attenuation" -msgstr "[Quadratic Attenuation]: Atenuació quadràtica de la distància" - - -msgid "Quadratic Coefficient" -msgstr "Coeficient quadràtic" - - -msgid "Quadratic distance attenuation coefficient" -msgstr "[Quadratic Coefficient]: Coeficient quadràtic d'atenuació de la distància" - - msgid "Shadow Buffer Bias" msgstr "Biaix de regulador d'ombra" @@ -24165,22 +24296,6 @@ msgid "Shadow map clip start, below which objects will not generate shadows" msgstr "[Shadow Buffer Clip Start]: Punt d'inici del mapejat d'ombres, per sota del qual els objectes no generaran ombres" -msgid "Samples" -msgstr "Mostres" - - -msgid "Number of shadow buffer samples" -msgstr "[Samples]: Nombre de mostres al regulador d'ombra" - - -msgid "Shadow Buffer Size" -msgstr "Mida del regulador d'ombra" - - -msgid "Resolution of the shadow buffer, higher values give crisper shadows but use more memory" -msgstr "[Shadow Buffer Size]: Resolució del regulador de memòria intermèdia de l'ombra, els valors més alts donen ombres més contrastades però usen més memòria" - - msgid "Shadow Color" msgstr "Color d'ombra" @@ -24349,6 +24464,14 @@ msgid "Control how fast the probe influence decreases" msgstr "Controla la velocitat amb què disminueix la influència de la sonda" +msgid "Bake Samples" +msgstr "Mostres de precuinat" + + +msgid "Number of ray directions to evaluate when baking" +msgstr "Nombres direccions de rajos a avaluar en precuinar" + + msgid "Resolution X" msgstr "Resolució X" @@ -24437,6 +24560,14 @@ msgid "Show the parallax correction volume in the 3D view" msgstr "[Parallax]: Mostra el volum de correcció de la paral·laxi en la vista 3D" +msgid "Surfel Density" +msgstr "Densitat de superfel" + + +msgid "Number of surfels per unit distance (higher values improve quality)" +msgstr "Nombre de superfels per unitat de distància (els valors més alts milloren la qualitat)" + + msgid "Type of light probe" msgstr "Tipus de sonda" @@ -24595,7 +24726,7 @@ msgstr "Color de difusió del material" msgid "Grease Pencil Settings" -msgstr "Llapis de Greix - Configuració" +msgstr "Llapis de greix - Configuració" msgid "Grease pencil color settings for material" @@ -24603,7 +24734,7 @@ msgstr "[Grease Pencil Settings]: Configuració del color del llapis de greix pe msgid "Is Grease Pencil" -msgstr "És llapis de greix" +msgstr "És Llapis de greix" msgid "True if this material has grease pencil data" @@ -25079,7 +25210,7 @@ msgstr "Clonar - Índex de capa UV de bucle" msgid "Clone UV loop layer index" -msgstr "L'índex de la capa de bucle UV per clonar" +msgstr "Clonar - Índex de la capa de bucle UV" msgid "Mask UV Loop Layer" @@ -25231,7 +25362,7 @@ msgstr "Número de fotograma d'escena global en què aquest vídeo comença a re msgid "Grease pencil data for this movie clip" -msgstr "Llapis de Greix - Dades del videoclip" +msgstr "Llapis de greix - Dades del videoclip" msgid "Width and height in pixels, zero when image data can't be loaded" @@ -25247,11 +25378,11 @@ msgstr "Document de vídeo" msgid "Use Proxy / Timecode" -msgstr "Usar simulació / cronofita" +msgstr "Usar simulació / cronografia" msgid "Use a preview proxy and/or timecode index for this clip" -msgstr "[Use Proxy / Timecode]: Usa un vídeo de simulació per previsualitzar i /o un índex de cronofites per a aquest videoclip" +msgstr "[Use Proxy / Timecode]: Usa un vídeo de simulació per previsualitzar i /o un índex cronogràfic per a aquest videoclip" msgid "Proxy Custom Directory" @@ -25295,7 +25426,7 @@ msgstr "[Label]: Etiqueta d'arbre de nodes" msgid "Grease Pencil Data" -msgstr "Llapis de Greix - Dades" +msgstr "Llapis de greix - Dades" msgid "Inputs" @@ -25322,6 +25453,14 @@ msgid "Node tree outputs" msgstr "[Outputs]: Egressors de l'arbre de nodes" +msgid "Panels" +msgstr "Plafons" + + +msgid "UI panels for structuring the node tree interface" +msgstr "Plafons de la IU per a estructurar la interfície d'arbre de nodes" + + msgid "Node Tree type (deprecated, bl_idname is the actual node tree type identifier)" msgstr "Tipus d'arbre de nodes (obsolet, bl_idname és l'identificador actual de tipus d'arbre de nodes)" @@ -25374,6 +25513,54 @@ msgid "Max size of a tile (smaller values gives better distribution of multiple msgstr "Mida màxima d'una rajola (els valors menors donen una millor distribució de múltiples trames, però més sobrecàrrega)" +msgid "32×32" +msgstr "32x32" + + +msgid "Chunksize of 32×32" +msgstr "Porcions de 32x32" + + +msgid "64×64" +msgstr "64x64" + + +msgid "Chunksize of 64×64" +msgstr "Porcions de 64x64" + + +msgid "128×128" +msgstr "128x128" + + +msgid "Chunksize of 128×128" +msgstr "Porcions de 128x128" + + +msgid "256×256" +msgstr "256x256" + + +msgid "Chunksize of 256×256" +msgstr "Porcions de 256x256" + + +msgid "512×512" +msgstr "512x512" + + +msgid "Chunksize of 512×512" +msgstr "Porcions de 512x512" + + +msgid "1024×1024" +msgstr "1024x1024" + + +msgid "Chunksize of 1024×1024" +msgstr "Porcions de 1024x1024" + + msgid "Edit Quality" msgstr "Qualitat d'edició" @@ -25426,6 +25613,14 @@ msgid "Composites full image result as fast as possible" msgstr "[Full Frame]: Composita el resultat de la imatge sencera el més ràpid possible" +msgid "Realtime GPU" +msgstr "Temps real GPU" + + +msgid "Use GPU accelerated compositing with more limited functionality" +msgstr "Usa compositació accelerada amb GPU amb funcionalitat més limitada" + + msgid "Render Quality" msgstr "Qualitat de revelat" @@ -25742,16 +25937,36 @@ msgid "Origin offset distance" msgstr "[Origin Offset]: Distància de separació en relació a l'origen" +msgctxt "Image" +msgid "Empty Image Side" +msgstr "Costat d'imatge buit" + + msgid "Show front/back side" msgstr "Mostra la part frontal/reversa" +msgctxt "Image" +msgid "Both" +msgstr "Ambdós" + + +msgctxt "Image" +msgid "Front" +msgstr "Davant" + + +msgctxt "Image" +msgid "Back" +msgstr "Darrere" + + msgid "Settings for using the object as a field in physics simulation" msgstr "Paràmetres per a usar l'objecte com a camp en la simulació física" msgid "Grease Pencil Modifiers" -msgstr "Llapis de Greix - Modificadors" +msgstr "Llapis de greix - Modificadors" msgid "Modifiers affecting the data of the grease pencil object" @@ -25830,6 +26045,10 @@ msgid "Only render shadows and reflections on this object, for compositing rende msgstr "[Shadow Catcher]: Només revela ombres i reflexos damunt de l'objecte, per a revelats de compòsit amb fotometratge real. Els objectes amb aquesta funcionalitat es considera que ja són dins el fotometratge, i els que no són objectes sintètics que s'hi afegeixen amb el compòsit" +msgid "Light linking settings" +msgstr "Configuració d'endoil·luminació" + + msgid "Lightgroup" msgstr "Grup de llums" @@ -25963,7 +26182,7 @@ msgstr "Editar partícules" msgid "Edit Grease Pencil Strokes" -msgstr "Editar traços del llapis de greix" +msgstr "Editar traços del Llapis de greix" msgid "Sculpt Grease Pencil Strokes" @@ -25979,11 +26198,11 @@ msgstr "Pinta traços de llapis de greix" msgid "Grease Pencil Weight Paint Strokes" -msgstr "Llapis de Greix - Traços de pintura de pesos" +msgstr "Llapis de greix - Traços de pintura de pesos" msgid "Grease Pencil Vertex Paint Strokes" -msgstr "Llapis de Greix - Traços de pintura de vèrtexs" +msgstr "Llapis de greix - Traços de pintura de vèrtexs" msgid "Modifiers affecting the geometric data of the object" @@ -26206,6 +26425,10 @@ msgid "Shape Key Lock" msgstr "Bloquejar morfofita" +msgid "Only show the active shape key at full value" +msgstr "Només mostra la morfofita activa a tota potència" + + msgid "Display Texture Space" msgstr "Mostrar espai de textura" @@ -26322,6 +26545,10 @@ msgid "Shape Key Edit Mode" msgstr "Mode edició de morfofites" +msgid "Display shape keys in edit mode (for meshes only)" +msgstr "[Shape Key Edit Mode]: Aplica les morfofites en mode d'edició (només per a malles)" + + msgid "Use Simulation Cache" msgstr "Usar cau de simulació" @@ -26495,7 +26722,7 @@ msgstr "Màxim de clenxa" msgid "Maximum root to tip angle (tip distance/root distance for long hair)" -msgstr "[Parting Maximum]: Angle màxim de l'arrel a la punta (distància de punta/distància de l'arrel per a cabells llargs)" +msgstr "[Parting Maximum]: Angle màxim de l'arrel a la punta (distància de punta/distància de l'arrel per a pèls llargs)" msgid "Parting Minimum" @@ -26503,7 +26730,7 @@ msgstr "Mínim de clenxa" msgid "Minimum root to tip angle (tip distance/root distance for long hair)" -msgstr "[Parting Minimum]: Angle mínim de l'arrel a la punta (distància de punta/distància de l'arrel per a cabells llargs)" +msgstr "[Parting Minimum]: Angle mínim de l'arrel a la punta (distància de punta/distància de l'arrel per a pèls llargs)" msgid "Children Per Parent" @@ -26739,7 +26966,7 @@ msgstr "Llargada del pèl" msgid "Length of the hair" -msgstr "[Hair Length]: La longitud del pèl o cabell" +msgstr "[Hair Length]: La longitud del pèl" msgid "Number of hair segments" @@ -26826,6 +27053,16 @@ msgid "Type of periodic offset on the path" msgstr "[Keys Step]: Tipus de desfasament periòdic del trajecte" +msgctxt "ParticleSettings" +msgid "Nothing" +msgstr "No-res" + + +msgctxt "ParticleSettings" +msgid "Spiral" +msgstr "Espiral" + + msgid "Amplitude Clump" msgstr "Amplitud d'aglutinat" @@ -27740,11 +27977,11 @@ msgstr "Anotacions" msgid "Grease Pencil data-block used for annotations in the 3D view" -msgstr "[Annotations]: Bloc de dades del llapis de greix esa per a les anotacions a la vista 3D" +msgstr "[Annotations]: Bloc de dades del Llapis de greix per a les anotacions a la visió 3D" msgid "Grease Pencil settings for the scene" -msgstr "Llapis de Greix - Configuració de l'escena" +msgstr "Llapis de greix - Configuració de l'escena" msgid "NLA Tweak Mode" @@ -28056,6 +28293,14 @@ msgid "Top-Left 3D Editor" msgstr "Editor 3D de dalt a l'esquerra" +msgid "Simulation data-block" +msgstr "Simulació - Bloc de dades" + + +msgid "Node tree defining the simulation" +msgstr "Arbre de nodes que defineix la simulació" + + msgid "Sound data-block referencing an external or packed sound file" msgstr "Bloc de dades de so que fa referència a un document de so extern o empaquetat" @@ -29453,6 +29698,14 @@ msgid "Maintained by community developers" msgstr "Mantingut pels desenvolupadors de la comunitat" +msgid "Testing" +msgstr "En proves" + + +msgid "Newly contributed scripts (excluded from release builds)" +msgstr "Protocols d'aportació recent (exclosos de les sub-versions)" + + msgid "Asset Blend Path" msgstr "Camí de recursos blend" @@ -29502,11 +29755,11 @@ msgstr "Obre finestres" msgid "XR Session Settings" -msgstr "Paràmetres de sessió XR" +msgstr "Paràmetres de sessió RX" msgid "XR Session State" -msgstr "Estat de sessió XR" +msgstr "Estat de sessió RX" msgid "Runtime state information about the VR session" @@ -29538,23 +29791,23 @@ msgstr "Es muda a aquest mode objecte quan s'activa l'obrador" msgid "Grease Pencil Edit Mode" -msgstr "Llapis de Greix - Mode edició" +msgstr "Llapis de greix - Mode edició" msgid "Grease Pencil Sculpt Mode" -msgstr "Llapis de Greix - Mode escultura" +msgstr "Llapis de greix - Mode escultura" msgid "Grease Pencil Draw" -msgstr "Llapis de Greix - Dibuixar" +msgstr "Llapis de greix - Dibuixar" msgid "Grease Pencil Vertex Paint" -msgstr "Llapis de Greix - Pintura de vèrtexs" +msgstr "Llapis de greix - Pintura de vèrtexs" msgid "Grease Pencil Weight Paint" -msgstr "Llapis de Greix - Pintura de pesos" +msgstr "Llapis de greix - Pintura de pesos" msgid "UI Tags" @@ -30205,6 +30458,10 @@ msgid "Format of multiview media" msgstr "Format del mèdia multivistes" +msgid "Multi-View" +msgstr "Múltiples càmeres" + + msgid "Tile Number" msgstr "Número de tessel·la" @@ -31389,21 +31646,37 @@ msgid "Media Play/Pause" msgstr "Reproducció/Pausa" +msgid "⏯" +msgstr "⏯" + + msgctxt "UI_Events_KeyMaps" msgid "Media Stop" msgstr "Parar reproducció" +msgid "⏹" +msgstr "⏹" + + msgctxt "UI_Events_KeyMaps" msgid "Media First" msgstr "Inici reproducció" +msgid "⏮" +msgstr "⏮" + + msgctxt "UI_Events_KeyMaps" msgid "Media Last" msgstr "Final reproducció" +msgid "⏭" +msgstr "⏭" + + msgctxt "UI_Events_KeyMaps" msgid "Text Input" msgstr "Ingressió de text" @@ -31849,7 +32122,7 @@ msgstr "Zacció PantComp" msgctxt "UI_Events_KeyMaps" msgid "XR Action" -msgstr "Acció XR" +msgstr "Acció RX" msgid "Map Type" @@ -33784,7 +34057,7 @@ msgstr "Punt actiu de capa màscara" msgid "Grease Pencil Color" -msgstr "Llapis de Greix - Color" +msgstr "Llapis de greix - Color" msgid "Alignment" @@ -34155,6 +34428,14 @@ msgid "Add Attribute" msgstr "Afegir atribut" +msgid "Light Linking Specials" +msgstr "Endoil·luminació especial" + + +msgid "Shadow Linking Specials" +msgstr "Endoombratge especial" + + msgid "Bone Group Specials" msgstr "Especials del grups d'ossos" @@ -34188,7 +34469,7 @@ msgstr "Menú contextual dels documents" msgid "Grease Pencil Vertex Groups" -msgstr "Llapis de Greix - Grups de Vèrtexs" +msgstr "Llapis de greix - Grups de Vèrtexs" msgid "Change Active Layer" @@ -34219,6 +34500,10 @@ msgid "F-Curve Context Menu" msgstr "Menú contextual de Corba F" +msgid "Add Extra" +msgstr "Afegir extra" + + msgid "Mask Context Menu" msgstr "Menú contextual de màscara" @@ -34748,7 +35033,7 @@ msgstr "Pivot de conjunt escultòric" msgid "Clone Layer" -msgstr "Capa de clonatge" +msgstr "Capa de clonació" msgid "UV Mapping" @@ -34828,7 +35113,7 @@ msgstr "Marca d'aresta per traç manual" msgid "Edge mark for Freestyle line rendering" -msgstr "[Freestyle Edge Mark]: Marca d'aresta que es revela com a traç manual" +msgstr "[Freestyle Edge Mark]: Marca d'aresta per revelar com a traç manual" msgid "Seam" @@ -35080,11 +35365,11 @@ msgstr "[Polygon Normal]: Vector normal unitari de llargada dins l'espai local p msgid "Freestyle Face Mark" -msgstr "Marca de cara de traç manual" +msgstr "Marca de cara amb traç manual" msgid "Face mark for Freestyle line rendering" -msgstr "[Freestyle Face Mark]: Marca de cara per al revelat de línia de traç manual" +msgstr "[Freestyle Face Mark]: Marca de cara per al revelat amb línia de traç manual" msgid "Mesh Polygons" @@ -35187,6 +35472,10 @@ msgid "Minimum for measuring thickness" msgstr "[Thickness Min]: Mínim per mesura de gruix" +msgid "Samples" +msgstr "Mostres" + + msgid "Number of samples to test per face" msgstr "Nombre de mostres a comprovar per cara" @@ -35816,7 +36105,7 @@ msgstr "Longitud dins la qual encabeix la corrua" msgid "Fit Type" -msgstr "Tipus d'acoblament" +msgstr "Tipus d'ajustament" msgid "Array length calculation method" @@ -36560,7 +36849,7 @@ msgstr "Traç manual" msgid "Transfer Freestyle edge mark" -msgstr "[Freestyle]: Transfereix marca l'aresta de traç manual" +msgstr "[Freestyle]: Transfereix marca d'aresta de traç manual" msgid "Face Corner Data Types" @@ -36608,7 +36897,7 @@ msgstr "Marca de traç manual" msgid "Transfer Freestyle face mark" -msgstr "[Freestyle Mark]: Transfereix la marca de cara de traç manual" +msgstr "[Freestyle Mark]: Transfereix la marca de cara amb traç manual" msgid "Vertex Data Types" @@ -39976,7 +40265,7 @@ msgstr "Qualitat JPEG de les imatges simulades" msgid "Timecode" -msgstr "Cronofita" +msgstr "Cronografia" msgid "Record Run" @@ -40004,7 +40293,7 @@ msgstr "Projecció lliure sense espais" msgid "Record run, but ignore timecode, changes in framerate or dropouts" -msgstr "[Free Run No Gaps]: Grava autofites, però ignorant les cronofites, els canvis en fotogrames/s o els orfes" +msgstr "[Free Run No Gaps]: Grava autofites, però ignorant la cronografia, els canvis en fotogrames/s o els orfes" msgid "Scopes for statistical view of a movie clip" @@ -41065,7 +41354,7 @@ msgstr "Valor mínim de la correlació entre el patrons coincidents o concomitan msgid "Grease pencil data for this track" -msgstr "Llapis de Greix - Dades de la pista" +msgstr "Llapis de greix - Dades de la pista" msgid "Has Bundle" @@ -41205,7 +41494,7 @@ msgstr "[Blending]: Mètode utilitzat per combinar el resultat dels segment com msgid "Action to take for gaps past the strip extents" -msgstr "Acció a prendre per als buits que superen l'extensió del segment" +msgstr "Acció a prendre per als espais més enllà de l'extensió del segment" msgid "F-Curves for controlling the strip's influence and timing" @@ -41614,7 +41903,7 @@ msgstr "Estén límits" msgid "Extend bounds of the input image to fully fit blurred image" -msgstr "[Extend Bounds]: Amplia els límits de la imatge ingressada perquè ajusti completament a la imatge borrosa" +msgstr "[Extend Bounds]: Amplia els límits de la imatge ingressada perquè s'ajusti completament a la imatge borrosa" msgid "Apply filter on gamma corrected values" @@ -42221,6 +42510,10 @@ msgid "Colors are treated alpha premultiplied, or colors output straight (alpha msgstr "[Composite]: Es tracta els colors amb premultiplicat alfa, o bé els colors surten directament (l'alfa queda com a 1)" +msgid "Convert Colorspace" +msgstr "Convertir espai cromàtic" + + msgid "From" msgstr "A partir de" @@ -42553,6 +42846,11 @@ msgid "Distance to grow/shrink (number of iterations)" msgstr "[Dilate/Erode]: Distància a expandir/encongir (nombre d'iteracions)" +msgctxt "Image" +msgid "Edge" +msgstr "Aresta" + + msgid "Edge to inset" msgstr "Aresta a insertar" @@ -42902,14 +43200,42 @@ msgid "Tracking Object" msgstr "Objecte a rastrejar" +msgid "Kuwahara" +msgstr "Kuwahara" + + +msgid "Size of filter. Larger values give stronger stylized effect" +msgstr "Mida del filtre. Els valors més alts fan un efecte més estilitzat" + + msgid "Smoothing" msgstr "Suavitzat" +msgid "Smoothing degree before applying filter. Higher values remove details and give smoother edges" +msgstr "Grau de suavització abans del filtre. Els valors més alts treuen detalls i donen cantells més suaus" + + +msgid "Variation of Kuwahara filter to use" +msgstr "Variació de filtre Kuwahara disponible" + + +msgid "Classic" +msgstr "Clàssic" + + +msgid "Fast but less accurate variation" +msgstr "Variació ràpida però menys exacta" + + msgid "Anisotropic" msgstr "Anisotròpic" +msgid "Accurate but slower variation" +msgstr "Variació més exacta però més lenta" + + msgid "Lens Distortion" msgstr "Distorsió de lent" @@ -44242,6 +44568,14 @@ msgid "Create a mesh that encloses all points in the input geometry with the sma msgstr "[Convex Hull]: Crea una malla que enclou tots els punts de la geometria ingressada amb el nombre més petit de punts" +msgid "Corners of Edge" +msgstr "Cantells de vora" + + +msgid "Retrieve face corners connected to edges" +msgstr "[Corners of Edge]: Extreu els cantells de cara connectats a vores" + + msgid "Corners of Face" msgstr "Cantells de cara" @@ -45776,7 +46110,7 @@ msgstr "Permet que el text utilitzi més espai que l'alçada especificada" msgid "Scale To Fit" -msgstr "Escalar a conforme" +msgstr "Escalar a ajustar" msgid "Scale the text size to fit inside the width and height" @@ -46128,6 +46462,10 @@ msgid "Multiscatter GGX" msgstr "Multidispersió GGX" +msgid "GGX with additional correction to account for multiple scattering, preserve energy and prevent unexpected darkening at high roughness" +msgstr "GGX amb correcció addicional per tenir en compte la dispersió múltiple, estalviar energia i evitar l'enfosquiment inesperat amb l'alta rugositat" + + msgid "Diffuse BSDF" msgstr "FDDB difusiva" @@ -46205,7 +46543,7 @@ msgstr "Coloració directa" msgid "Choose the color of your preference, and the shader will approximate the absorption coefficient to render lookalike hair" -msgstr "[Direct Coloring]: Tria el color que prefereixis, i l'aspector s'aproximarà al coeficient d'absorció per a generar un pèl semblant" +msgstr "[Direct Coloring]: Tria el color que prefereixis, i l'aspector s'aproximarà al coeficient d'absorció per a generar un aparença de pèl" msgid "Principled BSDF" @@ -47452,6 +47790,10 @@ msgid "Computes the radius of the n-sphere inscribed in the voronoi cell" msgstr "[N-Sphere Radius]: Calcula el radi de l'esfera N inscrita a la cel·la Voronoi" +msgid "Normalize output Distance to 0.0 to 1.0 range" +msgstr "Normalitzar distància d'egressió dins l'interval 0,0 a 0,1" + + msgid "Wave Texture" msgstr "Textura onatge" @@ -48035,6 +48377,34 @@ msgid "Node Outputs" msgstr "Sortides de nodes" +msgid "Panel in the node group interface" +msgstr "Plafó en la interfície de grup de nodes" + + +msgid "Name of the socket panel" +msgstr "Nom del plafó de borns" + + +msgid "Node Tree Socket Panels" +msgstr "Plafons de borns d'arbre de nodes" + + +msgid "Collection of socket panels in a node tree" +msgstr "Col·lecció de plafons de borns d'un arbre de nodes" + + +msgid "Active panel" +msgstr "Plafó actiu" + + +msgid "Active Index" +msgstr "Índex actiu" + + +msgid "Index of the active panel" +msgstr "Índex del plafó actiu" + + msgid "Node Socket" msgstr "Born de node" @@ -48243,6 +48613,14 @@ msgid "Object socket of a node" msgstr "Born d'objectes d'un node" +msgid "Rotation Node Socket" +msgstr "Born de node de rotació" + + +msgid "Rotation value socket of a node" +msgstr "Born de valors de rotació d'un node" + + msgid "Shader Node Socket" msgstr "Born de node d'aspector" @@ -48319,6 +48697,10 @@ msgid "Hide the socket input value even when the socket is not connected" msgstr "Amagar el valor d'entrada del born fins i tot quan no està connectat" +msgid "Panel to group sockets together in the UI" +msgstr "Plafó per agrupar borns en la IU" + + msgid "Boolean Node Socket Interface" msgstr "Interfície del born de node booleà" @@ -48363,6 +48745,10 @@ msgid "Object Node Socket Interface" msgstr "Interfície de born del node d'objectes" +msgid "Rotation Node Socket Interface" +msgstr "Interfície de born del node de rotació" + + msgid "Shader Node Socket Interface" msgstr "Interfície de born del node aspector" @@ -48452,13 +48838,33 @@ msgstr "L'objecte irradia ombres al mirador 3D" msgid "Object Grease Pencil Modifiers" -msgstr "Modificadors d'objecte de llapis de greix" +msgstr "Modificadors d'objecte de Llapis de greix" msgid "Collection of object grease pencil modifiers" msgstr "Col·lecció de modificadors d'objectes de llapis de greix" +msgid "Object Light Linking" +msgstr "Objecte endoil·luminació" + + +msgid "Blocker Collection" +msgstr "Col·lecció de blocadors" + + +msgid "Collection which defines objects which block light from this emitter" +msgstr "Col·lecció que defineeix els objectes que bloquegen la llum d'aquest emissor" + + +msgid "Receiver Collection" +msgstr "Col·lecció de receptors" + + +msgid "Collection which defines light linking relation of this emitter" +msgstr "Col·lecció que defineix les relacions d'endoil·luminació d'aquest emissor" + + msgid "Object Line Art" msgstr "Objecte dibuix lineal" @@ -48536,7 +48942,7 @@ msgstr "Opcions del temps d'execució" msgid "True when the cursor is grabbed" -msgstr "Ver quan el cursor està maniobrant-se" +msgstr "Ver quan el cursor està capturat" msgid "Invoke" @@ -50706,7 +51112,7 @@ msgstr "Afegir pinzell de dibuix" msgid "Add brush for Grease Pencil" -msgstr "[Add Drawing Brush]: Afegir un pinzell per al llapis de greix" +msgstr "[Add Drawing Brush]: Afegir un pinzell per al Llapis de greix" msgctxt "Operator" @@ -51553,11 +51959,11 @@ msgstr "Precarrega fotogrames des del disc per a una reproducció/rastreig més msgctxt "Operator" msgid "Rebuild Proxy and Timecode Indices" -msgstr "Recompon els índexs del vídeo simulat i de la cronofita" +msgstr "Recompon els índexs de vídeos simulats i cronogràfics" msgid "Rebuild all selected proxies and timecode indices in the background" -msgstr "Recompon tots els índexs dels vídeos simulats i de cronofita en segon pla" +msgstr "Recompon tots els vídeos simulats i índexs cronogràfics en segon pla" msgctxt "Operator" @@ -51993,7 +52399,7 @@ msgstr "Ajustar a la vista" msgid "Fit frame to the viewport" -msgstr "[Fit View]: Ajusta el fotograma al mirador" +msgstr "[Fit View]: Ajusta l'enquadrament al mirador" msgctxt "Operator" @@ -52652,10 +53058,31 @@ msgid "(De)select all control points" msgstr "(Des)selecciona tots els punts de control" +msgctxt "Operator" +msgid "Select Ends" +msgstr "Seleccionar extrems" + + msgid "Select end points of curves" msgstr "Selecciona els punts dels caps de les corbes" +msgid "Amount Back" +msgstr "Quantitat del darrere" + + +msgid "Number of points to select from the back" +msgstr "Nombre de punts a seleccionar de la banda posterior" + + +msgid "Amount Front" +msgstr "Quantitat del davant" + + +msgid "Number of points to select from the front" +msgstr "Nombre de punts per seleccionar de la banda anterior" + + msgid "Shrink the selection by one point" msgstr "Encongir la selecció d'un punt" @@ -52893,7 +53320,7 @@ msgstr "Màscara Encongir/Inflar" msgid "Grease Pencil Shrink/Fatten" -msgstr "Llapis de Greix - Encongir/Inflar" +msgstr "Llapis de greix - Encongir/Inflar" msgid "Time Translate" @@ -52921,7 +53348,7 @@ msgstr "Lliscador de seqüència" msgid "Grease Pencil Opacity" -msgstr "Llapis de Greix - Opacitat" +msgstr "Llapis de greix - Opacitat" msgctxt "Operator" @@ -53407,11 +53834,11 @@ msgstr "[Handles]: Utilitza nanses en convertir corbes bezier en polígons" msgctxt "Operator" msgid "Set Goal Weight" -msgstr "Establir pes que es busca" +msgstr "Establir pes del destí" msgid "Set softbody goal weight for selected points" -msgstr "[Set Goal Weight]: Estableix l'objectiu de pes del cos tou per als punts seleccionats" +msgstr "[Set Goal Weight]: Estableix el pes del destí del cos tou per als punts seleccionats" msgid "Split off selected points from connected unselected points" @@ -54734,10 +55161,6 @@ msgid "Force keeping channels for bones" msgstr "Forçar mantenir canal per a ossos" -msgid "if all keyframes are identical in a rig, force keeping the minimal animation. When off, all possible channels for the bones will be exported, even if empty (minimal animation, 2 keyframes)" -msgstr "si totes les fotofites són idèntiques en un engranatge, força que es mantingui l'animació mínima. Quan està apagat, s'exportaran tots els canals possibles per als ossos, inclús si estan buits (animació mínima, 2 fotofites)" - - msgid "Force keeping channel for objects" msgstr "Forçar mantenir canal per a objectes" @@ -56127,6 +56550,15 @@ msgid "Name of color attribute" msgstr "Nom de l'atribut de color" +msgctxt "Operator" +msgid "Run Node Group" +msgstr "Executar grup de nodes" + + +msgid "Execute a node group on geometry" +msgstr "Executa un grup de nodes sobre la geometria" + + msgctxt "Operator" msgid "Gizmo Select" msgstr "Selecció de flòstic" @@ -56151,7 +56583,7 @@ msgstr "Suprimir fotograma actiu" msgid "Delete the active frame for the active Grease Pencil Layer" -msgstr "Suprimeix el fotograma actiu per a la capa activa del llapis de greix" +msgstr "Suprimeix el fotograma actiu per a la capa activa del Llapis de greix" msgctxt "Operator" @@ -56160,7 +56592,7 @@ msgstr "Suprimir tots els fotogrames actius" msgid "Delete the active frame(s) of all editable Grease Pencil layers" -msgstr "Suprimeix el(s) fotograma(es) actiu(s) de totes les capes editables de llapis de greix" +msgstr "Suprimeix el(s) fotograma(es) actiu(s) de totes les capes editables de Llapis de greix" msgctxt "Operator" @@ -56295,11 +56727,11 @@ msgstr "[Annotation Add New]: Afegir un bloc de dades d'anotació nou" msgctxt "Operator" msgid "Bake Object Transform to Grease Pencil" -msgstr "Precuinar Transformació d'objecte sobre llapis de greix" +msgstr "Precuinar Transformació d'objecte sobre Llapis de greix" msgid "Bake grease pencil object transform to grease pencil keyframes" -msgstr "Precuina la transformació d'objecte de llapis de greix consignant-la en fotofites de llapis de greix" +msgstr "Precuina la transformació d'objecte de llapis de greix consignant-la en fotofites de Llapis de greix" msgid "The end frame of animation" @@ -56447,7 +56879,7 @@ msgstr "Converteix llapis de greix" msgid "Convert the active Grease Pencil layer to a new Curve Object" -msgstr "Converteix la capa activa del llapis de greix en un objecte de corba nou" +msgstr "Converteix la capa activa del Llapis de greix en un objecte de corba nou" msgid "Bevel resolution when depth is non-zero" @@ -56463,19 +56895,19 @@ msgstr "La durada de l'avaluació de la corba de control del camí" msgid "Gap Duration" -msgstr "Durada del buit" +msgstr "Durada de l'espai" msgid "Custom Gap mode: (Average) length of gaps, in frames (Note: Realtime value, will be scaled if Realtime is not set)" -msgstr "[Gap Duration]: Mode de buit adaptable: (mitjana) longitud dels buits, en fotogrames (Nota: valor en temps real, s'escalarà si el temps real no està consignat)" +msgstr "[Gap Duration]: Mode espai adaptable: (mitjana) longitud dels espais, en fotogrames (Nota: valor en temps real, s'escalarà si el temps real no està consignat)" msgid "Gap Randomness" -msgstr "Aleatorietat dels buits" +msgstr "Aleatorietat dels espais" msgid "Custom Gap mode: Number of frames that gap lengths can vary" -msgstr "[Gap Randomness]: Mode de buit adaptat: Nombre de fotogrames en què poden variar les longituds dels buits" +msgstr "[Gap Randomness]: Mode d'espai adaptat: Nombre de fotogrames en què poden variar les longituds dels espais" msgid "Radius Factor" @@ -56487,7 +56919,7 @@ msgstr "[Radius Factor]: Multiplicador per als radis dels punts (tret de l'ampla msgid "Custom Gap mode: Random generator seed" -msgstr "Mode de buit adaptat: generador aleatori de llavor" +msgstr "Mode espai adaptat: generador aleatori de llavor" msgid "The start frame of the path control curve" @@ -56515,15 +56947,15 @@ msgstr "Temps lineal simple" msgid "Use the original timing, gaps included" -msgstr "Usa el temps original, inclosos els buits" +msgstr "Usa el temps original, inclosos els espais" msgid "Custom Gaps" -msgstr "Buits adaptats" +msgstr "Espais adaptats" msgid "Use the original timing, but with custom gap lengths (in frames)" -msgstr "[Custom Gaps]: Usa el temps originals, però amb longituds de buits adaptats (en fotogrames)" +msgstr "[Custom Gaps]: Usa el temps originals, però amb longituds d'espais adaptats (en fotogrames)" msgid "Which type of curve to convert to" @@ -56571,7 +57003,7 @@ msgstr "Té cronologia vàlida" msgid "Whether the converted Grease Pencil layer has valid timing data (internal use)" -msgstr "[Has Valid Timing]: Si la capa de llapis de greix convertida té dades de temps vàlides (ús intern)" +msgstr "[Has Valid Timing]: Si la capa de Llapis de greix convertida té dades de temps vàlides (ús intern)" msgid "Convert 2.7x grease pencil files to 2.80" @@ -56588,7 +57020,7 @@ msgstr "Copiar traços" msgid "Copy selected Grease Pencil points and strokes" -msgstr "[Copy Strokes]: Copia els punts i traços de llapis de greix seleccionats" +msgstr "[Copy Strokes]: Copia els punts i traços de Llapis de greix seleccionats" msgctxt "Operator" @@ -56601,11 +57033,11 @@ msgstr "[Annotation Unlink]: Desenllaça el bloc de dades d'anotació actiu" msgid "Delete selected Grease Pencil strokes, vertices, or frames" -msgstr "Suprimir fotogrames, vèrtexs o traços de llapis de greix seleccionats" +msgstr "Suprimir fotogrames, vèrtexs o traços de Llapis de greix seleccionats" msgid "Method used for deleting Grease Pencil data" -msgstr "Mètode utilitzat per a suprimir les dades de llapis de greix" +msgstr "Mètode utilitzat per a suprimir les dades de Llapis de greix" msgid "Delete selected points and split strokes into segments" @@ -56659,7 +57091,7 @@ msgstr "Dibuix de llapis de greix" msgid "Draw a new stroke in the active Grease Pencil object" -msgstr "[Grease Pencil Draw]: Dibuixa un traç nou en l'objecte actiu del llapis de greix" +msgstr "[Grease Pencil Draw]: Dibuixa un traç nou en l'objecte actiu del Llapis de greix" msgid "No Fill Areas" @@ -56687,7 +57119,7 @@ msgstr "Angle de guia de rapidesa" msgid "Erase Grease Pencil strokes" -msgstr "Esborrar traços de llapis de greix" +msgstr "Esborrar traços de Llapis de greix" msgctxt "Operator" @@ -56696,11 +57128,11 @@ msgstr "Duplicar traços" msgid "Duplicate the selected Grease Pencil strokes" -msgstr "[Duplicate Strokes]: Duplica els traços del llapis de greix seleccionats" +msgstr "[Duplicate Strokes]: Duplica els traços del Llapis de greix seleccionats" msgid "Make copies of the selected Grease Pencil strokes and move them" -msgstr "Fer còpies dels traços seleccionats del llapis de greix i moure'ls" +msgstr "Fer còpies dels traços seleccionats del Llapis de greix i moure'ls" msgid "Duplicate Strokes" @@ -56713,7 +57145,7 @@ msgstr "Revessar mode edició de traços" msgid "Enter/Exit edit mode for Grease Pencil strokes" -msgstr "[Strokes Edit Mode Toggle]: Entra/Surt del mode d'edició per als traços del llapis de greix" +msgstr "[Strokes Edit Mode Toggle]: Entra/Surt del mode d'edició per als traços del Llapis de greix" msgid "Return to Previous Mode" @@ -56730,7 +57162,7 @@ msgstr "Extreu paleta del color de vèrtex(s)" msgid "Extract all colors used in Grease Pencil Vertex and create a Palette" -msgstr "Extreu tots els colors utilitzats en el Vèrtex del llapis de greix i crea una paleta" +msgstr "Extreu tots els colors utilitzats en el Vèrtex del Llapis de greix i crea una paleta" msgid "Convert only selected strokes" @@ -56743,7 +57175,7 @@ msgstr "Extrudir punts de traç" msgid "Extrude the selected Grease Pencil points" -msgstr "[Extrude Stroke Points]: Extrudeix els punts seleccionats de llapis de greix" +msgstr "[Extrude Stroke Points]: Extrudeix els punts seleccionats de Llapis de greix" msgid "Extrude selected points and move them" @@ -56832,7 +57264,7 @@ msgstr "Duplicar fotograma" msgid "Make a copy of the active Grease Pencil Frame" -msgstr "[Duplicate Frame]: Fa una còpia del fotograma actiu del llapis de greix" +msgstr "[Duplicate Frame]: Fa una còpia del fotograma actiu del Llapis de greix" msgid "Duplicate frame in active layer only" @@ -56899,7 +57331,7 @@ msgstr "Ocultar capa/es" msgid "Hide selected/unselected Grease Pencil layers" -msgstr "[Hide Layer(s)]: Amaga les capes seleccionades/no seleccionades del llapis de greix" +msgstr "[Hide Layer(s)]: Amaga les capes seleccionades/no seleccionades del Llapis de greix" msgid "Hide unselected rather than selected layers" @@ -56908,11 +57340,11 @@ msgstr "Amagar les capes no seleccionades preferiblement a les seleccionades" msgctxt "Operator" msgid "Generate Grease Pencil Object using image as source" -msgstr "Generar un objecte llapis de greix usant una imatge de font" +msgstr "Generar un objecte llapis de Llapis usant una imatge de font" msgid "Generate a Grease Pencil Object using Image as source" -msgstr "Generar un objecte llapis de greix usant una imatge com a origen" +msgstr "Generar un objecte Llapis de greix usant una imatge com a origen" msgid "Generate Mask" @@ -56986,7 +57418,7 @@ msgstr "Suprimir desglossaments" msgid "Remove breakdown frames generated by interpolating between two Grease Pencil frames" -msgstr "[Delete Breakdowns]: Elimina els fotogrames desglossats generats en interpolar entre dos fotogrames del llapis de greix" +msgstr "[Delete Breakdowns]: Elimina els fotogrames desglossats generats en interpolar entre dos fotogrames del Llapis de greix" msgctxt "Operator" @@ -56995,7 +57427,7 @@ msgstr "Interpolar seqüència" msgid "Generate 'in-betweens' to smoothly interpolate between Grease Pencil frames" -msgstr "[Interpolate Sequence]: Genera «entremitjos» per a interpolar suaument entre els fotogrames del llapis de greix" +msgstr "[Interpolate Sequence]: Genera «entremitjos» per a interpolar suaument entre els fotogrames del Llapis de greix" msgctxt "GPencil" @@ -57159,7 +57591,7 @@ msgstr "Canviar capa" msgid "Change active Grease Pencil layer" -msgstr "Canvia la capa activa del llapis de greix" +msgstr "Canvia la capa activa del Llapis de greix" msgctxt "Operator" @@ -57168,7 +57600,7 @@ msgstr "Duplicar capa" msgid "Make a copy of the active Grease Pencil layer" -msgstr "Fa una còpia de la capa activa del llapis de greix" +msgstr "Fa una còpia de la capa activa del Llapis de greix" msgid "All Data" @@ -57185,7 +57617,7 @@ msgstr "Duplicar la capa a un objecte nou" msgid "Make a copy of the active Grease Pencil layer to selected object" -msgstr "Fa una còpia de la capa activa del llapis de greix a l'objecte seleccionat" +msgstr "Fa una còpia de la capa activa del Llapis de greix a l'objecte seleccionat" msgctxt "GPencil" @@ -57233,7 +57665,7 @@ msgstr "Moure màscara de la capa del llapis de greix" msgid "Move the active Grease Pencil mask layer up/down in the list" -msgstr "Mou la capa activa de màscara de llapis de greix amunt/avall de la llista" +msgstr "Mou la capa activa de màscara de Llapis de greix amunt/avall de la llista" msgctxt "Operator" @@ -57268,7 +57700,7 @@ msgstr "Moure la capa de llapis de greix" msgid "Move the active Grease Pencil layer up/down in the list" -msgstr "Mou la capa activa del llapis de greix amunt/avall de la llista" +msgstr "Mou la capa activa del Llapis de greix amunt/avall de la llista" msgctxt "Operator" @@ -57277,7 +57709,7 @@ msgstr "Suprimir capa" msgid "Remove active Grease Pencil layer" -msgstr "Elimina la capa activa de llapis de greix" +msgstr "Elimina la capa activa de Llapis de greix" msgctxt "Operator" @@ -57286,7 +57718,7 @@ msgstr "Bloquejar totes les capes" msgid "Lock all Grease Pencil layers to prevent them from being accidentally modified" -msgstr "Bloqueja totes les capes de llapis de greix per evitar que es modifiquin accidentalment" +msgstr "Bloqueja totes les capes de Llapis de greix per evitar que es modifiquin accidentalment" msgctxt "Operator" @@ -57304,7 +57736,7 @@ msgstr "Oculta material(s)" msgid "Hide selected/unselected Grease Pencil materials" -msgstr "[Hide Material(s)]: Amaga els materials seleccionats/no seleccionats de llapis de greix" +msgstr "[Hide Material(s)]: Amaga els materials seleccionats/no seleccionats de Llapis de greix" msgid "Hide unselected rather than selected colors" @@ -57326,7 +57758,7 @@ msgstr "Bloquejar tots els materials" msgid "Lock all Grease Pencil materials to prevent them from being accidentally modified" -msgstr "Bloqueja tots els materials de llapis de greix per evitar que es modifiquin accidentalment" +msgstr "Bloqueja tots els materials de Llapis de greix per evitar que es modifiquin accidentalment" msgctxt "Operator" @@ -57344,7 +57776,7 @@ msgstr "Mostrar tots els materials" msgid "Unhide all hidden Grease Pencil materials" -msgstr "Desocultar tots els materials ocults de llapis de greix" +msgstr "Desocultar tots els materials ocults de Llapis de greix" msgctxt "Operator" @@ -57353,7 +57785,7 @@ msgstr "Seleccionar material" msgid "Select/Deselect all Grease Pencil strokes using current material" -msgstr "Selecciona/Desselecciona tots els traços de llapis de greix usant el material actual" +msgstr "Selecciona/Desselecciona tots els traços de Llapis de greix usant el material actual" msgid "Unselect strokes" @@ -57400,7 +57832,7 @@ msgstr "Desbloca tots els materials" msgid "Unlock all Grease Pencil materials so that they can be edited" -msgstr "Desbloca tots els materials de llapis de greix perquè es puguin editar" +msgstr "Desbloca tots els materials de Llapis de greix perquè es puguin editar" msgctxt "Operator" @@ -57409,7 +57841,7 @@ msgstr "Copiar materials a l'objecte seleccionat" msgid "Append Materials of the active Grease Pencil to other object" -msgstr "Incorporar materials del llapis de greix actiu a un altre objecte" +msgstr "Incorporar materials del Llapis de greix actiu a un altre objecte" msgid "Append only active material, uncheck to append all materials" @@ -57431,7 +57863,7 @@ msgstr "Revessar mode pintura de traç" msgid "Enter/Exit paint mode for Grease Pencil strokes" -msgstr "[Strokes Paint Mode Toggle]: Entra/Surt el mode de pintura per als traços del llapis de greix" +msgstr "[Strokes Paint Mode Toggle]: Entra/Surt el mode de pintura per als traços del Llapis de greix" msgctxt "Operator" @@ -57486,7 +57918,7 @@ msgstr "Polilínia" msgctxt "Operator" msgid "Grease Pencil Circle Shape" -msgstr "Llapis de greix cercle" +msgstr "Llapis de greix - Forma de cercle" msgid "Create predefined grease pencil stroke circle shapes" @@ -57495,7 +57927,7 @@ msgstr "[Grease Pencil Circle Shape]: Crea formes predefinides de traços de lla msgctxt "Operator" msgid "Grease Pencil Curve Shape" -msgstr "Llapis de greix corba" +msgstr "Llapis de greix - Forma de corba" msgid "Create predefined grease pencil stroke curve shapes" @@ -57504,7 +57936,7 @@ msgstr "Crea formes predefinides de traços de llapis de greix en forma de corba msgctxt "Operator" msgid "Grease Pencil Line Shape" -msgstr "Llapis de greix línia" +msgstr "Llapis de greix - Forma de línia" msgid "Create predefined grease pencil stroke lines" @@ -57513,7 +57945,7 @@ msgstr "Crea formes predefinides de traços de llapis de greix en forma de líni msgctxt "Operator" msgid "Grease Pencil Polyline Shape" -msgstr "Llapis de greix polilínia" +msgstr "Llapis de greix - Forma de polilínia" msgid "Create predefined grease pencil stroke polylines" @@ -57556,7 +57988,7 @@ msgstr "[Reset Fill Transformations]: Restableix qualsevol transformació UV i l msgid "Show all Grease Pencil layers" -msgstr "Mostrar totes les capes de llapis de greix" +msgstr "Mostrar totes les capes de Llapis de greix" msgctxt "Operator" @@ -57578,7 +58010,7 @@ msgstr "Revessar mode escultura de traç" msgid "Enter/Exit sculpt mode for Grease Pencil strokes" -msgstr "Entra/Surt del mode escultura de traç de llapis de greix" +msgstr "Entra/Surt del mode escultura de traç de Llapis de greix" msgctxt "Operator" @@ -57621,7 +58053,7 @@ msgstr "Índex del segment a eliminar" msgid "Select Grease Pencil strokes and/or stroke points" -msgstr "Seleccionar traços i/o punts de traç del llapis de greix" +msgstr "Seleccionar traços i/o punts de traç del Llapis de greix" msgid "Entire Strokes" @@ -57642,7 +58074,7 @@ msgstr "(Des)selecciona tots els traços" msgid "Change selection of all Grease Pencil strokes currently visible" -msgstr "Canvia la selecció de tots els traços de llapis de greix actualment visibles" +msgstr "Canvia la selecció de tots els traços de Llapis de greix actualment visibles" msgctxt "Operator" @@ -57663,7 +58095,7 @@ msgstr "[Unselect Ends]: No selecciona els punts primer i últim del traç" msgid "Select Grease Pencil strokes within a rectangular region" -msgstr "Seleccionar traços del llapis de greix dins una regió rectangular" +msgstr "Seleccionar traços del Llapis de greix dins una regió rectangular" msgid "Invert existing selection" @@ -57675,7 +58107,7 @@ msgstr "Intersecar selecció existent" msgid "Select Grease Pencil strokes using brush selection" -msgstr "Seleccionar traços de llapis de greix amb la selecció del pinzell" +msgstr "Seleccionar traços de Llapis de greix amb la selecció del pinzell" msgctxt "Operator" @@ -57684,7 +58116,7 @@ msgstr "Seleccionar primer" msgid "Select first point in Grease Pencil strokes" -msgstr "Selecciona el primer punt dels traços del llapis de greix" +msgstr "Selecciona el primer punt dels traços del Llapis de greix" msgid "Extend selection instead of deselecting all other selected points" @@ -57717,7 +58149,7 @@ msgstr "Llaç de selecció de traços" msgid "Select Grease Pencil strokes using lasso selection" -msgstr "[Lasso Select Strokes]: Selecciona traços de llapis de greix amb la selecció lasso" +msgstr "[Lasso Select Strokes]: Selecciona traços de Llapis de greix amb la selecció lasso" msgctxt "Operator" @@ -57726,7 +58158,7 @@ msgstr "Seleccionar últim" msgid "Select last point in Grease Pencil strokes" -msgstr "Selecciona l'últim punt dels traços de llapis de greix" +msgstr "Selecciona l'últim punt dels traços de Llapis de greix" msgid "Only select the last point of strokes that already have points selected" @@ -57734,7 +58166,7 @@ msgstr "Només seleccionar l'últim punt dels traços que ja tenen punts selecci msgid "Shrink sets of selected Grease Pencil points" -msgstr "Encongir jocs de punts de llapis de greix seleccionats" +msgstr "Encongir jocs de punts de Llapis de greix seleccionats" msgid "Select all points in same strokes as already selected points" @@ -57742,7 +58174,7 @@ msgstr "Seleccionar tots els punts dels mateixos traços que els punts seleccion msgid "Grow sets of selected Grease Pencil points" -msgstr "Expandir els jocs de punts seleccionats de llapis de greix" +msgstr "Expandir els jocs de punts seleccionats de Llapis de greix" msgctxt "Operator" @@ -57768,7 +58200,7 @@ msgstr "Tolerància de la selecció. Els valors més alts seleccionen un rang m msgid "Hide/Unhide selected points for Grease Pencil strokes setting alpha factor" -msgstr "Ocultar/Desocultar els punts seleccionats per a la configuració de factor alfa dels traços de llapis de greix" +msgstr "Ocultar/Desocultar els punts seleccionats per a la configuració de factor alfa dels traços de Llapis de greix" msgctxt "Operator" @@ -57777,7 +58209,7 @@ msgstr "Revessar mode de selecció" msgid "Set selection mode for Grease Pencil strokes" -msgstr "[Select Mode Toggle]: Estableix el mode de selecció per als traços de llapis de greix" +msgstr "[Select Mode Toggle]: Estableix el mode de selecció per als traços de Llapis de greix" msgid "Select Mode" @@ -58125,6 +58557,11 @@ msgid "Front" msgstr "Frontal" +msgctxt "View3D" +msgid "Side" +msgstr "Cara" + + msgctxt "View3D" msgid "Top" msgstr "Part superior" @@ -58302,7 +58739,7 @@ msgstr "Traç imatge per llapis de greix" msgid "Extract Grease Pencil strokes from image" -msgstr "[Trace Image to Grease Pencil]: Extreu traços de llapis de greix a partir de la imatge" +msgstr "[Trace Image to Grease Pencil]: Extreu traços de Llapis de greix a partir de la imatge" msgid "Trace Frame" @@ -58412,7 +58849,7 @@ msgstr "Desblocar totes les capes" msgid "Unlock all Grease Pencil layers so that they can be edited" -msgstr "[Unlock All Layers]: Desbloca totes les capes de llapis de greix perquè es puguin editar" +msgstr "[Unlock All Layers]: Desbloca totes les capes de Llapis de greix perquè es puguin editar" msgctxt "Operator" @@ -58563,7 +59000,7 @@ msgstr "Revessar mode vèrtex de traços" msgid "Enter/Exit vertex paint mode for Grease Pencil strokes" -msgstr "Entra/Surt del mode de pintat de vèrtexs per als traços de llapis de greix" +msgstr "Entra/Surt del mode de pintat de vèrtexs per als traços de Llapis de greix" msgctxt "Operator" @@ -58599,7 +59036,7 @@ msgstr "Revessar mode de pesos de traç" msgid "Enter/Exit weight paint mode for Grease Pencil strokes" -msgstr "Entra/Surt del mode de pintura de pesos amb traços del llapis de greix" +msgstr "Entra/Surt del mode de pintura de pesos amb traços del Llapis de greix" msgctxt "Operator" @@ -58633,6 +59070,10 @@ msgid "Blend selected keyframes to their left or right neighbor" msgstr "[Blend to Neighbor]: Fusiona les fotofites seleccionades al seu veí esquerre o dret" +msgid "The blend factor with 0 being the current frame" +msgstr "El factor de fusió on 0 és el fotograma actual" + + msgctxt "Operator" msgid "Breakdown" msgstr "Desglossar" @@ -59188,6 +59629,118 @@ msgid "Switch brush to smooth mode for duration of stroke" msgstr "Passar pinzell a mode suavitzat per a la durada del traç" +msgctxt "Operator" +msgid "Grease Pencil Draw Mode Toggle" +msgstr "Llapis de greix - Revessar mode dibuix" + + +msgid "Enter/Exit draw mode for grease pencil" +msgstr "[Grease Pencil Draw Mode Toggle]: Entra/Surt del mode de dibuix per al llapis de greix" + + +msgid "Insert a blank frame on the current scene frame" +msgstr "Inserir un fotograma en blanc dins el present enquadrament de l'escena" + + +msgid "Insert a blank frame in all editable layers" +msgstr "Inserir un fotograma en blanc en totes les capes editables" + + +msgid "Add a new Grease Pencil layer in the active object" +msgstr "Afegir una capa de Llapis de greix a l'objecte actiu" + + +msgid "Name of the new layer" +msgstr "Nom de la nova capa" + + +msgctxt "Operator" +msgid "Add New Layer Group" +msgstr "Afegir nou grup de capes" + + +msgid "Add a new Grease Pencil layer group in the active object" +msgstr "Afegeix un nou grup de capes de Llapis de greix a l'objecte actiu" + + +msgid "Name of the new layer group" +msgstr "Nom del nou grup de capes" + + +msgid "Remove the active Grease Pencil layer" +msgstr "Eliminar la capa activa de Llapis de greix" + + +msgctxt "Operator" +msgid "Reorder Layer" +msgstr "Reordenar capa" + + +msgid "Reorder the active Grease Pencil layer" +msgstr "Reordena la capa de Llapis de greix activa" + + +msgid "Above" +msgstr "Per dalt" + + +msgid "Below" +msgstr "Per baix" + + +msgid "Target Name" +msgstr "Nom de referent" + + +msgid "Name of the target layer" +msgstr "Nom de la capa referent" + + +msgid "(De)select all visible strokes" +msgstr "(Des)seleccionar tots els traços visibles" + + +msgctxt "Operator" +msgid "Select Alternate" +msgstr "Seleccionar alterns" + + +msgid "Select alternated points in strokes with already selected points" +msgstr "[Select Alternated]: Selecciona punts alternatius en traços amb punts ja seleccionats" + + +msgid "Deselect Ends" +msgstr "Desseleccionar extrems" + + +msgid "(De)select the first and last point of each stroke" +msgstr "[Deselect Ends]: (No) selecciona els punts primer i últim de cada traç" + + +msgid "Select end points of strokes" +msgstr "Selecciona els punts finals del traços" + + +msgid "Amount End" +msgstr "Quantitat de final" + + +msgid "Number of points to select from the end" +msgstr "Nombre de punts a seleccionar del final" + + +msgid "Amount Start" +msgstr "Quantitat d'inici" + + +msgid "Number of points to select from the start" +msgstr "Nombre de punts a seleccionar de l'inici" + + +msgid "Selects random points from the current strokes selection" +msgstr "Seleccionar punts aleatòriament des de la selecció actual de traços" + + msgctxt "Operator" msgid "Add Render Slot" msgstr "Afegir epígraf de revelat" @@ -62312,11 +62865,11 @@ msgstr "(Des)marca les arestes seleccionades com a arestes destacades de traç m msgctxt "Operator" msgid "Mark Freestyle Face" -msgstr "Marcar cara de traç manual" +msgstr "Marcar cara amb traç manual" msgid "(Un)mark selected faces for exclusion from Freestyle feature edge detection" -msgstr "[Mark Freestyle Face]: (Des)marca les cares seleccionades per excloure-les en la detecció d'arestes destacades e en la funció de traç manual" +msgstr "[Mark Freestyle Face]: (Des)marca les cares seleccionades per excloure-les en la detecció d'arestes destacades de traç manual" msgctxt "Operator" @@ -63553,7 +64106,7 @@ msgstr "Aplanat/Suau" msgctxt "Mesh" msgid "Freestyle Face Marks" -msgstr "Marques de cares de traç manual" +msgstr "Marques de cares amb traç manual" msgctxt "Operator" @@ -64607,11 +65160,11 @@ msgstr "[Attach Nodes]: Lliga el node actiu a un fotograma" msgctxt "Operator" msgid "Background Image Fit" -msgstr "Enquadrar imatge de rerefons" +msgstr "Ajustar imatge de rerefons" msgid "Fit the background image to the view" -msgstr "[Background Image Fit]: Encabeix la imatge de rerefons a la vista" +msgstr "[Background Image Fit]: Ajusta la imatge de rerefons a la vista" msgctxt "Operator" @@ -65108,6 +65661,33 @@ msgid "Remove the active input from a file output node" msgstr "Elimina l'entrada activa d'un node d'egressió de document" +msgctxt "Operator" +msgid "Add Panel" +msgstr "Afegir plafó" + + +msgid "Add a new panel to the tree" +msgstr "Afegir nou plafó a l'arbre" + + +msgctxt "Operator" +msgid "Move Panel" +msgstr "Mou plafó" + + +msgid "Move a panel to another position" +msgstr "Moure plafó a una altra ubicació" + + +msgctxt "Operator" +msgid "Remove Panel" +msgstr "Suprimir plafó" + + +msgid "Remove a panel from the tree" +msgstr "Treu el plafó de l'arbre" + + msgid "Attach selected nodes" msgstr "Lligar nodes seleccionats" @@ -65698,10 +66278,26 @@ msgid "Curve from Mesh or Text objects" msgstr "Corba des d'objectes malla o text" +msgid "Mesh from Curve, Surface, Metaball, Text, or Point Cloud objects" +msgstr "Malla des d'objectes corba, superfície, metabola, text o núvol de punts" + + +msgid "Grease Pencil (legacy) from Curve or Mesh objects" +msgstr "Llapis de greix (antic) a partir d'objectes corba o malla" + + +msgid "Point Cloud from Mesh objects" +msgstr "Núvol de punts des d'objectes malla" + + msgid "Curves from evaluated curve data" msgstr "Corbes de dades de corbes avaluades" +msgid "Grease Pencil from Grease Pencil (legacy)" +msgstr "Llapis de greix des de Llapis de greix (antic)" + + msgctxt "Operator" msgid "Copy Global Transform" msgstr "Copiar transformació global" @@ -65994,6 +66590,15 @@ msgid "Move inputs and outputs from in the modifier to a new node group" msgstr "Mou entrades i sortides de l'interior del modificador a un nou grup de nodes" +msgctxt "Operator" +msgid "Add Grease Pencil (legacy)" +msgstr "Afegir llapis de greix (antic)" + + +msgid "Add a Grease Pencil (legacy) object to the scene" +msgstr "Afegir un objecte Llapis de greix (antic) a l'escena" + + msgid "Stroke offset for the line art modifier" msgstr "Desplaçament de traç per al modificador de dibuix lineal" @@ -66039,7 +66644,7 @@ msgstr "Mostrar davant de tot" msgid "Show line art grease pencil in front of everything" -msgstr "[Show In Front]: Mostrar el llapis de cera de dibuix lineal per davant de tot" +msgstr "[Show In Front]: Mostrar el llapis de greix de dibuix lineal per davant de tot" msgid "Use lights for this grease pencil object" @@ -66152,7 +66757,7 @@ msgstr "Afegir llapis de greix" msgid "Add a Grease Pencil object to the scene" -msgstr "[Add Grease Pencil]: Afegir un objecte llapis de greix a l'escena" +msgstr "[Add Grease Pencil]: Afegir un objecte Llapis de greix a l'escena" msgctxt "Operator" @@ -66367,6 +66972,84 @@ msgid "Add a light object to the scene" msgstr "Afegir objecte llum a l'escena" +msgctxt "Operator" +msgid "New Light Linking Collection" +msgstr "Nova col·lecció d'endoil·luminació" + + +msgid "Create new light linking collection used by the active emitter" +msgstr "Crea una nova col·lecció d'endoil·luminació usada per l'emissor actiu" + + +msgctxt "Operator" +msgid "Link Blockers to Emitter" +msgstr "Associar blocadors a emissor" + + +msgid "Light link selected blockers to the active emitter object" +msgstr "Crea l'endoi·luminació entre els blocadors seleccionats i l'objecte emissor actiu" + + +msgid "State of the shadow linking" +msgstr "Estat de l'endoombratge" + + +msgid "Include selected blockers to cast shadows from the active emitter" +msgstr "Inclou els blocadors seleccionats perquè facin ombres a partir de l'emissió actiu" + + +msgid "Exclude selected blockers from casting shadows from the active emitter" +msgstr "Excloure els blocadors seleccionats de fer ombra a partir de l'emissor actiu" + + +msgctxt "Operator" +msgid "Select Light Linking Blockers" +msgstr "Seleccionar blocadors de l'endoil·luminació" + + +msgid "Select all objects which block light from this emitter" +msgstr "[Select Light Linking Blockers]: Selecciona tots els objectes amb endoil·luminació de bloqueig d'aquest emissor" + + +msgctxt "Operator" +msgid "Link Receivers to Emitter" +msgstr "Endoreceptors a emissor" + + +msgid "Light link selected receivers to the active emitter object" +msgstr "Crea l'endoil·luminació entre els receptors seleccionats i l'objecte actiu emissor" + + +msgid "State of the light linking" +msgstr "Estat de l'endoil·luminació" + + +msgid "Include selected receivers to receive light from the active emitter" +msgstr "Incloure els receptors seleccionats perquè rebin llum de l'emissor actiu" + + +msgid "Exclude selected receivers from receiving light from the active emitter" +msgstr "Excloure els receptors seleccionats de rebre llum de l'emissor actiu" + + +msgctxt "Operator" +msgid "Select Light Linking Receivers" +msgstr "Seleccionar receptors d'endoil·luminació" + + +msgid "Select all objects which receive light from this emitter" +msgstr "Selecciona tots els objectes que reben llum d'aquest emissor" + + +msgctxt "Operator" +msgid "Remove From Light Linking Collection" +msgstr "Treure de la col·lecció d'endoil·luminació" + + +msgid "Remove this object or collection from the light linking collection" +msgstr "Treu aquest objecte o col·lecció de la col·lecció d'endoil·luminació" + + msgctxt "Operator" msgid "Add Light Probe" msgstr "Afegir sonda de llum" @@ -66393,6 +67076,10 @@ msgid "Bake Light Cache" msgstr "Precuinar memòria cau de llum" +msgid "Bake irradiance volume light cache" +msgstr "Precuinar memòria cau de llum de volum d'irradiància" + + msgid "Delay in millisecond before baking starts" msgstr "Retard en mil·lisegons abans que s'iniciï el precuinat" @@ -66442,6 +67129,18 @@ msgid "Delete cached indirect lighting" msgstr "Suprimeix la il·luminació indirecta a la memòria cau" +msgid "Delete all light probes' baked lighting data" +msgstr "Eliminar totes les dades precuinades d'il·luminació de sondes de llum" + + +msgid "Only delete selected light probes' baked lighting data" +msgstr "Eliminar només les dades precuinades d'il·luminació de les sondes de llum seleccionades" + + +msgid "Only delete the active light probe's baked lighting data" +msgstr "Eliminar només les dades precuinades d'il·luminació de la sonda de llum activa" + + msgctxt "Operator" msgid "Bake Line Art" msgstr "Precuinar dibuix lineal" @@ -66457,7 +67156,7 @@ msgstr "Precuinar dibuix lineal (tots)" msgid "Bake all Grease Pencil objects that have a line art modifier" -msgstr "Precuina tots els objectes de llapis de greix que tenen un modificador de dibuix lineal" +msgstr "Precuina tots els objectes Llapis de greix que tenen un modificador de dibuix lineal" msgctxt "Operator" @@ -66475,7 +67174,7 @@ msgstr "Eliminar dibuix lineal precuinat (tots)" msgid "Clear all strokes in all Grease Pencil objects that have a line art modifier" -msgstr "Elimina tots els traços en tots els objectes del llapis de greix que tenen un modificador de dibuix lineal" +msgstr "Elimina tots els traços en tots els objectes del Llapis de greix que tenen un modificador de dibuix lineal" msgid "Link objects to a collection" @@ -68296,6 +68995,11 @@ msgid "Remove vertices which weight is below or equal to this limit" msgstr "Eliminar els vèrtexs els pesos dels quals sigui per sota o igual a aquest límit" +msgctxt "Operator" +msgid "Duplicate Vertex Group" +msgstr "Duplicar grup de vèrtexs" + + msgid "Make a copy of the active vertex group" msgstr "Fes una còpia del grup de vèrtex actiu" @@ -69717,6 +70421,19 @@ msgid "Select linked faces under the cursor" msgstr "[Select Linked Pick]: Selecciona les cares enllaçades sota del cursor" +msgctxt "Operator" +msgid "Select Loop" +msgstr "Seleccionar bucle" + + +msgid "Select face loop under the cursor" +msgstr "Seleccionar bucle de cares de sota el cursor" + + +msgid "If false, faces will be deselected" +msgstr "Si fals, es desseleccionaran les cares" + + msgid "Select Faces connected to existing selection" msgstr "Seleccionar cares connectades a la selecció actual" @@ -69740,11 +70457,11 @@ msgstr "Especifica si s'ha de seleccionar la geometria exposada de nou" msgctxt "Operator" msgid "Grab Clone" -msgstr "Agafar clonació" +msgstr "Capturar clon" msgid "Move the clone source image" -msgstr "[Grab Clone]: Mou la imatge d'origen per a clonatge" +msgstr "[Grab Clone]: Mou la imatge origen del clon" msgid "Delta offset of clone image in 0.0 to 1.0 coordinates" @@ -71551,6 +72268,15 @@ msgid "Remove existing theme file if exists" msgstr "Suprimir el document de tema existent si existeix" +msgctxt "Operator" +msgid "Remove File Association" +msgstr "Suprimir associació de document" + + +msgid "Remove this installation's associations with .blend files" +msgstr "Suprimeix les associacions d'aquesta instal·lació amb els documents .blend" + + msgctxt "Operator" msgid "Add New Cache" msgstr "Afegir nova memòria cau" @@ -72062,7 +72788,7 @@ msgstr "Afegir marques de cares al joc de fitoatributs" msgid "Add the data paths to the Freestyle Face Mark property of selected polygons to the active keying set" -msgstr "[Add Face Marks to Keying Set]: Afegeix al joc de fitoatributs actiu els camins de dades vers la propietat de marques de cara de traç manual dels polígons seleccionats" +msgstr "[Add Face Marks to Keying Set]: Afegeix al joc de fitoatributs actiu els camins de dades vers la propietat de marques de cara amb traç manual dels polígons seleccionats" msgctxt "Operator" @@ -72202,7 +72928,7 @@ msgstr "Suprimir el modificador de la llista de modificadors" msgctxt "Operator" msgid "Add Freestyle Module" -msgstr "Afegir mòdul manual" +msgstr "Afegir mòdul de traç manual" msgid "Add a style module into the list of modules" @@ -72211,7 +72937,7 @@ msgstr "[Add Freestyle Module]: Afegir un mòdul d'estil de línia a la llista d msgctxt "Operator" msgid "Move Freestyle Module" -msgstr "Moure mòdul manual" +msgstr "Moure mòdul de traç manual" msgid "Change the position of the style module within in the list of style modules" @@ -72241,7 +72967,7 @@ msgstr "Fa que el document del mòdul sigui intern després de carregar-lo" msgctxt "Operator" msgid "Remove Freestyle Module" -msgstr "Eliminar mòdul manual" +msgstr "Eliminar mòdul de traç manual" msgid "Remove the style module from the stack" @@ -72250,7 +72976,7 @@ msgstr "Suprimeix el mòdul d'estil de l'estiba" msgctxt "Operator" msgid "Create Freestyle Stroke Material" -msgstr "Crea material de traç de manual" +msgstr "Crea material de traç d'estil manual" msgid "Create Freestyle stroke material for testing" @@ -73200,6 +73926,10 @@ msgid "Generic sculpt expand operator" msgstr "Operador gèneric d'expansió d'esculpit" +msgid "Falloff Type" +msgstr "Tipus de decandiment" + + msgid "Initial falloff of the expand operation" msgstr "Decaïment inicial de l'operació d'expansió" @@ -74122,6 +74852,18 @@ msgid "The effect inputs to swap" msgstr "Ingressions d'efecte a intercanviar" +msgid "A → B" +msgstr "A → B" + + +msgid "B → C" +msgstr "B → C" + + +msgid "A → C" +msgstr "A → C" + + msgctxt "Operator" msgid "Change Effect Type" msgstr "Canviar tipus d'efecte" @@ -74435,11 +75177,11 @@ msgstr "[Clear Fades]: Suprimeix transicions d'animació de les seqüències sel msgctxt "Operator" msgid "Insert Gaps" -msgstr "Inserir buits" +msgstr "Inserir espais" msgid "Insert gap at current frame to first strips at the right, independent of selection or locked state of strips" -msgstr "[Insert Gaps]: Insereix buit al fotograma actual fins als primers segments de la dreta, independentment de la selecció o l'estat de bloqueig dels segments" +msgstr "[Insert Gaps]: Insereix espai al fotograma actual fins als primers segments de la dreta, independentment de la selecció o l'estat de bloqueig dels segments" msgid "Frames to insert after current strip" @@ -74448,19 +75190,19 @@ msgstr "Fotogrames a inserir després del segment actual" msgctxt "Operator" msgid "Remove Gaps" -msgstr "Eliminar buits" +msgstr "Eliminar espais" msgid "Remove gap at current frame to first strip at the right, independent of selection or locked state of strips" -msgstr "Elimina el buit del fotograma actual fins al primer segment a la dreta, independentment de la selecció o l'estat de bloqueig dels segments" +msgstr "Elimina l'espai del fotograma actual fins al primer segment a la dreta, independentment de la selecció o l'estat de bloqueig dels segments" msgid "All Gaps" -msgstr "Tots els buits" +msgstr "Tots els espais" msgid "Do all gaps to right of current frame" -msgstr "[All Gaps]: Fa tots els buits a la dreta del fotograma actual" +msgstr "[All Gaps]: Fa tots els espais a la dreta del fotograma actual" msgctxt "Operator" @@ -74653,7 +75395,7 @@ msgstr "[Reassign Inputs]: Reassigna les ingressions per al segment d'efecte" msgid "Rebuild all selected proxies and timecode indices using the job system" -msgstr "Recompon totes les simulacions i índexs de cronofites seleccionats usant el sistema de tasques" +msgstr "Recompon totes les simulacions i índexs cronogràfics seleccionats usant el sistema de tasques" msgctxt "Operator" @@ -74696,6 +75438,75 @@ msgid "Set render size and aspect from active sequence" msgstr "[Set Render Size]: Estableix la mida i l'aspecte del revelat a partir de la seqüència activa" +msgctxt "Operator" +msgid "Add Retiming Handle" +msgstr "Afegir nansa de retemporització" + + +msgid "Add retiming Handle" +msgstr "Afegeix nansa de retemporització" + + +msgid "Timeline Frame" +msgstr "Fotograma del cronograma" + + +msgid "Frame where handle will be added" +msgstr "Fotograma on s'afegirà la nansa" + + +msgctxt "Operator" +msgid "Move Retiming Handle" +msgstr "Moure nansa de retemporització" + + +msgid "Move retiming handle" +msgstr "Mou la nansa de retemporització" + + +msgid "Handle Index" +msgstr "Índex de nansa" + + +msgid "Index of handle to be moved" +msgstr "Índex de la nansa que s'ha de moure" + + +msgctxt "Operator" +msgid "Remove Retiming Handle" +msgstr "Suprimir nansa de retemporització" + + +msgid "Remove retiming handle" +msgstr "Suprimeix la nansa de retemporització" + + +msgid "Index of handle to be removed" +msgstr "Índex de nansa que s'ha de suprimir" + + +msgctxt "Operator" +msgid "Reset Retiming" +msgstr "Reiniciar retemporització" + + +msgid "Reset strip retiming" +msgstr "Reinicia la retemporització del segment" + + +msgctxt "Operator" +msgid "Set Speed" +msgstr "Definir rapidesa" + + +msgid "Set speed of retimed segment" +msgstr "Defineix la rapidesa del segment retemporitzat" + + +msgid "New speed of retimed segment" +msgstr "Nova rapidesa del segment retemporitzat" + + msgid "Use mouse to sample color in current frame" msgstr "Usar ratolí per a pescar un color en el fotograma actual" @@ -75571,6 +76382,15 @@ msgid "Copy the texture settings and nodes" msgstr "Copia la configuració de la textura i els nodes" +msgctxt "Operator" +msgid "Add Text Editor Preset" +msgstr "Afegir predefinit d'editor de text" + + +msgid "Add or remove a Text Editor Preset" +msgstr "Afegir o elimina un valor predefinit de l'editor de text" + + msgctxt "Operator" msgid "Text Auto Complete" msgstr "Autocompletar text" @@ -75675,10 +76495,36 @@ msgid "Line number to jump to" msgstr "Número de línia cap a on saltar" +msgctxt "Operator" +msgid "Open Text File at point" +msgstr "Obrir document de text en el punt" + + +msgid "Edit text file in external text editor" +msgstr "Edita un document de text en un editor de textos extern" + + +msgctxt "Operator" +msgid "Jump to File at Point (Internal)" +msgstr "Saltar al document en el punt (intern)" + + +msgid "Jump to a file for the internal text editor" +msgstr "Salta a un document per a l'editor de textos intern" + + msgid "Column" msgstr "Columna" +msgid "Column to jump to" +msgstr "Columna a on saltar" + + +msgid "Line to jump to" +msgstr "Línia a on saltar" + + msgctxt "Operator" msgid "Line Number" msgstr "Número de línia" @@ -75936,7 +76782,7 @@ msgstr "Editar llapis de greix" msgid "Edit selected Grease Pencil strokes" -msgstr "Edita els traços de llapis de greix seleccionats" +msgstr "Edita els traços de Llapis de greix seleccionats" msgid "Use Snapping Options" @@ -76012,6 +76858,14 @@ msgid "Edge Slide" msgstr "Lliscar aresta" +msgid "Allow Navigation" +msgstr "Permetre navegació" + + +msgid "Allow navigation while transforming" +msgstr "Permet la navegació durant la transformació" + + msgid "Correct UVs" msgstr "Corregir UVs" @@ -76032,6 +76886,10 @@ msgid "Snap to Elements" msgstr "Acoblar als elements" +msgid "Snap to increments" +msgstr "Acoblar a increments" + + msgid "Snap to vertices" msgstr "Acoblar als vèrtexs" @@ -76753,7 +77611,7 @@ msgstr "Pipeta de llapis de greix" msgid "Sample a color from the Blender Window and create Grease Pencil material" -msgstr "Pesca un color des de la finestra del Blender i crea material amb llapis de greix" +msgstr "Pesca un color des de la finestra del Blender i crea material amb Llapis de greix" msgctxt "Operator" @@ -77066,6 +77924,15 @@ msgid "Rename the active item in the data-set view" msgstr "Reanomena l'element actiu en la visualització de conjunt de dades" +msgctxt "Operator" +msgid "View Filter" +msgstr "Visionar filtre" + + +msgid "Start entering filter text for the data-set in focus" +msgstr "Comença a introduir el text de filtre per a les dades en focus" + + msgctxt "Operator" msgid "Align" msgstr "Alinear" @@ -77140,6 +78007,10 @@ msgid "Axis to align to" msgstr "Eix al qual alinear" +msgid "Correct Aspect" +msgstr "Aspecte correcte" + + msgid "Method to calculate rotation angle" msgstr "Mètode per calcular l'angle de rotació" @@ -77199,10 +78070,6 @@ msgid "Clip UV coordinates to bounds after unwrapping" msgstr "Retalla les coordenades UV als límits després de desembolcallar" -msgid "Correct Aspect" -msgstr "Aspecte correcte" - - msgid "Map UVs taking image aspect ratio into account" msgstr "[Correct Aspect]: Mapeja UVs tenint en compte la relació d'aspecte de la imatge" @@ -77663,6 +78530,10 @@ msgid "Clear pinning for the selection instead of setting it" msgstr "Descartar la fixació de la selecció en lloc d'activar-la" +msgid "Invert pinning for the selection instead of setting it" +msgstr "Invertir fixació de la selecció en lloc d'activar-la" + + msgctxt "Operator" msgid "Project from View" msgstr "Projectar des de visualització" @@ -78324,6 +79195,10 @@ msgid "Extrude Individual and Move" msgstr "Extrudir individu i moure'l" +msgid "Allow navigation" +msgstr "Permetre navegació" + + msgctxt "Operator" msgid "Extrude Manifold Along Normals" msgstr "Extrudir polivalents seguint normals" @@ -81237,6 +82112,10 @@ msgid "Exit Blender after saving" msgstr "Sortir del Blender després de desar" +msgid "Save the current Blender file with a numerically incremented name that does not overwrite any existing files" +msgstr "Desa el document Blender actual amb un nom incrementat numèricament que no sobreescrigui cap document existent" + + msgctxt "Operator" msgid "Save Preferences" msgstr "Preferències de desar" @@ -81728,10 +82607,6 @@ msgid "Path Mask" msgstr "Màscara de camí" -msgid "Import only the primitive at the given path and its descendents. Multiple paths may be specified in a list delimited by commas or semicolons" -msgstr "Importar només el primitiu en el camí estipulat i els seus descendents. Es poden especificar múltiples camins amb una llista delimitada per comes o punts i coma" - - msgid "Read mesh color attributes" msgstr "Llegir atributs de color de malla" @@ -81810,7 +82685,7 @@ msgstr "Crea una finestra principal nova amb el seu propi obrador i la selecció msgctxt "Operator" msgid "XR Navigation Fly" -msgstr "Vol de navegació en RS" +msgstr "Vol de navegació en RX" msgid "Move/turn relative to the VR viewer or controller" @@ -81959,7 +82834,7 @@ msgstr "Rapidesa mínima de moviment (gir) en metres (radians) per segon o per f msgctxt "Operator" msgid "XR Navigation Grab" -msgstr "Navegació de RS a mà" +msgstr "Navegació d'RX a mà" msgid "Navigate the VR scene by grabbing with controllers" @@ -81988,7 +82863,7 @@ msgstr "Evitar els canvis d'escala del visor" msgctxt "Operator" msgid "XR Navigation Reset" -msgstr "Restablir navegació RS" +msgstr "Restablir navegació RX" msgid "Reset VR navigation deltas relative to session base pose" @@ -82009,7 +82884,7 @@ msgstr "Restablir deltes d'escala" msgctxt "Operator" msgid "XR Navigation Teleport" -msgstr "Teleport de navegació RS" +msgstr "Teleport de navegació RX" msgid "Set VR viewer location to controller raycast hit location" @@ -82278,7 +83153,7 @@ msgstr "Pintura esculpir amb corbes" msgid "Grease Pencil Paint" -msgstr "Pintura de llapis de greix" +msgstr "Llapis de greix- Pintar" msgid "Paint Mode" @@ -82294,7 +83169,7 @@ msgstr "Pintar el material amb un atribut de color" msgid "Grease Pencil Sculpt Paint" -msgstr "Pintura esculpir amb llapis de greix" +msgstr "Llapis de greix - Esculpir pintant" msgid "Image Paint" @@ -82314,7 +83189,7 @@ msgstr "Imatge usada com a llenç" msgid "Image used as clone source" -msgstr "Imatge usada com a font de clonatge" +msgstr "Imatge usada com a font de clonació" msgid "Dither" @@ -82378,7 +83253,7 @@ msgstr "Situa la imatge per al pintat de textura de manera directa" msgid "Screen Grab Size" -msgstr "Mida presa pantalla" +msgstr "Mida captura de pantalla" msgid "Size to capture the image for re-projecting" @@ -82418,7 +83293,7 @@ msgstr "[Cull]: Ignora les cares que apunten fora de la vista (més ràpid)" msgid "Clone Map" -msgstr "Clonar mapa" +msgstr "Mapa de clonació" msgid "Use another UV map as clone source, otherwise use the 3D cursor as the source" @@ -82782,7 +83657,7 @@ msgstr "Visualització de màscara" msgid "Proxy/Timecode" -msgstr "Simulació/Cronofita" +msgstr "Simulació/cronografia" msgid "Stabilization" @@ -82871,6 +83746,10 @@ msgid "Shadow Terminator" msgstr "Anul·lador d'ombra" +msgid "Shadow Linking" +msgstr "Endoombratge" + + msgid "Ray Visibility" msgstr "Visibilitat de raigs" @@ -83196,7 +84075,7 @@ msgstr "Escala" msgid "Supports any combination of grab, rotate, and scale at once" -msgstr "Permet qualsevol combinació d'agafar, rotar i escalar alhora" +msgstr "Permet qualsevol combinació de capturar, rotar i escalar alhora" msgctxt "Operator" @@ -83206,7 +84085,7 @@ msgstr "Regió d'arrencar" msgctxt "Operator" msgid "Grab" -msgstr "Agafar" +msgstr "Capturar" msgctxt "Operator" @@ -83265,7 +84144,7 @@ msgstr "Ondulació" msgid "Freestyle Line" -msgstr "Manual" +msgstr "Línia manual" msgid "Material settings" @@ -83277,7 +84156,7 @@ msgstr "Predefinits de material" msgid "Grease Pencil Material Slots" -msgstr "Epígrafs de material de llapis de greix" +msgstr "Llapis de greix- Epígrafs de materials" msgid "Math Vis" @@ -83300,6 +84179,10 @@ msgid "Predefined node color" msgstr "Color del node predefinit" +msgid "Node Panels" +msgstr "Plafons de nodes" + + msgid "Simulation State" msgstr "Estat de simulació" @@ -83656,7 +84539,7 @@ msgstr "Memòria cau de pista" msgid "Strip Proxy & Timecode" -msgstr "Cronofita i simulació de pista" +msgstr "Cronografia i simulació de pista" msgctxt "Operator" @@ -83664,6 +84547,11 @@ msgid "Blade" msgstr "Cisalla" +msgctxt "Operator" +msgid "Retime" +msgstr "Retemporitzar" + + msgid "Feature Weights" msgstr "Pesos de característiques" @@ -83851,6 +84739,10 @@ msgid "Operating System Settings" msgstr "Configuració del sistema operatiu" +msgid "Text Editor Presets" +msgstr "Predeterminats de l'editor de texts" + + msgid "Bone Color Sets" msgstr "Jocs de colors d'ossos" @@ -84518,7 +85410,7 @@ msgstr "Decaïment de normals" msgid "Gap Closure" -msgstr "Tancament de buit" +msgstr "Tancament d'espai" msgid "Post-Processing" @@ -84686,11 +85578,11 @@ msgstr "Mode de longitud" msgid "Make hairs longer" -msgstr "Fa més llargs els pèls" +msgstr "Allargar els pèls" msgid "Make hairs shorter" -msgstr "Fa més curts els pèls" +msgstr "Escurçar els pèls" msgid "Puff Mode" @@ -85490,7 +86382,7 @@ msgstr "CI automàtica" msgid "Add temporary IK constraints while grabbing bones in Pose Mode" -msgstr "[Auto IK]: Afegir restriccions temporals de CI mentre s'agafen ossos en el mode de posa" +msgstr "[Auto IK]: Afegir restriccions temporals de CI en capturar ossos en el Mode posa" msgid "Relative Mirror" @@ -85693,6 +86585,10 @@ msgid "Pose Matrix" msgstr "Matriu de posa" +msgid "Final 4×4 matrix after constraints and drivers are applied, in the armature object space" +msgstr "Matriu final 4x4 després d'aplicar restriccions i controladors, en l'espai d'objecte esquelet" + + msgid "Alternative access to location/scale/rotation relative to the parent and own rest bone" msgstr "Accés alternatiu a la ubicació/escala/rotació en relació amb el pare i el propi os de repòs" @@ -85701,6 +86597,10 @@ msgid "Channel Matrix" msgstr "Matriu de canals" +msgid "4×4 matrix of the bone's location/rotation/scale channels (including animation and drivers) and the effect of bone constraints" +msgstr "Matriu 4x4 dels canals d'ubicació/rotació/escala de l'os (incloent-hi animació i controladors) i l'efecte de les restriccions d'os" + + msgid "Parent of this pose bone" msgstr "Pare d'aquest os posa" @@ -85926,7 +86826,7 @@ msgstr "Color de noves capes d'anotacions" msgid "Grease Pencil Eraser Radius" -msgstr "Radi d'esborrar de llapis de greix" +msgstr "Llapis de greix - Radi d'esborrador" msgid "Radius of eraser 'brush'" @@ -85934,7 +86834,7 @@ msgstr "Radi del «pinzell» esborrador" msgid "Grease Pencil Euclidean Distance" -msgstr "Distància euclidiana del llapis de greix" +msgstr "Llapis de greix - Distància euclidiana" msgid "Distance moved by mouse when drawing stroke to include" @@ -85942,7 +86842,7 @@ msgstr "Distància en què es mou el ratolí quan es dibuixa el traç a incloure msgid "Grease Pencil Manhattan Distance" -msgstr "Distància Manhattan del llapis de greix" +msgstr "Llapis de greix - Distància Manhattan" msgid "Pixels moved by mouse per axis when drawing stroke" @@ -86298,6 +87198,14 @@ msgid "Enable the new EEVEE codebase, requires restart" msgstr "Habilita el codi base nou d'EEVEE, cal reiniciar" +msgid "Overlay Next" +msgstr "Overlay següent" + + +msgid "Enable the new Overlay codebase, requires restart" +msgstr "Habilita el nou codi base d'Overlay, cal reiniciar" + + msgid "Workbench Next" msgstr "Workbench següent" @@ -86346,6 +87254,14 @@ msgid "Enable Cycles debugging options for developers" msgstr "Activa les opcions de depuració de Cycles per als desenvolupadors" +msgid "Experimental Compositors" +msgstr "Compositadors experimentals" + + +msgid "Enable compositor full frame and realtime GPU execution mode options (no tiling, reduces execution time and memory usage)" +msgstr "[Experimental Compositors]: Activa les opcions del mode d'execució en GPU de temps real i enquadrament complet en el compositador (no fa tessel·les, redueix el temps d'execució i l'ús de memòria)" + + msgid "Extended Asset Browser" msgstr "Navegador de recursos ampliat" @@ -86354,6 +87270,14 @@ msgid "Enable Asset Browser editor and operators to manage regular data-blocks a msgstr "Habilita l'editor i operadors del navegador de recursos perquè gestioni blocs de dades regulars com a recursos, no només poses" +msgid "Grease Pencil 3.0" +msgstr "Llapis de greix 3.0" + + +msgid "Enable the new grease pencil 3.0 codebase" +msgstr "Activa el nou codi base del llapis de greix 3.0" + + msgid "New Curves Tools" msgstr "Eines de noves corbes" @@ -86378,6 +87302,10 @@ msgid "Enables visibility of the new Volume nodes in the UI" msgstr "Habilita la visibilitat dels nous nodes de volum a la IU" +msgid "Enable node panels UI for grouping sockets in node groups" +msgstr "Habilita la IU de plafons de nodes per a agrupar borns en grups de nodes" + + msgid "Override Templates" msgstr "Sobreseure plantilles" @@ -86386,6 +87314,14 @@ msgid "Enable library override template in the Python API" msgstr "Habilita la plantilla de sobreseïment de biblioteca a l'API de python" +msgid "Rotation Socket" +msgstr "Born de rotació" + + +msgid "Enable the new rotation node socket type" +msgstr "Habilita la el nou tipus de born de node de rotació" + + msgid "Sculpt Texture Paint" msgstr "Esculpir pintant textura" @@ -86618,6 +87554,36 @@ msgid "The directory for storing temporary save files" msgstr "El directori per emmagatzemar documents temporals desats" +msgid "" +"Command to launch the text editor, either a full path or a command in $PATH.\n" +"Use the internal editor when left blank" +msgstr "" +"Ordre per engegar l'editor de text, sigui amb el camí complet o amb una ordre a $PATH.\n" +"Si es deixa buit, usa l'editor intern" + + +msgid "Text Editor Args" +msgstr "Args d'editor de text" + + +msgid "" +"Defines the specific format of the arguments with which the text editor opens files. The supported expansions are as follows:\n" +"\n" +"$filepath The absolute path of the file.\n" +"$line The line to open at (Optional).\n" +"$column The column to open from the beginning of the line (Optional).\n" +"$line0 & column0 start at zero.\n" +"Example: -f $filepath -l $line -c $column" +msgstr "" +"Defineix el format específic dels arguments amb què l'editor de text obre documents. Les expansions suportades són les següents:\n" +"\n" +"$filepath La ruta absoluta del document.\n" +"$line La línia a on obrir (opcional).\n" +"$column La columna que cal obrir des del principi de la línia (opcional).\n" +"$line0 i column0 comencen a zero.\n" +"Exemple: -f $filepath -l $line -c $column" + + msgid "The default directory to search for textures" msgstr "El directori predeterminat per a cercar textures" @@ -86951,7 +87917,7 @@ msgstr "Les tecles principals d'1 a 0 actuen com les del teclat numèric (útil msgid "Continuous Grab" -msgstr "Arrossegament continu" +msgstr "Agafar continuat" msgid "Let the mouse wrap around the view boundaries so mouse movements are not limited by the screen size (used by transform, dragging of UI controls, etc.)" @@ -87102,6 +88068,22 @@ msgid "Quality of anisotropic filtering" msgstr "Qualitat del filtratge anisotròpic" +msgid "2×" +msgstr "2×" + + +msgid "4×" +msgstr "4×" + + +msgid "8×" +msgstr "8×" + + +msgid "16×" +msgstr "16×" + + msgid "Audio Device" msgstr "Dispositiu àudio" @@ -87350,6 +88332,14 @@ msgid "Use GLSL shaders for display transform and display image with 2D texture" msgstr "Usa aspectors GLSL per a la transformació de pantalla i la imatge de pantalla amb textura 2D" +msgid "Is Microsoft Store Install" +msgstr "És instal·lació de Microsoft Store" + + +msgid "Whether this blender installation is a sandboxed Microsoft Store version" +msgstr "Si aquesta instal·lació de blender és la versió expressa del Microsoft Store" + + msgid "Legacy Compute Device Type" msgstr "Tipus de dispositiu de càlcul antic" @@ -87374,6 +88364,14 @@ msgid "Memory cache limit (in megabytes)" msgstr "Límit de memòria cau (en megabytes)" +msgid "Register for All Users" +msgstr "Registre per a totes les usuàries" + + +msgid "Make this Blender version open blend files for all users. Requires elevated privileges" +msgstr "Fa que aquesta versió de Blender obri documents blend de tots els usuaris. Exigeix privilegis elevats" + + msgid "Maximum number of lines to store for the console buffer" msgstr "Nombre màxim de línies d'emmagatzematge per a la memòria intermèdia de la consola" @@ -88043,11 +89041,11 @@ msgstr "Lleuger" msgid "Timecode Style" -msgstr "Estil cronofites" +msgstr "Estil de cronografia" msgid "Format of timecode displayed when not displaying timing in terms of frames" -msgstr "[Timecode Style]: Format de la cronofita visible quan no es mostra el temps en fotogrames" +msgstr "[Timecode Style]: Format de la cronografia visible quan no es mostra el temps en fotogrames" msgid "Minimal Info" @@ -88055,7 +89053,7 @@ msgstr "Informació mínima" msgid "Most compact representation, uses '+' as separator for sub-second frame numbers, with left and right truncation of the timecode as necessary" -msgstr "La representació més compacta, usa «+» com a separador per als nombres de fotogrames per sota del segon, amb truncament esquerre i dret de la cronofita si cal" +msgstr "La representació més compacta, usa «+» com a separador per als nombres de fotogrames per sota del segon, amb truncament esquerre i dret de la cronografia si cal" msgid "SMPTE (Full)" @@ -88063,7 +89061,7 @@ msgstr "SMPTE (completa)" msgid "Full SMPTE timecode (format is HH:MM:SS:FF)" -msgstr "[SMPTE (Full)]: Cronofita SMPTE completa (format HH:MM:SS:FF)" +msgstr "[SMPTE (Full)]: Cronografia SMPTE completa (format HH:MM:SS:FF)" msgid "SMPTE (Compact)" @@ -88071,7 +89069,7 @@ msgstr "SMPTE (compacta)" msgid "SMPTE timecode showing minutes, seconds, and frames only - hours are also shown if necessary, but not by default" -msgstr "Cronofita SMPTE que mostra només minuts, segons i fotogrames - les hores també es mostren si cal, però no per defecte" +msgstr "Cronografia SMPTE que mostra només minuts, segons i fotogrames - les hores també es mostren si cal, però no per defecte" msgid "Compact with Milliseconds" @@ -88834,26 +89832,56 @@ msgid "Combination of true displacement and bump mapping for finer detail" msgstr "Combinació de desplaçament real i mapejat de relleu per a detalls més fins" +msgctxt "Light" +msgid "Emission Sampling" +msgstr "Mostreig d'emissió" + + msgid "Sampling strategy for emissive surfaces" msgstr "Estratègia de mostreig per a superfícies d'emissió" +msgctxt "Light" +msgid "None" +msgstr "No-cap" + + msgid "Do not use this surface as a light for sampling" msgstr "No usar aquesta superfície com a llum per al mostreig" +msgctxt "Light" +msgid "Auto" +msgstr "Automàtic" + + msgid "Automatically determine if the surface should be treated as a light for sampling, based on estimated emission intensity" msgstr "Determina automàticament si la superfície s'ha de tractar com una llum per al mostreig, basat en la intensitat d'emissió estimada" +msgctxt "Light" +msgid "Front" +msgstr "Frontal" + + msgid "Treat only front side of the surface as a light, usually for closed meshes whose interior is not visible" msgstr "Tracta només el costat frontal de la superfície com a llum, generalment per a malles tancades l'interior de les quals no és visible" +msgctxt "Light" +msgid "Back" +msgstr "Posterior" + + msgid "Treat only back side of the surface as a light for sampling" msgstr "Tracta només la part posterior de la superfície com a llum per al mostreig" +msgctxt "Light" +msgid "Front and Back" +msgstr "Frontal i posterior" + + msgid "Treat surface as a light for sampling, emitting from both the front and back side" msgstr "[Front and Back]: Tracta la superfície com una llum per al mostreig, emetent-se tant des del costat frontal com des del posterior" @@ -89430,6 +90458,38 @@ msgid "Maximum number of glossy reflection bounces, bounded by total maximum" msgstr "[Glossy Bounces]: Nombre màxim de rebots de reflex de setinat, delimitats pel màxim total" +msgid "Directional Sampling Type" +msgstr "Tipus de mostreig direccional" + + +msgid "Type of the directional sampling used for guiding" +msgstr "Tipus de mostreig direccional utilitzat per al guiatge" + + +msgid "Diffuse Product MIS" +msgstr "MIM de producte difusiu" + + +msgid "Guided diffuse BSDF component based on the incoming light distribution and the cosine product (closed form product)" +msgstr "Component FDDB difusiu guiat que es basa en la distribució de llum entrant i el producte cosinus (producte de forma tancada)" + + +msgid "Re-sampled Importance Sampling" +msgstr "Re-mostreig del mostreig d'importància" + + +msgid "Perform RIS sampling to guided based on the product of the incoming light distribution and the BSDF" +msgstr "Executa el mostreig MER al guiat basat en el producte de la distribució de llum entrant i l'FDDB" + + +msgid "Roughness-based" +msgstr "Basat en rugositat" + + +msgid "Adjust the guiding probability based on the roughness of the material components" +msgstr "Ajusta la probabilitat de guiatge en base a la rugositat dels components del material" + + msgid "Guiding Distribution Type" msgstr "Tipus de distribució de guiatge" @@ -89462,6 +90522,14 @@ msgid "Use von Mises-Fisher models as directional distribution" msgstr "[VMM]: Usa els models von Mises-Fisher com a distribució direccional" +msgid "Guiding Roughness Threshold" +msgstr "Llindar de rugositat de guiatge" + + +msgid "The minimal roughness value of a material to apply guiding" +msgstr "La rugositat mínima d'una material per aplicar-l'hi guiatge" + + msgid "Training Samples" msgstr "Mostres d'entrenament" @@ -90578,6 +91646,14 @@ msgid "Property that stores arbitrary, user defined properties" msgstr "Propietat que es guarda propietats arbitràries, definides per la usuària" +msgid "Quaternion Attribute Value" +msgstr "Valor d'atribut de quaternió" + + +msgid "Rotation value in geometry attribute" +msgstr "[Quaternion Attribute Value]: Valor de rotació en l'atribut de geometria" + + msgid "Read-only Integer" msgstr "Enter de sols-lectura" @@ -91178,6 +92254,10 @@ msgid "Automatic pixel size, depends on the user interface scale" msgstr "Mida automàtica del píxel, depèn de l'escala de la interfície d'usuària" +msgid "1×" +msgstr "1×" + + msgid "Render at full resolution" msgstr "Revela a resolució completa" @@ -91247,7 +92327,7 @@ msgstr "Percentatge global de partícules filles durant el revelat" msgid "Simplify Grease Pencil drawing" -msgstr "Simplificar dibuix de llapis de greix" +msgstr "Simplificar dibuix de Llapis de greix" msgid "Antialiasing" @@ -91267,7 +92347,7 @@ msgstr "Només reproduir" msgid "Simplify Grease Pencil only during animation playback" -msgstr "[Playback Only]: Simplifica el llapis de greix només mentre reprodueix l'animació" +msgstr "[Playback Only]: Simplifica el Llapis de greix només mentre reprodueix l'animació" msgid "Display Shader Effects" @@ -91422,6 +92502,10 @@ msgid "Add the file format extensions to the rendered file name (eg: filename + msgstr "Afegir les extensions de format de document al nom del document revelat (p. ex. nom del document + .jpg)" +msgid "Use Freestyle" +msgstr "Usar traç manual" + + msgid "Draw stylized strokes using Freestyle" msgstr "Dibuixar traços estilitzats amb línia manual" @@ -91627,7 +92711,7 @@ msgstr "Temps a la llegenda" msgid "Include the rendered frame timecode as HH:MM:SS.FF in image metadata" -msgstr "Inclou la cronofita del fotograma revelat com a HH:MM:SS.FF a les metadades de la imatge" +msgstr "Inclou la cronografia del fotograma revelat com a HH:MM:SS.FF a les metadades de la imatge" msgid "Setup Stereo Mode" @@ -91638,10 +92722,6 @@ msgid "Single stereo camera system, adjust the stereo settings in the camera pan msgstr "Sistema d'única càmera, ajusta la configuració estèreo al plafó de la càmera" -msgid "Multi-View" -msgstr "Múltiples càmeres" - - msgid "Multi camera system, adjust the cameras individually" msgstr "Sistema de càmera múltiple, ajusta les càmeres individualment" @@ -91686,6 +92766,22 @@ msgid "Active index in render view array" msgstr "Índex actiu en la sèrie de visualitzacions de revelat" +msgid "Retiming Handle" +msgstr "Nansa de retemporització" + + +msgid "Handle mapped to particular frame that can be moved to change playback speed" +msgstr "Nansa mapejada a un fotograma concret que es pot moure per canviar la velocitat de reproducció" + + +msgid "Position of retiming handle in timeline" +msgstr "Posició de la nansa de retemporització dins el cronograma" + + +msgid "Collection of RetimingHandle" +msgstr "Col·lecció de Nansa de retemporització" + + msgid "Constraint influencing Objects inside Rigid Body Simulation" msgstr "Restricció que afecta d'objectes dins de la simulació de cos rígid" @@ -93921,6 +95017,10 @@ msgid "Sequence strip to load a video" msgstr "[Movie Sequence]: Segment de seqüències per a carregar un vídeo" +msgid "Retiming Handles" +msgstr "Nanses de retemporització" + + msgid "Stream Index" msgstr "Índex de discorriment" @@ -94448,7 +95548,7 @@ msgstr "Qualitat dels simuladors a confegir" msgid "Method for reading the inputs timecode" -msgstr "Mètode de lectura per a les ingressions de cronofites" +msgstr "Mètode de lectura per les cronografies de les ingressions" msgid "Use images in the order as they are recorded" @@ -94456,11 +95556,11 @@ msgstr "Usar imatges en l'ordre en què es graven" msgid "Record Run No Gaps" -msgstr "Gravar autofites sense buits" +msgstr "Gravar autofites sense espais" msgid "Like record run, but ignore timecode, changes in framerate or dropouts" -msgstr "[Record Run No Gaps]: És com gravar autofites, però ignorant les cronofites, els canvis en la taxa de fotogrames o els orfes" +msgstr "[Record Run No Gaps]: És com gravar autofites, però ignorant les cronografies, els canvis en la taxa de fotogrames o els orfes" msgid "Overwrite existing proxy files when building" @@ -94499,6 +95599,14 @@ msgid "Type of filter to use for image transformation" msgstr "Tipus de filtre per a la transformació d'imatge" +msgid "Subsampling (3×3)" +msgstr "Submostrejar (3x3)" + + +msgid "Use nearest with 3×3 subsamples during rendering" +msgstr "Usaa el més proper amb les submostres de 3x3 mentre es revela" + + msgid "Move along X axis" msgstr "Moure seguint l'eix X" @@ -95007,6 +96115,11 @@ msgid "Use object as center of rotation" msgstr "Utilitza l'objecte com a centre de rotació" +msgctxt "GPencil" +msgid "Wave" +msgstr "Ona" + + msgid "Use wave effect" msgstr "Usar efecte d'ona" @@ -95264,15 +96377,15 @@ msgstr "Borrositat durant la col·lisió, els valors alts fan que la gestió de msgid "Default Goal (vertex target position) value" -msgstr "Valor d'objectiu per defecte (posició objectiu de vèrtex)" +msgstr "Valor de destí per defecte (posició objectiu de vèrtex)" msgid "Goal maximum, vertex weights are scaled to match this range" -msgstr "Objectiu màxim, els pesos dels vèrtexs s'escalaran per a coincidir amb aquest interval" +msgstr "Destí màxim, els pesos dels vèrtexs s'escalaran per a coincidir amb aquest interval" msgid "Goal minimum, vertex weights are scaled to match this range" -msgstr "Objectiu mínim, els pesos dels vèrtexs s'escalaran per coincidir amb aquest interval" +msgstr "Destí mínim, els pesos dels vèrtexs s'escalaran per coincidir amb aquest interval" msgid "Gravitation" @@ -95392,7 +96505,7 @@ msgstr "Les cares també xoquen, pot ser molt lent" msgid "Use Goal" -msgstr "Usar objectiu" +msgstr "Usar destí" msgid "Define forces for vertices to stick to animated position" @@ -95412,7 +96525,7 @@ msgstr "Afegir tensors en diagonals als 4-gons" msgid "Goal Vertex Group" -msgstr "Grup de vèrtexs objectiu" +msgstr "Grup de vèrtexs destí" msgid "Control point weight values" @@ -95949,7 +97062,7 @@ msgstr "Editar totes les fotofites de l'escena" msgid "Timeline and playback controls" -msgstr "Controls de cromograma i reproducció" +msgstr "Controls de cronograma i reproducció" msgid "Action Editor" @@ -95969,7 +97082,7 @@ msgstr "[Shape Key Editor]: Edita les fotofites en l'acció de Morfofites de l'o msgid "Edit timings for all Grease Pencil sketches in file" -msgstr "Editar els temps per a tots els esbossos de llapis de greix del document" +msgstr "Editar els temps per a tots els esbossos de Llapis de greix del document" msgid "Edit timings for Mask Editor splines" @@ -96512,6 +97625,29 @@ msgid "Node tree being displayed and edited" msgstr "Arbre de nodes que s'està mostrant i editant" +msgctxt "ID" +msgid "Geometry Nodes Type" +msgstr "Tipus de nodes de geometria" + + +msgctxt "ID" +msgid "Modifier" +msgstr "Modificador" + + +msgid "Edit node group from active object's active modifier" +msgstr "Edita el grup de nodes des del modificador actiu de l'objecte actiu" + + +msgctxt "ID" +msgid "Operator" +msgstr "Operador" + + +msgid "Edit any geometry node group for use as an operator" +msgstr "Edita qualsevol grup de nodes de geometria per utilitzar-lo com a operador" + + msgid "Data-block whose nodes are being edited" msgstr "Bloc de dades els nodes dels quals s'estan editant" @@ -97108,7 +98244,7 @@ msgstr "Vectoscopi croma" msgid "Grease Pencil data for this Preview region" -msgstr "Dades de llapis de greix per a aquesta regió de previsualització" +msgstr "Dades de Llapis de greix per a aquesta regió de previsualització" msgid "Overlay Type" @@ -98477,7 +99613,7 @@ msgstr "Rotació de textura de pinzell" msgid "Has Texture Angle Source" -msgstr "Té una font d'angle de textura" +msgstr "Té font d'angle de textura" msgid "Stencil" @@ -98617,7 +99753,7 @@ msgstr "Factor longitud" msgid "Amount texture affects child hair length" -msgstr "Quant afecta la textura la longitud del pèl de les filles" +msgstr "Quant afecta la textura la longitud de les partícules filles de pèl" msgid "Life Time Factor" @@ -98721,7 +99857,7 @@ msgstr "Afecta la freqüència de torsió de les filles" msgid "Affect the child hair length" -msgstr "Afecta la longitud del pèl de les filles" +msgstr "Afecta la longitud de partícules pèl" msgid "Life Time" @@ -100310,15 +101446,15 @@ msgstr "Cara - Text de l'àrea" msgid "Grease Pencil Vertex" -msgstr "Llapis dG - Vèrtex" +msgstr "Llapis de greix - Vèrtex" msgid "Grease Pencil Vertex Select" -msgstr "Llapis dG - Selecció de vèrtex" +msgstr "Llapis de greix - Selecció de vèrtex" msgid "Grease Pencil Vertex Size" -msgstr "Llapis dG - Mida de vèrtex" +msgstr "Llapis de greix - Mida de vèrtex" msgid "Face Normal" @@ -100370,7 +101506,7 @@ msgstr "Fotofita de llapis de greix" msgid "Color for indicating Grease Pencil keyframes" -msgstr "Color per a indicar les fotofites de llapis de greix" +msgstr "Color per a indicar les fotofites de Llapis de greix" msgid "Object Keyframe" @@ -100574,7 +101710,7 @@ msgstr "Interpolació de llapis de greix" msgid "Settings for Grease Pencil Interpolation tools" -msgstr "Paràmetres per a les eines d'interpolació del llapis de greix" +msgstr "Paràmetres per a les eines d'interpolació del Llapis de greix" msgid "Grease Pencil Sculpt" @@ -100746,6 +101882,18 @@ msgid "Type of element to snap to" msgstr "[Snap Element]: Tipus d'element al qual s'acoblarà" +msgid "Type of element for the 'Snap With' to snap to" +msgstr "Tipus d'element a què \"Acoblar amb\" s'ha d'acoblar" + + +msgid "Project Mode" +msgstr "Mode projecció" + + +msgid "Type of element for individual transformed elements to snap to" +msgstr "Tipus d'element per a on s'acoblen els elements individuals transformats" + + msgid "Snap to" msgstr "Acoblar a" @@ -101746,7 +102894,7 @@ msgstr "Intensitat de l'efecte d'esvaïment" msgid "Fade layer opacity for Grease Pencil layers except the active one" -msgstr "Capa d'esvaïment per a capes de llapis de greix exceptuant l'activa" +msgstr "Capa d'esvaïment per a capes de Llapis de greix exceptuant l'activa" msgid "Fade factor" @@ -101998,11 +103146,11 @@ msgstr "Mostra les marques d'aresta de traç manual, usades amb el revelat de tr msgid "Display Freestyle Face Marks" -msgstr "Mostrar marques de cara de línia manual" +msgstr "Mostrar marques de cara amb traç manual" msgid "Display Freestyle face marks, used with the Freestyle renderer" -msgstr "Mostrar marques de cara de línia manual, usades en el revelat de línia manual" +msgstr "Mostrar marques de cara amb traç manual, usades en el revelat de línia manual" msgid "Light Colors" @@ -102210,7 +103358,7 @@ msgstr "Esvaeix objectes de llapis de greix" msgid "Fade Grease Pencil Objects, except the active one" -msgstr "Esvaeix els objectes del llapis de greix, excepte l'actiu" +msgstr "Esvaeix els objectes del Llapis de greix, excepte l'actiu" msgid "Fade Layers" @@ -102218,7 +103366,7 @@ msgstr "Esvaeix capes" msgid "Toggle fading of Grease Pencil layers except the active one" -msgstr "[Fade Layers]: Revessa l'esvaïment de les capes de llapis de greix excepte l'activa" +msgstr "[Fade Layers]: Revessa l'esvaïment de les capes de Llapis de greix excepte l'activa" msgid "Fade Objects" @@ -102234,7 +103382,7 @@ msgstr "Usar quadrícula" msgid "Display a grid over grease pencil paper" -msgstr "Mostra una quadrícula sobre paper de llapis de greix" +msgstr "Mostra una quadrícula sobre paper de Llapis de greix" msgid "Lines Only" @@ -102828,6 +103976,18 @@ msgid "Type of the path element" msgstr "Tipus d'element de trajecte" +msgid "Name that can be displayed in the UI for this element" +msgstr "Nom d'aquest element que es pot mostrar a la IU" + + +msgid "Node ID" +msgstr "ID de node" + + +msgid "Simulation Output Node ID" +msgstr "ID de node de sortida de simulació" + + msgid "Volume Display" msgstr "Visualització de volum" @@ -102864,6 +104024,10 @@ msgid "Fine" msgstr "Refinat" +msgid "Display box for each leaf node containing 8×8 voxels" +msgstr "[Fine]: Mostra capsa per a cada node orfe que conté 8x8 vòxels" + + msgid "Type of wireframe display" msgstr "Tipus de visualització de filat" @@ -103241,14 +104405,6 @@ msgid "Length of rays, defines how far away other faces give occlusion effect" msgstr "Longitud dels rajos, defineix fins a quant de lluny les altres fan efecte d'oclusió" -msgid "Use Ambient Occlusion" -msgstr "Usar oclusió ambiental" - - -msgid "Use Ambient Occlusion to add shadowing based on distance between objects" -msgstr "[Use Ambient Occlusion]: Usa l'oclusió ambiental per a afegir ombres basades en la distància entre objectes" - - msgid "World Mist" msgstr "Boira al món" @@ -103390,7 +104546,7 @@ msgstr "Col·lecció d'associacions de mapa d'acció XR" msgid "XR Action Map Item" -msgstr "Element de mapa d'acció XR" +msgstr "Element de mapa d'acció RX" msgid "Bimanual" @@ -103598,7 +104754,7 @@ msgstr "[XR Component Path]: Camí del component d'OpenXR" msgid "XR Component Paths" -msgstr "Camins de component XR" +msgstr "Rutes de component RX" msgid "Collection of OpenXR component paths" @@ -103610,7 +104766,7 @@ msgstr "Dades d'RX per a esdeveniment del gestor de finestres" msgid "XR action name" -msgstr "Nom d'acció XR" +msgstr "Nom d'acció RX" msgid "Action Set" @@ -104096,6 +105252,14 @@ msgid "Causes select-all ('A' key) to de-select in the case a selection exists" msgstr "Fa que seleccionar tot (tecla «A») desseleccioni en cas que hi hagi una selecció" +msgid "Navigate during Transform" +msgstr "Navegar durant transformació" + + +msgid "Enable view navigation while using transform operators. Proportional Influence, Automatic Constraints and Auto IK Chain Length shortcuts will require holding Alt key" +msgstr "Habilita la navegació de visionat mentre s'usen operadors de transformació. Per a la influència proporcional, les estriccions automàtiques i les dreceres de llargada de cadene an Auto-CI caldrà mantenir la tecla Alt" + + msgid "Tweak Select: Mouse Select & Move" msgstr "Manipular selecció: seleccionar i moure amb ratolí" @@ -105505,142 +106669,142 @@ msgstr "Editor clips al guió tècnic" msgctxt "WindowManager" msgid "Grease Pencil Stroke Curve Edit Mode" -msgstr "Mode edició de traç de corba amb llapis de greix" +msgstr "Llapis de greix - Mode edició de traç de corba" msgctxt "WindowManager" msgid "Grease Pencil Stroke Edit Mode" -msgstr "Mode edició de traç de llapis de greix" +msgstr "Llapis de greix - Mode edició de traç" msgctxt "WindowManager" msgid "Grease Pencil Stroke Paint (Draw brush)" -msgstr "Pintura de traç de llapis de greix (pinzell de dibuix)" +msgstr "Llapis de greix - Pintura de traç (pinzell de dibuix)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Paint (Fill)" -msgstr "Pintura de traç de llapis de greix (emplenar)" +msgstr "Llapis de greix - Pintura de traç (emplenar)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Paint (Erase)" -msgstr "Pintura de traç de llapis de greix (esborrar)" +msgstr "Llapis de greix Pintura de traç (esborrar)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Paint (Tint)" -msgstr "Pintura de traç de llapis de greix (tintar)" +msgstr "Llapis de greix - Pintura de traç (tintar)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Paint Mode" -msgstr "Mode pintura de traç de llapis de greix" +msgstr "Llapis de greix - Mode pintura de traç" msgctxt "WindowManager" msgid "Grease Pencil Stroke Sculpt Mode" -msgstr "Mode escultura de traç de llapis de greix" +msgstr "Llapis de greix - Mode escultura de traç" msgctxt "WindowManager" msgid "Grease Pencil Stroke Sculpt (Smooth)" -msgstr "Escultura de traç de llapis de greix (suavitzar)" +msgstr "Llapis de greix - Escultura de traç (suavitzar)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Sculpt (Thickness)" -msgstr "Escultura de traç de llapis de greix (gruix)" +msgstr "Llapis de greix - Escultura de traç (gruix)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Sculpt (Strength)" -msgstr "Escultura de traç de llapis de greix (intensitat)" +msgstr "Llapis de greix - Escultura de traç (intensitat)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Sculpt (Grab)" -msgstr "Escultura de traç de llapis de greix (agafar)" +msgstr "Llapis de greix - Escultura de traç (captura)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Sculpt (Push)" -msgstr "Escultura de traç de llapis de greix (pitjar)" +msgstr "Llapis de greix - Escultura de traç (pitjar)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Sculpt (Twist)" -msgstr "Escultura de traç de llapis de greix (roscar)" +msgstr "Llapis de greix - Escultura de traç (roscar)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Sculpt (Pinch)" -msgstr "Escultura de traç de llapis de greix (pinçar)" +msgstr "Llapis de greix - Escultura de traç (pinçar)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Sculpt (Randomize)" -msgstr "Escultura de traç de llapis de greix (aleatoritzar)" +msgstr "Llapis de greix - Escultura de traç (aleatoritzar)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Sculpt (Clone)" -msgstr "Escultura de traç de llapis de greix (clonar)" +msgstr "Llapis de greix - Escultura de traç (clonar)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Weight Mode" -msgstr "Mode pesos de traç de llapis de greix" +msgstr "Llapis de greix - Mode pesos de traç" msgctxt "WindowManager" msgid "Grease Pencil Stroke Weight (Draw)" -msgstr "Pesos de traç de llapis de greix (dibuixar)" +msgstr "Llapis de greix - Pesos de traç (dibuixar)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Weight (Blur)" -msgstr "Pesos de traç de llapis de greix (difuminar)" +msgstr "Llapis de greix - Pesos de traç (difuminar)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Weight (Average)" -msgstr "Pesos de traç de llapis de greix (mitjana)" +msgstr "Llapis de greix - Pesos de traç (mitjana)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Weight (Smear)" -msgstr "Pesos de traç de llapis de greix (escampar)" +msgstr "Llapis de greix - Pesos de traç (escampar)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Vertex Mode" -msgstr "Mode vèrtex de traç de llapis de greix" +msgstr "Llapis de greix - Mode vèrtex de traç" msgctxt "WindowManager" msgid "Grease Pencil Stroke Vertex (Draw)" -msgstr "Mode vèrtex de traç de llapis de greix (dibuixar)" +msgstr "Llapis de greix - Mode vèrtex de traç (dibuixar)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Vertex (Blur)" -msgstr "Vèrtex de traç de llapis de greix (difuminar)" +msgstr "Llapis de greix - Vèrtex de traç (difuminar)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Vertex (Average)" -msgstr "Vèrtex de traç de llapis de greix (mitjana)" +msgstr "Llapis de greix - Vèrtex de traç (mitjana)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Vertex (Smear)" -msgstr "Vèrtex de traç de llapis de greix (escampar)" +msgstr "Llapis de greix - Vèrtex de traç (escampar)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Vertex (Replace)" -msgstr "Vèrtex de traç de llapis de greix (reemplaçar)" +msgstr "Llapis de greix - Vèrtex de traç (reemplaçar)" msgctxt "WindowManager" @@ -105798,6 +106962,16 @@ msgid "Clear Constraints" msgstr "Descartar restriccions" +msgctxt "WindowManager" +msgid "Set Snap Base" +msgstr "Definir base d'acoblament" + + +msgctxt "WindowManager" +msgid "Set Snap Base (Off)" +msgstr "Definir base d'acoblament (desactivat)" + + msgctxt "WindowManager" msgid "Snap Invert" msgstr "Invertir acoblament" @@ -106139,10 +107313,6 @@ msgid "or AMD with macOS %s or newer" msgstr "o AMD amb macOS %s o més recent" -msgid " - intel-level-zero-gpu version %s or newer" -msgstr " - versió intel-level-zero-gpu %s o més recent" - - msgid "Noise Threshold" msgstr "Llindar de soroll" @@ -106888,10 +108058,18 @@ msgid "No vars to display" msgstr "No hi ha variables per mostrar" +msgid "Demo text \"%s\" created with %s file(s){:,d}" +msgstr "Demo text \"%s\" creat amb %s document(s){:,d}" + + msgid "Search *.blend recursively" msgstr "Cercar *.blend recursivament" +msgid "Writes: %s config text" +msgstr "Consigna: %s config text" + + msgid "Generate Settings:" msgstr "Configuració de generar:" @@ -106904,6 +108082,10 @@ msgid "Render Settings:" msgstr "Configuració de revelar:" +msgid "Can't load %s config, run: File -> Demo Mode (Setup)" +msgstr "No es carrega %s config, run: Document -> Mode demo (instal·lació)" + + msgid "Demo Mode:" msgstr "Mode demo:" @@ -107524,6 +108706,18 @@ msgid "Current frame not within strip framerange" msgstr "El fotograma actual no està dins del rang dels segments" +msgid "Text Editor Args Format must contain $filepath" +msgstr "Els args d'editor de text han de contenir $filepath" + + +msgid "Exception parsing template: %r" +msgstr "Excepció analitzant plantilla: %r" + + +msgid "Exception running external editor: %r" +msgstr "Excepció executant editor extern: %r" + + msgid "Reload Start-Up file to restore settings" msgstr "Recarregar document d'inici per restaurar la configuració" @@ -107844,7 +109038,7 @@ msgstr "Volum(s)" msgid "Grease Pencil(s)" -msgstr "Llapis de cera" +msgstr "Llapis de greix" msgid "Armature(s)" @@ -108445,6 +109639,11 @@ msgid "Remove All Groups" msgstr "Eliminar tots els grups" +msgctxt "Operator" +msgid "Add Group" +msgstr "Afegir grup" + + msgid "Interpolation U" msgstr "Interpolació U" @@ -109066,7 +110265,7 @@ msgstr "Passos de qualitat" msgid "Pin Goal Strength" -msgstr "Força de les fixacions" +msgstr "Força de fixacions a destí" msgid "Air Drag" @@ -109804,6 +111003,16 @@ msgid "Bake Cubemap Only" msgstr "Precuinar sols cubografia" +msgctxt "Operator" +msgid "Bake Light Caches" +msgstr "Precuinar memòria cau de llum" + + +msgctxt "Operator" +msgid "Delete Light Caches" +msgstr "Suprimir memòria cau de llum" + + msgid "Shadow Resolution" msgstr "Resolució ombres" @@ -109901,6 +111110,11 @@ msgid "Tiles" msgstr "Quadrets" +msgctxt "Amount" +msgid "Even" +msgstr "Uniforme" + + msgid "Odd" msgstr "Senars" @@ -110015,7 +111229,7 @@ msgstr "Confegir sense distorsió:" msgctxt "Operator" msgid "Build Proxy / Timecode" -msgstr "Confegir simulació / Cronofita" +msgstr "Confegir simulació / cronografia" msgctxt "Operator" @@ -110150,7 +111364,7 @@ msgstr "Rastres per a ubicació" msgid "Timecode Index" -msgstr "Índex del cronofites" +msgstr "Índex cronogràfic" msgctxt "Operator" @@ -110797,6 +112011,11 @@ msgid "Unpin" msgstr "Desfixar" +msgctxt "Operator" +msgid "Invert Pins" +msgstr "Invertir fixacions" + + msgctxt "Operator" msgid "Clear Seam" msgstr "Eliminar costura" @@ -111025,7 +112244,7 @@ msgstr "Moure pla de fons" msgctxt "Operator" msgid "Fit Backdrop to Available Space" -msgstr "Encabir pla de fons a espai disponible" +msgstr "Ajustar pla de fons a espai disponible" msgctxt "Operator" @@ -112151,6 +113370,11 @@ msgid "Back to Previous" msgstr "Tornar a anterior" +msgctxt "Operator" +msgid "Save Incremental" +msgstr "Desat incremental" + + msgctxt "Operator" msgid "Save Copy..." msgstr "Desar còpia..." @@ -112191,6 +113415,11 @@ msgid "Wavefront (.obj)" msgstr "Wavefront (.obj)" +msgctxt "Operator" +msgid "Stanford PLY (.ply)" +msgstr "Stanford PLY (.ply)" + + msgctxt "Operator" msgid "STL (.stl) (experimental)" msgstr "STL (.stl) (experimental)" @@ -112490,6 +113719,14 @@ msgid "Render Cache" msgstr "Memòria cau de revelats" +msgid "Program" +msgstr "Programa" + + +msgid "Arguments" +msgstr "Arguments" + + msgid "I18n Branches" msgstr "Branques I18n" @@ -112564,6 +113801,24 @@ msgid "Requires a restart of Blender to take effect" msgstr "Requereix reiniciar el Blender perquè tingui efecte" +msgid "Open blend files with this Blender version" +msgstr "Obrir documents blend amb aquesta versió de Blender" + + +msgctxt "Operator" +msgid "Register" +msgstr "Registrar" + + +msgctxt "Operator" +msgid "Unregister" +msgstr "Desregistrar" + + +msgid "For All Users" +msgstr "Per a totes les usuàries" + + msgid "Player" msgstr "Jugador" @@ -112835,6 +114090,16 @@ msgid "Similar" msgstr "Similar" +msgctxt "Operator" +msgid "First" +msgstr "Primer" + + +msgctxt "Operator" +msgid "Last" +msgstr "Últim" + + msgctxt "Operator" msgid "Set Color Attribute" msgstr "Establir atribut de color" @@ -113673,6 +114938,11 @@ msgid "Outline" msgstr "Contorn" +msgctxt "GPencil" +msgid "Join" +msgstr "Unir" + + msgctxt "Operator" msgid "Set as Active Material" msgstr "Definir com a material actiu" @@ -113811,6 +115081,10 @@ msgid "Snap To" msgstr "Acoblar a" +msgid "Snap Individual Elements To" +msgstr "Acoblar elements individuals a" + + msgid "Fade Inactive Layers" msgstr "Esvair capes inactives" @@ -113888,6 +115162,21 @@ msgid "Color Attribute" msgstr "Atribut de color" +msgctxt "Operator" +msgid "Empty" +msgstr "Buit" + + +msgctxt "Operator" +msgid "Stroke" +msgstr "Traç" + + +msgctxt "Operator" +msgid "Suzanne" +msgstr "Susanna" + + msgctxt "Operator" msgid "Point Cloud" msgstr "Núvol de punts" @@ -114490,7 +115779,7 @@ msgstr "Eliminar aresta de traç manual" msgctxt "Operator" msgid "Clear Freestyle Face" -msgstr "Eliminar cara de traç manual" +msgstr "Eliminar cara amb traç manual" msgid "Specular Lighting" @@ -114835,6 +116124,11 @@ msgid "Add UVs" msgstr "Afegir UVs" +msgctxt "GPencil" +msgid "Boundary" +msgstr "Rebava" + + msgid "Ignore Transparent" msgstr "Ignorar transparent" @@ -115285,6 +116579,18 @@ msgid "Data corruption: data-block '%s' is using another local data-block ('%s') msgstr "Corrupció de dades: el bloc de dades '%s' està usant un altre bloc de dades local ('%s') com a referència de sobreseïment de biblioteca" +msgid "Light Linking for %s" +msgstr "Endoil·luminació de %s" + + +msgid "Shadow Linking for %s" +msgstr "Endoombradge de %s" + + +msgid "Cannot unlink unsupported '%s' from light linking collection '%s'" +msgstr "No es pot desenllaçar '%s' no compatible de la col·lecció d'endoil·luminació '%s'" + + msgid "MaskLayer" msgstr "CapaMàscara" @@ -115357,6 +116663,10 @@ msgid "LightProbe" msgstr "SondaLlum" +msgid "GreasePencil" +msgstr "Llapis de greix" + + msgid "No new files have been packed" msgstr "No s'han empaquetat documents nous" @@ -116166,6 +117476,10 @@ msgid "GpencilMode" msgstr "ModeLlapisdG" +msgid "Gpencil" +msgstr "Llapis-dG" + + msgid "UV/Image" msgstr "UV/Imatge" @@ -116178,6 +117492,10 @@ msgid "Select ID" msgstr "Seleccionar ID" +msgid "Select-Next" +msgstr "Seleccionar següent" + + msgid "Workbench" msgstr "Workbench" @@ -116191,7 +117509,7 @@ msgstr "Visibilitat de corba-F a l'editor de gràfiques" msgid "Grease Pencil layer is visible in the viewport" -msgstr "La capa llapis de greix és visible al mirador" +msgstr "La capa Llapis de greix és visible al mirador" msgid "Toggle visibility of Channels in Graph Editor for editing" @@ -117150,11 +118468,11 @@ msgstr "No hi ha cap objecte esquelet a la capa de visualització" msgid "No Grease Pencil data to work on" -msgstr "No hi ha dades del llapis de greix per treballar" +msgstr "No hi ha dades del Llapis de greix per treballar" msgid "Current Grease Pencil strokes have no valid timing data, most timing options will be hidden!" -msgstr "Els traços actuals del llapis de greix no tenen dades de temps vàlides, la majoria de les opcions de temps s'ocultaran!" +msgstr "Els traços actuals del Llapis de greix no tenen dades de temps vàlides, la majoria de les opcions de temps s'ocultaran!" msgid "Object created" @@ -117198,7 +118516,7 @@ msgstr "No hi ha color actiu per aïllar" msgid "No Grease Pencil data" -msgstr "Sense dades del llapis de greix" +msgstr "Sense dades del Llapis de greix" msgid "Unable to add a new Lattice modifier to object" @@ -117385,11 +118703,11 @@ msgstr "Dades d'objecte referent de la biblioteca, s'ignorarà!" msgid "Grease Pencil Erase Session: Hold and drag LMB or RMB to erase | ESC/Enter to end (or click outside this area)" -msgstr "Llapis de Greix - Sessió d'esborrat: mantenir i arrossegar amb el BER o el BDR per a esborrar | ESC/Retorn per a finalitzar (o clicar fora de l'àrea)" +msgstr "Llapis de greix - Sessió d'esborrat: mantenir i arrossegar amb el BER o el BDR per a esborrar | ESC/Retorn per a finalitzar (o clicar fora de l'àrea)" msgid "Grease Pencil Line Session: Hold and drag LMB to draw | ESC/Enter to end (or click outside this area)" -msgstr "Llapis de Greix - Sessió de línia: mantenir i arrossegar amb el BER per a dibuixar | ESC/Retorn per a finalitzar (o clicar fora de l'àrea)" +msgstr "Llapis de greix - Sessió de línia: mantenir i arrossegar amb el BER per a dibuixar | ESC/Retorn per a finalitzar (o clicar fora de l'àrea)" msgid "Grease Pencil Guides: LMB click and release to place reference point | Esc/RMB to cancel" @@ -117397,15 +118715,15 @@ msgstr "Llapis de greix - guies: clicar amb el BER i amollar per posar el punt d msgid "Grease Pencil Freehand Session: Hold and drag LMB to draw | M key to flip guide | O key to move reference point" -msgstr "Grease Pencil - Sessió a mà alçada: mantenir i arrossegar amb el BER per a dibuixar | tecla M per a invertir la guia | Tecla O per a moure el punt de referència" +msgstr "Llapis de greix - Sessió a mà alçada: mantenir i arrossegar amb el BER per a dibuixar | tecla M per a invertir la guia | Tecla O per a moure el punt de referència" msgid "Grease Pencil Freehand Session: Hold and drag LMB to draw" -msgstr "Grease Pencil - Sessió a mà alçada: mantenir i arrossegar amb el BER per a dibuixar" +msgstr "Llapis de greix - Sessió a mà alçada: mantenir i arrossegar amb el BER per a dibuixar" msgid "Grease Pencil Session: ESC/Enter to end (or click outside this area)" -msgstr "Llapis de Greix - Sessió: ESC/Retorn per a finalitzar (o clicar fora de l'àrea)" +msgstr "Llapis de greix - Sessió: ESC/Retorn per a finalitzar (o clicar fora de l'àrea)" msgid "Active layer is locked or hidden" @@ -117417,11 +118735,35 @@ msgstr "O no hi ha res a esborrar o totes les capes estan bloquejades" msgid "Grease Pencil operator is already active" -msgstr "L'operador del llapis de greix ja està actiu" +msgstr "L'operador del Llapis de greix ja està actiu" msgid "Grease Pencil has no active paint tool" -msgstr "El llapis de greix no té cap eina de pintura activa" +msgstr "El Llapis de greix no té cap eina de pintura activa" + + +msgid "Line: ESC to cancel, LMB set origin, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to align, Alt to center, E: extrude, G: grab" +msgstr "Línia: ESC per a cancel·lar, BER establir origen, Retorn/BMR confirmar, RÒDOL/+- ajustar número de subdivisió, Maj alinear, Alt centrar, E: extrudir, G: capturar" + + +msgid "Polyline: ESC to cancel, LMB to set, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to align, G: grab" +msgstr "Polilínia: ESC per a cancel·lar, BER per a establir, Intro/BMR per a confirmar, RÒDOL/+- per a ajustar el número de subdivisió, Maj per a alinear, G: capturar" + + +msgid "Rectangle: ESC to cancel, LMB set origin, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to square, Alt to center, G: grab" +msgstr "Rectangle: ESC per a cancel·lar, BER estableix origen, Retorn/BMR per a confirmar, RODÒL/+- per a ajustar el número de subdivisió, Maj al quadrat, Alt per centrar, G: capturar" + + +msgid "Circle: ESC to cancel, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to square, Alt to center, G: grab" +msgstr "Cercle: ESC per a cancel·lar, Intro/BMR per a confirmar, RÒDOL/+- per a ajustar el número de subdivisió, Maj per quadrar, Alt per centrar, G: capturar" + + +msgid "Arc: ESC to cancel, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to square, Alt to center, M: Flip, E: extrude, G: grab" +msgstr "Arc: ESC per cancel·lar, Intro/BMR per confirmar, RÒDOL/+- per ajustar el número de subdivisió, Maj per quadrar, Alt per centrar, M: invertir, E: extrudir, G: capturar" + + +msgid "Curve: ESC to cancel, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to square, Alt to center, E: extrude, G: grab" +msgstr "Corba: ESC per cancel·lar, Intro/BMR per confirmar, RÒDOL/+- per a ajustar el número de subdivisió, Maj per quadrar, Alt per centrar, E: extrudir, G: capturar" msgid "Primitives can only be added in Draw or Edit modes" @@ -117496,6 +118838,14 @@ msgid "GPencil Weight Smear: LMB to smear | RMB/Escape to Exit" msgstr "Escampar pesos de llapis-dG: BER per escampar | BDR/Escape per sortir" +msgid "Skin_light" +msgstr "Skin_Light" + + +msgid "Skin_shadow" +msgstr "Skin_Shadow" + + msgid "Failed to set value" msgstr "No s'ha pogut establir el valor" @@ -117903,6 +119253,10 @@ msgid "Drag" msgstr "Arrossegar" +msgid "Add to light linking collection" +msgstr "Afegir a col·lecció d'endoil·luminació" + + msgid "Double click to rename" msgstr "Doble clic per canviar el nom" @@ -118219,6 +119573,10 @@ msgid "Browse Particle Settings to be linked" msgstr "Explorar els paràmetres de partícules per enllaçar" +msgid "Browse Grease Pencil (legacy) Data to be linked" +msgstr "Explorar les dades de Llapis de greix (antic) a enllaçar" + + msgid "Browse Movie Clip to be linked" msgstr "Explorar el clip de pel·lícula per enllaçar" @@ -118264,7 +119622,7 @@ msgstr "Explorar la simulació per enllaçar" msgid "Browse Grease Pencil Data to be linked" -msgstr "Explorar les dades de llapis de greix per enllaçar" +msgstr "Explorar les dades de Llapis de greix per enllaçar" msgid "Browse ID data to be linked" @@ -119035,7 +120393,7 @@ msgstr "Camp" msgctxt "GPencil" msgid "GPencil" -msgstr "LlapisG" +msgstr "Llapis-dG" msgctxt "GPencil" @@ -119066,7 +120424,7 @@ msgstr "S'estan convertint algunes dades d'objecte/objecte no editable, forçant msgid "Convert Surfaces to Grease Pencil is not supported" -msgstr "No suportat la conversió de superfícies a llapis de greix" +msgstr "No suportat la conversió de superfícies a Llapis de greix" msgid "Object not found" @@ -119922,7 +121280,7 @@ msgstr "No es pot aplicar a un esquelet multiusador" msgid "Grease Pencil Object does not support this set origin option" -msgstr "L'objecte llapis de greix no admet aquesta opció d'establir origen" +msgstr "L'objecte Llapis de greix no admet aquesta opció d'establir origen" msgid "Curves Object does not support this set origin operation" @@ -120381,6 +121739,30 @@ msgid "Rigid Body World has no associated physics data to export" msgstr "El Món de cos rígid no té dades de física associades per exportar" +msgid "3D Local View " +msgstr "Visió local 3D " + + +msgid "3D View " +msgstr "Visió 3D " + + +msgid "Frame:" +msgstr "Fotograma:" + + +msgid "Time:" +msgstr "Temps:" + + +msgid "Mem:%.2fM (Peak %.2fM)" +msgstr "Mem:%.2fM (Pic %.2fM)" + + +msgid "Mem:%.2fM, Peak: %.2fM" +msgstr "Mem:%.2fM, Pic: %.2fM" + + msgid "Cannot write a single file with an animation format selected" msgstr "No es pot escriure un document únic amb un format d'animació seleccionat" @@ -121194,6 +122576,10 @@ msgid "Track the selected markers forward by one frame" msgstr "Segueix el rastre els marcadors seleccionats endavant per un fotograma" +msgid "New lines unsupported, call this operator multiple times" +msgstr "Noves línies no compatibles, incoquen l'operador molts cops" + + msgid "Unassigned" msgstr "Sense assignar" @@ -121695,6 +123081,10 @@ msgid "Can't Load Image" msgstr "No es pot carregar la imatge" +msgid "%d × %d, " +msgstr "%d × %d, " + + msgid "%d float channel(s)" msgstr "%d canal(s) de flotant" @@ -121988,7 +123378,7 @@ msgstr "Massa pocs aplecs de segments seleccionades a la pista d'ANL (%s): cal q msgid "Cannot swap '%s' and '%s' as one or both will not be able to fit in their new places" -msgstr "No es pot intercanviar '%s' i '%s' perquè un o tots dos no podran encaixar en els seus nous llocs" +msgstr "No es pot intercanviar '%s' i '%s' perquè un o tots dos no podran encabir-se en els seus nous llocs" msgid "Modifier could not be added to (%s : %s) (see console for details)" @@ -122151,6 +123541,10 @@ msgid "Color field based on:" msgstr "Camp de color basat en:" +msgid "• {}" +msgstr "• {}" + + msgid "Empty Geometry" msgstr "Geometria buida" @@ -122215,6 +123609,10 @@ msgid "Accessed named attributes:" msgstr "Atributs amb nom accedits:" +msgid " • \"{}\": " +msgstr " • \"{}\": " + + msgid "read" msgstr "llegir" @@ -122712,6 +124110,14 @@ msgid "Could not create library override from one or more of the selected data-b msgstr "No s'ha pogut crear el sobreseïment de biblioteca des d'un o més dels blocs de dades seleccionats" +msgid "Cannot clear embedded library override '%s', only overrides of real data-blocks can be directly cleared" +msgstr "No es pot descartar el sobreseïment de biblioteca incrustat '%s', només es poden suprimir directament els sobreseïments dels blocs de dades reals" + + +msgid "Cannot clear linked library override '%s', only local overrides can be directly cleared" +msgstr "No es pot descartar el sobreseïment de biblioteca enllaçat '%s', només es poden suprimir directament els sobreseïments locals" + + msgid "Current File" msgstr "Document actual" @@ -122744,6 +124150,18 @@ msgid "Added through override" msgstr "S'ha afegit mitjançant sobreseïment" +msgid "Protected from override" +msgstr "Protegit del sobreseïment" + + +msgid "Additive override" +msgstr "Sobreseïment additiu" + + +msgid "Multiplicative override" +msgstr "Sobreseïment multiplicatiu" + + msgid "(empty)" msgstr "(buit)" @@ -122932,6 +124350,18 @@ msgid "Select movie or image strips" msgstr "Seleccionar segments de pel·lícula o imatge" +msgid "No handle available" +msgstr "Sense nanses disponibles" + + +msgid "Can not create handle inside of speed transition" +msgstr "No es pot crear una nansa dins una transició de rapidesa" + + +msgid "This strip type can not be retimed" +msgstr "Aquest segment no es pot retemportizar" + + msgid "No active sequence!" msgstr "No hi ha cap seqüència activa!" @@ -122968,6 +124398,10 @@ msgid "Data Set" msgstr "Joc de dades" +msgid "Unsupported column type" +msgstr "Tipus de columna no suportat" + + msgid "File Modified Outside and Inside Blender" msgstr "Document modificat fora i dins del Blender" @@ -123064,6 +124498,10 @@ msgid "Undo History" msgstr "Historial de desfer" +msgid "Registration not possible from Microsoft Store installations" +msgstr "No es pot fer registre des d'instal·lacions de Microsoft Store" + + msgid "File association registered" msgstr "Associació de documents registrada" @@ -123072,10 +124510,26 @@ msgid "Unable to register file association" msgstr "No s'ha pogut registrar l'associació de documents" +msgid "Unregistration not possible from Microsoft Store installations" +msgstr "No es pot desregistrar des d'instal·lacions de Microsoft Store" + + +msgid "File association unregistered" +msgstr "Associació de documents desregistrada" + + +msgid "Unable to unregister file association" +msgstr "No s'ha pogut desregistrar l'associació de documents" + + msgid "There is no asset library to remove" msgstr "No hi ha cap biblioteca de recursos per eliminar" +msgid "Not available for Microsoft Store installations" +msgstr "No disponible per a instal·lacions de Microsoft Store" + + msgid "Windows-only operator" msgstr "Operador només de Windows" @@ -123233,7 +124687,7 @@ msgstr "Pes d'aresta utilitzat pel Modificador bisellat" msgid "Weight used for Soft Body Goal" -msgstr "Pes utilitzat per a l'objectiu del cos tou" +msgstr "Pes utilitzat per a destí del cos tou" msgid "Radius of curve control points" @@ -123712,6 +125166,10 @@ msgid " or Alt) Even Thickness %s" msgstr " o Alt) Gruix regular %s" +msgid "'Shrink/Fatten' meshes is only supported in edit mode" +msgstr "\"Encongir/inflar\" malles només suportat en mode edició" + + msgid "Tilt: %s° %s" msgstr "Inclinació: %s: %s" @@ -123901,6 +125359,10 @@ msgid "Overwrite %s" msgstr "Sobreescriure %s" +msgid "Failed to set preview: no ID in context (incorrect context?)" +msgstr "Previsualització fallida: sense ID al context (context incorrecte?)" + + msgid "Incorrect context for running data-block fake user toggling" msgstr "El context és incorrecte per a executar el revessat de l'usador fals del bloc de dades" @@ -124204,7 +125666,7 @@ msgstr "El contorn requereix una càmera activa" msgid "Stroke Fit Method" -msgstr "Mètode d'encaix de traç" +msgstr "Mètode ajust de traç" msgid "TextureMapping" @@ -124227,62 +125689,6 @@ msgid "No active object or active object isn't a GPencil object" msgstr "No hi ha objecte actiu o l'objecte actiu no és un objecte Llapis-dG" -msgid "Object type mismatch, Alembic object path pointed to Camera when importing, but not any more." -msgstr "No casen els tipus d'objecte, el camí de l'objecte Alembic apuntava a la càmera en la importació, però ja no." - - -msgid "Object type mismatch, Alembic object path points to Camera." -msgstr "No casen els tipus d'objecte, el camí de l'objecte Alembic apunta a la càmera." - - -msgid "Object type mismatch, Alembic object path pointed to Curves when importing, but not any more." -msgstr "No casen els tipus d'objecte, el camí de l'objecte Alembic apuntava a Corbes en la importació, però ja no." - - -msgid "Object type mismatch, Alembic object path points to Curves." -msgstr "No casen els tipus d'objecte, el camí de l'objecte Alembic apunta a Corbes" - - -msgid "Object type mismatch, Alembic object path pointed to PolyMesh when importing, but not any more." -msgstr "No casen els tipus d'objecte, el camí de l'objecte Alembic apuntava a la Polimalla en la importació, però ja no." - - -msgid "Object type mismatch, Alembic object path points to PolyMesh." -msgstr "No casen els tipus d'objecte, el camí de l'objecte Alembic apunta a Polimalla." - - -msgid "Object type mismatch, Alembic object path pointed to SubD when importing, but not any more." -msgstr "No casen els tipus d'objecte, el camí de l'objecte Alembic apuntava a la DubD en la importació, però ja no." - - -msgid "Object type mismatch, Alembic object path points to SubD." -msgstr "No casen els tipus d'objecte, el camí de l'objecte Alembic apunta a SubD." - - -msgid "Object type mismatch, Alembic object path pointed to NURBS when importing, but not any more." -msgstr "No casen els tipus d'objecte, el camí de l'objecte Alembic apuntava a NURBS en la importació, però ja no." - - -msgid "Object type mismatch, Alembic object path points to NURBS." -msgstr "No casen els tipus d'objecte, el camí de l'objecte Alembic apunta a NURBS." - - -msgid "Object type mismatch, Alembic object path pointed to Points when importing, but not any more." -msgstr "No casen els tipus d'objecte, el camí de l'objecte Alembic apuntava a Punts en la importació, però ja no." - - -msgid "Object type mismatch, Alembic object path points to Points." -msgstr "No casen els tipus d'objecte, el camí de l'objecte Alembic apunta a Punts." - - -msgid "Object type mismatch, Alembic object path pointed to XForm when importing, but not any more." -msgstr "No casen els tipus d'objecte, el camí de l'objecte Alembic apuntava a la XForm en la importació, però ja no." - - -msgid "Object type mismatch, Alembic object path points to XForm." -msgstr "No casen els tipus d'objecte, el camí de l'objecte Alembic apunta a XForm." - - msgid "Could not open Alembic archive for reading, see console for detail" msgstr "No s'ha pogut obrir l'arxiu Alembic per a lectura! Consulta consola per més detalls" @@ -124455,6 +125861,14 @@ msgid "USD Export: couldn't construct relative file path for .vdb file, absolute msgstr "Exportació USD: no s'ha pogut construir el camí relatiu per al document .vdb, s'utilitzarà el camí absolut" +msgid "Asset data can only be assigned to assets. Use asset_mark() to mark as an asset" +msgstr "Dades del recurs només es poden assignar a recursos. Usar asset_mark() per marcar-lo com un recurs" + + +msgid "Asset data cannot be None" +msgstr "Les dades del recurs no poden ser No-cap" + + msgid "Override template experimental feature is disabled" msgstr "El sobreseÏment experimental de plantilla està desactivat" @@ -124495,6 +125909,10 @@ msgid "Registering id property class: '%s' is too long, maximum length is %d" msgstr "S'està registrant la classe de propietat id: '%s' és massa llarg, la longitud màxima és %d" +msgid "'%s' is of a type that cannot be an asset" +msgstr "'%s' és d'un tipus que no pot ser un recurs" + + msgid "ID '%s' isn't an override" msgstr "L'ID '%s' no és cap sobreseïment" @@ -125247,6 +126665,14 @@ msgid "Unable to move sockets in built-in node" msgstr "No s'han pogut moure els borns en el node predefinit" +msgid "Panel is not in the node tree interface" +msgstr "El plafó no és a la interfície de l'arbre de nodes" + + +msgid "Unable to create panel" +msgstr "No s'ha pogut crear plafó" + + msgid "%s '%s', bl_idname '%s' could not be unregistered" msgstr "%s '%s', bl_idname '%s' no s'ha pogut desregistrar" @@ -126913,6 +128339,11 @@ msgid "End Radius" msgstr "Radi final" +msgctxt "NodeTree" +msgid "Rotations" +msgstr "Rotacions" + + msgid "Number of points in one rotation of the spiral" msgstr "Nombre de punts en una rotació de l'espiral" @@ -127105,6 +128536,14 @@ msgid "Surface has no mesh" msgstr "La superfície no té malla" +msgid "Evaluated surface missing UV map: \"{}\"" +msgstr "Mapa UV que falta a la superfície avaluada: \"%s\"" + + +msgid "Original surface missing UV map: \"{}\"" +msgstr "Mapa UV que falta a la superfície original: \"%s\"" + + msgid "Evaluated surface missing attribute: \"rest_position\"" msgstr "Atribut perdut de la superfície avaluada: «rest_position»" @@ -127113,6 +128552,10 @@ msgid "Curves are not attached to any UV map" msgstr "Les corbes no estan adherides a cap mapa UV" +msgid "Invalid surface UVs on {} curves" +msgstr "Superfície d'UVs invàlida sobre corbes {}" + + msgid "The parts of the geometry to be deleted" msgstr "Les parts de la geometria a suprimir" @@ -127706,6 +129149,14 @@ msgid "Half the width of the narrow band in voxel units" msgstr "La meitat de l'amplada de la banda estreta en unitats vòxels" +msgid "The edge to retrieve data from. Defaults to the edge from the context" +msgstr "Aresta d'on recuperar les dades. Per defecte va a l'aresta des del context" + + +msgid "Values that sort the corners attached to the edge" +msgstr "Valors que ordenen les canells associats a l'aresta" + + msgid "Which of the sorted corners to output" msgstr "Quin dels cantells ordenats egressar" @@ -127714,6 +129165,22 @@ msgid "Corner Index" msgstr "Índex de cantell" +msgid "A corner of the input edge in its face's winding order, chosen by the sort index" +msgstr "Un cantell de l'aresta ingressada en ordre giratori de cares, escollit per l'índex d'ordenació" + + +msgid "The number of faces or corners connected to each edge" +msgstr "El nombre de cares o cantells connectats a cada aresta" + + +msgid "Corner of Edge" +msgstr "Cantell d'aresta" + + +msgid "Edge Corner Count" +msgstr "Recompte de cantells d'aresta" + + msgid "The face to retrieve data from. Defaults to the face from the context" msgstr "La cara de la qual s'han de recuperar les dades. Predeterminat a la cara des del context" @@ -127918,6 +129385,14 @@ msgid "Hit Distance" msgstr "Distància de diana" +msgid "Attribute does not exist: \"{}\"" +msgstr "L'atribut no existeix: \"{}\"" + + +msgid "Cannot delete built-in attribute: \"{}\"" +msgstr "No es pot eliminar l'atribut predefinit: \"{}\"" + + msgid "Which element to retrieve a value from on the geometry" msgstr "De quin element s'ha d'obtenir un valor en la geometria" @@ -128030,6 +129505,10 @@ msgid "Add a new simulation input and output nodes to the node tree" msgstr "Afegir a l'arbre de nodes nous nodes d'entrada i sortida de simulació" +msgid "Failed to write to attribute \"{}\" with domain \"{}\" and type \"{}\"" +msgstr "No s'ha pogut escriure a l'atribut \"{}\" amb domini \"{}\" i tipus \"{}\"" + + msgid "Delimiter" msgstr "Delimitador" @@ -128071,7 +129550,7 @@ msgstr "Cares a considerar en empaquetar illes" msgid "Rotate islands for best fit" -msgstr "Rotar illes per a millor encaix" +msgstr "Rotar illes per a millor ajust" msgid "Pack UV Islands Field" @@ -128466,6 +129945,18 @@ msgid "Sun disc not available in Eevee" msgstr "El disc del sol no està disponible a Eevee" +msgid "The number of Voronoi layers to sum" +msgstr "Nombre de capes Voronoi a sumar" + + +msgid "The influence of a Voronoi layer relative to that of the previous layer" +msgstr "Influència d'una capa Voronoi relativa a la de la capa prèvia" + + +msgid "The scale of a Voronoi layer relative to that of the previous layer" +msgstr "Escala d'una capa Voronoi relativa a la de la capa prèvia" + + msgid "Detail Scale" msgstr "Escala de detall" @@ -128658,18 +130149,6 @@ msgid "%s: failed to load '%s'" msgstr "%s: no s'ha pogut carregar '%s'" -msgid "reading render result: dimensions don't match, expected %dx%d" -msgstr "llegint resultat de revelat: les dimensions no quadren, s'esperava %dx%d" - - -msgid "reading render result: expected channel \"%s.%s\" or \"%s\" not found" -msgstr "llegint resultat de revelat: no es troba el canal esperat \"%s.%s\" o \"%s\"" - - -msgid "reading render result: expected channel \"%s.%s\" not found" -msgstr "llegint resultat de revelat: no es troba el canal esperat \"%s.%s\"" - - msgctxt "Sequence" msgid "Color Balance" msgstr "Equilibri de color" @@ -128860,6 +130339,10 @@ msgid "Unable to save an unsaved file with an empty or unset \"filepath\" proper msgstr "No s'ha pogut desar un document sense desar amb una propietat buida o amb «filepath» no establert" +msgid "Unable to find an available incremented file name" +msgstr "No s'ha pogut trobar un nom de document incrementat disponible" + + msgid "Engine '%s' not available for scene '%s' (an add-on may need to be installed or enabled)" msgstr "El motor '%s' no està disponible per a l'escena '%s' (pot ser que calgui instal·lar o habilitar un complement)" @@ -129089,6 +130572,10 @@ msgid "Property from path '%s' has length %d instead of %d" msgstr "La propietat del camí '%s' té longitud %d en lloc de %d" +msgid "%d × %s: %.4f ms, average: %.8f ms" +msgstr "%d × %s: %.4f ms, mitjana: %.8f ms" + + msgctxt "WindowManager" msgid "Limited Platform Support" msgstr "Suport limitat de la plataforma" @@ -129516,6 +131003,14 @@ msgid "whole milk" msgstr "llet sencera" +msgid "internal" +msgstr "internament" + + +msgid "visual studio code" +msgstr "codi de visual studio" + + msgid "Blurry Footage" msgstr "Imatge borrosa" @@ -130249,7 +131744,7 @@ msgstr "Fa rotar cada corba de pèl al voltant d'un eix" msgid "Sets the radius attribute of hair curves according to a profile shape" -msgstr "Estableix l'atribut delo radi de les corbes de pèl ajustant-se a una forma de perfil" +msgstr "Estableix l'atribut del radi de les corbes de pèl ajustant-se a una forma de perfil" msgid "Shrinkwrap Hair Curves" @@ -130281,5 +131776,5 @@ msgstr "Retallar corbes de pèl" msgid "Trims or scales hair curves to a certain length" -msgstr "Retalla o escala les corbes de cabell a una certa longitud" +msgstr "Retalla o escala les corbes de pèl a una certa longitud" diff --git a/locale/po/cs.po b/locale/po/cs.po index 33148b8b449..d0ed457aea8 100644 --- a/locale/po/cs.po +++ b/locale/po/cs.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: \n" "Last-Translator: Martin Tabačan \n" "Language-Team: Taby \n" @@ -7023,10 +7023,6 @@ msgid "Show scenes" msgstr "Ukázat scény" -msgid "Show materials, nodetrees, textures and Freestyle's linestyles" -msgstr "Zobrazit materiály, větvení uzlů, textury a Freestyle čáry" - - msgid "Directory" msgstr "Adresář" @@ -10149,58 +10145,14 @@ msgid "Area Light" msgstr "Plošné Světlo" -msgid "Constant Coefficient" -msgstr "Konstantní Koeficient" - - msgid "Contact Shadow Distance" msgstr "Vzdálenost Stykového Stínu" -msgid "Falloff Type" -msgstr "Typ poklesu" - - -msgid "Inverse Linear" -msgstr "Prohodit" - - -msgid "Inverse Square" -msgstr "Opustit Editační mód" - - -msgid "Lin/Quad Weighted" -msgstr "Lineární" - - -msgid "Linear Attenuation" -msgstr "Rotace" - - -msgid "Linear distance attenuation" -msgstr "Opustit Editační mód" - - -msgid "Quadratic Attenuation" -msgstr "Rotace" - - msgid "Shadow Buffer Bias" msgstr "Vložit barvu z bufferu" -msgid "Samples" -msgstr "Vzorky" - - -msgid "Number of shadow buffer samples" -msgstr "Číslo, určující počet 'Spin' kroků" - - -msgid "Shadow Buffer Size" -msgstr "Velikost stínu" - - msgid "Shadow Color" msgstr "Ukázat kurzor" @@ -14692,6 +14644,10 @@ msgid "Name of skin layer" msgstr "Nelze uložit soubor" +msgid "Samples" +msgstr "Vzorky" + + msgid "Intersect" msgstr "Protínají" @@ -29336,6 +29292,10 @@ msgid "Expand" msgstr "Rozšířit" +msgid "Falloff Type" +msgstr "Typ poklesu" + + msgctxt "Operator" msgid "Face Sets Visibility" msgstr "Viditelnost Sady Ploch" @@ -40118,10 +40078,6 @@ msgid "Walk Speed" msgstr "Rychlost chůze" -msgid "Use Ambient Occlusion" -msgstr "Použít Okolní Okluzi" - - msgid "World Mist" msgstr "Světová Mlha" diff --git a/locale/po/de.po b/locale/po/de.po index 30625155aaf..0b01ebbd1d0 100644 --- a/locale/po/de.po +++ b/locale/po/de.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: \n" "Last-Translator: Martin Reininger \n" "Language-Team: German translation team\n" @@ -15004,54 +15004,10 @@ msgid "Power" msgstr "Power" -msgid "Falloff Type" -msgstr "Abfall-Typ" - - -msgid "Inverse Linear" -msgstr "Invers" - - -msgid "Inverse Square" -msgstr "Invers" - - -msgid "Inverse Coefficients" -msgstr "Invertiere Koeffizienten" - - -msgid "Linear Attenuation" -msgstr "Animation rendern" - - -msgid "Linear Coefficient" -msgstr "Linearer Koeffizient" - - -msgid "Quadratic Attenuation" -msgstr "Quadratisch" - - -msgid "Quadratic distance attenuation" -msgstr "Quadratische Entfernungsdämpfung" - - -msgid "Quadratic distance attenuation coefficient" -msgstr "Quadratischer Abstandsdämpfungskoeffizient" - - msgid "Shadow Buffer Bias" msgstr "Schattenpuffer-Tendenz" -msgid "Samples" -msgstr "Abtastwerte" - - -msgid "Shadow Buffer Size" -msgstr "Schattenpuffer Größe" - - msgid "Shadow Color" msgstr "Schattenfarbe" @@ -18189,6 +18145,10 @@ msgid "When rendering animations, save JPG preview images in same directory" msgstr "Beim Rendern von Animationen JPG-Vorschaubilder im selben Verzeichnis speichern" +msgid "Multi-View" +msgstr "Mehrfachansicht" + + msgid "View Index" msgstr "Index anzeigen" @@ -21139,6 +21099,10 @@ msgid "Thickness Min" msgstr "Dicke minimal" +msgid "Samples" +msgstr "Abtastwerte" + + msgid "Number of samples to test per face" msgstr "Anzahl der zu überprüfenden Abtastwerte pro Fläche" @@ -38910,6 +38874,10 @@ msgid "Expand" msgstr "Erweitern" +msgid "Falloff Type" +msgstr "Abfall-Typ" + + msgid "Preserve Previous" msgstr "Bewahrung Vorherige" @@ -47454,10 +47422,6 @@ msgid "Single stereo camera system, adjust the stereo settings in the camera pan msgstr "Einzelnes Stereo-Kamera-System, passt die Stereo-Einstellungen im Kamerabedienfeld an" -msgid "Multi-View" -msgstr "Mehrfachansicht" - - msgid "Multi camera system, adjust the cameras individually" msgstr "Multi-Kamera-System, passt die Kameras individuell an" @@ -52683,14 +52647,6 @@ msgid "Length of rays, defines how far away other faces give occlusion effect" msgstr "Strahlenlänge, definiert wie weit weg andere Flächen den Verdeckungseffekt abgeben" -msgid "Use Ambient Occlusion" -msgstr "Ambient Occlusion verwenden" - - -msgid "Use Ambient Occlusion to add shadowing based on distance between objects" -msgstr "Ambient Occlusion verwenden, um eine Abschattung auf Basis der Entfernung zwischen Objekten hinzuzufügen" - - msgid "Use quadratic progression" msgstr "Quadratische Abfolge verwenden" diff --git a/locale/po/es.po b/locale/po/es.po index d212825c00f..30889345af2 100644 --- a/locale/po/es.po +++ b/locale/po/es.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: \n" "Last-Translator: Gabriel Gazzán \n" "Language-Team: Español \n" @@ -11,7 +11,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.2" +"X-Generator: Poedit 3.3.2" msgid "Shader AOV" @@ -1286,6 +1286,10 @@ msgid "Quaternion" msgstr "Cuaternio" +msgid "Floating point quaternion rotation" +msgstr "Rotación cuaternio decimal" + + msgid "Domain" msgstr "Dominio" @@ -1426,6 +1430,14 @@ msgid "Geometry attribute that stores integer values" msgstr "Atributo de una geometría que almacena valores enteros" +msgid "Quaternion Attribute" +msgstr "Atributo cuaternio" + + +msgid "Geometry attribute that stores rotation" +msgstr "Atributo de una geometría que almacena una rotación" + + msgid "String Attribute" msgstr "Atributo de texto" @@ -2018,6 +2030,10 @@ msgid "Grease Pencil" msgstr "Lápiz de cera" +msgid "Grease Pencil data-blocks" +msgstr "Bloques de datos de lápiz de cera" + + msgid "Hair Curves" msgstr "Curvas de pelo" @@ -2206,6 +2222,10 @@ msgid "Simulations" msgstr "Simulaciones" +msgid "Simulation data-blocks" +msgstr "Bloques de datos de simulaciones" + + msgid "Sounds" msgstr "Sonidos" @@ -2518,6 +2538,14 @@ msgid "Collection of screens" msgstr "Colección de pantallas" +msgid "Main Simulations" +msgstr "Simulaciones principales" + + +msgid "Collection of simulations" +msgstr "Colección de simulaciones" + + msgid "Main Sounds" msgstr "Sonidos principales" @@ -3384,10 +3412,18 @@ msgid "Bone Matrix" msgstr "Matriz del hueso" +msgid "3×3 bone matrix" +msgstr "Matriz de 3×3 del hueso" + + msgid "Bone Armature-Relative Matrix" msgstr "Matriz del hueso en relación al esqueleto" +msgid "4×4 bone matrix relative to armature" +msgstr "Matriz de 4×4 del hueso en relación al esqueleto" + + msgid "Parent" msgstr "Superior" @@ -4639,6 +4675,11 @@ msgid "Path of an object inside of an Alembic archive" msgstr "Ruta de un objeto dentro del archivo Alembic" +msgctxt "File browser" +msgid "Path" +msgstr "Ruta" + + msgid "Object path" msgstr "Ruta del objeto" @@ -5634,14 +5675,46 @@ msgid "The inputs are invalid, or the algorithm has been improperly called" msgstr "Los datos ingresados son inválidos o el algoritmo ha sido invocado de forma inapropiada" +msgid "Collection Child" +msgstr "Subordinada a colección" + + +msgid "Child collection with its collection related settings" +msgstr "Colección subordinada, con sus opciones relacionadas con la colección" + + +msgid "Light Linking" +msgstr "Vinculación de iluminación" + + +msgid "Light linking settings of the collection object" +msgstr "Opciones de vinculación de iluminación del objeto de la colección" + + msgid "Collection Children" -msgstr "Subordinados de colección" +msgstr "Subordinadas a colección" msgid "Collection of child collections" msgstr "Colección de colecciones subordinadas" +msgid "Collection Light Linking" +msgstr "Colección de vínculos de iluminación" + + +msgid "Light linking settings of objects and children collections of a collection" +msgstr "Opciones de vinculación de iluminación de objetos y colecciones subordinadas a una colección" + + +msgid "Link State" +msgstr "Estado de vinculación" + + +msgid "Light or shadow receiving state of the object or collection" +msgstr "Estado de recepción de iluminación o sombras del objeto o colección" + + msgid "Include" msgstr "Incluir" @@ -5650,12 +5723,24 @@ msgid "Exclude" msgstr "Excluir" +msgid "Collection Object" +msgstr "Objeto de colección" + + +msgid "Object of a collection with its collection related settings" +msgstr "Objeto de una colección, con sus opciones relacionadas con la colección" + + +msgid "Light linking settings of the collection" +msgstr "Opciones de vinculación de iluminación de la colección" + + msgid "Collection Objects" msgstr "Objetos de colección" msgid "Collection of collection objects" -msgstr "Colección de objetos de colección" +msgstr "Colección de objetos de la colección" msgid "Collision Settings" @@ -9811,6 +9896,11 @@ msgid "Font" msgstr "Tipografía" +msgctxt "ID" +msgid "Grease Pencil (legacy)" +msgstr "Lápiz de cera (antiguo)" + + msgctxt "ID" msgid "Grease Pencil" msgstr "Lápiz de cera" @@ -10288,6 +10378,31 @@ msgid "Multiplier for wave influence of this brush" msgstr "Multiplicador para la influencia de este pincel" +msgctxt "Simulation" +msgid "Wave Type" +msgstr "Tipo de onda" + + +msgctxt "Simulation" +msgid "Depth Change" +msgstr "Cambio de profundidad" + + +msgctxt "Simulation" +msgid "Obstacle" +msgstr "Obstáculo" + + +msgctxt "Simulation" +msgid "Force" +msgstr "Fuerza" + + +msgctxt "Simulation" +msgid "Reflect Only" +msgstr "Sólo reflejar" + + msgid "Canvas Settings" msgstr "Opciones de lienzo" @@ -10556,6 +10671,10 @@ msgid "Anti-Aliasing" msgstr "Suavizado de bordes" +msgid "Use 5× multisampling to smooth paint edges" +msgstr "Usa un muestreo múltiple 5 veces mayor para pintar los bordes suavemente" + + msgid "Enable to make surface changes disappear over time" msgstr "Habilitar para hacer que los cambios en la superficie desaparezcan con el tiempo" @@ -12090,10 +12209,50 @@ msgid "Adjust the offset to the beginning/end" msgstr "Permite introducir un desplazamiento del efecto hacia el inicio o final del pelo" +msgctxt "ParticleSettings" +msgid "Kink" +msgstr "Rizado" + + msgid "Type of periodic offset on the curve" msgstr "Tipo de desplazamiento periódico a lo largo de la curva" +msgctxt "ParticleSettings" +msgid "None" +msgstr "Ninguno" + + +msgctxt "ParticleSettings" +msgid "Braid" +msgstr "Trenza" + + +msgctxt "ParticleSettings" +msgid "Curl" +msgstr "Rulo" + + +msgctxt "ParticleSettings" +msgid "Radial" +msgstr "Radial" + + +msgctxt "ParticleSettings" +msgid "Roll" +msgstr "Girar" + + +msgctxt "ParticleSettings" +msgid "Rotation" +msgstr "Rotación" + + +msgctxt "ParticleSettings" +msgid "Wave" +msgstr "Onda" + + msgid "The distance from which particles are affected fully" msgstr "La distancia dentro de la cual las partículas serán completamente afectadas" @@ -12703,10 +12862,6 @@ msgid "Show scenes" msgstr "Mostrar escenas" -msgid "Show materials, nodetrees, textures and Freestyle's linestyles" -msgstr "Mostrar materiales, árboles de nodos, texturas y estilos de línea de Freestyle" - - msgid "Directory" msgstr "Directorio" @@ -18716,6 +18871,34 @@ msgid "Grid scale" msgstr "Escala de la cuadrícula" +msgid "Collection of related drawings" +msgstr "Colección de dibujos relacionados" + + +msgid "Set layer visibility" +msgstr "Permite definir la visibilidad de la capa" + + +msgid "Grease Pencil Layer Group" +msgstr "Grupo de capas de lápiz de cera" + + +msgid "Group of Grease Pencil layers" +msgstr "Grupo de capas de lápiz de cera" + + +msgid "Set layer group visibility" +msgstr "Permite definir la visibilidad del grupo de capas" + + +msgid "Protect group from further editing and/or frame changes" +msgstr "Protege el grupo de futuras ediciones y/o cambios de fotograma" + + +msgid "Group name" +msgstr "Nombre del grupo" + + msgid "Grease Pencil Layers" msgstr "Capas de lápiz de cera" @@ -18760,6 +18943,10 @@ msgid "Active index in layer mask array" msgstr "Identificador de la capa activa en la matriz de capas de máscara" +msgid "Collection of Grease Pencil layers" +msgstr "Colección de capas de lápiz de cera" + + msgid "Active Grease Pencil layer" msgstr "Capa activa de lápiz de cera" @@ -21598,6 +21785,14 @@ msgid "Collections that are immediate children of this collection" msgstr "Colecciones que son subordinadas inmediatas de esta colección" +msgid "Children collections their parent-collection-specific settings" +msgstr "Colecciones subordinadas, con sus opciones específicas relacionadas con la colección superior" + + +msgid "Objects of the collection with their parent-collection-specific settings" +msgstr "Objetos de la colección, con sus opciones específicas relacionadas con la colección superior" + + msgid "Collection Color" msgstr "Color de la colección" @@ -22262,10 +22457,6 @@ msgid "Whether the selected text is italics" msgstr "Indica si el texto seleccionado se encuentra en cursiva" -msgid "Selected Smallcaps" -msgstr "Seleccionado en versalitas" - - msgid "Whether the selected text is small caps" msgstr "Indica si el texto seleccionado se encuentra en versalitas" @@ -23326,6 +23517,18 @@ msgid "Grease Pencil data-block" msgstr "Bloque de datos de lápiz de cera" +msgid "Layer Groups" +msgstr "Grupos de capas" + + +msgid "Grease Pencil layer groups" +msgstr "Grupos de capas de lápiz de cera" + + +msgid "Grease Pencil layers" +msgstr "Capas de lápiz de cera" + + msgid "Image data-block referencing an external or packed image" msgstr "Bloque de datos de imagen referenciando a una imagen externa o empacada" @@ -23959,10 +24162,6 @@ msgid "Diffuse reflection multiplier" msgstr "Multiplicador para la reflexión difusa" -msgid "Falloff distance - the light is at half the original intensity at this point" -msgstr "Distancia de decaimiento - la luz está a la mitad de su intensidad original en este punto" - - msgid "Node tree for node based lights" msgstr "Árbol de nodos para luces basadas en nodos" @@ -24048,14 +24247,6 @@ msgid "Directional area Light" msgstr "Luz de área direccional" -msgid "Constant Coefficient" -msgstr "Coeficiente constante" - - -msgid "Constant distance attenuation coefficient" -msgstr "Coeficiente constante de atenuación según la distancia" - - msgid "Contact Shadow Bias" msgstr "Desviación sombra contacto" @@ -24089,66 +24280,6 @@ msgid "Light energy emitted over the entire area of the light in all directions" msgstr "Energía lumínica emitida por el área completa de la luz, en todas direcciones" -msgid "Custom light falloff curve" -msgstr "Curva de decaimiento de luz personalizada" - - -msgid "Falloff Type" -msgstr "Tipo de decaimiento" - - -msgid "Intensity Decay with distance" -msgstr "Decaimiento de la intensidad según la distancia" - - -msgid "Inverse Linear" -msgstr "Inverso lineal" - - -msgid "Inverse Square" -msgstr "Inverso al cuadrado" - - -msgid "Inverse Coefficients" -msgstr "Coeficientes inversos" - - -msgid "Lin/Quad Weighted" -msgstr "Lineal/cuadrático ponderado" - - -msgid "Linear Attenuation" -msgstr "Atenuación lineal" - - -msgid "Linear distance attenuation" -msgstr "Atenuación lineal según la distancia" - - -msgid "Linear Coefficient" -msgstr "Coeficiente lineal" - - -msgid "Linear distance attenuation coefficient" -msgstr "Coeficiente de atenuación lineal según la distancia" - - -msgid "Quadratic Attenuation" -msgstr "Atenuación cuadrática" - - -msgid "Quadratic distance attenuation" -msgstr "Atenuación cuadrática según la distancia" - - -msgid "Quadratic Coefficient" -msgstr "Coeficiente cuadrático" - - -msgid "Quadratic distance attenuation coefficient" -msgstr "Coeficiente de atenuación cuadrática según la distancia" - - msgid "Shadow Buffer Bias" msgstr "Buffer sombras desviación" @@ -24165,22 +24296,6 @@ msgid "Shadow map clip start, below which objects will not generate shadows" msgstr "Recorte inicial del mapa de sombras, debajo del cual los objetos no generarán sombras" -msgid "Samples" -msgstr "Muestras" - - -msgid "Number of shadow buffer samples" -msgstr "Cantidad de muestras del buffer de sombras" - - -msgid "Shadow Buffer Size" -msgstr "Buffer sombras tamaño" - - -msgid "Resolution of the shadow buffer, higher values give crisper shadows but use more memory" -msgstr "Resolución del buffer de sombras, valores altos producen sombras más definidas pero usan más memoria" - - msgid "Shadow Color" msgstr "Color de la sombra" @@ -24349,6 +24464,14 @@ msgid "Control how fast the probe influence decreases" msgstr "Permite controlar qué tan rápido decae la influencia de la sonda" +msgid "Bake Samples" +msgstr "Muestras de captura" + + +msgid "Number of ray directions to evaluate when baking" +msgstr "Cantidad de direcciones de rayos a ser evaluadas al capturar" + + msgid "Resolution X" msgstr "Resolución X" @@ -24437,6 +24560,14 @@ msgid "Show the parallax correction volume in the 3D view" msgstr "Mostrar el volumen de corrección de paralaje en la vista 3D" +msgid "Surfel Density" +msgstr "Densidad de surfels" + + +msgid "Number of surfels per unit distance (higher values improve quality)" +msgstr "Cantidad de surfels (surface-elements: elementos de superficie) por unidad de distancia (valores mayores mejorarán la calidad)" + + msgid "Type of light probe" msgstr "Tipo de sonda de luz" @@ -25322,6 +25453,14 @@ msgid "Node tree outputs" msgstr "Salidas del árbol de nodos" +msgid "Panels" +msgstr "Paneles" + + +msgid "UI panels for structuring the node tree interface" +msgstr "Paneles de interfaz para estructurar la interfaz del árbol de nodos" + + msgid "Node Tree type (deprecated, bl_idname is the actual node tree type identifier)" msgstr "Tipo de árbol de nodos (depreciado, bl_idname es el identificador actual de tipo de árbol de nodos)" @@ -25374,6 +25513,54 @@ msgid "Max size of a tile (smaller values gives better distribution of multiple msgstr "Tamaño máximo de cada celda (valores más pequeños producen una mejor distribución en múltiples hilos, pero más cantidad de trabajo)" +msgid "32×32" +msgstr "32×32" + + +msgid "Chunksize of 32×32" +msgstr "Celda de 32×32" + + +msgid "64×64" +msgstr "64×64" + + +msgid "Chunksize of 64×64" +msgstr "Celda de 64×64" + + +msgid "128×128" +msgstr "128×128" + + +msgid "Chunksize of 128×128" +msgstr "Celda de 128×128" + + +msgid "256×256" +msgstr "256×256" + + +msgid "Chunksize of 256×256" +msgstr "Celda de 256×256" + + +msgid "512×512" +msgstr "512×512" + + +msgid "Chunksize of 512×512" +msgstr "Celda de 512×512" + + +msgid "1024×1024" +msgstr "1024×1024" + + +msgid "Chunksize of 1024×1024" +msgstr "Celda de 1024×1024" + + msgid "Edit Quality" msgstr "Calidad de edición" @@ -25426,6 +25613,14 @@ msgid "Composites full image result as fast as possible" msgstr "Se compondrá la imagen completa, tan rápido como sea posible" +msgid "Realtime GPU" +msgstr "Tiempo real por GPU" + + +msgid "Use GPU accelerated compositing with more limited functionality" +msgstr "Usar composición acelerada por GPU con funcionalidad limitada" + + msgid "Render Quality" msgstr "Calidad de procesamiento" @@ -25727,11 +25922,11 @@ msgstr "Círculo" msgid "Empty Image Depth" -msgstr "Vacío Profundidad de imagen" +msgstr "Vacío - Profundidad de imagen" msgid "Determine which other objects will occlude the image" -msgstr "Otros objetos podrán ocluir a la imagen" +msgstr "Determina qué otros objetos podrán ocluir a la imagen" msgid "Origin Offset" @@ -25742,8 +25937,28 @@ msgid "Origin offset distance" msgstr "Distancia de desplazamiento con respecto al origen" +msgctxt "Image" +msgid "Empty Image Side" +msgstr "Vacío - Lado de la imagen" + + msgid "Show front/back side" -msgstr "Mostrar lado frontal/trasero" +msgstr "Mostrar del lado frontal/trasero" + + +msgctxt "Image" +msgid "Both" +msgstr "Ambos" + + +msgctxt "Image" +msgid "Front" +msgstr "Frontal" + + +msgctxt "Image" +msgid "Back" +msgstr "Trasero" msgid "Settings for using the object as a field in physics simulation" @@ -25830,6 +26045,10 @@ msgid "Only render shadows and reflections on this object, for compositing rende msgstr "Permite procesar solamente las sombras y reflexiones de este objeto, útil para componer imágenes procesadas sobre filmaciones reales. Los objetos que tengan activada esta opción representarán a elementos de la imagen filmada, mientras que los que no la tengan activada serán procesados normalmente y compuestos sobre ella" +msgid "Light linking settings" +msgstr "Opciones de vinculación de iluminación" + + msgid "Lightgroup" msgstr "Grupo_de_luces" @@ -26206,6 +26425,10 @@ msgid "Shape Key Lock" msgstr "Bloquear Forma clave" +msgid "Only show the active shape key at full value" +msgstr "Muestra únicamente la forma clave activa, a máxima intensidad" + + msgid "Display Texture Space" msgstr "Mostrar espacio texturizado" @@ -26322,6 +26545,10 @@ msgid "Shape Key Edit Mode" msgstr "Formas clave en modo Edición" +msgid "Display shape keys in edit mode (for meshes only)" +msgstr "Permite visualizar el efecto final de las Formas clave en modo edición (sólo para mallas)" + + msgid "Use Simulation Cache" msgstr "Usar caché de simulación" @@ -26826,6 +27053,16 @@ msgid "Type of periodic offset on the path" msgstr "Tipo de desplazamiento periódico sobre la trayectoria" +msgctxt "ParticleSettings" +msgid "Nothing" +msgstr "Ninguno" + + +msgctxt "ParticleSettings" +msgid "Spiral" +msgstr "Espiral" + + msgid "Amplitude Clump" msgstr "Amplitud mechones" @@ -28056,6 +28293,14 @@ msgid "Top-Left 3D Editor" msgstr "Vista 3D superior izquierda" +msgid "Simulation data-block" +msgstr "Bloque de datos de simulación" + + +msgid "Node tree defining the simulation" +msgstr "Árbol de nodos que define la simulación" + + msgid "Sound data-block referencing an external or packed sound file" msgstr "Bloque de datos de sonido referenciando a un archivo de sonido externo o empacado" @@ -29453,6 +29698,14 @@ msgid "Maintained by community developers" msgstr "Mantenidos por desarrolladores de la comunidad" +msgid "Testing" +msgstr "A prueba" + + +msgid "Newly contributed scripts (excluded from release builds)" +msgstr "Scripts recientemente contribuidos (excluidos de las versiones oficiales)" + + msgid "Asset Blend Path" msgstr "Trayectoria archivo del recurso" @@ -30205,6 +30458,10 @@ msgid "Format of multiview media" msgstr "Formato del medio con vistas múltiples" +msgid "Multi-View" +msgstr "Vistas múltiples" + + msgid "Tile Number" msgstr "Número de celda" @@ -31386,22 +31643,38 @@ msgstr "Fin" msgctxt "UI_Events_KeyMaps" msgid "Media Play/Pause" -msgstr "Reproducción/Pausa" +msgstr "Reproducir/Pausar" + + +msgid "⏯" +msgstr "⏯" msgctxt "UI_Events_KeyMaps" msgid "Media Stop" -msgstr "Detener medio" +msgstr "Detener" + + +msgid "⏹" +msgstr "⏹" msgctxt "UI_Events_KeyMaps" msgid "Media First" -msgstr "Inicio medio" +msgstr "Inicio" + + +msgid "⏮" +msgstr "⏮" msgctxt "UI_Events_KeyMaps" msgid "Media Last" -msgstr "Final medio" +msgstr "Final" + + +msgid "⏭" +msgstr "⏭" msgctxt "UI_Events_KeyMaps" @@ -34155,6 +34428,14 @@ msgid "Add Attribute" msgstr "Agregar atributo" +msgid "Light Linking Specials" +msgstr "Especiales de vinculación de iluminación" + + +msgid "Shadow Linking Specials" +msgstr "Especiales de vinculación de sombras" + + msgid "Bone Group Specials" msgstr "Especiales de grupos de huesos" @@ -34219,6 +34500,10 @@ msgid "F-Curve Context Menu" msgstr "Curva-f - menú contextual" +msgid "Add Extra" +msgstr "Agregar adicional" + + msgid "Mask Context Menu" msgstr "Máscara - menú contextual" @@ -35187,6 +35472,10 @@ msgid "Minimum for measuring thickness" msgstr "Medida mínima de grosor" +msgid "Samples" +msgstr "Muestras" + + msgid "Number of samples to test per face" msgstr "Cantidad de muestras a tomar por cara" @@ -42221,6 +42510,10 @@ msgid "Colors are treated alpha premultiplied, or colors output straight (alpha msgstr "Los colores de salida se premultiplicarán por el alfa, o saldrán de forma directa (con el alfa definido a 1)" +msgid "Convert Colorspace" +msgstr "Convertir espacio de color" + + msgid "From" msgstr "Desde" @@ -42553,6 +42846,11 @@ msgid "Distance to grow/shrink (number of iterations)" msgstr "Distancia a expandir o contraer (cantidad de iteraciones)" +msgctxt "Image" +msgid "Edge" +msgstr "Borde" + + msgid "Edge to inset" msgstr "Borde a incrustar" @@ -42902,14 +43200,42 @@ msgid "Tracking Object" msgstr "Objeto de rastreo" +msgid "Kuwahara" +msgstr "Kuwahara" + + +msgid "Size of filter. Larger values give stronger stylized effect" +msgstr "Tamaño del filtro. Valores mayores producirán un efecto con un estilizado más marcado" + + msgid "Smoothing" msgstr "Suavizado" +msgid "Smoothing degree before applying filter. Higher values remove details and give smoother edges" +msgstr "Grado de suavizado antes de aplicar el filtro. Valores mayores eliminarán detalles y producirán bordes más suaves" + + +msgid "Variation of Kuwahara filter to use" +msgstr "Variación del filtro Kuwahara a usar" + + +msgid "Classic" +msgstr "Clásico" + + +msgid "Fast but less accurate variation" +msgstr "Variación rápida pero menos precisa" + + msgid "Anisotropic" msgstr "Anisotropía" +msgid "Accurate but slower variation" +msgstr "Variación precisa pero más lenta" + + msgid "Lens Distortion" msgstr "Distorsión de lente" @@ -44242,6 +44568,14 @@ msgid "Create a mesh that encloses all points in the input geometry with the sma msgstr "Crea una malla que encierra a todos los puntos de la geometría de entrada, usando la menor cantidad de puntos posible" +msgid "Corners of Edge" +msgstr "Esquinas de borde" + + +msgid "Retrieve face corners connected to edges" +msgstr "Proporciona las esquinas de caras conectadas a los bordes" + + msgid "Corners of Face" msgstr "Esquinas de cara" @@ -46128,6 +46462,10 @@ msgid "Multiscatter GGX" msgstr "GGX con dispersión múltiple" +msgid "GGX with additional correction to account for multiple scattering, preserve energy and prevent unexpected darkening at high roughness" +msgstr "GGX con corrección adicional para tomar en cuenta la dispersión múltiple, la preservación de energía y prevenir el oscurecimiento no deseado a altos niveles de rugosidad" + + msgid "Diffuse BSDF" msgstr "BSDF Difuso" @@ -47452,6 +47790,10 @@ msgid "Computes the radius of the n-sphere inscribed in the voronoi cell" msgstr "Calcula el radio de la hiperesfera inscripta en la celda voronoi" +msgid "Normalize output Distance to 0.0 to 1.0 range" +msgstr "Normaliza la distancia de salida al rango 0.0 a 1.0" + + msgid "Wave Texture" msgstr "Ondas" @@ -48035,6 +48377,34 @@ msgid "Node Outputs" msgstr "Salidas de nodo" +msgid "Panel in the node group interface" +msgstr "Panel en la interfaz del grupo de nodos" + + +msgid "Name of the socket panel" +msgstr "Nombre del panel de conexión" + + +msgid "Node Tree Socket Panels" +msgstr "Paneles de conexión del árbol de nodos" + + +msgid "Collection of socket panels in a node tree" +msgstr "Colección de paneles de conexión de un árbol de nodos" + + +msgid "Active panel" +msgstr "Panel activo" + + +msgid "Active Index" +msgstr "Identificador de activo" + + +msgid "Index of the active panel" +msgstr "Identificador del panel activo" + + msgid "Node Socket" msgstr "Conector del nodo" @@ -48243,6 +48613,14 @@ msgid "Object socket of a node" msgstr "Conector de objeto de un nodo" +msgid "Rotation Node Socket" +msgstr "Conector de rotación de nodo" + + +msgid "Rotation value socket of a node" +msgstr "Conector de valor de rotación de un nodo" + + msgid "Shader Node Socket" msgstr "Conector de sombreador de nodo" @@ -48319,6 +48697,10 @@ msgid "Hide the socket input value even when the socket is not connected" msgstr "Oculta el valor de entrada del conector, aún en caso de que se encuentre desconectado" +msgid "Panel to group sockets together in the UI" +msgstr "Panel para agrupar conectores en la interfaz" + + msgid "Boolean Node Socket Interface" msgstr "Interfaz de conector booleano de nodo" @@ -48363,6 +48745,10 @@ msgid "Object Node Socket Interface" msgstr "Interfaz del conector de objeto del nodo" +msgid "Rotation Node Socket Interface" +msgstr "Interfaz del conector de rotación del nodo" + + msgid "Shader Node Socket Interface" msgstr "Interfaz del conector de sombreador del nodo" @@ -48459,6 +48845,26 @@ msgid "Collection of object grease pencil modifiers" msgstr "Colección de modificadores de lápiz de cera del objeto" +msgid "Object Light Linking" +msgstr "Vinculación de iluminación del objeto" + + +msgid "Blocker Collection" +msgstr "Colección de bloqueadores" + + +msgid "Collection which defines objects which block light from this emitter" +msgstr "Colección que define los objetos que bloquearán la iluminación de este emisor" + + +msgid "Receiver Collection" +msgstr "Colección de receptores" + + +msgid "Collection which defines light linking relation of this emitter" +msgstr "Colección que define la relación de vinculación de iluminación de este emisor" + + msgid "Object Line Art" msgstr "Objeto a arte lineal" @@ -52652,10 +53058,31 @@ msgid "(De)select all control points" msgstr "(De)selecciona todos los puntos de control" +msgctxt "Operator" +msgid "Select Ends" +msgstr "Seleccionar extremos" + + msgid "Select end points of curves" msgstr "Seleccionar extremos de las curvas" +msgid "Amount Back" +msgstr "Cantidad trasera" + + +msgid "Number of points to select from the back" +msgstr "Cantidad de puntos de la parte trasera a ser seleccionados" + + +msgid "Amount Front" +msgstr "Cantidad frontal" + + +msgid "Number of points to select from the front" +msgstr "Cantidad de puntos de la parte frontal a ser seleccionados" + + msgid "Shrink the selection by one point" msgstr "Contrae la selección un punto" @@ -54715,7 +55142,7 @@ msgstr "Agrupar por pista de ANL" msgid "When on, multiple actions become part of the same glTF animation if they're pushed onto NLA tracks with the same name. When off, all the currently assigned actions become one glTF animation" -msgstr "Cuando se encuentre activa, acciones distintas formarán parte de la misma animación glTF, en caso de ser arrastradas a pistas de ANL con el mismo nombre. Cuando se encuentre desactivada, todas las acciones actualmente asignadas conformarán una única animación glTF." +msgstr "Cuando se encuentre activa, acciones distintas formarán parte de la misma animación glTF, en caso de ser arrastradas a pistas de ANL con el mismo nombre. Cuando se encuentre desactivada, todas las acciones actualmente asignadas conformarán una única animación glTF" msgid "Merged Animation Name" @@ -54734,10 +55161,6 @@ msgid "Force keeping channels for bones" msgstr "Preservar canales de huesos" -msgid "if all keyframes are identical in a rig, force keeping the minimal animation. When off, all possible channels for the bones will be exported, even if empty (minimal animation, 2 keyframes)" -msgstr "si todos los claves fueran idénticos en un sistema de control, forzará a que se preserve la mínima animación posible. Cuando se encuentre desactivado, se exportarán todos los canales posibles de los huesos, aunque se encontraran vacíos (mínima animación posible: 2 claves)" - - msgid "Force keeping channel for objects" msgstr "Preservar canales de objetos" @@ -56127,6 +56550,15 @@ msgid "Name of color attribute" msgstr "Nombre del atributo de color" +msgctxt "Operator" +msgid "Run Node Group" +msgstr "Ejecutar grupo de nodos" + + +msgid "Execute a node group on geometry" +msgstr "Ejecuta un grupo de nodos en la geometría" + + msgctxt "Operator" msgid "Gizmo Select" msgstr "Seleccionar manipulador" @@ -58125,6 +58557,11 @@ msgid "Front" msgstr "Frontal" +msgctxt "View3D" +msgid "Side" +msgstr "Lateral" + + msgctxt "View3D" msgid "Top" msgstr "Superior" @@ -58633,6 +59070,10 @@ msgid "Blend selected keyframes to their left or right neighbor" msgstr "Fundir los claves seleccionados con sus cercanos a derecha o izquierda" +msgid "The blend factor with 0 being the current frame" +msgstr "El factor de fusión, en donde 0 representa al fotograma actual" + + msgctxt "Operator" msgid "Breakdown" msgstr "Intermedio" @@ -59188,6 +59629,10 @@ msgid "Switch brush to smooth mode for duration of stroke" msgstr "Cambia el pincel a modo suave por la duración del trazo" +msgid "Name of the new layer" +msgstr "Nombre de la nueva capa" + + msgctxt "Operator" msgid "Add Render Slot" msgstr "Agregar contenedor procesamiento" @@ -65108,6 +65553,33 @@ msgid "Remove the active input from a file output node" msgstr "Remueve la entrada activa del nodo Archivo de salida" +msgctxt "Operator" +msgid "Add Panel" +msgstr "Agregar panel" + + +msgid "Add a new panel to the tree" +msgstr "Agrega un nuevo panel al árbol" + + +msgctxt "Operator" +msgid "Move Panel" +msgstr "Mover panel" + + +msgid "Move a panel to another position" +msgstr "Mueve un panel a otra posición" + + +msgctxt "Operator" +msgid "Remove Panel" +msgstr "Eliminar panel" + + +msgid "Remove a panel from the tree" +msgstr "Elimina un panel del árbol" + + msgid "Attach selected nodes" msgstr "Vincula los nodos seleccionados" @@ -68296,6 +68768,11 @@ msgid "Remove vertices which weight is below or equal to this limit" msgstr "Remueve los vértices cuya influencia sea menor o igual que este límite" +msgctxt "Operator" +msgid "Duplicate Vertex Group" +msgstr "Duplicar grupo de vértices" + + msgid "Make a copy of the active vertex group" msgstr "Hace una copia del grupo de vértices activo" @@ -69717,6 +70194,19 @@ msgid "Select linked faces under the cursor" msgstr "Selecciona las caras vinculadas bajo el cursor" +msgctxt "Operator" +msgid "Select Loop" +msgstr "Seleccionar bucle" + + +msgid "Select face loop under the cursor" +msgstr "Selecciona el bucle de caras bajo el cursor" + + +msgid "If false, faces will be deselected" +msgstr "Si fuera falso las caras serán deseleccionadas" + + msgid "Select Faces connected to existing selection" msgstr "Selecciona las caras conectadas a la selección actual" @@ -71551,6 +72041,15 @@ msgid "Remove existing theme file if exists" msgstr "Remueve el archivo del tema existente, si lo hay" +msgctxt "Operator" +msgid "Remove File Association" +msgstr "Eliminar asociación de archivo" + + +msgid "Remove this installation's associations with .blend files" +msgstr "Elimina las asociaciones de esta instalación con archivos .blend" + + msgctxt "Operator" msgid "Add New Cache" msgstr "Agregar nuevo caché" @@ -73200,6 +73699,10 @@ msgid "Generic sculpt expand operator" msgstr "Operador de esculpido genérico de expansión" +msgid "Falloff Type" +msgstr "Tipo de decaimiento" + + msgid "Initial falloff of the expand operation" msgstr "Decaimiento inicial de la operación de expansión" @@ -74122,6 +74625,18 @@ msgid "The effect inputs to swap" msgstr "Las entradas del efecto a intercambiar" +msgid "A → B" +msgstr "A → B" + + +msgid "B → C" +msgstr "B → C" + + +msgid "A → C" +msgstr "A → C" + + msgctxt "Operator" msgid "Change Effect Type" msgstr "Cambiar tipo de efecto" @@ -76012,6 +76527,14 @@ msgid "Edge Slide" msgstr "Deslizar bordes" +msgid "Allow Navigation" +msgstr "Permitir navegación" + + +msgid "Allow navigation while transforming" +msgstr "Permite navegar durante una transformación" + + msgid "Correct UVs" msgstr "Corregir UV" @@ -76032,6 +76555,10 @@ msgid "Snap to Elements" msgstr "Adherir a elementos" +msgid "Snap to increments" +msgstr "Adherir a incrementos" + + msgid "Snap to vertices" msgstr "Adherir a vértices" @@ -77140,6 +77667,10 @@ msgid "Axis to align to" msgstr "Eje al cual alinear" +msgid "Correct Aspect" +msgstr "Corregir proporción" + + msgid "Method to calculate rotation angle" msgstr "Método para calcular el ángulo de rotación" @@ -77199,10 +77730,6 @@ msgid "Clip UV coordinates to bounds after unwrapping" msgstr "Recorta las coordenadas UV hasta los límites luego de desplegarlas" -msgid "Correct Aspect" -msgstr "Corregir proporción" - - msgid "Map UVs taking image aspect ratio into account" msgstr "Mapea los UV tomando en cuenta la proporción de la imagen" @@ -78324,6 +78851,10 @@ msgid "Extrude Individual and Move" msgstr "Extruir individual y mover" +msgid "Allow navigation" +msgstr "Permitir la navegación" + + msgctxt "Operator" msgid "Extrude Manifold Along Normals" msgstr "Extruir desplegable a lo largo de las normales" @@ -81728,10 +82259,6 @@ msgid "Path Mask" msgstr "Máscara de ruta" -msgid "Import only the primitive at the given path and its descendents. Multiple paths may be specified in a list delimited by commas or semicolons" -msgstr "Importa sólo la primitiva en la ruta indicada y sus subordinadas. Es posible especificar múltiples rutas mediante una lista separada por comas o punto y comas" - - msgid "Read mesh color attributes" msgstr "Leer atributos de colr de mallas" @@ -82871,6 +83398,10 @@ msgid "Shadow Terminator" msgstr "Terminador de sombras" +msgid "Shadow Linking" +msgstr "Vinculación de sombras" + + msgid "Ray Visibility" msgstr "Visibilidad a los rayos" @@ -83300,6 +83831,10 @@ msgid "Predefined node color" msgstr "Color predefinido de nodo" +msgid "Node Panels" +msgstr "Paneles de nodos" + + msgid "Simulation State" msgstr "Estado de la simulación" @@ -83851,6 +84386,10 @@ msgid "Operating System Settings" msgstr "Opciones de sistema operativo" +msgid "Text Editor Presets" +msgstr "Ajustes del editor de texto" + + msgid "Bone Color Sets" msgstr "Conjuntos de colores de huesos" @@ -85693,6 +86232,10 @@ msgid "Pose Matrix" msgstr "Matriz de pose" +msgid "Final 4×4 matrix after constraints and drivers are applied, in the armature object space" +msgstr "Matriz resultante de 4×4 luego de aplicar restricciones y controladores, en espacio de objeto del esqueleto" + + msgid "Alternative access to location/scale/rotation relative to the parent and own rest bone" msgstr "Acceso alternativo a la posición/rotación/escala relativa al hueso superior y de reposo propio" @@ -85701,6 +86244,10 @@ msgid "Channel Matrix" msgstr "Matriz de canal" +msgid "4×4 matrix of the bone's location/rotation/scale channels (including animation and drivers) and the effect of bone constraints" +msgstr "Matriz de 4×4 de los canales de posición rotación y escala del hueso (incluyendo su animación y controladores) y el efecto de sus restricciones" + + msgid "Parent of this pose bone" msgstr "Superior del hueso de esta pose" @@ -86346,6 +86893,10 @@ msgid "Enable Cycles debugging options for developers" msgstr "Habilita las opciones de depuración de Cycles para desarrolladores" +msgid "Experimental Compositors" +msgstr "Composición experimental" + + msgid "Extended Asset Browser" msgstr "Explorador de recursos extendido" @@ -86354,6 +86905,14 @@ msgid "Enable Asset Browser editor and operators to manage regular data-blocks a msgstr "Habilita a que el editor y los operadores del Explorador de recursos administren bloques de datos normales como si fueran recursos, y no únicamente los de poses" +msgid "Grease Pencil 3.0" +msgstr "Lápiz de cera 3.0" + + +msgid "Enable the new grease pencil 3.0 codebase" +msgstr "Habilita la base de código de lápiz de cera 3.0" + + msgid "New Curves Tools" msgstr "Nuevas herramientas de curvas" @@ -86386,6 +86945,14 @@ msgid "Enable library override template in the Python API" msgstr "Habilitar plantillas de redefinición de bibliotecas en la API de Python" +msgid "Rotation Socket" +msgstr "Conector de rotación" + + +msgid "Enable the new rotation node socket type" +msgstr "Habilita el nuevo tipo de conector de rotación de nodos" + + msgid "Sculpt Texture Paint" msgstr "Pintar texturas en esculpido" @@ -87102,6 +87669,22 @@ msgid "Quality of anisotropic filtering" msgstr "Calidad del filtro anisótropo" +msgid "2×" +msgstr "×2" + + +msgid "4×" +msgstr "×4" + + +msgid "8×" +msgstr "×8" + + +msgid "16×" +msgstr "×16" + + msgid "Audio Device" msgstr "Dispositivo de audio" @@ -88838,6 +89421,11 @@ msgid "Combination of true displacement and bump mapping for finer detail" msgstr "Combinación de desplazamiento real y mapeo de relieve para el detalle más fino" +msgctxt "Light" +msgid "Emission Sampling" +msgstr "Muestreo de emisión" + + msgid "Sampling strategy for emissive surfaces" msgstr "Estrategia de muestreo para superficies emisivas" @@ -91182,6 +91770,10 @@ msgid "Automatic pixel size, depends on the user interface scale" msgstr "Tamaño automático, depende de la escala de la interfaz" +msgid "1×" +msgstr "×1" + + msgid "Render at full resolution" msgstr "Procesar a resolución completa" @@ -91426,6 +92018,10 @@ msgid "Add the file format extensions to the rendered file name (eg: filename + msgstr "Agrega la extensión del formato de archivo al nombre del archivo procesado (p.ej: nombre + .jpg)" +msgid "Use Freestyle" +msgstr "Usar Freestyle" + + msgid "Draw stylized strokes using Freestyle" msgstr "Dibuja trazos estilizados usando Freestyle" @@ -91642,10 +92238,6 @@ msgid "Single stereo camera system, adjust the stereo settings in the camera pan msgstr "Sistema de cámara única, ajustar las opciones de estereoscopía en el panel de la cámara" -msgid "Multi-View" -msgstr "Vistas múltiples" - - msgid "Multi camera system, adjust the cameras individually" msgstr "Sistema de múltiples cámaras, ajustar cada cámara de forma individual" @@ -94501,6 +95093,14 @@ msgid "Type of filter to use for image transformation" msgstr "Tipo de filtro a usar para la transformación de imágenes" +msgid "Subsampling (3×3)" +msgstr "Submuestreo (3×3)" + + +msgid "Use nearest with 3×3 subsamples during rendering" +msgstr "Usar más cercano con 3×3 submuestras durante el procesamiento" + + msgid "Move along X axis" msgstr "Mover a lo largo del eje X" @@ -96514,6 +97114,21 @@ msgid "Node tree being displayed and edited" msgstr "Árbol de nodos que se está editando" +msgctxt "ID" +msgid "Geometry Nodes Type" +msgstr "Tipo de nodos de geometría" + + +msgctxt "ID" +msgid "Modifier" +msgstr "Modificador" + + +msgctxt "ID" +msgid "Operator" +msgstr "Operador" + + msgid "Data-block whose nodes are being edited" msgstr "Bloque de datos cuyos nodos están siendo editados" @@ -102830,6 +103445,10 @@ msgid "Type of the path element" msgstr "Tipo del elemento de la ruta" +msgid "Node ID" +msgstr "ID de nodo" + + msgid "Volume Display" msgstr "Visualización volúmenes" @@ -103243,14 +103862,6 @@ msgid "Length of rays, defines how far away other faces give occlusion effect" msgstr "Longitud de los rayos. Define qué tan lejanas estarán las caras que provocan el efecto de oclusión" -msgid "Use Ambient Occlusion" -msgstr "Usar oclusión ambiental" - - -msgid "Use Ambient Occlusion to add shadowing based on distance between objects" -msgstr "Usa la oclusión ambiental para agregar sombreado basado en la distancia entre los objetos" - - msgid "World Mist" msgstr "Niebla del entorno" @@ -106141,10 +106752,6 @@ msgid "or AMD with macOS %s or newer" msgstr "o AMD con macOS %s o más nuevo" -msgid " - intel-level-zero-gpu version %s or newer" -msgstr " - intel-level-zero-gpu versión %s o más nueva" - - msgid "Noise Threshold" msgstr "Umbral de ruido" @@ -106890,10 +107497,18 @@ msgid "No vars to display" msgstr "Ninguna variable que mostrar" +msgid "Demo text \"%s\" created with %s file(s){:,d}" +msgstr "Texto de demostración \"%s\" creado con %s archivo(s){:,d}" + + msgid "Search *.blend recursively" msgstr "Buscar recursivamente en *.blend" +msgid "Writes: %s config text" +msgstr "Guarda: Texto de configuración %s" + + msgid "Generate Settings:" msgstr "Opciones de generación:" @@ -106906,12 +107521,16 @@ msgid "Render Settings:" msgstr "Opciones de procesamiento:" +msgid "Can't load %s config, run: File -> Demo Mode (Setup)" +msgstr "No es posible cargar la configuración de %s, ejecutar: Archivo -> Modo demostración (Configurar)" + + msgid "Demo Mode:" msgstr "Modo de demostración:" msgid "No configuration found with text or file: %s. Run File -> Demo Mode Setup" -msgstr "No se encontró configuración con el texto o archivo: %s. Run File -> Demo Mode Setup" +msgstr "No se encontró ninguna configuración con el texto o archivo: %s. Ejecutar Archivo -> Modo demostración (Configurar)" msgid "Save to PO File" @@ -107451,7 +108070,7 @@ msgstr "El objeto %r ya contiene un sistema de partículas" msgid "Set Hair Curve Profile" -msgstr "Definir perfil de curva de pelo" +msgstr "Definir perfil de curvas de pelo" msgid "Interpolate Hair Curves" @@ -108447,6 +109066,11 @@ msgid "Remove All Groups" msgstr "Eliminar todos los grupos" +msgctxt "Operator" +msgid "Add Group" +msgstr "Agregar grupo" + + msgid "Interpolation U" msgstr "Interpolación en U" @@ -109806,6 +110430,16 @@ msgid "Bake Cubemap Only" msgstr "Capturar sólo mapa cúbico" +msgctxt "Operator" +msgid "Bake Light Caches" +msgstr "Capturar cachés de iluminación" + + +msgctxt "Operator" +msgid "Delete Light Caches" +msgstr "Borrar cachés de iluminación" + + msgid "Shadow Resolution" msgstr "Resolución sombras" @@ -109903,6 +110537,11 @@ msgid "Tiles" msgstr "Celdas" +msgctxt "Amount" +msgid "Even" +msgstr "Pares" + + msgid "Odd" msgstr "Impares" @@ -112193,6 +112832,11 @@ msgid "Wavefront (.obj)" msgstr "Wavefront (.obj)" +msgctxt "Operator" +msgid "Stanford PLY (.ply)" +msgstr "PLY de Stanford (.ply)" + + msgctxt "Operator" msgid "STL (.stl) (experimental)" msgstr "STL (.stl) (experimental)" @@ -112492,6 +113136,14 @@ msgid "Render Cache" msgstr "Caché de procesamiento" +msgid "Program" +msgstr "Programa" + + +msgid "Arguments" +msgstr "Argumentos" + + msgid "I18n Branches" msgstr "Ramas de traducción" @@ -112566,6 +113218,11 @@ msgid "Requires a restart of Blender to take effect" msgstr "Requiere reinicializar Blender para entrar en efecto" +msgctxt "Operator" +msgid "Register" +msgstr "Registrar" + + msgid "Player" msgstr "Reproductor" @@ -113890,6 +114547,21 @@ msgid "Color Attribute" msgstr "Atributo de color" +msgctxt "Operator" +msgid "Empty" +msgstr "Vacío" + + +msgctxt "Operator" +msgid "Stroke" +msgstr "Stroke" + + +msgctxt "Operator" +msgid "Suzanne" +msgstr "Suzanne" + + msgctxt "Operator" msgid "Point Cloud" msgstr "Nube de puntos" @@ -115356,7 +116028,11 @@ msgstr "LápizCera" msgid "LightProbe" -msgstr "Sonda de luz" +msgstr "Sonda_de_luz" + + +msgid "GreasePencil" +msgstr "Lápiz_de_cera" msgid "No new files have been packed" @@ -116168,6 +116844,10 @@ msgid "GpencilMode" msgstr "ModoLapizCera" +msgid "Gpencil" +msgstr "LápizCera" + + msgid "UV/Image" msgstr "UV/Imagen" @@ -117905,6 +118585,10 @@ msgid "Drag" msgstr "Arrastrar" +msgid "Add to light linking collection" +msgstr "Agregar a colección de vinculación de iluminación" + + msgid "Double click to rename" msgstr "Doble clic para renombrar" @@ -120383,6 +121067,30 @@ msgid "Rigid Body World has no associated physics data to export" msgstr "El entorno de cuerpos rígidos no contiene datos dinámicos asociados que exportar" +msgid "3D Local View " +msgstr "Vista 3D local" + + +msgid "3D View " +msgstr "Vista 3D" + + +msgid "Frame:" +msgstr "Fotograma:" + + +msgid "Time:" +msgstr "Tiempo:" + + +msgid "Mem:%.2fM (Peak %.2fM)" +msgstr "Mem:%.2fM (Pico %.2fM)" + + +msgid "Mem:%.2fM, Peak: %.2fM" +msgstr "Mem:%.2fM, Pico: %.2fM" + + msgid "Cannot write a single file with an animation format selected" msgstr "No es posible guardar un único archivo con el formato de animación seleccionado" @@ -121697,6 +122405,10 @@ msgid "Can't Load Image" msgstr "No es posible cargar la imagen" +msgid "%d × %d, " +msgstr "%d × %d, " + + msgid "%d float channel(s)" msgstr "%d canal(es) decimal(es)" @@ -122153,6 +122865,10 @@ msgid "Color field based on:" msgstr "Campo de color basado en:" +msgid "• {}" +msgstr "• {}" + + msgid "Empty Geometry" msgstr "Geometría vacía" @@ -122217,6 +122933,10 @@ msgid "Accessed named attributes:" msgstr "Atributos con nombre accedidos:" +msgid " • \"{}\": " +msgstr " • \"{}\": " + + msgid "read" msgstr "leer" @@ -124229,62 +124949,6 @@ msgid "No active object or active object isn't a GPencil object" msgstr "No hay ningún objeto activo o el objeto activo no es un objeto de Lápiz de cera" -msgid "Object type mismatch, Alembic object path pointed to Camera when importing, but not any more." -msgstr "Tipo de objeto no coincidente, la ruta del objeto Alembic apuntaba hacia una Cámara al ser importado, pero ya no lo hace." - - -msgid "Object type mismatch, Alembic object path points to Camera." -msgstr "Tipo de objeto no coincidente, la ruta del objeto Alembic apunta hacia una Cámara." - - -msgid "Object type mismatch, Alembic object path pointed to Curves when importing, but not any more." -msgstr "Tipo de objeto no coincidente, la ruta del objeto Alembic apuntaba hacia Curvas al ser importado, pero ya no lo hace." - - -msgid "Object type mismatch, Alembic object path points to Curves." -msgstr "Tipo de objeto no coincidente, la ruta del objeto Alembic apunta hacia Curvas." - - -msgid "Object type mismatch, Alembic object path pointed to PolyMesh when importing, but not any more." -msgstr "Tipo de objeto no coincidente, la ruta del objeto Alembic apuntaba hacia una Malla poligonal al ser importado, pero ya no lo hace." - - -msgid "Object type mismatch, Alembic object path points to PolyMesh." -msgstr "Tipo de objeto no coincidente, la ruta del objeto Alembic apunta hacia una Malla poligonal." - - -msgid "Object type mismatch, Alembic object path pointed to SubD when importing, but not any more." -msgstr "Tipo de objeto no coincidente, la ruta del objeto Alembic apuntaba hacia una Superficie de subdivisión al ser importado, pero ya no lo hace." - - -msgid "Object type mismatch, Alembic object path points to SubD." -msgstr "Tipo de objeto no coincidente, la ruta del objeto Alembic apunta hacia una Superficie de subdivisión." - - -msgid "Object type mismatch, Alembic object path pointed to NURBS when importing, but not any more." -msgstr "Tipo de objeto no coincidente, la ruta del objeto Alembic apuntaba hacia NURBS al ser importado, pero ya no lo hace." - - -msgid "Object type mismatch, Alembic object path points to NURBS." -msgstr "Tipo de objeto no coincidente, la ruta del objeto Alembic apunta hacia NURBS." - - -msgid "Object type mismatch, Alembic object path pointed to Points when importing, but not any more." -msgstr "Tipo de objeto no coincidente, la ruta del objeto Alembic apuntaba hacia Puntos al ser importado, pero ya no lo hace." - - -msgid "Object type mismatch, Alembic object path points to Points." -msgstr "Tipo de objeto no coincidente, la ruta del objeto Alembic apunta hacia Puntos." - - -msgid "Object type mismatch, Alembic object path pointed to XForm when importing, but not any more." -msgstr "Tipo de objeto no coincidente, la ruta del objeto Alembic apuntaba hacia XForm al ser importado, pero ya no lo hace." - - -msgid "Object type mismatch, Alembic object path points to XForm." -msgstr "Tipo de objeto no coincidente, la ruta del objeto Alembic apunta hacia XForm." - - msgid "Could not open Alembic archive for reading, see console for detail" msgstr "¡No fue posible abrir el archivo Alembic para lectura! Ver la consola para más detalles" @@ -126915,6 +127579,11 @@ msgid "End Radius" msgstr "Radio final" +msgctxt "NodeTree" +msgid "Rotations" +msgstr "Rotaciones" + + msgid "Number of points in one rotation of the spiral" msgstr "Cantidad de puntos en un ciclo de la espiral" @@ -128660,18 +129329,6 @@ msgid "%s: failed to load '%s'" msgstr "%s: falla al cargar '%s'" -msgid "reading render result: dimensions don't match, expected %dx%d" -msgstr "leyendo resultado del procesamiento: las dimensiones no coinciden, se esperaba %dx%d" - - -msgid "reading render result: expected channel \"%s.%s\" or \"%s\" not found" -msgstr "leyendo resultado del procesamiento: no se encontraron los canales esperados \"%s.%s\" o \"%s\"" - - -msgid "reading render result: expected channel \"%s.%s\" not found" -msgstr "leyendo resultado del procesamiento: no se encontró el canal esperado \"%s.%s\"" - - msgctxt "Sequence" msgid "Color Balance" msgstr "Balance de color" @@ -129091,6 +129748,10 @@ msgid "Property from path '%s' has length %d instead of %d" msgstr "La propiedad de la ruta '%s' tiene longitud %d en vez de %d" +msgid "%d × %s: %.4f ms, average: %.8f ms" +msgstr "%d × %s: %.4f ms, promedio: %.8f ms" + + msgctxt "WindowManager" msgid "Limited Platform Support" msgstr "Plataforma con soporte limitado" @@ -129518,6 +130179,10 @@ msgid "whole milk" msgstr "leche entera" +msgid "internal" +msgstr "interno" + + msgid "Blurry Footage" msgstr "Película borrosa" diff --git a/locale/po/eu.po b/locale/po/eu.po index c0a4a1c18da..ff194ec3238 100644 --- a/locale/po/eu.po +++ b/locale/po/eu.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Ainhize & Miriam \n" "Language-Team: Euskara \n" diff --git a/locale/po/fa.po b/locale/po/fa.po index e16df34ab07..7c331466329 100644 --- a/locale/po/fa.po +++ b/locale/po/fa.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2012-10-31 17:00-0800\n" "Last-Translator: Amin Babaeipanah \n" "Language-Team: LeoMoon Studios \n" diff --git a/locale/po/fi.po b/locale/po/fi.po index ad8f49d2169..d65a6bed7a6 100644 --- a/locale/po/fi.po +++ b/locale/po/fi.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" diff --git a/locale/po/fr.po b/locale/po/fr.po index 5fa0feae542..ed2c7b35d27 100644 --- a/locale/po/fr.po +++ b/locale/po/fr.po @@ -1,10 +1,10 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2023-07-02 18:46+0200\n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"PO-Revision-Date: 2023-07-08 13:52+0200\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "Last-Translator: Damien Picard (pioverfour) \n" "Language-Team: French https://wiki.blender.org/wiki/Process/Translate_Blender/French_Team\n" "Language: fr\n" @@ -1286,6 +1286,10 @@ msgid "Quaternion" msgstr "Quaternion" +msgid "Floating point quaternion rotation" +msgstr "Rotation en quaternions à virgule flottante" + + msgid "Domain" msgstr "Domaine" @@ -1419,13 +1423,21 @@ msgstr "Attribut de géométrie contenant des vecteurs 2D d’entiers" msgid "Integer Attribute" -msgstr "Attribut Entier" +msgstr "Attribut entier" msgid "Geometry attribute that stores integer values" msgstr "Attribut de géométrie contenant des valeurs entières" +msgid "Quaternion Attribute" +msgstr "Attribut quaternion" + + +msgid "Geometry attribute that stores rotation" +msgstr "Attribut de géométrie contenant des rotations" + + msgid "String Attribute" msgstr "Attribut texte" @@ -2018,6 +2030,10 @@ msgid "Grease Pencil" msgstr "Crayon gras" +msgid "Grease Pencil data-blocks" +msgstr "Blocs de données crayon gras" + + msgid "Hair Curves" msgstr "Courbes de poils" @@ -2206,6 +2222,10 @@ msgid "Simulations" msgstr "Simulations" +msgid "Simulation data-blocks" +msgstr "Blocs de données simulation" + + msgid "Sounds" msgstr "Sons" @@ -2518,6 +2538,14 @@ msgid "Collection of screens" msgstr "Collection d’écrans" +msgid "Main Simulations" +msgstr "Simulations du Main" + + +msgid "Collection of simulations" +msgstr "Collection de simulation" + + msgid "Main Sounds" msgstr "Sons du Main" @@ -3384,10 +3412,18 @@ msgid "Bone Matrix" msgstr "Matrice de l’os" +msgid "3×3 bone matrix" +msgstr "Matrice 3×3 de l’os" + + msgid "Bone Armature-Relative Matrix" msgstr "Matrice de l’os relative à l’armature" +msgid "4×4 bone matrix relative to armature" +msgstr "Matrice 4×4 de l’os, relativement à l’armature" + + msgid "Parent" msgstr "Parent" @@ -4639,6 +4675,11 @@ msgid "Path of an object inside of an Alembic archive" msgstr "Chemin d’un objet au sein d’une archive Alembic" +msgctxt "File browser" +msgid "Path" +msgstr "Chemin" + + msgid "Object path" msgstr "Chemin d’objet" @@ -5634,6 +5675,22 @@ msgid "The inputs are invalid, or the algorithm has been improperly called" msgstr "Les données en entrée sont invalides, ou l’algorithme n’a pas été invoqué correctement" +msgid "Collection Child" +msgstr "Enfant de collection" + + +msgid "Child collection with its collection related settings" +msgstr "Enfant de collection avec ses réglages liés à la collection" + + +msgid "Light Linking" +msgstr "Liaison d’éclairage" + + +msgid "Light linking settings of the collection object" +msgstr "Réglages de liaison d’éclairage pour l’objet collection" + + msgid "Collection Children" msgstr "Collection d’enfants" @@ -5642,6 +5699,22 @@ msgid "Collection of child collections" msgstr "Collection de collections enfants" +msgid "Collection Light Linking" +msgstr "Liaison d’éclairage de collection" + + +msgid "Light linking settings of objects and children collections of a collection" +msgstr "Réglages de liaison d’éclairage des objets et collections enfants d’une collection" + + +msgid "Link State" +msgstr "État de la liaison" + + +msgid "Light or shadow receiving state of the object or collection" +msgstr "État de réception de lumière ou d’ombre de l’objet ou collection" + + msgid "Include" msgstr "Inclure" @@ -5650,6 +5723,18 @@ msgid "Exclude" msgstr "Exclure" +msgid "Collection Object" +msgstr "Objet collection" + + +msgid "Object of a collection with its collection related settings" +msgstr "Objet d’une collection avec ses réglages liés à la collection" + + +msgid "Light linking settings of the collection" +msgstr "Réglages de liaison de lumière de la collection" + + msgid "Collection Objects" msgstr "Objets de collection" @@ -9811,6 +9896,11 @@ msgid "Font" msgstr "Police" +msgctxt "ID" +msgid "Grease Pencil (legacy)" +msgstr "Crayon gras (obsolète)" + + msgctxt "ID" msgid "Grease Pencil" msgstr "Crayon gras" @@ -10288,6 +10378,31 @@ msgid "Multiplier for wave influence of this brush" msgstr "Multiplicateur pour l’influence de cette brosse sur les vagues" +msgctxt "Simulation" +msgid "Wave Type" +msgstr "Type de vague" + + +msgctxt "Simulation" +msgid "Depth Change" +msgstr "Changement de profondeur" + + +msgctxt "Simulation" +msgid "Obstacle" +msgstr "Obstacle" + + +msgctxt "Simulation" +msgid "Force" +msgstr "Force" + + +msgctxt "Simulation" +msgid "Reflect Only" +msgstr "Refléter uniquement" + + msgid "Canvas Settings" msgstr "Réglages de la toile" @@ -10556,6 +10671,10 @@ msgid "Anti-Aliasing" msgstr "Anticrénelage" +msgid "Use 5× multisampling to smooth paint edges" +msgstr "Utiliser un multiéchantillonnage ×5 pour adoucir les bords de la peinture" + + msgid "Enable to make surface changes disappear over time" msgstr "Activer pour faire disparaître les changements de la surface avec le temps" @@ -12090,10 +12209,50 @@ msgid "Adjust the offset to the beginning/end" msgstr "Ajuster le décalage au début/à la fin" +msgctxt "ParticleSettings" +msgid "Kink" +msgstr "Entortillement" + + msgid "Type of periodic offset on the curve" msgstr "Type de décalage périodique sur la courbe" +msgctxt "ParticleSettings" +msgid "None" +msgstr "Aucun" + + +msgctxt "ParticleSettings" +msgid "Braid" +msgstr "Tresse" + + +msgctxt "ParticleSettings" +msgid "Curl" +msgstr "Boucle" + + +msgctxt "ParticleSettings" +msgid "Radial" +msgstr "Radial" + + +msgctxt "ParticleSettings" +msgid "Roll" +msgstr "Roulis" + + +msgctxt "ParticleSettings" +msgid "Rotation" +msgstr "Rotation" + + +msgctxt "ParticleSettings" +msgid "Wave" +msgstr "Vague" + + msgid "The distance from which particles are affected fully" msgstr "La distance à partir de laquelle les particules sont totalement affectées" @@ -12703,10 +12862,6 @@ msgid "Show scenes" msgstr "Afficher les scènes" -msgid "Show materials, nodetrees, textures and Freestyle's linestyles" -msgstr "Afficher les matériaux, arborescences de nœuds, textures et styles de lignes Freestyle" - - msgid "Directory" msgstr "Dossier" @@ -18716,6 +18871,34 @@ msgid "Grid scale" msgstr "Échelle de grille" +msgid "Collection of related drawings" +msgstr "Collection de dessins apparentés" + + +msgid "Set layer visibility" +msgstr "Définir la visibilité du calque" + + +msgid "Grease Pencil Layer Group" +msgstr "Groupe de calques de crayon gras" + + +msgid "Group of Grease Pencil layers" +msgstr "Groupe de calques de crayon gras" + + +msgid "Set layer group visibility" +msgstr "Définir la visibilité du groupe de calques" + + +msgid "Protect group from further editing and/or frame changes" +msgstr "Protéger le groupe de toute nouvelle édition et/ou changement de frame" + + +msgid "Group name" +msgstr "Nom du groupe" + + msgid "Grease Pencil Layers" msgstr "Calques de crayon gras" @@ -18760,6 +18943,10 @@ msgid "Active index in layer mask array" msgstr "Indice actif dans le tableau des calques de masque" +msgid "Collection of Grease Pencil layers" +msgstr "Collection de calques de crayon gras" + + msgid "Active Grease Pencil layer" msgstr "Calque de crayon gras actif" @@ -21598,6 +21785,14 @@ msgid "Collections that are immediate children of this collection" msgstr "Collections qui sont les enfants immédiats de cette collection" +msgid "Children collections their parent-collection-specific settings" +msgstr "Collections enfants et leurs réglages liés à la collection parente" + + +msgid "Objects of the collection with their parent-collection-specific settings" +msgstr "Objets de la collection et leurs réglages liés à la collection parente" + + msgid "Collection Color" msgstr "Couleur de la collection" @@ -22262,10 +22457,6 @@ msgid "Whether the selected text is italics" msgstr "Est-ce que le texte sélectionné est en italique" -msgid "Selected Smallcaps" -msgstr "Petites capitales sélectionnées" - - msgid "Whether the selected text is small caps" msgstr "Est-ce que le texte sélectionné est en petites capitales" @@ -23326,6 +23517,18 @@ msgid "Grease Pencil data-block" msgstr "Bloc de données crayon gras" +msgid "Layer Groups" +msgstr "Groupes de calques" + + +msgid "Grease Pencil layer groups" +msgstr "Groupes de calques de crayon gras" + + +msgid "Grease Pencil layers" +msgstr "Calques de crayon gras" + + msgid "Image data-block referencing an external or packed image" msgstr "Bloc de données image référençant une image externe ou empaquetée" @@ -23959,10 +24162,6 @@ msgid "Diffuse reflection multiplier" msgstr "Multiplicateur pour la réflexion diffuse" -msgid "Falloff distance - the light is at half the original intensity at this point" -msgstr "Distance d’atténuation – la lumière est à la moitié de son intensité de départ à cette distance" - - msgid "Node tree for node based lights" msgstr "Arborescence de nœuds pour les éclairages basés sur les nœuds" @@ -24048,14 +24247,6 @@ msgid "Directional area Light" msgstr "Éclairage zone directionnel" -msgid "Constant Coefficient" -msgstr "Coefficient constant" - - -msgid "Constant distance attenuation coefficient" -msgstr "Coefficient d’atténuation de distance constante" - - msgid "Contact Shadow Bias" msgstr "Biais d’ombres au contact" @@ -24089,66 +24280,6 @@ msgid "Light energy emitted over the entire area of the light in all directions" msgstr "L’énergie de la lumière émise sur toute la surface de l’éclairage dans toutes les directions" -msgid "Custom light falloff curve" -msgstr "Courbe d’atténuation lumineuse personnalisée" - - -msgid "Falloff Type" -msgstr "Type d’atténuation" - - -msgid "Intensity Decay with distance" -msgstr "Décroissance de l’intensité avec la distance" - - -msgid "Inverse Linear" -msgstr "Linéaire inverse" - - -msgid "Inverse Square" -msgstr "Quadratique inverse" - - -msgid "Inverse Coefficients" -msgstr "Inverse avec coefficients" - - -msgid "Lin/Quad Weighted" -msgstr "Linéaire/quadratique pondérée" - - -msgid "Linear Attenuation" -msgstr "Atténuation linéaire" - - -msgid "Linear distance attenuation" -msgstr "Atténuation de distance linéaire" - - -msgid "Linear Coefficient" -msgstr "Coefficient linéaire" - - -msgid "Linear distance attenuation coefficient" -msgstr "Coefficient de l’atténuation de distance linéaire" - - -msgid "Quadratic Attenuation" -msgstr "Atténuation quadratique" - - -msgid "Quadratic distance attenuation" -msgstr "Atténuation de distance quadratique" - - -msgid "Quadratic Coefficient" -msgstr "Coefficient quadratique" - - -msgid "Quadratic distance attenuation coefficient" -msgstr "Coefficient de l’atténuation de distance quadratique" - - msgid "Shadow Buffer Bias" msgstr "Biais du tampon d’ombre" @@ -24165,22 +24296,6 @@ msgid "Shadow map clip start, below which objects will not generate shadows" msgstr "Découpage lointain de la carte d’ombrage, au-delà duquel les objets ne généreront pas d’ombre" -msgid "Samples" -msgstr "Échantillons" - - -msgid "Number of shadow buffer samples" -msgstr "Nombre d’échantillons du tampon d’ombre" - - -msgid "Shadow Buffer Size" -msgstr "Taille du tampon d’ombre" - - -msgid "Resolution of the shadow buffer, higher values give crisper shadows but use more memory" -msgstr "Résolution du tampon d’ombre, des valeurs plus élevées donnent des ombres plus nettes, mais utilisent plus de mémoire" - - msgid "Shadow Color" msgstr "Couleur d’ombre" @@ -24349,6 +24464,14 @@ msgid "Control how fast the probe influence decreases" msgstr "Contrôle à quelle vitesse l’influence de la sonde diminue" +msgid "Bake Samples" +msgstr "Échantillons de précalcul" + + +msgid "Number of ray directions to evaluate when baking" +msgstr "Nombre de directions de rayons à évaluer lors du précalcul" + + msgid "Resolution X" msgstr "Résolution X" @@ -24437,6 +24560,14 @@ msgid "Show the parallax correction volume in the 3D view" msgstr "Afficher le volume de correction de parallaxe dans la vue 3D" +msgid "Surfel Density" +msgstr "Densité de surfels" + + +msgid "Number of surfels per unit distance (higher values improve quality)" +msgstr "Nombre de surfels (éléments de surface) par unité de distance (une valeur plus élevée améliore la qualité)" + + msgid "Type of light probe" msgstr "Type de sonde lumière" @@ -25322,6 +25453,14 @@ msgid "Node tree outputs" msgstr "Sorties de l’arborescence de nœuds" +msgid "Panels" +msgstr "Panneaux" + + +msgid "UI panels for structuring the node tree interface" +msgstr "Panneaux d’interface pour structurer l’interface de l’arborescence de nœuds" + + msgid "Node Tree type (deprecated, bl_idname is the actual node tree type identifier)" msgstr "Type d’arborescence de nœuds (obsolète, bl_idname est le vrai identifiant d’arborescence de nœuds)" @@ -25374,6 +25513,54 @@ msgid "Max size of a tile (smaller values gives better distribution of multiple msgstr "Taille maximale d’une tuile (de plus petites valeurs donnent une meilleure distribution sur plusieurs threads, mais réclament plus de travail de gestion)" +msgid "32×32" +msgstr "32×32" + + +msgid "Chunksize of 32×32" +msgstr "Taille d’élément de 32×32" + + +msgid "64×64" +msgstr "64×64" + + +msgid "Chunksize of 64×64" +msgstr "Taille d’élément de 64×64" + + +msgid "128×128" +msgstr "128×128" + + +msgid "Chunksize of 128×128" +msgstr "Taille d’élément de 128×128" + + +msgid "256×256" +msgstr "256×256" + + +msgid "Chunksize of 256×256" +msgstr "Taille d’élément de 256×256" + + +msgid "512×512" +msgstr "512×512" + + +msgid "Chunksize of 512×512" +msgstr "Taille d’élément de 512×512" + + +msgid "1024×1024" +msgstr "1024×1024" + + +msgid "Chunksize of 1024×1024" +msgstr "Taille d’élément de 1024×1024" + + msgid "Edit Quality" msgstr "Qualité d’édition" @@ -25426,6 +25613,14 @@ msgid "Composites full image result as fast as possible" msgstr "Compositer l’image entière aussi vite que possible" +msgid "Realtime GPU" +msgstr "GPU temps réel" + + +msgid "Use GPU accelerated compositing with more limited functionality" +msgstr "Utiliser le compositing avec accélération GPU, mais des fonctionnalités plus limitées" + + msgid "Render Quality" msgstr "Qualité au rendu" @@ -25742,10 +25937,30 @@ msgid "Origin offset distance" msgstr "Distance de décalage de l’origine" +msgctxt "Image" +msgid "Empty Image Side" +msgstr "Côté de l’objet vide image" + + msgid "Show front/back side" msgstr "Afficher l’avant ou l’arrière" +msgctxt "Image" +msgid "Both" +msgstr "Les deux" + + +msgctxt "Image" +msgid "Front" +msgstr "Devant" + + +msgctxt "Image" +msgid "Back" +msgstr "Derrière" + + msgid "Settings for using the object as a field in physics simulation" msgstr "Réglages pour utiliser l’objet comme un champ de force dans une simulation physique" @@ -25830,6 +26045,10 @@ msgid "Only render shadows and reflections on this object, for compositing rende msgstr "Ne rendre que les ombres et réflexions pour cet objet, pour compositer des rendus dans des prises de vue réelles. On considère que les objets avec ce réglage existent déjà dans le plan, les objets sans sont des objets de synthèse composités dans le plan" +msgid "Light linking settings" +msgstr "Réglages de liaison de lumière" + + msgid "Lightgroup" msgstr "Groupe d’éclairage" @@ -26206,6 +26425,10 @@ msgid "Shape Key Lock" msgstr "Verrouiller la clé de forme" +msgid "Only show the active shape key at full value" +msgstr "N’afficher que la clé de forme active, avec son effet au maximum" + + msgid "Display Texture Space" msgstr "Afficher l’espace de texture" @@ -26322,6 +26545,10 @@ msgid "Shape Key Edit Mode" msgstr "Clés de forme en mode édition" +msgid "Display shape keys in edit mode (for meshes only)" +msgstr "Afficher les clés de forme en mode édition (pour les maillages uniquement)" + + msgid "Use Simulation Cache" msgstr "Utiliser le cache de simulation" @@ -26826,6 +27053,16 @@ msgid "Type of periodic offset on the path" msgstr "Type de décalage périodique sur le chemin" +msgctxt "ParticleSettings" +msgid "Nothing" +msgstr "Aucun" + + +msgctxt "ParticleSettings" +msgid "Spiral" +msgstr "Spirale" + + msgid "Amplitude Clump" msgstr "Amplitude d’agglutination" @@ -28056,6 +28293,14 @@ msgid "Top-Left 3D Editor" msgstr "Éditeur 3D en haut à gauche" +msgid "Simulation data-block" +msgstr "Blocs de données simulation" + + +msgid "Node tree defining the simulation" +msgstr "Arborescence de nœuds définissant la simulation" + + msgid "Sound data-block referencing an external or packed sound file" msgstr "Bloc de données son référençant un fichier son externe ou empaqueté" @@ -29453,6 +29698,14 @@ msgid "Maintained by community developers" msgstr "Maintenus par les développeurs de la communauté" +msgid "Testing" +msgstr "En test" + + +msgid "Newly contributed scripts (excluded from release builds)" +msgstr "Scripts ajoutés récemment (exclus des versions release)" + + msgid "Asset Blend Path" msgstr "Chemin du blend d’asset" @@ -30205,6 +30458,10 @@ msgid "Format of multiview media" msgstr "Format de média multivues" +msgid "Multi-View" +msgstr "Multivues" + + msgid "Tile Number" msgstr "Numéro de tuile" @@ -31389,21 +31646,37 @@ msgid "Media Play/Pause" msgstr "Média lecture/pause" +msgid "⏯" +msgstr "⏯" + + msgctxt "UI_Events_KeyMaps" msgid "Media Stop" msgstr "Média arrêt" +msgid "⏹" +msgstr "⏹" + + msgctxt "UI_Events_KeyMaps" msgid "Media First" msgstr "Média précédent" +msgid "⏮" +msgstr "⏮" + + msgctxt "UI_Events_KeyMaps" msgid "Media Last" msgstr "Média suivant" +msgid "⏭" +msgstr "⏭" + + msgctxt "UI_Events_KeyMaps" msgid "Text Input" msgstr "Entrée texte" @@ -34155,6 +34428,14 @@ msgid "Add Attribute" msgstr "Ajouter un attribut" +msgid "Light Linking Specials" +msgstr "Opérations de liaison de lumière" + + +msgid "Shadow Linking Specials" +msgstr "Opérations de liaison d’ombre" + + msgid "Bone Group Specials" msgstr "Opérations de groupes d’os" @@ -34219,6 +34500,10 @@ msgid "F-Curve Context Menu" msgstr "Menu contextuel de F-courbe" +msgid "Add Extra" +msgstr "Opérations de calques" + + msgid "Mask Context Menu" msgstr "Menu contextuel de masque" @@ -35189,6 +35474,10 @@ msgid "Minimum for measuring thickness" msgstr "Minimum pour la mesure de l’épaisseur" +msgid "Samples" +msgstr "Échantillons" + + msgid "Number of samples to test per face" msgstr "Nombre d’échantillons à tester par face" @@ -42223,6 +42512,10 @@ msgid "Colors are treated alpha premultiplied, or colors output straight (alpha msgstr "Les couleurs sont traitées prémultipliées par l’alpha, ou elles sont affichées directes (l’alpha est mis à 1)" +msgid "Convert Colorspace" +msgstr "Convertir l’espace de couleur" + + msgid "From" msgstr "Depuis" @@ -42555,6 +42848,11 @@ msgid "Distance to grow/shrink (number of iterations)" msgstr "Distance à laquelle agrandir/diminuer (nombre d’itérations)" +msgctxt "Image" +msgid "Edge" +msgstr "Contour" + + msgid "Edge to inset" msgstr "Contour à décaler" @@ -42904,14 +43202,42 @@ msgid "Tracking Object" msgstr "Objet de suivi" +msgid "Kuwahara" +msgstr "Kuwahara" + + +msgid "Size of filter. Larger values give stronger stylized effect" +msgstr "Taille du filtre. Une valeur plus élevée donne un effet plus fort et stylisé" + + msgid "Smoothing" msgstr "Lissage" +msgid "Smoothing degree before applying filter. Higher values remove details and give smoother edges" +msgstr "Degré d’adoucissement avant l’application du filtre. Une valeur plus élevée supprime des détails et donne des bords plus doux" + + +msgid "Variation of Kuwahara filter to use" +msgstr "Variante du filtre de Kuwahara à utiliser" + + +msgid "Classic" +msgstr "Classique" + + +msgid "Fast but less accurate variation" +msgstr "Variante rapide mais moins précise" + + msgid "Anisotropic" msgstr "Anisotrope" +msgid "Accurate but slower variation" +msgstr "Variation précise mais plus lente" + + msgid "Lens Distortion" msgstr "Distorsion optique" @@ -44244,6 +44570,14 @@ msgid "Create a mesh that encloses all points in the input geometry with the sma msgstr "Créer un maillage contenant tous les points de la géométrie d’entrée, avec le plus petit nombre de points possible" +msgid "Corners of Edge" +msgstr "Coins de l’arête" + + +msgid "Retrieve face corners connected to edges" +msgstr "Obtenir les coins de faces connectés aux arêtes" + + msgid "Corners of Face" msgstr "Coins de la face" @@ -46130,6 +46464,10 @@ msgid "Multiscatter GGX" msgstr "GGX multidiffusions" +msgid "GGX with additional correction to account for multiple scattering, preserve energy and prevent unexpected darkening at high roughness" +msgstr "GGX avec une correction supplémentaire pour tenir compte des diffusions multiples, préserver l’énergie et empêcher un assombrissement inattendu pour des valeurs élevées de rugosité" + + msgid "Diffuse BSDF" msgstr "BSDF diffuse" @@ -47454,6 +47792,10 @@ msgid "Computes the radius of the n-sphere inscribed in the voronoi cell" msgstr "Calculer le rayon de la n-sphère inscrite dans la cellule de Voronoï" +msgid "Normalize output Distance to 0.0 to 1.0 range" +msgstr "Normaliser la distance de sortie dans l’intervalle de 0.0 à 1.0" + + msgid "Wave Texture" msgstr "Texture onde" @@ -48037,6 +48379,34 @@ msgid "Node Outputs" msgstr "Sorties de nœud" +msgid "Panel in the node group interface" +msgstr "Panneau dans l’interface du groupe de nœuds" + + +msgid "Name of the socket panel" +msgstr "Nom du panneau de prise" + + +msgid "Node Tree Socket Panels" +msgstr "Panneaux de prises d’arborescence de nœuds" + + +msgid "Collection of socket panels in a node tree" +msgstr "Collection de panneaux de prises dans une arborescence de nœuds" + + +msgid "Active panel" +msgstr "Panneau actif" + + +msgid "Active Index" +msgstr "Indice actif" + + +msgid "Index of the active panel" +msgstr "Indice du panneau actif" + + msgid "Node Socket" msgstr "Prise de nœud" @@ -48245,6 +48615,14 @@ msgid "Object socket of a node" msgstr "Prise d’objet d’un nœud" +msgid "Rotation Node Socket" +msgstr "Prise de nœud rotation" + + +msgid "Rotation value socket of a node" +msgstr "Prise de valeur rotation d’un nœud" + + msgid "Shader Node Socket" msgstr "Prise de nœud shader" @@ -48321,6 +48699,10 @@ msgid "Hide the socket input value even when the socket is not connected" msgstr "Masquer la valeur d’entrée de la prise même quand elle n’est pas connectée" +msgid "Panel to group sockets together in the UI" +msgstr "Panneau pour regrouper des prises dans l’interface" + + msgid "Boolean Node Socket Interface" msgstr "Interface de prise de nœud booléen" @@ -48365,6 +48747,10 @@ msgid "Object Node Socket Interface" msgstr "Interface de prise de nœud objet" +msgid "Rotation Node Socket Interface" +msgstr "Interface de prise de nœud rotation" + + msgid "Shader Node Socket Interface" msgstr "Interface de prise de nœud shader" @@ -48461,6 +48847,26 @@ msgid "Collection of object grease pencil modifiers" msgstr "Collection de modificateurs d’objet crayon gras" +msgid "Object Light Linking" +msgstr "Liaison de lumière d’objet" + + +msgid "Blocker Collection" +msgstr "Collection bloqueuse" + + +msgid "Collection which defines objects which block light from this emitter" +msgstr "Collection définissant les objets qui bloquent la lumière depuis cet émetteur" + + +msgid "Receiver Collection" +msgstr "Collection receveuse" + + +msgid "Collection which defines light linking relation of this emitter" +msgstr "Collection définissant la relation de liaison de lumière pour cet émetteur" + + msgid "Object Line Art" msgstr "Line Art de l’objet" @@ -52654,10 +53060,31 @@ msgid "(De)select all control points" msgstr "(Dé)sélectionner tous les points de contrôle" +msgctxt "Operator" +msgid "Select Ends" +msgstr "Sélectionner les extrémités" + + msgid "Select end points of curves" msgstr "Sélectionner les extrémités des courbes" +msgid "Amount Back" +msgstr "Nombre à l’arrière" + + +msgid "Number of points to select from the back" +msgstr "Nombre de points à sélectionner depuis l’arrière" + + +msgid "Amount Front" +msgstr "Nombre à l’avant" + + +msgid "Number of points to select from the front" +msgstr "Nombre de points à sélectionner depuis l’avant" + + msgid "Shrink the selection by one point" msgstr "Réduire la sélection d’un point" @@ -54164,7 +54591,7 @@ msgstr "Éclairage" msgid "WARNING: not supported in dupli/group instances" -msgstr "ATTENTION : non pris en charge dans les instances dupli/group" +msgstr "ATTENTION : non pris en charge dans les instances dupli/groupe" msgid "Other" @@ -54736,10 +55163,6 @@ msgid "Force keeping channels for bones" msgstr "Forcer à garder les canaux pour les os" -msgid "if all keyframes are identical in a rig, force keeping the minimal animation. When off, all possible channels for the bones will be exported, even if empty (minimal animation, 2 keyframes)" -msgstr "Si toutes les images clés sont identiques dans un rig, forcer à garder une animation minimale. Si désactivé, tous les canaux possibles pour les os seront exportés, même s’ils sont vides (une animation minimale, 2 images clés)" - - msgid "Force keeping channel for objects" msgstr "Forcer à garder le canal pour les objets" @@ -56129,6 +56552,15 @@ msgid "Name of color attribute" msgstr "Nom de l’attribut de couleur" +msgctxt "Operator" +msgid "Run Node Group" +msgstr "Lancer le groupe de nœuds" + + +msgid "Execute a node group on geometry" +msgstr "Exécuter un groupe de nœuds sur la géométrie" + + msgctxt "Operator" msgid "Gizmo Select" msgstr "Sélectionner le gizmo" @@ -58127,6 +58559,11 @@ msgid "Front" msgstr "Face" +msgctxt "View3D" +msgid "Side" +msgstr "Côté" + + msgctxt "View3D" msgid "Top" msgstr "Dessus" @@ -58635,6 +59072,10 @@ msgid "Blend selected keyframes to their left or right neighbor" msgstr "Mélanger les clés sélectionnées à leur voisine de gauche ou de droite" +msgid "The blend factor with 0 being the current frame" +msgstr "Le facteur de mélange, 0 étant la frame actuelle" + + msgctxt "Operator" msgid "Breakdown" msgstr "Intervalles principaux" @@ -59190,6 +59631,118 @@ msgid "Switch brush to smooth mode for duration of stroke" msgstr "Passer la brosse en mode doux pour la durée du trait" +msgctxt "Operator" +msgid "Grease Pencil Draw Mode Toggle" +msgstr "(Dés)activer l’outil dessin de crayon gras" + + +msgid "Enter/Exit draw mode for grease pencil" +msgstr "Entrer/sortir du mode dessin de crayon gras" + + +msgid "Insert a blank frame on the current scene frame" +msgstr "Insérer une frame vide à la frame actuelle de la scène" + + +msgid "Insert a blank frame in all editable layers" +msgstr "Insérer une frame vide dans tous les calques éditables" + + +msgid "Add a new Grease Pencil layer in the active object" +msgstr "Ajouter un nouveau calque de crayon gras à l’objet actif" + + +msgid "Name of the new layer" +msgstr "Nom du nouveau calque" + + +msgctxt "Operator" +msgid "Add New Layer Group" +msgstr "Ajouter un nouveau groupe de calques" + + +msgid "Add a new Grease Pencil layer group in the active object" +msgstr "Ajouter un nouveau groupe de calques à l’objet actif" + + +msgid "Name of the new layer group" +msgstr "Nom du nouveau groupe de calques" + + +msgid "Remove the active Grease Pencil layer" +msgstr "Supprimer le calque de crayon gras actif" + + +msgctxt "Operator" +msgid "Reorder Layer" +msgstr "Réordonner le calque" + + +msgid "Reorder the active Grease Pencil layer" +msgstr "Réordonner le calque de crayon gras actif" + + +msgid "Above" +msgstr "Dessus" + + +msgid "Below" +msgstr "Dessous" + + +msgid "Target Name" +msgstr "Nom cible" + + +msgid "Name of the target layer" +msgstr "Nom du calque cible" + + +msgid "(De)select all visible strokes" +msgstr "(Dé)sélectionner tous les traits visibles" + + +msgctxt "Operator" +msgid "Select Alternate" +msgstr "Sélectionner alternés" + + +msgid "Select alternated points in strokes with already selected points" +msgstr "Sélectionner des points alternés dans les mêmes traits que les points déjà sélectionnés" + + +msgid "Deselect Ends" +msgstr "Désélectionner les extrémités" + + +msgid "(De)select the first and last point of each stroke" +msgstr "(Dé)sélectionner le premier et le dernier point de chaque trait" + + +msgid "Select end points of strokes" +msgstr "Sélectionner les extrémités des traits" + + +msgid "Amount End" +msgstr "Nombre à la fin" + + +msgid "Number of points to select from the end" +msgstr "Nombre de points à sélectionner depuis la fin" + + +msgid "Amount Start" +msgstr "Nombre au début" + + +msgid "Number of points to select from the start" +msgstr "Nombre de points à sélectionner depuis le début" + + +msgid "Selects random points from the current strokes selection" +msgstr "Sélectionner des points aléatoires dans la sélection de traits actuelle" + + msgctxt "Operator" msgid "Add Render Slot" msgstr "Ajouter un emplacement de rendu" @@ -65110,6 +65663,33 @@ msgid "Remove the active input from a file output node" msgstr "Supprimer l’entrée active d’un nœud de sortie fichier" +msgctxt "Operator" +msgid "Add Panel" +msgstr "Ajouter un panneau" + + +msgid "Add a new panel to the tree" +msgstr "Ajouter un nouveau panneau à l’arborescence" + + +msgctxt "Operator" +msgid "Move Panel" +msgstr "Déplacer le panneau" + + +msgid "Move a panel to another position" +msgstr "Déplacer un panneau vers une nouvelle position" + + +msgctxt "Operator" +msgid "Remove Panel" +msgstr "Supprimer le panneau" + + +msgid "Remove a panel from the tree" +msgstr "Supprimer un panneau de l’arborescence" + + msgid "Attach selected nodes" msgstr "Attacher les nœuds sélectionnés" @@ -65700,10 +66280,26 @@ msgid "Curve from Mesh or Text objects" msgstr "Courbe depuis les objets maillages ou textes" +msgid "Mesh from Curve, Surface, Metaball, Text, or Point Cloud objects" +msgstr "Maillage depuis les objets courbes, surfaces, métaballes, textes, ou nuages de points" + + +msgid "Grease Pencil (legacy) from Curve or Mesh objects" +msgstr "Crayon gras (obsolète) depuis les objets courbes ou maillages" + + +msgid "Point Cloud from Mesh objects" +msgstr "Nuage de points depuis les objets maillages" + + msgid "Curves from evaluated curve data" msgstr "Courbes depuis les données évaluées" +msgid "Grease Pencil from Grease Pencil (legacy)" +msgstr "Crayon gras depuis les crayons gras (obsolètes)" + + msgctxt "Operator" msgid "Copy Global Transform" msgstr "Copier les transformations globales" @@ -65996,6 +66592,15 @@ msgid "Move inputs and outputs from in the modifier to a new node group" msgstr "Déplacer les entrées et sorties à l’intérieur du modificateur vers un nouveau groupe de nœuds" +msgctxt "Operator" +msgid "Add Grease Pencil (legacy)" +msgstr "Ajouter un crayon gras (obsolète)" + + +msgid "Add a Grease Pencil (legacy) object to the scene" +msgstr "Ajouter un objet crayon gras (obsolète) à la scène" + + msgid "Stroke offset for the line art modifier" msgstr "Décalage du tracé pour le modificateur de Line Art" @@ -66369,6 +66974,84 @@ msgid "Add a light object to the scene" msgstr "Ajouter un objet éclairage à la scène" +msgctxt "Operator" +msgid "New Light Linking Collection" +msgstr "Nouvelle collection de liaison de lumière" + + +msgid "Create new light linking collection used by the active emitter" +msgstr "Créer une nouvelle collection de liaison de lumière utilisée par l’émetteur actif" + + +msgctxt "Operator" +msgid "Link Blockers to Emitter" +msgstr "Lier les bloqueurs à l’émetteur" + + +msgid "Light link selected blockers to the active emitter object" +msgstr "Créer une liaison de lumière entre les bloqueurs sélectionnés et l’objet émetteur" + + +msgid "State of the shadow linking" +msgstr "État de la liaison d’ombre" + + +msgid "Include selected blockers to cast shadows from the active emitter" +msgstr "Permettre aux bloqueurs sélectionnés de projeter des ombres depuis l’émetteur actif" + + +msgid "Exclude selected blockers from casting shadows from the active emitter" +msgstr "Empêcher les bloqueurs sélectionnés de projeter des d’ombres depuis l’émetteur actif" + + +msgctxt "Operator" +msgid "Select Light Linking Blockers" +msgstr "Sélectionner les bloqueurs de liaison de lumière" + + +msgid "Select all objects which block light from this emitter" +msgstr "Sélectionner tous les objets qui bloquent la lumière depuis cet émetteur" + + +msgctxt "Operator" +msgid "Link Receivers to Emitter" +msgstr "Lier les receveurs à l’émetteur" + + +msgid "Light link selected receivers to the active emitter object" +msgstr "Créer une liaison de lumière entre les receveurs sélectionnés et l’objet émetteur" + + +msgid "State of the light linking" +msgstr "État de la liaison de lumière" + + +msgid "Include selected receivers to receive light from the active emitter" +msgstr "Permettre aux receveurs sélectionnés de recevoir de lumière depuis l’émetteur actif" + + +msgid "Exclude selected receivers from receiving light from the active emitter" +msgstr "Empêcher les receveurs sélectionnés de recevoir de lumière depuis l’émetteur actif" + + +msgctxt "Operator" +msgid "Select Light Linking Receivers" +msgstr "Sélectionner les receveurs de liaison de lumière" + + +msgid "Select all objects which receive light from this emitter" +msgstr "Sélectionner tous les objets recevant de la lumière de cet émetteur" + + +msgctxt "Operator" +msgid "Remove From Light Linking Collection" +msgstr "Enlever de la collection de liaison de lumière" + + +msgid "Remove this object or collection from the light linking collection" +msgstr "Enlever cet objet ou collection de la collection de liaison de lumière" + + msgctxt "Operator" msgid "Add Light Probe" msgstr "Ajouter une sonde lumière" @@ -66395,6 +67078,10 @@ msgid "Bake Light Cache" msgstr "Précalculer le cache d’éclairage" +msgid "Bake irradiance volume light cache" +msgstr "Précalculer le cache de lumière du volume d’irradiance" + + msgid "Delay in millisecond before baking starts" msgstr "Délai en millisecondes avant le début du précalcul" @@ -66444,6 +67131,18 @@ msgid "Delete cached indirect lighting" msgstr "Supprimer l’éclairage indirect en cache" +msgid "Delete all light probes' baked lighting data" +msgstr "Supprimer les données d’éclairage précalculées de toutes les sondes lumière" + + +msgid "Only delete selected light probes' baked lighting data" +msgstr "Ne supprimer que les données d’éclairage précalculées des sondes lumière sélectionnées" + + +msgid "Only delete the active light probe's baked lighting data" +msgstr "Ne supprimer que les données d’éclairage précalculées de la sonde lumière active" + + msgctxt "Operator" msgid "Bake Line Art" msgstr "Précalculer Line Art" @@ -68298,6 +68997,11 @@ msgid "Remove vertices which weight is below or equal to this limit" msgstr "Enlever les sommets dont le poids est inférieur ou égal à cette limite" +msgctxt "Operator" +msgid "Duplicate Vertex Group" +msgstr "Dupliquer le groupe de sommets" + + msgid "Make a copy of the active vertex group" msgstr "Faire une copie du groupe de sommets actif" @@ -69719,6 +70423,19 @@ msgid "Select linked faces under the cursor" msgstr "Sélectionner les faces liées sous le curseur" +msgctxt "Operator" +msgid "Select Loop" +msgstr "Sélectionner la boucle" + + +msgid "Select face loop under the cursor" +msgstr "Sélectionner la boucle de faces sous le curseur" + + +msgid "If false, faces will be deselected" +msgstr "Si faux, les faces seront désélectionnées" + + msgid "Select Faces connected to existing selection" msgstr "Sélectionner les faces connectées à la sélection actuelle" @@ -71553,6 +72270,15 @@ msgid "Remove existing theme file if exists" msgstr "Supprimer le fichier de thème existant, si présent" +msgctxt "Operator" +msgid "Remove File Association" +msgstr "Supprimer l’association de fichiers" + + +msgid "Remove this installation's associations with .blend files" +msgstr "Supprimer les associations de fichers .blend de cette installation" + + msgctxt "Operator" msgid "Add New Cache" msgstr "Ajouter un nouveau cache" @@ -73202,6 +73928,10 @@ msgid "Generic sculpt expand operator" msgstr "Opérateur d’expansion générique pour la sculpture" +msgid "Falloff Type" +msgstr "Type d’atténuation" + + msgid "Initial falloff of the expand operation" msgstr "Atténuation initiale de l’opération d’expansion" @@ -74124,6 +74854,18 @@ msgid "The effect inputs to swap" msgstr "Les entrées de l’effet à intervertir" +msgid "A → B" +msgstr "A → B" + + +msgid "B → C" +msgstr "B → C" + + +msgid "A → C" +msgstr "A → C" + + msgctxt "Operator" msgid "Change Effect Type" msgstr "Changer le type d’effet" @@ -74698,6 +75440,75 @@ msgid "Set render size and aspect from active sequence" msgstr "Définir les taille et proportions du rendu d’après la séquence active" +msgctxt "Operator" +msgid "Add Retiming Handle" +msgstr "Ajouter une poignée de reminutage" + + +msgid "Add retiming Handle" +msgstr "Ajouter une poignée de reminutage" + + +msgid "Timeline Frame" +msgstr "Frame de la timeline" + + +msgid "Frame where handle will be added" +msgstr "Frame à laquelle ajouter la poignée" + + +msgctxt "Operator" +msgid "Move Retiming Handle" +msgstr "Déplacer la poignée de reminutage" + + +msgid "Move retiming handle" +msgstr "Déplacer la poignée de reminutage" + + +msgid "Handle Index" +msgstr "Indice de la poignée" + + +msgid "Index of handle to be moved" +msgstr "Indice de la poignée à déplacer" + + +msgctxt "Operator" +msgid "Remove Retiming Handle" +msgstr "Supprimer la poignée de reminutage" + + +msgid "Remove retiming handle" +msgstr "Supprimer la poignée de reminutage" + + +msgid "Index of handle to be removed" +msgstr "Indice de la poignée à supprimer" + + +msgctxt "Operator" +msgid "Reset Retiming" +msgstr "Réinitialiser le reminutage" + + +msgid "Reset strip retiming" +msgstr "Réinitialiser le reminutage de la bande" + + +msgctxt "Operator" +msgid "Set Speed" +msgstr "Définir la vitesse" + + +msgid "Set speed of retimed segment" +msgstr "Définir la vitesse du segment reminuté" + + +msgid "New speed of retimed segment" +msgstr "Nouvelle vitesse du segment reminuté" + + msgid "Use mouse to sample color in current frame" msgstr "Utiliser la souris pour échantillonner une couleur dans l’image actuelle" @@ -75573,6 +76384,15 @@ msgid "Copy the texture settings and nodes" msgstr "Copier les réglages et nœuds de la texture" +msgctxt "Operator" +msgid "Add Text Editor Preset" +msgstr "Ajouter un préréglage d’éditeur de texte" + + +msgid "Add or remove a Text Editor Preset" +msgstr "Ajouter ou supprimer un préréglage d’éditeur de texte" + + msgctxt "Operator" msgid "Text Auto Complete" msgstr "Autocompléter le texte" @@ -75677,10 +76497,36 @@ msgid "Line number to jump to" msgstr "Numéro de la ligne à rejoindre" +msgctxt "Operator" +msgid "Open Text File at point" +msgstr "Ouvrir le fichier texte actuel" + + +msgid "Edit text file in external text editor" +msgstr "Éditer le fichier texte dans l’éditeur de texte externe" + + +msgctxt "Operator" +msgid "Jump to File at Point (Internal)" +msgstr "Ouvrir le fichier texte actuel (éditeur interne)" + + +msgid "Jump to a file for the internal text editor" +msgstr "Aller au fichier dans l’éditeur de texte interne" + + msgid "Column" msgstr "Colonne" +msgid "Column to jump to" +msgstr "Numéro de la colonne à rejoindre" + + +msgid "Line to jump to" +msgstr "Numéro de la ligne à rejoindre" + + msgctxt "Operator" msgid "Line Number" msgstr "Numéro de ligne" @@ -76014,6 +76860,14 @@ msgid "Edge Slide" msgstr "Glisser les arêtes" +msgid "Allow Navigation" +msgstr "Permettre la navigation" + + +msgid "Allow navigation while transforming" +msgstr "Permettre la navigation lors de la transformation" + + msgid "Correct UVs" msgstr "Corriger les UV" @@ -76034,6 +76888,10 @@ msgid "Snap to Elements" msgstr "Aimanter aux éléments" +msgid "Snap to increments" +msgstr "Aimanter aux incréments" + + msgid "Snap to vertices" msgstr "Aimanter aux sommets" @@ -76067,7 +76925,7 @@ msgstr "Aimanter au point le plus proche d’une arête" msgid "Face Project" -msgstr "Projeter sur face" +msgstr "Projeter sur la face" msgid "Face Nearest" @@ -77068,6 +77926,15 @@ msgid "Rename the active item in the data-set view" msgstr "Renommer l’élément actif dans la vue du jeu de données" +msgctxt "Operator" +msgid "View Filter" +msgstr "Filtrer la vue" + + +msgid "Start entering filter text for the data-set in focus" +msgstr "Commencer à entrer du texte pour filtrer l’ensemble de données" + + msgctxt "Operator" msgid "Align" msgstr "Aligner" @@ -77142,6 +78009,10 @@ msgid "Axis to align to" msgstr "Axe sur lequel aligner" +msgid "Correct Aspect" +msgstr "Corriger l’aspect" + + msgid "Method to calculate rotation angle" msgstr "Méthode de calcul de l’angle de rotation" @@ -77201,10 +78072,6 @@ msgid "Clip UV coordinates to bounds after unwrapping" msgstr "Restreindre les coordonnées UV aux limites après dépliage" -msgid "Correct Aspect" -msgstr "Corriger l’aspect" - - msgid "Map UVs taking image aspect ratio into account" msgstr "Plaquer les UV en prenant en compte les proportions de l’image" @@ -77665,6 +78532,10 @@ msgid "Clear pinning for the selection instead of setting it" msgstr "Effacer l’épinglage de la sélection au lieu de le définir" +msgid "Invert pinning for the selection instead of setting it" +msgstr "Inverser l’épinglage de la sélection au lieu de le définir" + + msgctxt "Operator" msgid "Project from View" msgstr "Projeter depuis vue" @@ -78326,6 +79197,10 @@ msgid "Extrude Individual and Move" msgstr "Extruder individuels et déplacer" +msgid "Allow navigation" +msgstr "Permettre la navigation" + + msgctxt "Operator" msgid "Extrude Manifold Along Normals" msgstr "Extruder manifold le long des normales" @@ -81239,6 +82114,10 @@ msgid "Exit Blender after saving" msgstr "Quitter Blender après avoir enregistré" +msgid "Save the current Blender file with a numerically incremented name that does not overwrite any existing files" +msgstr "Enregistrer le fichier Blender actuel en incrémentant une valeur numérique dans son nom, sans écraser de fichier existant" + + msgctxt "Operator" msgid "Save Preferences" msgstr "Enregistrer les préférences" @@ -81730,10 +82609,6 @@ msgid "Path Mask" msgstr "Masque de chemin" -msgid "Import only the primitive at the given path and its descendents. Multiple paths may be specified in a list delimited by commas or semicolons" -msgstr "N’importer que la primitive au chemin spécifié et ses descendants. Plusieurs chemins peuvent être spécifiés dans une liste délimitée par des virgules ou des points-virgules" - - msgid "Read mesh color attributes" msgstr "Lire les attributs de couleur du maillage" @@ -82873,6 +83748,10 @@ msgid "Shadow Terminator" msgstr "Terminateur d’ombres" +msgid "Shadow Linking" +msgstr "Liaison d’ombre" + + msgid "Ray Visibility" msgstr "Visibilité des rayons" @@ -83302,6 +84181,10 @@ msgid "Predefined node color" msgstr "Couleur de nœud prédéfinie" +msgid "Node Panels" +msgstr "Panneaux de nœuds" + + msgid "Simulation State" msgstr "État de la simulation" @@ -83666,6 +84549,11 @@ msgid "Blade" msgstr "Lame" +msgctxt "Operator" +msgid "Retime" +msgstr "Reminuter" + + msgid "Feature Weights" msgstr "Poids de la fonctionnalité" @@ -83853,6 +84741,10 @@ msgid "Operating System Settings" msgstr "Paramètres du système d’exploitation" +msgid "Text Editor Presets" +msgstr "Préréglages d’éditeur de texte" + + msgid "Bone Color Sets" msgstr "Ensemble de couleurs d’os" @@ -85695,6 +86587,10 @@ msgid "Pose Matrix" msgstr "Matrice de pose" +msgid "Final 4×4 matrix after constraints and drivers are applied, in the armature object space" +msgstr "Matrice 4×4 finale après application des contraintes et contrôleurs, dans l’espace objet de l’armature" + + msgid "Alternative access to location/scale/rotation relative to the parent and own rest bone" msgstr "Accès alternatif aux position/échelle/rotation relativement aux parent et propre os de repos" @@ -85703,6 +86599,10 @@ msgid "Channel Matrix" msgstr "Matrice de canal" +msgid "4×4 matrix of the bone's location/rotation/scale channels (including animation and drivers) and the effect of bone constraints" +msgstr "Matrice 4×4 des canaux position/rotation/échelle de l’os (y compris l’animation et les contrôleurs) et l’effet des contraintes d’os" + + msgid "Parent of this pose bone" msgstr "Parent de cet os de pose" @@ -86300,6 +87200,14 @@ msgid "Enable the new EEVEE codebase, requires restart" msgstr "Activer le nouveau code base d’Eevee, nécessite un redémarrage" +msgid "Overlay Next" +msgstr "Overlay Next" + + +msgid "Enable the new Overlay codebase, requires restart" +msgstr "Activer le nouveau code base des surimpressions, nécessite un redémarrage" + + msgid "Workbench Next" msgstr "Workbench Next" @@ -86348,6 +87256,14 @@ msgid "Enable Cycles debugging options for developers" msgstr "Activer les options de débugage pour les développeurs" +msgid "Experimental Compositors" +msgstr "Compositeurs expérimentaux" + + +msgid "Enable compositor full frame and realtime GPU execution mode options (no tiling, reduces execution time and memory usage)" +msgstr "Activer les options de mode d’exécution « cadre entier » et temps réel pour le compositeur (pas de tuiles, réduit le temps d’exécution et l’utilisation mémoire)" + + msgid "Extended Asset Browser" msgstr "Explorateur d’assets étendu" @@ -86356,6 +87272,14 @@ msgid "Enable Asset Browser editor and operators to manage regular data-blocks a msgstr "Permettre à l’éditeur et aux opérateurs de l’explorateur d’assets de gérer les blocs de données ordinaires en tant qu’assets, pas seulement en tant que poses" +msgid "Grease Pencil 3.0" +msgstr "Crayon gras 3.0" + + +msgid "Enable the new grease pencil 3.0 codebase" +msgstr "Activer le nouveau code base du crayon gras" + + msgid "New Curves Tools" msgstr "Nouveaux outils de courbes" @@ -86380,6 +87304,10 @@ msgid "Enables visibility of the new Volume nodes in the UI" msgstr "Activer la visibilité des nouveaux nœuds de volume dans l’interface" +msgid "Enable node panels UI for grouping sockets in node groups" +msgstr "Activer l’interface de panneaux de nœuds pour regrouper les prises dans les groupes de nœuds" + + msgid "Override Templates" msgstr "Patrons de redéfinition" @@ -86388,6 +87316,14 @@ msgid "Enable library override template in the Python API" msgstr "Activer les patrons de redéfinition de bibliothèque dans l’API Python" +msgid "Rotation Socket" +msgstr "Prise de rotation" + + +msgid "Enable the new rotation node socket type" +msgstr "Activer le nouveau type de prise de nœuds pour les rotations" + + msgid "Sculpt Texture Paint" msgstr "Peinture de texture en mode sculpture" @@ -86620,6 +87556,36 @@ msgid "The directory for storing temporary save files" msgstr "Le répertoire contenant les fichiers temporaires de sauvegarde" +msgid "" +"Command to launch the text editor, either a full path or a command in $PATH.\n" +"Use the internal editor when left blank" +msgstr "" +"Commande pour lancer l’éditeur de texte, avec soit un chemin entier, soit une commande dans le $PATH.\n" +"Utilise l’éditeur interne si laissé vide" + + +msgid "Text Editor Args" +msgstr "Arguments de l’éditeur de texte" + + +msgid "" +"Defines the specific format of the arguments with which the text editor opens files. The supported expansions are as follows:\n" +"\n" +"$filepath The absolute path of the file.\n" +"$line The line to open at (Optional).\n" +"$column The column to open from the beginning of the line (Optional).\n" +"$line0 & column0 start at zero.\n" +"Example: -f $filepath -l $line -c $column" +msgstr "" +"Définit le format spécifique des arguments avec lequel l’éditeur de texte ouvre les fichiers. Les arguments pris en charge sont les suivants :\n" +"\n" +"$filepath Le chemin absolu du fichier.\n" +"$line La ligne à laquelle ouvrir (facultatif).\n" +"$column La colonne à laquelle ouvrir, depuis le début de la ligne (facultatif).\n" +"$line0 et $column0 commencent à zéro.\n" +"Exemple : -f $filepath -l $line -c $column" + + msgid "The default directory to search for textures" msgstr "Le répertoire par défaut des textures" @@ -87104,6 +88070,22 @@ msgid "Quality of anisotropic filtering" msgstr "Qualité du filtrage anisotrope" +msgid "2×" +msgstr "2×" + + +msgid "4×" +msgstr "4×" + + +msgid "8×" +msgstr "8×" + + +msgid "16×" +msgstr "16×" + + msgid "Audio Device" msgstr "Périphérique audio" @@ -87352,6 +88334,14 @@ msgid "Use GLSL shaders for display transform and display image with 2D texture" msgstr "Utiliser les shaders GLSL pour la transformation d’affichage et dessiner l’image avec une texture 2D" +msgid "Is Microsoft Store Install" +msgstr "Est une installation Microsoft Store" + + +msgid "Whether this blender installation is a sandboxed Microsoft Store version" +msgstr "Cette installation de Blender est-elle une version bac à sable du Microsoft Store" + + msgid "Legacy Compute Device Type" msgstr "Ancien type de périphérique de calculs" @@ -87376,6 +88366,14 @@ msgid "Memory cache limit (in megabytes)" msgstr "Limite de mémoire cache (en mégaoctets)" +msgid "Register for All Users" +msgstr "Enregistrer pour tous les utilisateurs" + + +msgid "Make this Blender version open blend files for all users. Requires elevated privileges" +msgstr "Ouvrir les fichiers .blend avec cette version de Blender pour tous les utilisateurs. Nécessite une élévation des privilèges" + + msgid "Maximum number of lines to store for the console buffer" msgstr "Nombre maximum de lignes à conserver dans le tampon de la console" @@ -88797,11 +89795,11 @@ msgstr "Nombre maximum de rebonds effectués par la lumière durant le rendu" msgid "Multiple Importance Sample" -msgstr "Échantillonnage à importance multiple" +msgstr "Échantillonnage à importances multiples" msgid "Use multiple importance sampling for the light, reduces noise for area lights and sharp glossy materials" -msgstr "Utiliser l’échantillonnage à importance multiple pour cet éclairage, réduit le bruit pour les éclairages zone et les matériaux fortement brillants" +msgstr "Utiliser l’échantillonnage à importances multiples pour cet éclairage, réduit le bruit pour les éclairages zone et les matériaux fortement brillants" msgid "Displacement Method" @@ -88836,26 +89834,56 @@ msgid "Combination of true displacement and bump mapping for finer detail" msgstr "Combinaison de déplacement réel et de placage de relief pour plus de détails" +msgctxt "Light" +msgid "Emission Sampling" +msgstr "Échantillonnage d’émission" + + msgid "Sampling strategy for emissive surfaces" msgstr "Stratégie d’échantillonnage pour les surfaces émissives" +msgctxt "Light" +msgid "None" +msgstr "Aucun" + + msgid "Do not use this surface as a light for sampling" msgstr "Ne pas utiliser cette surface comme éclairage pour l’échantillonnage" +msgctxt "Light" +msgid "Auto" +msgstr "Auto" + + msgid "Automatically determine if the surface should be treated as a light for sampling, based on estimated emission intensity" msgstr "Déterminer automatiquement si la surface doit être traitée comme un éclairage pour l’échantillonnage, d’après une estimation de l’intensité de l’émission" +msgctxt "Light" +msgid "Front" +msgstr "Avant" + + msgid "Treat only front side of the surface as a light, usually for closed meshes whose interior is not visible" msgstr "Ne traiter que l’avant de la surface comme un éclairage ; habituellement pour les maillages fermés dont l’intérieur n’est pas visible" +msgctxt "Light" +msgid "Back" +msgstr "Arrière" + + msgid "Treat only back side of the surface as a light for sampling" msgstr "Ne traiter que l’arrière de la surface comme un éclairage pour l’échantillonnage" +msgctxt "Light" +msgid "Front and Back" +msgstr "Avant et arrière" + + msgid "Treat surface as a light for sampling, emitting from both the front and back side" msgstr "Traiter la surface comme un éclairage pour l’échantillonnage, et émettre à la fois depuis l’avant et l’arrière des faces" @@ -88905,7 +89933,7 @@ msgstr "Utiliser l’échantillonnage équiangulaire, à préférer pour les vol msgid "Multiple Importance" -msgstr "Importance multiple" +msgstr "Importances multiples" msgid "Combine distance and equi-angular sampling for volumes where neither method is ideal" @@ -89333,11 +90361,11 @@ msgstr "Le type de stratégie utilisée pour échantillonner les contributions d msgid "Multiple Importance Sampling" -msgstr "Échantillonnage à importance multiple" +msgstr "Échantillonnage à importances multiples" msgid "Multiple importance sampling is used to combine direct light contributions from next-event estimation and forward path tracing" -msgstr "L’échantillonnage à importance multiple est utilisé pour combiner les contributions de lumière directes depuis une estimation de l’évènement suivant, et le lancer de rayon direct" +msgstr "L’échantillonnage à importances multiples est utilisé pour combiner les contributions de lumière directes depuis une estimation de l’évènement suivant, et le lancer de rayon direct" msgid "Forward Path Tracing" @@ -89432,6 +90460,38 @@ msgid "Maximum number of glossy reflection bounces, bounded by total maximum" msgstr "Nombre maximum de rebonds de réflexion brillante, limité par le maximum total" +msgid "Directional Sampling Type" +msgstr "Type d’échantillonnage directionnel" + + +msgid "Type of the directional sampling used for guiding" +msgstr "Type de l’échantillonnage directionnel utilisé pour le guidage" + + +msgid "Diffuse Product MIS" +msgstr "MIS par produit de diffuse" + + +msgid "Guided diffuse BSDF component based on the incoming light distribution and the cosine product (closed form product)" +msgstr "Composant diffus guidé de la BSDF, d’après la distribution de la lumière incidente et le produit du cosinus (produit de forme fermée)" + + +msgid "Re-sampled Importance Sampling" +msgstr "Échantillonnage à importance rééchantillonnée" + + +msgid "Perform RIS sampling to guided based on the product of the incoming light distribution and the BSDF" +msgstr "Effectuer un échantillonnage RIS (échantillonnage à importance rééchantillonnée) guidé d’après le produit de la distribution de la lumière incidente et du BSDF" + + +msgid "Roughness-based" +msgstr "Selon la rugosité" + + +msgid "Adjust the guiding probability based on the roughness of the material components" +msgstr "Ajuster la probabilité de guidage d’après la rugosité des composants du matériau" + + msgid "Guiding Distribution Type" msgstr "Type de distribution de guidage" @@ -89464,6 +90524,14 @@ msgid "Use von Mises-Fisher models as directional distribution" msgstr "Utiliser des modèles de von Mises-Fisher comme distribution directionnelle" +msgid "Guiding Roughness Threshold" +msgstr "Seuil de rugosité de guidage" + + +msgid "The minimal roughness value of a material to apply guiding" +msgstr "Valeur de rugosité minimale d’un matériau pour appliquer le guidage" + + msgid "Training Samples" msgstr "Échantillons d’entraînement" @@ -89873,7 +90941,7 @@ msgstr "Utiliser les poids de MIS" msgid "Use the MIS weight to weight the contribution of directly visible light sources during guiding" -msgstr "Utiliser les poids du MIS (échantillonnage à importance multiple) pour pondérer la contribution des sources lumineuses directement visibles durant le guidage" +msgstr "Utiliser les poids du MIS (échantillonnage à importances multiples) pour pondérer la contribution des sources lumineuses directement visibles durant le guidage" msgid "Layer Samples" @@ -90580,6 +91648,14 @@ msgid "Property that stores arbitrary, user defined properties" msgstr "Propriété qui stocke des propriétés arbitraires, définies par l’utilisateur" +msgid "Quaternion Attribute Value" +msgstr "Valeur d’attribut de quaternion" + + +msgid "Rotation value in geometry attribute" +msgstr "Valeur de rotation dans un attribut de géométrie" + + msgid "Read-only Integer" msgstr "Entier en lecture seule" @@ -91180,6 +92256,10 @@ msgid "Automatic pixel size, depends on the user interface scale" msgstr "Taille de pixel automatique, en fonction de l’échelle de l’interface" +msgid "1×" +msgstr "1×" + + msgid "Render at full resolution" msgstr "Rendre en résolution complète" @@ -91424,6 +92504,10 @@ msgid "Add the file format extensions to the rendered file name (eg: filename + msgstr "Ajouter les extensions de format de fichier aux noms des fichiers rendus (par ex. : nomdefichier + .jpg)" +msgid "Use Freestyle" +msgstr "Utiliser Freestyle" + + msgid "Draw stylized strokes using Freestyle" msgstr "Dessiner des traits stylisés avec Freestyle" @@ -91640,10 +92724,6 @@ msgid "Single stereo camera system, adjust the stereo settings in the camera pan msgstr "Système de caméra stéréo unique, ajuster les réglages stéréo dans le panneau de la caméra" -msgid "Multi-View" -msgstr "Multivues" - - msgid "Multi camera system, adjust the cameras individually" msgstr "Système multicaméras, ajuster les caméras individuellement" @@ -91688,6 +92768,22 @@ msgid "Active index in render view array" msgstr "Indice actif dans le tableau des vues de rendu" +msgid "Retiming Handle" +msgstr "Poignée de reminutage" + + +msgid "Handle mapped to particular frame that can be moved to change playback speed" +msgstr "Poignée correspondant à une frame spécifique et pouvant être déplacée pour changer la vitesse de lecture" + + +msgid "Position of retiming handle in timeline" +msgstr "Position de la poignée de reminutage dans la timeline" + + +msgid "Collection of RetimingHandle" +msgstr "Collection de poignées de reminutage" + + msgid "Constraint influencing Objects inside Rigid Body Simulation" msgstr "Contrainte influençant les objets dans la simulation de corps rigides" @@ -93923,6 +95019,10 @@ msgid "Sequence strip to load a video" msgstr "Bande séquence pour charger une vidéo" +msgid "Retiming Handles" +msgstr "Poignées de reminutage" + + msgid "Stream Index" msgstr "Indice du flux" @@ -94499,6 +95599,14 @@ msgid "Type of filter to use for image transformation" msgstr "Type de filtre à utiliser pour la transformation de l’image" +msgid "Subsampling (3×3)" +msgstr "Sous-échantillonnage (3×3)" + + +msgid "Use nearest with 3×3 subsamples during rendering" +msgstr "Utiliser le plus proche avec 3×3 sous-échantillons durant le rendu" + + msgid "Move along X axis" msgstr "Déplacer le long de l’axe X" @@ -95007,6 +96115,11 @@ msgid "Use object as center of rotation" msgstr "Utiliser un objet comme centre de rotation" +msgctxt "GPencil" +msgid "Wave" +msgstr "Ondulation" + + msgid "Use wave effect" msgstr "Utiliser un effet d’ondulation" @@ -96512,6 +97625,29 @@ msgid "Node tree being displayed and edited" msgstr "Arborescence de nœuds affichée et éditée" +msgctxt "ID" +msgid "Geometry Nodes Type" +msgstr "Type de nœuds de géométrie" + + +msgctxt "ID" +msgid "Modifier" +msgstr "Modificateur" + + +msgid "Edit node group from active object's active modifier" +msgstr "Éditer le groupe de nœuds depuis le modificateur actif de l’objet actif" + + +msgctxt "ID" +msgid "Operator" +msgstr "Opérateur" + + +msgid "Edit any geometry node group for use as an operator" +msgstr "Éditer n’importe quel groupe de nœuds de géométrie, à utiliser comme opérateur" + + msgid "Data-block whose nodes are being edited" msgstr "Blocs de données dont les nœuds sont édités" @@ -100746,6 +101882,18 @@ msgid "Type of element to snap to" msgstr "Type d’élément auquel aimanter" +msgid "Type of element for the 'Snap With' to snap to" +msgstr "Type d’élément auquel « Aimanter avec »" + + +msgid "Project Mode" +msgstr "Mode de projection" + + +msgid "Type of element for individual transformed elements to snap to" +msgstr "Type d’élément auquel aimanter les éléments transformés individuellement" + + msgid "Snap to" msgstr "Aimanter à" @@ -102828,6 +103976,18 @@ msgid "Type of the path element" msgstr "Type de l’élément de chemin" +msgid "Name that can be displayed in the UI for this element" +msgstr "Nom pouvant être affiché dans l’interface pour cet élément" + + +msgid "Node ID" +msgstr "Identifiant du nœud" + + +msgid "Simulation Output Node ID" +msgstr "Identifiant du nœud de sortie de simulation" + + msgid "Volume Display" msgstr "Affichage volume" @@ -102864,6 +104024,10 @@ msgid "Fine" msgstr "Détaillé" +msgid "Display box for each leaf node containing 8×8 voxels" +msgstr "Afficher une boîte par nœud feuille contenant 8×8 voxels" + + msgid "Type of wireframe display" msgstr "Type d’affichage filaire" @@ -103241,14 +104405,6 @@ msgid "Length of rays, defines how far away other faces give occlusion effect" msgstr "Longueur des rayons, définit à quelle distance les faces lontaines produisent un effet d’occlusion" -msgid "Use Ambient Occlusion" -msgstr "Utiliser occlusion ambiante" - - -msgid "Use Ambient Occlusion to add shadowing based on distance between objects" -msgstr "Utiliser l’occlusion ambiante pour ajouter de l’ombrage selon la distance entre les objets" - - msgid "World Mist" msgstr "Brume du monde" @@ -104094,6 +105250,14 @@ msgid "Causes select-all ('A' key) to de-select in the case a selection exists" msgstr "Si une sélection existe déjà, Tout sélectionner désélectionne au lieu de sélectionner" +msgid "Navigate during Transform" +msgstr "Naviguer durant la transformation" + + +msgid "Enable view navigation while using transform operators. Proportional Influence, Automatic Constraints and Auto IK Chain Length shortcuts will require holding Alt key" +msgstr "Permettre la navigation de la vue pendant l’utilisation des opérateurs de transformation. Les raccourcis d’influence proportionnelles, de contraintes automatiques et de longueur de chaine IK auto peuvent être utilisés en maintenant la touche Alt" + + msgid "Tweak Select: Mouse Select & Move" msgstr "Ajuster et sélections : sélectionner avec la souris et déplacer" @@ -105796,6 +106960,16 @@ msgid "Clear Constraints" msgstr "Effacer les contraintes" +msgctxt "WindowManager" +msgid "Set Snap Base" +msgstr "Définir la base d’aimantation" + + +msgctxt "WindowManager" +msgid "Set Snap Base (Off)" +msgstr "Définir la base d’aimantation (off)" + + msgctxt "WindowManager" msgid "Snap Invert" msgstr "Inverser aimant" @@ -106137,10 +107311,6 @@ msgid "or AMD with macOS %s or newer" msgstr "ou AMD avec macOS %s ou plus" -msgid " - intel-level-zero-gpu version %s or newer" -msgstr " - intel-level-zero-gpu version %s ou plus" - - msgid "Noise Threshold" msgstr "Seuil de bruit" @@ -106886,10 +108056,18 @@ msgid "No vars to display" msgstr "Aucune variable à afficher" +msgid "Demo text \"%s\" created with %s file(s){:,d}" +msgstr "Texte de démo « %s » créé avec %s fichier(s){:,d}" + + msgid "Search *.blend recursively" msgstr "Chercher les *.blend récursivement " +msgid "Writes: %s config text" +msgstr "Écrit : texte de config %s" + + msgid "Generate Settings:" msgstr "Réglages de génération :" @@ -106902,6 +108080,10 @@ msgid "Render Settings:" msgstr "Réglages de rendu :" +msgid "Can't load %s config, run: File -> Demo Mode (Setup)" +msgstr "Impossible de charger la config %s, lancer : Fichier → Mode démonstration (régler)" + + msgid "Demo Mode:" msgstr "Mode démo :" @@ -107522,6 +108704,18 @@ msgid "Current frame not within strip framerange" msgstr "La frame actuelle n’est pas dans l’intervalle de frames de la bande" +msgid "Text Editor Args Format must contain $filepath" +msgstr "Le format d’arguments de l’éditeur de texte doit contenir $filepath" + + +msgid "Exception parsing template: %r" +msgstr "Exception à l’analyse du modèle : %r" + + +msgid "Exception running external editor: %r" +msgstr "Exception à l’exécution de l’éditeur externe : %r" + + msgid "Reload Start-Up file to restore settings" msgstr "Recharger le fichier de démarrage pour restaurer les réglages" @@ -108443,6 +109637,11 @@ msgid "Remove All Groups" msgstr "Enlever tous les groupes" +msgctxt "Operator" +msgid "Add Group" +msgstr "Ajouter un groupe" + + msgid "Interpolation U" msgstr "Interpolation U" @@ -109802,6 +111001,16 @@ msgid "Bake Cubemap Only" msgstr "Précalculer cubemap uniquement" +msgctxt "Operator" +msgid "Bake Light Caches" +msgstr "Précalculer les caches d’éclairage" + + +msgctxt "Operator" +msgid "Delete Light Caches" +msgstr "Supprimer les caches d’éclairage" + + msgid "Shadow Resolution" msgstr "Résolution des ombres" @@ -109899,6 +111108,11 @@ msgid "Tiles" msgstr "Tuiles" +msgctxt "Amount" +msgid "Even" +msgstr "Paires" + + msgid "Odd" msgstr "Impaires" @@ -110208,7 +111422,7 @@ msgstr "Pistes pour rotation/échelle" msgctxt "Operator" msgid "View Fit" -msgstr "Ajuster vue" +msgstr "Ajuster la vue" msgctxt "Operator" @@ -110795,6 +112009,11 @@ msgid "Unpin" msgstr "Désépingler" +msgctxt "Operator" +msgid "Invert Pins" +msgstr "Inverser les épinglages" + + msgctxt "Operator" msgid "Clear Seam" msgstr "Effacer coutures" @@ -112149,6 +113368,11 @@ msgid "Back to Previous" msgstr "Revenir au précédent" +msgctxt "Operator" +msgid "Save Incremental" +msgstr "Enregistrer incrémental" + + msgctxt "Operator" msgid "Save Copy..." msgstr "Enregistrer une copie…" @@ -112189,6 +113413,11 @@ msgid "Wavefront (.obj)" msgstr "Wavefront (.obj)" +msgctxt "Operator" +msgid "Stanford PLY (.ply)" +msgstr "Stanford PLY (.ply)" + + msgctxt "Operator" msgid "STL (.stl) (experimental)" msgstr "STL (.stl) (expérimental)" @@ -112488,6 +113717,14 @@ msgid "Render Cache" msgstr "Cache de rendu" +msgid "Program" +msgstr "Programme" + + +msgid "Arguments" +msgstr "Arguments" + + msgid "I18n Branches" msgstr "Branches i18n" @@ -112562,6 +113799,24 @@ msgid "Requires a restart of Blender to take effect" msgstr "Nécessite un redémarrage de Blender pour prendre effet" +msgid "Open blend files with this Blender version" +msgstr "Ouvrir les fichiers .blend avec cette version de Blender" + + +msgctxt "Operator" +msgid "Register" +msgstr "Enregistrer" + + +msgctxt "Operator" +msgid "Unregister" +msgstr "Désenregistrer" + + +msgid "For All Users" +msgstr "Pour tous les utilisateurs" + + msgid "Player" msgstr "Lecteur" @@ -112833,6 +114088,16 @@ msgid "Similar" msgstr "Similaire" +msgctxt "Operator" +msgid "First" +msgstr "Début" + + +msgctxt "Operator" +msgid "Last" +msgstr "Fin" + + msgctxt "Operator" msgid "Set Color Attribute" msgstr "Définir l’attribut de couleur" @@ -113127,7 +114392,7 @@ msgstr "Sculpture de courbes" msgctxt "Operator" msgid "Add New Group" -msgstr "Ajouter nouveau groupe" +msgstr "Ajouter un nouveau groupe" msgctxt "Operator" @@ -113671,6 +114936,11 @@ msgid "Outline" msgstr "Contour" +msgctxt "GPencil" +msgid "Join" +msgstr "Joindre" + + msgctxt "Operator" msgid "Set as Active Material" msgstr "Définir comme matériau actif" @@ -113809,6 +115079,10 @@ msgid "Snap To" msgstr "Aimanter à" +msgid "Snap Individual Elements To" +msgstr "Aimanter chaque élément à" + + msgid "Fade Inactive Layers" msgstr "Atténuer calques inactifs" @@ -113886,6 +115160,21 @@ msgid "Color Attribute" msgstr "Attribut de couleur" +msgctxt "Operator" +msgid "Empty" +msgstr "Vide" + + +msgctxt "Operator" +msgid "Stroke" +msgstr "Trait" + + +msgctxt "Operator" +msgid "Suzanne" +msgstr "Suzanne" + + msgctxt "Operator" msgid "Point Cloud" msgstr "Nuage de point" @@ -114833,6 +116122,11 @@ msgid "Add UVs" msgstr "Ajouter UV" +msgctxt "GPencil" +msgid "Boundary" +msgstr "Bordure" + + msgid "Ignore Transparent" msgstr "Ignorer transparence" @@ -115283,6 +116577,18 @@ msgid "Data corruption: data-block '%s' is using another local data-block ('%s') msgstr "Corruption de données : le bloc de données « %s » utilise un autre bloc de données local (« %s ») comme référence de redéfinition de bibliothèque" +msgid "Light Linking for %s" +msgstr "Liaison de lumière pour %s" + + +msgid "Shadow Linking for %s" +msgstr "Liaison d’ombre pour %s" + + +msgid "Cannot unlink unsupported '%s' from light linking collection '%s'" +msgstr "Impossible de délier « %s » non pris en charge de la collection de liaison d’éclairage « %s »" + + msgid "MaskLayer" msgstr "CalqueMasque" @@ -115355,6 +116661,10 @@ msgid "LightProbe" msgstr "SondeLumière" +msgid "GreasePencil" +msgstr "CrayonGras" + + msgid "No new files have been packed" msgstr "Aucun nouveau fichier n’a été empaqueté" @@ -116164,6 +117474,10 @@ msgid "GpencilMode" msgstr "ModeCrayonGras" +msgid "Gpencil" +msgstr "CrayonG" + + msgid "UV/Image" msgstr "UV/Image" @@ -116176,6 +117490,10 @@ msgid "Select ID" msgstr "Sélectionner ID" +msgid "Select-Next" +msgstr "Select-Next" + + msgid "Workbench" msgstr "Workbench" @@ -117422,6 +118740,30 @@ msgid "Grease Pencil has no active paint tool" msgstr "Aucun outil de peinture actif pour le crayon gras" +msgid "Line: ESC to cancel, LMB set origin, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to align, Alt to center, E: extrude, G: grab" +msgstr "Ligne : Échap : annuler, ClicG : placer l’origine, Entrée/ClicM : confirmer, Molette/+- : ajuster nombre subdivs, Maj : aligner, Alt : centrer, E : extruder, G : déplacer" + + +msgid "Polyline: ESC to cancel, LMB to set, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to align, G: grab" +msgstr "Polyligne : Échap : annuler, ClicG : placer, Entrée/ClicM : confirmer, Molette/+- : ajuster nombre subdivs, Maj : aligner, G : déplacer" + + +msgid "Rectangle: ESC to cancel, LMB set origin, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to square, Alt to center, G: grab" +msgstr "Rectangle : Échap : annuler, ClicG : placer origine, Entrée/ClicM : confirmer, Molette/+- : ajuster nombre subdivs, Maj : carré, Alt : centrer, G : déplacer" + + +msgid "Circle: ESC to cancel, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to square, Alt to center, G: grab" +msgstr "Cercle : Échap : annuler, ClicG : placer origine, Entrée/ClicM : confirmer, Molette/+- : ajuster nombre subdivs, Maj : carré, Alt : centrer, G : déplacer" + + +msgid "Arc: ESC to cancel, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to square, Alt to center, M: Flip, E: extrude, G: grab" +msgstr "Arc : Échap : annuler, ClicG : placer origine, Entrée/ClicM : confirmer, Molette/+- : ajuster nombre subdivs, Maj : carré, Alt : centrer, M : inverser, E: extruder, G : déplacer" + + +msgid "Curve: ESC to cancel, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to square, Alt to center, E: extrude, G: grab" +msgstr "Courbe : Échap : annuler, Entrée/ClicM : confirmer, Molette/+- : ajuster nombre subdivs, Maj : carré, Alt : centrer, E: extruder, G : déplacer" + + msgid "Primitives can only be added in Draw or Edit modes" msgstr "Les primitives ne peuvent être ajoutées qu’en modes dessin ou édition" @@ -117494,6 +118836,14 @@ msgid "GPencil Weight Smear: LMB to smear | RMB/Escape to Exit" msgstr "Étalement de poids crayon gras : ClicG : étaler | ClicD/Échap : annuler" +msgid "Skin_light" +msgstr "Peau_Lumière" + + +msgid "Skin_shadow" +msgstr "Peau_Ombre" + + msgid "Failed to set value" msgstr "Impossible d’assigner la valeur" @@ -117901,6 +119251,10 @@ msgid "Drag" msgstr "Glisser" +msgid "Add to light linking collection" +msgstr "Ajouter à la collection de liaison de lumière" + + msgid "Double click to rename" msgstr "Double-cliquer pour renommer" @@ -118217,6 +119571,10 @@ msgid "Browse Particle Settings to be linked" msgstr "Parcourir les réglages de particules à lier" +msgid "Browse Grease Pencil (legacy) Data to be linked" +msgstr "Parcourir les données de crayon gras (obsolète) à lier" + + msgid "Browse Movie Clip to be linked" msgstr "Parcourir clip vidéo à lier" @@ -120379,6 +121737,30 @@ msgid "Rigid Body World has no associated physics data to export" msgstr "Le monde de corps rigides n’a pas de données physiques associées à exporter" +msgid "3D Local View " +msgstr "Vue locale 3D " + + +msgid "3D View " +msgstr "Vue 3D " + + +msgid "Frame:" +msgstr "Frame :" + + +msgid "Time:" +msgstr "Temps :" + + +msgid "Mem:%.2fM (Peak %.2fM)" +msgstr "Mem : %.2fM (Pointe : %.2fM)" + + +msgid "Mem:%.2fM, Peak: %.2fM" +msgstr "Mem : %.2fM, Pointe : %.2fM" + + msgid "Cannot write a single file with an animation format selected" msgstr "Impossible d’écrire un fichier unique avec un format d’animation sélectionné" @@ -121192,6 +122574,10 @@ msgid "Track the selected markers forward by one frame" msgstr "Suivre les marqueurs sélectionnés vers l’avant, sur une frame" +msgid "New lines unsupported, call this operator multiple times" +msgstr "Nouvelles lignes non prises en charge, appeler cet opérateur plusieurs fois" + + msgid "Unassigned" msgstr "Non assigné" @@ -121693,6 +123079,10 @@ msgid "Can't Load Image" msgstr "Impossible de charger l’image" +msgid "%d × %d, " +msgstr "%d × %d, " + + msgid "%d float channel(s)" msgstr "%d canal(-naux) flottant(s)" @@ -122149,6 +123539,10 @@ msgid "Color field based on:" msgstr "Champ couleur d’après :" +msgid "• {}" +msgstr "• {}" + + msgid "Empty Geometry" msgstr "Géométrie vide" @@ -122213,6 +123607,10 @@ msgid "Accessed named attributes:" msgstr "Accès attribut nommé :" +msgid " • \"{}\": " +msgstr " • « {} »: " + + msgid "read" msgstr "lecture" @@ -122710,6 +124108,14 @@ msgid "Could not create library override from one or more of the selected data-b msgstr "Impossible de créer une redéfinition de bibliothèque depuis un ou plusieurs blocs de données sélectionnés" +msgid "Cannot clear embedded library override '%s', only overrides of real data-blocks can be directly cleared" +msgstr "Impossible de supprimer la redéfinition de bibliothèque intégrée « %s », seules les redéfinitions de blocs de données réels peuvent être directement supprimées" + + +msgid "Cannot clear linked library override '%s', only local overrides can be directly cleared" +msgstr "Impossible de supprimer la redéfinition de bibliothèque intégrée « %s », seuls les redéfinitions locales peuvent être directement supprimées" + + msgid "Current File" msgstr "Fichier actuel" @@ -122742,6 +124148,18 @@ msgid "Added through override" msgstr "Ajoutée via une redéfinition" +msgid "Protected from override" +msgstr "Protégé de toute redéfinition" + + +msgid "Additive override" +msgstr "Redéfinition additive" + + +msgid "Multiplicative override" +msgstr "Redéfinition multiplicative" + + msgid "(empty)" msgstr "(vide)" @@ -122930,6 +124348,18 @@ msgid "Select movie or image strips" msgstr "Sélectionner des bandes vidéo ou images" +msgid "No handle available" +msgstr "Aucune poignée disponible" + + +msgid "Can not create handle inside of speed transition" +msgstr "Impossible de créer une poignée à l’intérieur d’une transition de vitesse" + + +msgid "This strip type can not be retimed" +msgstr "Ce type de bande ne peut pas être reminuté" + + msgid "No active sequence!" msgstr "Aucune séquence active !" @@ -122966,6 +124396,10 @@ msgid "Data Set" msgstr "Ensemble de données" +msgid "Unsupported column type" +msgstr "Type de colonne non pris en charge" + + msgid "File Modified Outside and Inside Blender" msgstr "Fichier modifié en dehors et dans Blender" @@ -123062,6 +124496,10 @@ msgid "Undo History" msgstr "Historique d’annulation" +msgid "Registration not possible from Microsoft Store installations" +msgstr "Impossible d’enregistrer depuis les installations du Microsoft Store" + + msgid "File association registered" msgstr "Association de fichiers enregistrée" @@ -123070,10 +124508,26 @@ msgid "Unable to register file association" msgstr "Impossible d’enregistrer l’association de fichiers" +msgid "Unregistration not possible from Microsoft Store installations" +msgstr "Impossible de désenregistrer depuis les installations du Microsoft Store" + + +msgid "File association unregistered" +msgstr "Association de fichiers désenregistrée" + + +msgid "Unable to unregister file association" +msgstr "Impossible de désenregistrer l’association de fichiers" + + msgid "There is no asset library to remove" msgstr "Aucune bibliothèque d’assets à supprimer" +msgid "Not available for Microsoft Store installations" +msgstr "Non disponible pour les installations du Microsoft Store" + + msgid "Windows-only operator" msgstr "Opérateur pour Windows uniquement" @@ -123710,6 +125164,10 @@ msgid " or Alt) Even Thickness %s" msgstr " ou Alt) épaisseur uniforme %s" +msgid "'Shrink/Fatten' meshes is only supported in edit mode" +msgstr "Compresser/dilater les maillages n’est possible qu’en mode édition" + + msgid "Tilt: %s° %s" msgstr "Inclinaison : %s° %s" @@ -123899,6 +125357,10 @@ msgid "Overwrite %s" msgstr "Écraser %s" +msgid "Failed to set preview: no ID in context (incorrect context?)" +msgstr "Impossible de définir la prévisualisation : aucun ID dans le contexte (contexte incorrect ?)" + + msgid "Incorrect context for running data-block fake user toggling" msgstr "Context incorrect pour activer ou désactiver l’utilisateur fictif sur le bloc de données" @@ -124225,58 +125687,6 @@ msgid "No active object or active object isn't a GPencil object" msgstr "Aucun object actif, ou l’objet actif n’est pas un crayon gras" -msgid "Object type mismatch, Alembic object path pointed to Camera when importing, but not any more." -msgstr "Incohérence du type d’objet, le chemin d’objet Alembic pointait vers une caméra lors de l’import mais ce n’est plus le cas." - - -msgid "Object type mismatch, Alembic object path points to Camera." -msgstr "Incohérence du type d’objet, le chemin d’objet Alembic pointe vers une caméra." - - -msgid "Object type mismatch, Alembic object path pointed to Curves when importing, but not any more." -msgstr "Incohérence du type d’objet, le chemin d’objet Alembic pointait vers des courbes lors de l’import mais ce n’est plus le cas." - - -msgid "Object type mismatch, Alembic object path points to Curves." -msgstr "Incohérence du type d’objet, le chemin d’objet Alembic pointe vers des courbes." - - -msgid "Object type mismatch, Alembic object path pointed to PolyMesh when importing, but not any more." -msgstr "Incohérence du type d’objet, le chemin d’objet Alembic pointait vers un maillage polygonale lors de l’import mais ce n’est plus le cas." - - -msgid "Object type mismatch, Alembic object path points to PolyMesh." -msgstr "Incohérence du type d’objet, le chemin d’objet Alembic pointe vers un maillage polygonale." - - -msgid "Object type mismatch, Alembic object path pointed to SubD when importing, but not any more." -msgstr "Incohérence du type d’objet, le chemin d’objet Alembic pointait vers une surface de subdivision lors de l’import mais ce n’est plus le cas." - - -msgid "Object type mismatch, Alembic object path points to SubD." -msgstr "Incohérence du type d’objet, le chemin d’objet Alembic pointe vers une surface de subdivision." - - -msgid "Object type mismatch, Alembic object path pointed to NURBS when importing, but not any more." -msgstr "Incohérence du type d’objet, le chemin d’objet Alembic pointait vers des NURBS lors de l’import mais ce n’est plus le cas." - - -msgid "Object type mismatch, Alembic object path points to NURBS." -msgstr "Incohérence du type d’objet, le chemin d’objet Alembic pointe vers des NURBS." - - -msgid "Object type mismatch, Alembic object path points to Points." -msgstr "Incohérence du type d’objet, le chemin d’objet Alembic pointe vers des Points." - - -msgid "Object type mismatch, Alembic object path pointed to XForm when importing, but not any more." -msgstr "Incohérence du type d’objet, le chemin d’objet Alembic pointait vers une transformation lors de l’import mais ce n’est plus le cas." - - -msgid "Object type mismatch, Alembic object path points to XForm." -msgstr "Incohérence du type d’objet, le chemin d’objet Alembic pointe vers une transformation." - - msgid "Could not open Alembic archive for reading, see console for detail" msgstr "Impossible d’ouvrir l’archive Alembic en lecture, voir la console pour plus de détails" @@ -124449,6 +125859,14 @@ msgid "USD Export: couldn't construct relative file path for .vdb file, absolute msgstr "Export USD : impossible de construire un chemin de fichier relatif pour le fichier .vdb, un chemin absolu sera utilisé à la place" +msgid "Asset data can only be assigned to assets. Use asset_mark() to mark as an asset" +msgstr "Les données d’asset ne peuvent être assignées qu’à des assets. Utiliser asset_mark() pour marquer comme asset" + + +msgid "Asset data cannot be None" +msgstr "Les données d’asset ne peuvent pas être None" + + msgid "Override template experimental feature is disabled" msgstr "La fonctionnalité expérimentale des patrons de redéfinition est désactivée" @@ -124489,6 +125907,10 @@ msgid "Registering id property class: '%s' is too long, maximum length is %d" msgstr "Enregistrement de la classe de propriété id : « %s » est trop long, longueur maximum de %d" +msgid "'%s' is of a type that cannot be an asset" +msgstr "« %s » est d’un type qui ne peut pas être un asset" + + msgid "ID '%s' isn't an override" msgstr "L’ID « %s » n’est pas une redéfinition" @@ -125241,6 +126663,14 @@ msgid "Unable to move sockets in built-in node" msgstr "Impossible de déplacer des prises d’un nœud intégré" +msgid "Panel is not in the node tree interface" +msgstr "Le panneau n’est pas dans l’interface de l’arborescence de nœuds" + + +msgid "Unable to create panel" +msgstr "Impossible de créer le panneau" + + msgid "%s '%s', bl_idname '%s' could not be unregistered" msgstr "%s '%s', bl_idname '%s' n’a pas pu être déchargé" @@ -126907,6 +128337,11 @@ msgid "End Radius" msgstr "Rayon fin" +msgctxt "NodeTree" +msgid "Rotations" +msgstr "Rotations" + + msgid "Number of points in one rotation of the spiral" msgstr "Nombre de points dans un tour de la spirale" @@ -127099,14 +128534,26 @@ msgid "Surface has no mesh" msgstr "La surface n’a pas de maillage" +msgid "Evaluated surface missing UV map: \"{}\"" +msgstr "Il manque une carte UV à la surface évaluée : « {} »" + + +msgid "Original surface missing UV map: \"{}\"" +msgstr "Il manque une carte UV à la surface originale : « {} »" + + msgid "Evaluated surface missing attribute: \"rest_position\"" -msgstr "Il manque un attribut à la surface évaluée : \"rest_position\"" +msgstr "Il manque un attribut à la surface évaluée : « rest_position »" msgid "Curves are not attached to any UV map" msgstr "Les courbes ne sont attachées à aucune carte UV" +msgid "Invalid surface UVs on {} curves" +msgstr "UV de surface invalide pour les courbes {}" + + msgid "The parts of the geometry to be deleted" msgstr "Parties de la géométrie à supprimer" @@ -127700,6 +129147,14 @@ msgid "Half the width of the narrow band in voxel units" msgstr "La moitié de la bande étroite, en unités de voxels" +msgid "The edge to retrieve data from. Defaults to the edge from the context" +msgstr "L’arête de laquelle obtenir les données. Utilise l’arête à partir du contexte par défaut" + + +msgid "Values that sort the corners attached to the edge" +msgstr "Valeurs triant les coins attachés à l’arête" + + msgid "Which of the sorted corners to output" msgstr "Quels coins triés sortir" @@ -127708,6 +129163,22 @@ msgid "Corner Index" msgstr "Indice du coin" +msgid "A corner of the input edge in its face's winding order, chosen by the sort index" +msgstr "Un coin de l’arête en entrée, dans l’ordre de rotation de sa face, choisi par l’indice de tri" + + +msgid "The number of faces or corners connected to each edge" +msgstr "Nombre de faces ou de coins connectés à chaque arête" + + +msgid "Corner of Edge" +msgstr "Coin de l’arête" + + +msgid "Edge Corner Count" +msgstr "Nombre de coins d’arêtes" + + msgid "The face to retrieve data from. Defaults to the face from the context" msgstr "La face de laquelle obtenir les données. Utilise la face à partir du contexte par défaut" @@ -127912,6 +129383,14 @@ msgid "Hit Distance" msgstr "Distance de l’impact" +msgid "Attribute does not exist: \"{}\"" +msgstr "L’attribut n’existe pas : « {} »" + + +msgid "Cannot delete built-in attribute: \"{}\"" +msgstr "Impossible de supprimer l’attribut prédéfini appelé « {} »" + + msgid "Which element to retrieve a value from on the geometry" msgstr "Depuis quel élément obtenir une valeur sur la géométrie" @@ -128024,6 +129503,10 @@ msgid "Add a new simulation input and output nodes to the node tree" msgstr "Ajouter de nouveaux nœuds d’entrée et de sortie de simulation à l’arborescence de nœuds" +msgid "Failed to write to attribute \"{}\" with domain \"{}\" and type \"{}\"" +msgstr "Impossible d’écrire dans l’attribut « {} » avec le domaine « {} » et le type « {} »" + + msgid "Delimiter" msgstr "Délimiteur" @@ -128460,6 +129943,18 @@ msgid "Sun disc not available in Eevee" msgstr "Disque solaire indisponible dans Eevee" +msgid "The number of Voronoi layers to sum" +msgstr "Nombre de couches de Voronoï à additionner" + + +msgid "The influence of a Voronoi layer relative to that of the previous layer" +msgstr "Influence d’un calque de Voronoï, relativement à celle du calque précédent" + + +msgid "The scale of a Voronoi layer relative to that of the previous layer" +msgstr "Échelle d’un calque de Voronoï, relativement à celle du calque précédent" + + msgid "Detail Scale" msgstr "Échelle de détail" @@ -128652,18 +130147,6 @@ msgid "%s: failed to load '%s'" msgstr "%s : impossible de charger « %s »" -msgid "reading render result: dimensions don't match, expected %dx%d" -msgstr "lecture du résultat de rendu : les dimensions ne correspondent pas, %d×%d attendus" - - -msgid "reading render result: expected channel \"%s.%s\" or \"%s\" not found" -msgstr "lecture du résultat de rendu : canaux attendus « %s.%s » ou « %s » introuvables" - - -msgid "reading render result: expected channel \"%s.%s\" not found" -msgstr "lecture du résultat de rendu : canal attendu « %s.%s » introuvable" - - msgctxt "Sequence" msgid "Color Balance" msgstr "BalanceCouleurs" @@ -128854,6 +130337,10 @@ msgid "Unable to save an unsaved file with an empty or unset \"filepath\" proper msgstr "Impossible d’enregistrer un fichier non-enregistré avec une propriété « filepath » vide ou non-définie" +msgid "Unable to find an available incremented file name" +msgstr "Impossible de trouver un nom de fichier incrémenté disponible" + + msgid "Engine '%s' not available for scene '%s' (an add-on may need to be installed or enabled)" msgstr "Le moteur « %s » n’est pas disponible pour la scène « %s » (un add-on doit peut-être être installé ou activé)" @@ -129083,6 +130570,10 @@ msgid "Property from path '%s' has length %d instead of %d" msgstr "La propriété définie par le chemin « %s » a une longueur de %d au lieu de %d" +msgid "%d × %s: %.4f ms, average: %.8f ms" +msgstr "%d × %s : %.4f ms, moyenne : %.8f ms" + + msgctxt "WindowManager" msgid "Limited Platform Support" msgstr "Prise en charge limitée pour cette plateforme" @@ -129510,6 +131001,14 @@ msgid "whole milk" msgstr "lait entier" +msgid "internal" +msgstr "interne" + + +msgid "visual studio code" +msgstr "visual studio code" + + msgid "Blurry Footage" msgstr "Métrage flou" diff --git a/locale/po/ha.po b/locale/po/ha.po index 1652ac96af1..643934a8a80 100644 --- a/locale/po/ha.po +++ b/locale/po/ha.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2017-12-25 14:01+0100\n" "Last-Translator: UMAR HARUNA ABDULLAHI \n" "Language-Team: BlenderNigeria \n" diff --git a/locale/po/he.po b/locale/po/he.po index 2a58512c61e..31872c00028 100644 --- a/locale/po/he.po +++ b/locale/po/he.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2012-10-07 13:56+0300\n" "Last-Translator: Barak Itkin \n" "Language-Team: LANGUAGE \n" diff --git a/locale/po/hi.po b/locale/po/hi.po index 7e012385d12..d2e172df0d7 100644 --- a/locale/po/hi.po +++ b/locale/po/hi.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2015-03-03 16:21+0530\n" "Last-Translator: Roshan Lal Gumasta \n" "Language-Team: Hindi \n" diff --git a/locale/po/hu.po b/locale/po/hu.po index 982e23f0c48..9fccc1d39c4 100644 --- a/locale/po/hu.po +++ b/locale/po/hu.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2015-02-21 19:17+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -13,9 +13,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.7.4\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -25,9 +25,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -37,9 +37,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -49,9 +49,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -61,9 +61,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -73,9 +73,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -85,9 +85,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -97,9 +97,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -109,9 +109,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -121,9 +121,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -133,9 +133,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -145,9 +145,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -157,9 +157,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -169,9 +169,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -181,9 +181,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -193,9 +193,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -205,9 +205,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -217,9 +217,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -229,9 +229,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -241,9 +241,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -253,9 +253,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -265,9 +265,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -277,9 +277,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -289,9 +289,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -301,9 +301,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -313,9 +313,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -325,9 +325,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -337,9 +337,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -349,9 +349,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -361,9 +361,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-12-27 18:52+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -373,9 +373,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.7.1\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -385,9 +385,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -397,9 +397,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -409,9 +409,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -421,9 +421,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -433,9 +433,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -445,9 +445,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -457,9 +457,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -469,9 +469,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -481,9 +481,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -493,9 +493,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -505,9 +505,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -517,9 +517,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -529,9 +529,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -541,9 +541,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -553,9 +553,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -565,9 +565,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -577,9 +577,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -589,9 +589,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -601,9 +601,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -613,9 +613,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -625,9 +625,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -637,9 +637,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -649,9 +649,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -661,9 +661,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -673,9 +673,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -685,9 +685,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -697,9 +697,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -709,9 +709,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -721,9 +721,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-11-05 17:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -733,9 +733,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -745,9 +745,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -757,9 +757,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -769,9 +769,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -781,9 +781,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -793,9 +793,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -805,9 +805,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -817,9 +817,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -829,9 +829,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -841,9 +841,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -853,9 +853,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -865,9 +865,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -877,9 +877,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -889,9 +889,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -901,9 +901,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -913,9 +913,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -925,9 +925,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -937,9 +937,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -949,9 +949,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -961,9 +961,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -973,9 +973,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -985,9 +985,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -997,9 +997,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1009,9 +1009,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1021,9 +1021,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1033,9 +1033,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1045,9 +1045,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1057,9 +1057,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1069,9 +1069,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1081,9 +1081,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2015-01-10 20:46+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1093,9 +1093,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.7.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1105,9 +1105,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1117,9 +1117,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1129,9 +1129,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1141,9 +1141,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1153,9 +1153,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1165,9 +1165,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1177,9 +1177,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1189,9 +1189,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1201,9 +1201,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1213,9 +1213,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1225,9 +1225,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1237,9 +1237,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1249,9 +1249,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1261,9 +1261,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1273,9 +1273,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1285,9 +1285,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1297,9 +1297,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1309,9 +1309,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1321,9 +1321,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1333,9 +1333,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1345,9 +1345,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1357,9 +1357,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1369,9 +1369,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1381,9 +1381,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1393,9 +1393,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1405,9 +1405,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1417,9 +1417,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1429,9 +1429,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1441,9 +1441,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-12-27 18:52+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1453,9 +1453,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.7.1\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1465,9 +1465,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1477,9 +1477,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1489,9 +1489,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1501,9 +1501,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1513,9 +1513,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1525,9 +1525,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1537,9 +1537,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1549,9 +1549,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1561,9 +1561,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1573,9 +1573,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1585,9 +1585,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1597,9 +1597,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1609,9 +1609,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1621,9 +1621,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1633,9 +1633,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1645,9 +1645,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1657,9 +1657,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1669,9 +1669,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1681,9 +1681,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1693,9 +1693,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1705,9 +1705,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1717,9 +1717,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1729,9 +1729,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1741,9 +1741,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1753,9 +1753,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1765,9 +1765,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1777,9 +1777,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1789,9 +1789,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1801,9 +1801,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-11-05 17:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1813,9 +1813,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1825,9 +1825,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1837,9 +1837,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1849,9 +1849,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1861,9 +1861,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1873,9 +1873,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1885,9 +1885,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1897,9 +1897,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1909,9 +1909,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1921,9 +1921,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1933,9 +1933,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1945,9 +1945,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1957,9 +1957,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1969,9 +1969,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1981,9 +1981,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1993,9 +1993,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2005,9 +2005,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2017,9 +2017,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2029,9 +2029,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2041,9 +2041,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2053,9 +2053,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2065,9 +2065,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2077,9 +2077,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2089,9 +2089,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2101,9 +2101,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2113,9 +2113,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2125,9 +2125,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2137,9 +2137,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2149,9 +2149,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2161,9 +2161,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2015-01-30 16:20+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2173,9 +2173,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.7.4\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2185,9 +2185,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2197,9 +2197,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2209,9 +2209,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2221,9 +2221,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2233,9 +2233,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2245,9 +2245,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2257,9 +2257,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2269,9 +2269,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2281,9 +2281,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2293,9 +2293,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2305,9 +2305,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2317,9 +2317,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2329,9 +2329,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2341,9 +2341,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2353,9 +2353,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2365,9 +2365,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2377,9 +2377,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2389,9 +2389,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2401,9 +2401,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2413,9 +2413,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2425,9 +2425,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2437,9 +2437,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2449,9 +2449,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2461,9 +2461,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2473,9 +2473,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2485,9 +2485,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2497,9 +2497,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2509,9 +2509,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2521,9 +2521,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-12-27 18:52+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2533,9 +2533,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.7.1\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2545,9 +2545,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2557,9 +2557,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2569,9 +2569,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2581,9 +2581,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2593,9 +2593,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2605,9 +2605,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2617,9 +2617,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2629,9 +2629,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2641,9 +2641,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2653,9 +2653,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2665,9 +2665,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2677,9 +2677,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2689,9 +2689,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2701,9 +2701,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2713,9 +2713,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2725,9 +2725,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2737,9 +2737,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2749,9 +2749,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2761,9 +2761,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2773,9 +2773,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2785,9 +2785,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2797,9 +2797,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2809,9 +2809,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2821,9 +2821,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2833,9 +2833,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2845,9 +2845,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2857,9 +2857,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2869,9 +2869,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2881,9 +2881,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-11-05 17:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2893,9 +2893,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2905,9 +2905,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2917,9 +2917,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2929,9 +2929,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2941,9 +2941,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2953,9 +2953,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2965,9 +2965,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2977,9 +2977,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2989,9 +2989,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3001,9 +3001,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3013,9 +3013,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3025,9 +3025,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3037,9 +3037,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3049,9 +3049,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3061,9 +3061,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3073,9 +3073,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3085,9 +3085,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3097,9 +3097,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3109,9 +3109,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3121,9 +3121,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3133,9 +3133,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3145,9 +3145,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3157,9 +3157,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3169,9 +3169,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3181,9 +3181,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3193,9 +3193,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3205,9 +3205,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3217,9 +3217,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3229,9 +3229,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3241,9 +3241,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2015-01-10 20:46+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3253,9 +3253,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.7.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3265,9 +3265,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3277,9 +3277,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3289,9 +3289,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3301,9 +3301,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3313,9 +3313,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3325,9 +3325,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3337,9 +3337,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3349,9 +3349,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3361,9 +3361,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3373,9 +3373,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3385,9 +3385,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3397,9 +3397,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3409,9 +3409,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3421,9 +3421,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3433,9 +3433,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3445,9 +3445,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3457,9 +3457,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3469,9 +3469,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3481,9 +3481,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3493,9 +3493,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3505,9 +3505,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3517,9 +3517,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3529,9 +3529,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3541,9 +3541,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3553,9 +3553,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3565,9 +3565,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3577,9 +3577,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3589,9 +3589,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3601,9 +3601,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-12-27 18:52+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3613,9 +3613,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.7.1\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3625,9 +3625,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3637,9 +3637,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3649,9 +3649,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3661,9 +3661,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3673,9 +3673,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3685,9 +3685,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3697,9 +3697,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3709,9 +3709,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3721,9 +3721,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3733,9 +3733,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3745,9 +3745,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3757,9 +3757,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3769,9 +3769,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3781,9 +3781,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3793,9 +3793,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3805,9 +3805,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3817,9 +3817,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3829,9 +3829,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3841,9 +3841,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3853,9 +3853,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3865,9 +3865,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3877,9 +3877,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3889,9 +3889,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3901,9 +3901,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3913,9 +3913,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3925,9 +3925,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3937,9 +3937,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3949,9 +3949,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3961,9 +3961,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-11-05 17:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3973,9 +3973,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3985,9 +3985,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3997,9 +3997,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4009,9 +4009,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4021,9 +4021,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -4033,9 +4033,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4045,9 +4045,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4057,9 +4057,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4069,9 +4069,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4081,9 +4081,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -4093,9 +4093,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4105,9 +4105,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4117,9 +4117,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4129,9 +4129,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4141,9 +4141,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -4153,9 +4153,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4165,9 +4165,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4177,9 +4177,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4189,9 +4189,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4201,9 +4201,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -4213,9 +4213,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4225,9 +4225,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4237,9 +4237,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4249,9 +4249,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4261,9 +4261,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -4273,9 +4273,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4285,9 +4285,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4297,9 +4297,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4309,9 +4309,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -9003,14 +9003,6 @@ msgid "Interpolation Type W" msgstr "Interpoláció típus W" -msgid "Falloff Type" -msgstr "Elenyészés típusa" - - -msgid "Samples" -msgstr "Minták" - - msgid "Resolution X" msgstr "Felbotás X" @@ -10706,6 +10698,10 @@ msgid "Freestyle Face Mark" msgstr "Freestyle Oldallap jelölés" +msgid "Samples" +msgstr "Minták" + + msgid "Intersect" msgstr "Metszet" @@ -15790,6 +15786,10 @@ msgid "Sculpt" msgstr "Szobor" +msgid "Falloff Type" +msgstr "Elenyészés típusa" + + msgid "Operator" msgstr "Operátor" @@ -18947,14 +18947,6 @@ msgid "Length of rays, defines how far away other faces give occlusion effect" msgstr "Sugarak hossza, meghatározza, milyen távol adjanak más oldallapok elnyelődés effektet" -msgid "Use Ambient Occlusion" -msgstr "Környezeti elnyelődés haszálata" - - -msgid "Use Ambient Occlusion to add shadowing based on distance between objects" -msgstr "Környezeti elnyelődés használata az objektumok távolságán alapuló árnyékolás hozzáadásához" - - msgid "World Mist" msgstr "Világ köd" diff --git a/locale/po/id.po b/locale/po/id.po index 698bec7aed0..d10417ff567 100644 --- a/locale/po/id.po +++ b/locale/po/id.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2021-12-25 23:57-0800\n" "Last-Translator: Adriel Tristanputra \n" "Language-Team: Indonesian <>\n" diff --git a/locale/po/it.po b/locale/po/it.po index 5ecd56bbed4..c88f18d1ead 100644 --- a/locale/po/it.po +++ b/locale/po/it.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2022-01-21 16:08+0100\n" "Last-Translator: MT\n" "Language-Team: blend-it \n" @@ -12318,10 +12318,6 @@ msgid "Cycles light settings" msgstr "Impostazioni luci Cycles" -msgid "Falloff distance - the light is at half the original intensity at this point" -msgstr "Distanza decadimento - la luce ha metà dell'intensità originale a questa distanza" - - msgid "Specular Factor" msgstr "Fattore Speculare" @@ -12383,14 +12379,6 @@ msgid "Directional area Light" msgstr "Luce area direzionale" -msgid "Constant Coefficient" -msgstr "Coefficiente Costante" - - -msgid "Constant distance attenuation coefficient" -msgstr "Coefficiente distanza di attenuazione costante" - - msgid "Contact Shadow Distance" msgstr "Distanza Ombre di Contatto" @@ -12399,62 +12387,6 @@ msgid "Contact Shadow Thickness" msgstr "Spessore Ombre di Contatto" -msgid "Falloff Type" -msgstr "Tipo Decadimento" - - -msgid "Intensity Decay with distance" -msgstr "Decadimento dell'intensità con la distanza" - - -msgid "Inverse Linear" -msgstr "Lineare Inverso" - - -msgid "Inverse Square" -msgstr "Quadratico Inverso" - - -msgid "Inverse Coefficients" -msgstr "Coefficienti Inversi" - - -msgid "Lin/Quad Weighted" -msgstr "Lin/Quadr Pesati" - - -msgid "Linear Attenuation" -msgstr "Attenuazione Lineare" - - -msgid "Linear distance attenuation" -msgstr "Attenuazione lineare con la distanza" - - -msgid "Linear Coefficient" -msgstr "Coefficiente Lineare" - - -msgid "Linear distance attenuation coefficient" -msgstr "Coefficiente distanza di attenuazione lineare" - - -msgid "Quadratic Attenuation" -msgstr "Attenuazione Quadratica" - - -msgid "Quadratic distance attenuation" -msgstr "Attenuazione quadratica con la distanza" - - -msgid "Quadratic Coefficient" -msgstr "Coefficiente Quadratico" - - -msgid "Quadratic distance attenuation coefficient" -msgstr "Coefficiente distanza di attenuazione quadratico" - - msgid "Shadow Buffer Bias" msgstr "Influenza Buffer Ombra" @@ -12463,14 +12395,6 @@ msgid "Shadow Buffer Clip Start" msgstr "Taglio Iniziale Buffer Ombra" -msgid "Samples" -msgstr "Campioni" - - -msgid "Shadow Buffer Size" -msgstr "Dimensione Buffer Ombra" - - msgid "Shadow Color" msgstr "Colore Ombra" @@ -16088,6 +16012,10 @@ msgid "Format of multiview media" msgstr "Formato del media multivista" +msgid "Multi-View" +msgstr "Multi-Vista" + + msgid "Image Preview" msgstr "Anteprima Immagine" @@ -18816,6 +18744,10 @@ msgid "Thickness Min" msgstr "Spessore Min" +msgid "Samples" +msgstr "Campioni" + + msgid "Number of samples to test per face" msgstr "Numero di campioni da testare per faccia" @@ -37813,6 +37745,10 @@ msgid "Dynamic topology alters the mesh topology while sculpting" msgstr "La topologia dinamica altera la topologia della mesh mentre si scolpisce" +msgid "Falloff Type" +msgstr "Tipo Decadimento" + + msgid "Operator" msgstr "Operatore" @@ -39586,6 +39522,10 @@ msgid "Align UVs on Y axis" msgstr "Allinea le UV sull'asse Y" +msgid "Correct Aspect" +msgstr "Aspetto Corretto" + + msgctxt "Operator" msgid "Average Islands Scale" msgstr "Omogeneizza Scala Isole" @@ -39612,10 +39552,6 @@ msgid "Clip UV coordinates to bounds after unwrapping" msgstr "Aggancia le coordinate UV ai limiti dopo la scucitura" -msgid "Correct Aspect" -msgstr "Aspetto Corretto" - - msgid "Map UVs taking image aspect ratio into account" msgstr "La mappatura UV tiene in considerazione le proporzioni dell'immagine" @@ -46280,10 +46216,6 @@ msgid "Single stereo camera system, adjust the stereo settings in the camera pan msgstr "Sistema stereoscopico a camera singola. Aggiusta le impostazioni stereoscopiche nel pannello Camera" -msgid "Multi-View" -msgstr "Multi-Vista" - - msgid "Multi camera system, adjust the cameras individually" msgstr "Sistema stereoscopico multi camera. Aggiusta le camere individualmente" @@ -51053,14 +50985,6 @@ msgid "Length of rays, defines how far away other faces give occlusion effect" msgstr "Lunghezza dei raggi, definisce quanto sono lontane le altre facce che danno l'effetto di occlusione" -msgid "Use Ambient Occlusion" -msgstr "Usa Occlusione Ambientale" - - -msgid "Use Ambient Occlusion to add shadowing based on distance between objects" -msgstr "Usa Occlusione Ambientale per aggiungere ombre in base alla distanza tra gli oggetti" - - msgid "World Mist" msgstr "Foschia Mondo" diff --git a/locale/po/ja.po b/locale/po/ja.po index 232513a0108..b2283eb5a22 100644 --- a/locale/po/ja.po +++ b/locale/po/ja.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2016-10-13 03:05+0900\n" "Last-Translator: \n" "Language-Team: Japanese Translation Team (https://sites.google.com/site/blugjp/blender-translators)\n" @@ -12826,10 +12826,6 @@ msgid "Show scenes" msgstr "シーンを表示します" -msgid "Show materials, nodetrees, textures and Freestyle's linestyles" -msgstr "マテリアル、ノードツリー、テクスチャ、Freestyle ラインスタイルを表示します" - - msgid "Directory" msgstr "ディレクトリ" @@ -22551,10 +22547,6 @@ msgid "Whether the selected text is italics" msgstr "選択中のテキストがイタリックかどうか" -msgid "Selected Smallcaps" -msgstr "選択部分が小文字" - - msgid "Whether the selected text is small caps" msgstr "選択中のテキストが小文字かどうか" @@ -24256,10 +24248,6 @@ msgid "Diffuse reflection multiplier" msgstr "ディフューズ反射の乗数" -msgid "Falloff distance - the light is at half the original intensity at this point" -msgstr "減衰距離。この地点での照明の強さは元の半分になります" - - msgid "Node tree for node based lights" msgstr "ノードベースのライト用ノードツリー" @@ -24345,14 +24333,6 @@ msgid "Directional area Light" msgstr "指向性の面光源" -msgid "Constant Coefficient" -msgstr "一定の係数" - - -msgid "Constant distance attenuation coefficient" -msgstr "一定の距離減衰係数" - - msgid "Contact Shadow Bias" msgstr "コンタクトシャドウバイアス" @@ -24386,66 +24366,6 @@ msgid "Light energy emitted over the entire area of the light in all directions" msgstr "ライトの全領域から全方向に放射する光のエネルギー" -msgid "Custom light falloff curve" -msgstr "カスタムライト減衰曲線" - - -msgid "Falloff Type" -msgstr "減衰タイプ" - - -msgid "Intensity Decay with distance" -msgstr "距離による明度の減少方法" - - -msgid "Inverse Linear" -msgstr "逆線形" - - -msgid "Inverse Square" -msgstr "逆二乗式" - - -msgid "Inverse Coefficients" -msgstr "逆係数" - - -msgid "Lin/Quad Weighted" -msgstr "重み付き線形/二次式" - - -msgid "Linear Attenuation" -msgstr "線形減衰" - - -msgid "Linear distance attenuation" -msgstr "線形の距離減衰" - - -msgid "Linear Coefficient" -msgstr "線形係数" - - -msgid "Linear distance attenuation coefficient" -msgstr "線形の距離減衰係数" - - -msgid "Quadratic Attenuation" -msgstr "二次式減衰" - - -msgid "Quadratic distance attenuation" -msgstr "二次距離減衰" - - -msgid "Quadratic Coefficient" -msgstr "二次係数" - - -msgid "Quadratic distance attenuation coefficient" -msgstr "二次の距離減衰係数" - - msgid "Shadow Buffer Bias" msgstr "シャドウバッファーバイアス" @@ -24462,22 +24382,6 @@ msgid "Shadow map clip start, below which objects will not generate shadows" msgstr "シャドウマップのクリップ始端。これより近くのオブジェクトには影が生成されません" -msgid "Samples" -msgstr "サンプル数" - - -msgid "Number of shadow buffer samples" -msgstr "シャドウバッファーのサンプル数" - - -msgid "Shadow Buffer Size" -msgstr "シャドウバッファーの大きさ" - - -msgid "Resolution of the shadow buffer, higher values give crisper shadows but use more memory" -msgstr "シャドウバッファーの解像度。高い値で鮮明な影になりますが、より多くのメモリを使用します" - - msgid "Shadow Color" msgstr "シャドウカラー" @@ -30561,6 +30465,10 @@ msgid "Format of multiview media" msgstr "マルチビューメディアのフォーマット" +msgid "Multi-View" +msgstr "マルチビュー" + + msgid "Tile Number" msgstr "タイル数" @@ -35561,6 +35469,10 @@ msgid "Minimum for measuring thickness" msgstr "計測する厚さの最小値" +msgid "Samples" +msgstr "サンプル数" + + msgid "Number of samples to test per face" msgstr "面毎にテストするサンプル数" @@ -55279,14 +55191,6 @@ msgid "Force keeping channels for bones" msgstr "ボーンチャンネルを強制的に最適化" -msgid "if all keyframes are identical in a rig, force keeping the minimal animation. When off, all possible channels for the bones will be exported, even if empty (minimal animation, 2 keyframes)" -msgstr "" -"あるリグ内の全キーフレームが同一であった場合、アニメーションを\n" -"強制的に最小限にします。無効時、ボーンの利用可能なチャンネルが\n" -"空であっても、すべてエクスポートされます(最小アニメーションは\n" -"キーフレーム2つ)" - - msgid "Force keeping channel for objects" msgstr "オブジェクトチャンネルを強制的に最適化" @@ -73848,6 +73752,10 @@ msgid "Generic sculpt expand operator" msgstr "汎用のスカルプト拡大オペレーター" +msgid "Falloff Type" +msgstr "減衰タイプ" + + msgid "Initial falloff of the expand operation" msgstr "拡大操作の初期減衰" @@ -77809,6 +77717,10 @@ msgid "Axis to align to" msgstr "揃える対象の軸" +msgid "Correct Aspect" +msgstr "アスペクト比の補正" + + msgid "Method to calculate rotation angle" msgstr "回転角度の計算に使用する方法" @@ -77868,10 +77780,6 @@ msgid "Clip UV coordinates to bounds after unwrapping" msgstr "展開後にUV座標を矩形に切り抜きます" -msgid "Correct Aspect" -msgstr "アスペクト比の補正" - - msgid "Map UVs taking image aspect ratio into account" msgstr "UV展開に画像のアスペクト比を考慮します" @@ -82446,13 +82354,6 @@ msgid "Path Mask" msgstr "パスマスク" -msgid "Import only the primitive at the given path and its descendents. Multiple paths may be specified in a list delimited by commas or semicolons" -msgstr "" -"指定のパスのプリミティブとその子のみインポートします\n" -"コンマまたはセミコロンで区切ったリストで複数のパスが\n" -"指定されている可能性があります" - - msgid "Read mesh color attributes" msgstr "メッシュカラー属性を読み込みます" @@ -92473,10 +92374,6 @@ msgid "Single stereo camera system, adjust the stereo settings in the camera pan msgstr "単一のステレオカメラシステム。カメラパネルのステレオ設定で調整します" -msgid "Multi-View" -msgstr "マルチビュー" - - msgid "Multi camera system, adjust the cameras individually" msgstr "複数のカメラシステム。各カメラを別々に調整できます" @@ -104129,16 +104026,6 @@ msgid "Length of rays, defines how far away other faces give occlusion effect" msgstr "遮蔽効果が発生する、光線と他の面との距離" -msgid "Use Ambient Occlusion" -msgstr "アンビエントオクルージョンを使用" - - -msgid "Use Ambient Occlusion to add shadowing based on distance between objects" -msgstr "" -"オブジェクト間の距離を元に影を追加する\n" -"アンビエントオクルージョンを使用します" - - msgid "World Mist" msgstr "ワールドミスト" @@ -107029,10 +106916,6 @@ msgid "or AMD with macOS %s or newer" msgstr "または AMD と macOS %s 以降が必要です" -msgid " - intel-level-zero-gpu version %s or newer" -msgstr " ・intel-level-zero-gpu ver.%s 以降" - - msgid "Noise Threshold" msgstr "ノイズしきい値" @@ -125139,62 +125022,6 @@ msgid "No active object or active object isn't a GPencil object" msgstr "アクティブオブジェクトなし、またはグリースペンシルオブジェクトではありません" -msgid "Object type mismatch, Alembic object path pointed to Camera when importing, but not any more." -msgstr "オブジェクトタイプミスマッチ。インポート時 Alembic オブジェクトパスは Camera を指していましたが、今は違います" - - -msgid "Object type mismatch, Alembic object path points to Camera." -msgstr "オブジェクトタイプミスマッチ。Alembic オブジェクトパスは Camera を指しています" - - -msgid "Object type mismatch, Alembic object path pointed to Curves when importing, but not any more." -msgstr "オブジェクトタイプミスマッチ。インポート時 Alembic オブジェクトパスは Curves を指していましたが、今は違います" - - -msgid "Object type mismatch, Alembic object path points to Curves." -msgstr "オブジェクトタイプミスマッチ。Alembic オブジェクトパスは Curves を指しています" - - -msgid "Object type mismatch, Alembic object path pointed to PolyMesh when importing, but not any more." -msgstr "オブジェクトタイプミスマッチ。インポート時 Alembic オブジェクトパスは PolyMesh を指していましたが、今は違います" - - -msgid "Object type mismatch, Alembic object path points to PolyMesh." -msgstr "オブジェクトタイプミスマッチ。Alembic オブジェクトパスは PolyMesh を指しています" - - -msgid "Object type mismatch, Alembic object path pointed to SubD when importing, but not any more." -msgstr "オブジェクトタイプミスマッチ。インポート時 Alembic オブジェクトパスは SubD を指していましたが、今は違います" - - -msgid "Object type mismatch, Alembic object path points to SubD." -msgstr "オブジェクトタイプミスマッチ。Alembic オブジェクトパスは SubD を指しています" - - -msgid "Object type mismatch, Alembic object path pointed to NURBS when importing, but not any more." -msgstr "オブジェクトタイプミスマッチ。インポート時 Alembic オブジェクトパスは NURBS を指していましたが、今は違います" - - -msgid "Object type mismatch, Alembic object path points to NURBS." -msgstr "オブジェクトタイプミスマッチ。Alembic オブジェクトパスは NURBS を指しています" - - -msgid "Object type mismatch, Alembic object path pointed to Points when importing, but not any more." -msgstr "オブジェクトタイプミスマッチ。インポート時 Alembic オブジェクトパスは Points を指していましたが、今は違います" - - -msgid "Object type mismatch, Alembic object path points to Points." -msgstr "オブジェクトタイプミスマッチ。Alembic オブジェクトパスは Points を指しています" - - -msgid "Object type mismatch, Alembic object path pointed to XForm when importing, but not any more." -msgstr "オブジェクトタイプミスマッチ。インポート時 Alembic オブジェクトパスは XForm を指していましたが、今は違います" - - -msgid "Object type mismatch, Alembic object path points to XForm." -msgstr "オブジェクトタイプミスマッチ。Alembic オブジェクトパスが XForm を指しています" - - msgid "Could not open Alembic archive for reading, see console for detail" msgstr "Alembic アーカイブを開いて読み込みできません!(コンソールに詳細)" @@ -129584,18 +129411,6 @@ msgid "%s: failed to load '%s'" msgstr "%s:「%s」の読み込みに失敗しました" -msgid "reading render result: dimensions don't match, expected %dx%d" -msgstr "レンダーリザルト読込:寸法が合いません(予定:%d×%d)" - - -msgid "reading render result: expected channel \"%s.%s\" or \"%s\" not found" -msgstr "レンダーリザルト読込:必要なチャンネル「%s.%s」や「%s」が見つかりません" - - -msgid "reading render result: expected channel \"%s.%s\" not found" -msgstr "レンダーリザルト読込:必要なチャンネル「%s.%s」が見つかりません" - - msgctxt "Sequence" msgid "Color Balance" msgstr "カラーバランス" diff --git a/locale/po/ka.po b/locale/po/ka.po index 1c64e75c6db..638d28c8eed 100644 --- a/locale/po/ka.po +++ b/locale/po/ka.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Tamar Mebonia , 2023\n" "Language-Team: LANGUAGE \n" @@ -12459,10 +12459,6 @@ msgid "Show scenes" msgstr "აჩვენე სცენები" -msgid "Show materials, nodetrees, textures and Freestyle's linestyles" -msgstr "აჩვენე მასალები, კვანძური ხეები, ტექსტურები და თავისუფალი სტილის ხაზსტილები" - - msgid "Directory" msgstr "საქაღალდე" @@ -23181,10 +23177,6 @@ msgid "Diffuse reflection multiplier" msgstr "დიფუზიური ანარეკლის მამრავლი" -msgid "Falloff distance - the light is at half the original intensity at this point" -msgstr "მილევის მანძილი - ამ ადგილთან სინათლე თავისი თავდაპირველი ინტენსივობის ნახევარზეა" - - msgid "Node tree for node based lights" msgstr "კვანძური ხე კვანძებზე დაფუძნებული სინათლეებისთვის" @@ -23270,14 +23262,6 @@ msgid "Directional area Light" msgstr "მიმართული არეალური სინათლე" -msgid "Constant Coefficient" -msgstr "მუდმივი კოეფიციენტი" - - -msgid "Constant distance attenuation coefficient" -msgstr "მუდმივი მანძილისმიერი შესუსტების კოეფიციენტი" - - msgid "Contact Shadow Bias" msgstr "კონტაქტური ჩრდილების მიკერძოება" @@ -23311,66 +23295,6 @@ msgid "Light energy emitted over the entire area of the light in all directions" msgstr "სინათლის მთელი არეალიდან ყველა მიმართულებით გამოცემული შუქის ენერგია" -msgid "Custom light falloff curve" -msgstr "სინათლის მილევის მორგებული წირი" - - -msgid "Falloff Type" -msgstr "მილევის ტიპი" - - -msgid "Intensity Decay with distance" -msgstr "ინტენსივობის დავარდნა დაშორებასთან ერთად" - - -msgid "Inverse Linear" -msgstr "ინვერსიული წრფივი" - - -msgid "Inverse Square" -msgstr "ინვერსიული კვადრატი" - - -msgid "Inverse Coefficients" -msgstr "ინვერსიული კოეფიციენტები" - - -msgid "Lin/Quad Weighted" -msgstr "წრფ./კვადრ. შერეული" - - -msgid "Linear Attenuation" -msgstr "წრფივი შესუსტება" - - -msgid "Linear distance attenuation" -msgstr "წრფივი მანძილისმიერი შესუსტები" - - -msgid "Linear Coefficient" -msgstr "წრფივი კოეფიციენტი" - - -msgid "Linear distance attenuation coefficient" -msgstr "წრფივი მანძილისმიერი შესუსტების კოეფიციენტი" - - -msgid "Quadratic Attenuation" -msgstr "კვადრატული შესუსტება" - - -msgid "Quadratic distance attenuation" -msgstr "კვადრატული მანძილისმიერი შესუსტება" - - -msgid "Quadratic Coefficient" -msgstr "კვადრატული კოეფიციენტი" - - -msgid "Quadratic distance attenuation coefficient" -msgstr "კვადრატული მანძილისმიერი შესუსტების კოეფიციენტი" - - msgid "Shadow Buffer Bias" msgstr "ჩრდილის ბუფერის მიკერძოება" @@ -23387,22 +23311,6 @@ msgid "Shadow map clip start, below which objects will not generate shadows" msgstr "ჩრდილის რუკის ჩამოჭრის დასაწყისი, რომლის ქვემოთაც ობიექტები ჩრდილს არ წარმოქმნიან" -msgid "Samples" -msgstr "სემპლები" - - -msgid "Number of shadow buffer samples" -msgstr "რდილის ბუფერის სემპლების რიცხვი" - - -msgid "Shadow Buffer Size" -msgstr "ჩრდილის ბუფერის ზომა" - - -msgid "Resolution of the shadow buffer, higher values give crisper shadows but use more memory" -msgstr "ჩრდილის ბუფერის გარჩევადობა, უფრო მაღალი მნიშვნელობები უფრო მკვეთრ ჩრდილებს იძლევა, მაგრამ მეტ მეხსიერებას იყენებს" - - msgid "Shadow Color" msgstr "ჩრდილის ფერი" @@ -28161,6 +28069,10 @@ msgid "YCC" msgstr "YCC" +msgid "Multi-View" +msgstr "მრაავლ-ხედი" + + msgid "Tile Number" msgstr "ფილის ნომერი" @@ -31363,6 +31275,10 @@ msgid "Root" msgstr "ფესვი" +msgid "Samples" +msgstr "სემპლები" + + msgid "Intersect" msgstr "გადაკვეთა" @@ -37330,6 +37246,10 @@ msgid "Expand" msgstr "გაფართოება" +msgid "Falloff Type" +msgstr "მილევის ტიპი" + + msgid "Add face set within the box as you move the brush" msgstr "ფუნჯის მოძრაობით გამოსახულ მართკუთხედში დაამატე წახნაგების ჯგუფი" @@ -40775,10 +40695,6 @@ msgid "Render Single Layer" msgstr "დაარენდერე ერთი შრე" -msgid "Multi-View" -msgstr "მრაავლ-ხედი" - - msgid "Mesh Source" msgstr "მეშის წყარო" @@ -42359,14 +42275,6 @@ msgid "Screen" msgstr "ეკრანი" -msgid "Use Ambient Occlusion" -msgstr "გამოიყენე გარემოსმიერი დახშობა" - - -msgid "Use Ambient Occlusion to add shadowing based on distance between objects" -msgstr "გამოიყენე გარემოსმიერი დახშობა და მოჩრდილვა ობიექტებს შორის მანძილის მიხედვით" - - msgid "Search" msgstr "ძიება" diff --git a/locale/po/ko.po b/locale/po/ko.po index cf54b9d4d46..a16683d4744 100644 --- a/locale/po/ko.po +++ b/locale/po/ko.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2020-01-04 05:04+0900\n" "Last-Translator: Geuntak Jeong \n" "Language-Team: Korean (http://www.transifex.com/lxlalexlxl/blender/language/ko/)\n" @@ -17687,10 +17687,6 @@ msgid "Cycles light settings" msgstr "Cycles 라이트 설정" -msgid "Falloff distance - the light is at half the original intensity at this point" -msgstr "감소 거리 - 이 포인트에서 라이트은 원본 강도의 절반" - - msgid "Node tree for node based lights" msgstr "노드 기반 라이트에 대한 노드 트리" @@ -17764,14 +17760,6 @@ msgid "Directional area Light" msgstr "지향성 영역 라이트" -msgid "Constant Coefficient" -msgstr "상수 계수" - - -msgid "Constant distance attenuation coefficient" -msgstr "상수 거리 감쇠 계수" - - msgid "Contact Shadow Bias" msgstr "접촉 섀도우 성향" @@ -17796,66 +17784,6 @@ msgid "Pixel thickness used to detect occlusion" msgstr "폐색을 감지하는 데 사용되는 픽셀 두께" -msgid "Custom light falloff curve" -msgstr "커스텀 라이트 감소 커브" - - -msgid "Falloff Type" -msgstr "감소 유형" - - -msgid "Intensity Decay with distance" -msgstr "거리와 강도 소멸" - - -msgid "Inverse Linear" -msgstr "선형을 반전" - - -msgid "Inverse Square" -msgstr "제곱 반전" - - -msgid "Inverse Coefficients" -msgstr "반전 계수" - - -msgid "Lin/Quad Weighted" -msgstr "린/쿼드 웨이트됨" - - -msgid "Linear Attenuation" -msgstr "선형 감쇠" - - -msgid "Linear distance attenuation" -msgstr "선형 원거리 감쇠" - - -msgid "Linear Coefficient" -msgstr "선형 계수" - - -msgid "Linear distance attenuation coefficient" -msgstr "선형 거리 감쇠 계수" - - -msgid "Quadratic Attenuation" -msgstr "이차 감쇠" - - -msgid "Quadratic distance attenuation" -msgstr "이차 거리 감쇠" - - -msgid "Quadratic Coefficient" -msgstr "이차 계수" - - -msgid "Quadratic distance attenuation coefficient" -msgstr "이차 거리 감쇠 계수" - - msgid "Shadow Buffer Bias" msgstr "섀도우 버퍼 성향" @@ -17872,22 +17800,6 @@ msgid "Shadow map clip start, below which objects will not generate shadows" msgstr "섀도우맵 클립 시작, 그 아래에 오브젝트는 섀도우를 생성하지 않음" -msgid "Samples" -msgstr "샘플" - - -msgid "Number of shadow buffer samples" -msgstr "섀도우 버퍼 샘플의 수" - - -msgid "Shadow Buffer Size" -msgstr "섀도우 버퍼 크기" - - -msgid "Resolution of the shadow buffer, higher values give crisper shadows but use more memory" -msgstr "섀도우 버퍼의 해상도, 값이 높을수록 선명한 섀도우를 제공하지만 더 많은 메모리를 사용합니다" - - msgid "Shadow Color" msgstr "섀도우 컬러" @@ -22777,6 +22689,10 @@ msgid "Format of multiview media" msgstr "멀티뷰 미디어의 형식" +msgid "Multi-View" +msgstr "멀티 뷰" + + msgid "Image Preview" msgstr "이미지 미리보기" @@ -26920,6 +26836,10 @@ msgid "Minimum for measuring thickness" msgstr "두께 측정에 대한 최소치" +msgid "Samples" +msgstr "샘플" + + msgid "Number of samples to test per face" msgstr "페이스 당 테스트하는 샘플의 수" @@ -53705,6 +53625,10 @@ msgid "Dynamic topology alters the mesh topology while sculpting" msgstr "스컬프트하는 동안 메쉬 토폴로지를 다이나믹 토폴로지로 변경" +msgid "Falloff Type" +msgstr "감소 유형" + + msgctxt "Operator" msgid "Mask Expand" msgstr "마스크 확장" @@ -56330,6 +56254,10 @@ msgid "Align UVs on Y axis" msgstr "UV를 Y 축에 정렬" +msgid "Correct Aspect" +msgstr "보정 측면" + + msgctxt "Operator" msgid "Average Islands Scale" msgstr "평균 아일랜드 축적" @@ -56356,10 +56284,6 @@ msgid "Clip UV coordinates to bounds after unwrapping" msgstr "펼치기 이후 경계에 UV 좌표를 클립합니다" -msgid "Correct Aspect" -msgstr "보정 측면" - - msgid "Map UVs taking image aspect ratio into account" msgstr "이미지 측면 비율을 고려한 UV 매핑" @@ -66374,10 +66298,6 @@ msgid "Single stereo camera system, adjust the stereo settings in the camera pan msgstr "단일 스테레오 카메라 시스템, 카메라 패널의 스테레오 설정 조정" -msgid "Multi-View" -msgstr "멀티 뷰" - - msgid "Multi camera system, adjust the cameras individually" msgstr "다중 카메라 시스템, 카메라를 개별적으로 조정" @@ -75010,14 +74930,6 @@ msgid "Length of rays, defines how far away other faces give occlusion effect" msgstr "광선의 길이, 떨어진 다른 면에 폐색 효과를 주는 정도를 정의" -msgid "Use Ambient Occlusion" -msgstr "주변 폐색을 사용" - - -msgid "Use Ambient Occlusion to add shadowing based on distance between objects" -msgstr "오브젝트 사이의 거리에 따라 섀도우를 추가하는 주변 폐색을 사용" - - msgid "World Mist" msgstr "월드 안개" diff --git a/locale/po/ky.po b/locale/po/ky.po index 297c86861f5..f034505f467 100644 --- a/locale/po/ky.po +++ b/locale/po/ky.po @@ -1,10 +1,10 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "(b'0000000000000000000000000000000000000000')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2013-11-05 13:47+0600\n" "Last-Translator: Chyngyz Dzhumaliev \n" "Language-Team: Kirghiz \n" diff --git a/locale/po/nl.po b/locale/po/nl.po index b4bc7799b92..5447899cd45 100644 --- a/locale/po/nl.po +++ b/locale/po/nl.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2021-12-05 20:05+0100\n" "Language: nl\n" "MIME-Version: 1.0\n" @@ -2196,14 +2196,6 @@ msgid "Area" msgstr "Gebied" -msgid "Falloff Type" -msgstr "Type Afvlakking" - - -msgid "Inverse Square" -msgstr "Inverse Wortel" - - msgid "Shadow Color" msgstr "Schaduwkleur" @@ -5744,6 +5736,10 @@ msgid "Change value" msgstr "Wijzig waarde" +msgid "Falloff Type" +msgstr "Type Afvlakking" + + msgid "Modify Active" msgstr "Wijzig Actieve" diff --git a/locale/po/pl.po b/locale/po/pl.po index cbb3ac98b0c..aeac0db33ba 100644 --- a/locale/po/pl.po +++ b/locale/po/pl.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2017-08-26 11:13+0200\n" "Last-Translator: Mikołaj Juda \n" "Language: pl\n" diff --git a/locale/po/pt.po b/locale/po/pt.po index edfda776a0b..55b21a89cac 100644 --- a/locale/po/pt.po +++ b/locale/po/pt.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: Ivan Paulos Tomé \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2017-09-08 21:24-0300\n" "Last-Translator: Ivan Paulos Tomé \n" "Language-Team: Ivan Paulos Tomé, Inês Almeida, João Brandão (ULISBOA), Paulo Martins \n" @@ -13501,10 +13501,6 @@ msgid "Light color" msgstr "Cor da luz" -msgid "Falloff distance - the light is at half the original intensity at this point" -msgstr "Permite definir a distância para o decaimento. A iluminação terá a metade de sua intensidade original de energia neste ponto." - - msgid "Specular Factor" msgstr "Fator especular" @@ -13525,70 +13521,6 @@ msgid "Directional area light source" msgstr "Fonte de luz com área direcional." -msgid "Constant Coefficient" -msgstr "Coeficiente constante" - - -msgid "Constant distance attenuation coefficient" -msgstr "Coeficiente de atenuação constante para o decaimento conforme a distância." - - -msgid "Falloff Type" -msgstr "Tipo de decaimento" - - -msgid "Intensity Decay with distance" -msgstr "Controla o decaimento da intensidade conforme a distância." - - -msgid "Inverse Linear" -msgstr "Linear inverso" - - -msgid "Inverse Square" -msgstr "Inverso quadrático" - - -msgid "Inverse Coefficients" -msgstr "Coeficientes inversos" - - -msgid "Lin/Quad Weighted" -msgstr "Influência linear e quadrática" - - -msgid "Linear Attenuation" -msgstr "Atenuação linear" - - -msgid "Linear distance attenuation" -msgstr "Atenuação linear para o decaimento conforme a distância." - - -msgid "Linear Coefficient" -msgstr "Coeficiente linear" - - -msgid "Linear distance attenuation coefficient" -msgstr "Coeficiente de atenuação linear para o decaimento conforme a distância." - - -msgid "Quadratic Attenuation" -msgstr "Atenuação quadrática" - - -msgid "Quadratic distance attenuation" -msgstr "Atenuação quadrática para o decaimento conforme a distância." - - -msgid "Quadratic Coefficient" -msgstr "Coeficiente quadrático" - - -msgid "Quadratic distance attenuation coefficient" -msgstr "Coeficiente quadrático de atenuação para o decaimento conforme a distância." - - msgid "Shadow Buffer Bias" msgstr "Ajuste fino para sombras contingenciadas" @@ -13601,22 +13533,6 @@ msgid "Shadow map clip start, below which objects will not generate shadows" msgstr "O limite inicial do mapa de sombras (distância), abaixo do qual os objetos não irão gerar sombras." -msgid "Samples" -msgstr "Amostras" - - -msgid "Number of shadow buffer samples" -msgstr "Número de amostras de contingenciamento de sombras." - - -msgid "Shadow Buffer Size" -msgstr "Tamanho do contingenciador de sombras" - - -msgid "Resolution of the shadow buffer, higher values give crisper shadows but use more memory" -msgstr "A resolução do contingenciador de sombras, valores mais altos fornecem sombras realçadas mas usam mais memória." - - msgid "Shadow Color" msgstr "Cor de sombras" @@ -17511,6 +17427,10 @@ msgid "Format of multiview media" msgstr "Formato de mídia com múltiplas visualizações." +msgid "Multi-View" +msgstr "Múltipla visualização" + + msgid "Image Preview" msgstr "Visualização de imagem" @@ -21087,6 +21007,10 @@ msgid "Minimum for measuring thickness" msgstr "Mínimo para a medição da espessura." +msgid "Samples" +msgstr "Amostras" + + msgid "Number of samples to test per face" msgstr "Número de amostras para testar por face." @@ -42893,6 +42817,10 @@ msgid "Dynamic topology alters the mesh topology while sculpting" msgstr "Topologia dinâmica altera a topologia da malha durante a escultura." +msgid "Falloff Type" +msgstr "Tipo de decaimento" + + msgid "Operator" msgstr "Operador" @@ -44953,6 +44881,10 @@ msgid "Align UVs on Y axis" msgstr "Alinha as UVs no eixo Y." +msgid "Correct Aspect" +msgstr "Corrigir aspecto" + + msgctxt "Operator" msgid "Average Islands Scale" msgstr "Escalonar as ilhas por uma média" @@ -44979,10 +44911,6 @@ msgid "Clip UV coordinates to bounds after unwrapping" msgstr "Limita as coordenadas UV para as margens após o desdobramento." -msgid "Correct Aspect" -msgstr "Corrigir aspecto" - - msgid "Map UVs taking image aspect ratio into account" msgstr "Mapeia as UVs levando em conta a proporção de aspecto da imagem." @@ -52045,10 +51973,6 @@ msgid "Single stereo camera system, adjust the stereo settings in the camera pan msgstr "Sistema unificado para a câmara estéreo, ajuste as definições estéreo dentro dos painéis de câmara." -msgid "Multi-View" -msgstr "Múltipla visualização" - - msgid "Multi camera system, adjust the cameras individually" msgstr "Um sistema de múltiplas câmaras (múltipla visualização), que permite ajustar as câmaras individualmente." @@ -58238,14 +58162,6 @@ msgid "Length of rays, defines how far away other faces give occlusion effect" msgstr "Comprimento dos raios, define com que distância as outras faces causam o efeito de oclusão." -msgid "Use Ambient Occlusion" -msgstr "Usar oclusão ambiente" - - -msgid "Use Ambient Occlusion to add shadowing based on distance between objects" -msgstr "Usa a oclusão ambiente para adicionar sombreamento com base na distância entre objetos." - - msgid "World Mist" msgstr "Névoa no ambiente" diff --git a/locale/po/pt_BR.po b/locale/po/pt_BR.po index 7c6e46086d3..a3ae717b01c 100644 --- a/locale/po/pt_BR.po +++ b/locale/po/pt_BR.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: Leandro Paganelli \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2022-03-21 19:03-0300\n" "Last-Translator: Leandro Paganelli \n" "Language-Team: Leandro Paganelli, Ivan Paulos Tomé, Dalai Felinto, Bruno Gonçalves Pirajá, Samuel Arataca, Daniel Tavares, Moraes Junior \n" @@ -14405,10 +14405,6 @@ msgid "Cycles light settings" msgstr "Configurações de Luz do Cycles" -msgid "Falloff distance - the light is at half the original intensity at this point" -msgstr "Permite definir a distância para o decaimento. A iluminação terá a metade de sua intensidade original de energia neste ponto." - - msgid "Specular Factor" msgstr "Fator especular" @@ -14458,70 +14454,6 @@ msgid "Directional area light source" msgstr "Fonte de luz com área direcional." -msgid "Constant Coefficient" -msgstr "Coeficiente constante" - - -msgid "Constant distance attenuation coefficient" -msgstr "Coeficiente de atenuação constante para o decaimento conforme a distância." - - -msgid "Falloff Type" -msgstr "Tipo de decaimento" - - -msgid "Intensity Decay with distance" -msgstr "Controla o decaimento da intensidade conforme a distância." - - -msgid "Inverse Linear" -msgstr "Linear inverso" - - -msgid "Inverse Square" -msgstr "Inverso quadrático" - - -msgid "Inverse Coefficients" -msgstr "Coeficientes inversos" - - -msgid "Lin/Quad Weighted" -msgstr "Influência linear e quadrática" - - -msgid "Linear Attenuation" -msgstr "Atenuação linear" - - -msgid "Linear distance attenuation" -msgstr "Atenuação linear para o decaimento conforme a distância." - - -msgid "Linear Coefficient" -msgstr "Coeficiente linear" - - -msgid "Linear distance attenuation coefficient" -msgstr "Coeficiente de atenuação linear para o decaimento conforme a distância." - - -msgid "Quadratic Attenuation" -msgstr "Atenuação quadrática" - - -msgid "Quadratic distance attenuation" -msgstr "Atenuação quadrática para o decaimento conforme a distância." - - -msgid "Quadratic Coefficient" -msgstr "Coeficiente quadrático" - - -msgid "Quadratic distance attenuation coefficient" -msgstr "Coeficiente quadrático de atenuação para o decaimento conforme a distância." - - msgid "Shadow Buffer Bias" msgstr "Ajuste fino para sombras contingenciadas" @@ -14534,22 +14466,6 @@ msgid "Shadow map clip start, below which objects will not generate shadows" msgstr "O limite inicial do mapa de sombras (distância), abaixo do qual os objetos não irão gerar sombras." -msgid "Samples" -msgstr "Amostras" - - -msgid "Number of shadow buffer samples" -msgstr "Número de amostras de contingenciamento de sombras." - - -msgid "Shadow Buffer Size" -msgstr "Tamanho do contingenciador de sombras" - - -msgid "Resolution of the shadow buffer, higher values give crisper shadows but use more memory" -msgstr "A resolução do contingenciador de sombras, valores mais altos fornecem sombras realçadas mas usam mais memória." - - msgid "Shadow Color" msgstr "Cor de sombras" @@ -18652,6 +18568,10 @@ msgid "Format of multiview media" msgstr "Formato de mídia com múltiplas visualizações." +msgid "Multi-View" +msgstr "Múltipla visualização" + + msgid "Image Preview" msgstr "Visualização de imagem" @@ -22633,6 +22553,10 @@ msgid "Minimum for measuring thickness" msgstr "Mínimo para a medição da espessura." +msgid "Samples" +msgstr "Amostras" + + msgid "Number of samples to test per face" msgstr "Número de amostras para testar por face." @@ -47116,6 +47040,10 @@ msgid "Expand" msgstr "Expandir" +msgid "Falloff Type" +msgstr "Tipo de decaimento" + + msgid "Reposition Pivot" msgstr "Reposiciona Pivô" @@ -49356,6 +49284,10 @@ msgid "Align UVs on Y axis" msgstr "Alinha as UVs no eixo Y." +msgid "Correct Aspect" +msgstr "Corrigir aspecto" + + msgctxt "Operator" msgid "Average Islands Scale" msgstr "Escalonar as ilhas por uma média" @@ -49382,10 +49314,6 @@ msgid "Clip UV coordinates to bounds after unwrapping" msgstr "Limita as coordenadas UV para as margens após o desdobramento." -msgid "Correct Aspect" -msgstr "Corrigir aspecto" - - msgid "Map UVs taking image aspect ratio into account" msgstr "Mapeia as UVs levando em conta a proporção de aspecto da imagem." @@ -57826,10 +57754,6 @@ msgid "Single stereo camera system, adjust the stereo settings in the camera pan msgstr "Sistema unificado para a câmera estéreo, ajuste as definições estéreo dentro dos painéis de câmera." -msgid "Multi-View" -msgstr "Múltipla visualização" - - msgid "Multi camera system, adjust the cameras individually" msgstr "Um sistema de múltiplas câmeras (múltipla visualização), que permite ajustar as câmeras individualmente." @@ -64412,14 +64336,6 @@ msgid "Length of rays, defines how far away other faces give occlusion effect" msgstr "Comprimento dos raios, define com que distância as outras faces causam o efeito de oclusão." -msgid "Use Ambient Occlusion" -msgstr "Usar oclusão ambiente" - - -msgid "Use Ambient Occlusion to add shadowing based on distance between objects" -msgstr "Usa a oclusão ambiente para adicionar sombreamento com base na distância entre objetos." - - msgid "World Mist" msgstr "Névoa no ambiente" diff --git a/locale/po/ru.po b/locale/po/ru.po index d39ad3c4871..7b3a85aabf6 100644 --- a/locale/po/ru.po +++ b/locale/po/ru.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2018-01-03 14:47+0000\n" "Last-Translator: Lockal , 2023\n" "Language-Team: Russian (https://app.transifex.com/translateblender/teams/82039/ru/)\n" @@ -11924,10 +11924,6 @@ msgid "Show scenes" msgstr "Показать сцены" -msgid "Show materials, nodetrees, textures and Freestyle's linestyles" -msgstr "Показать материалы, системы нодов и стили линий Freestyle" - - msgid "Directory" msgstr "Папка" @@ -20702,10 +20698,6 @@ msgid "Cycles light settings" msgstr "Настройки освещения в Cycles" -msgid "Falloff distance - the light is at half the original intensity at this point" -msgstr "Расстояние полурассеивания - расстояние, на котором интенсивность освещения уменьшается в два раза" - - msgid "Node tree for node based lights" msgstr "Система нодов для источников света" @@ -20779,14 +20771,6 @@ msgid "Directional area Light" msgstr "Направленный протяжённый источник света" -msgid "Constant Coefficient" -msgstr "Постоянный коэффициент" - - -msgid "Constant distance attenuation coefficient" -msgstr "Постоянный коэффициент затухания на расстоянии" - - msgid "Contact Shadow Bias" msgstr "Погрешность контактных теней" @@ -20816,66 +20800,6 @@ msgid "Power" msgstr "Мощность" -msgid "Custom light falloff curve" -msgstr "Особая кривая ослабления света" - - -msgid "Falloff Type" -msgstr "Тип спада" - - -msgid "Intensity Decay with distance" -msgstr "Характер зависимости интенсивности от расстояния" - - -msgid "Inverse Linear" -msgstr "Обратно-линейно" - - -msgid "Inverse Square" -msgstr "Обратно-квадратично" - - -msgid "Inverse Coefficients" -msgstr "Обратные коэффициенты" - - -msgid "Lin/Quad Weighted" -msgstr "Смесь лин./квад." - - -msgid "Linear Attenuation" -msgstr "Линейное затухание" - - -msgid "Linear distance attenuation" -msgstr "Линейное затухание от расстояния" - - -msgid "Linear Coefficient" -msgstr "Линейный коэффициент" - - -msgid "Linear distance attenuation coefficient" -msgstr "Линейный коэффициент затухания на расстоянии" - - -msgid "Quadratic Attenuation" -msgstr "Квадратичное затухание" - - -msgid "Quadratic distance attenuation" -msgstr "Квадратичное затухание от расстояния" - - -msgid "Quadratic Coefficient" -msgstr "Квадратичный коэффициент" - - -msgid "Quadratic distance attenuation coefficient" -msgstr "Квадратичный коэффициент затухания на расстоянии" - - msgid "Shadow Buffer Bias" msgstr "Погрешность теневого буфера" @@ -20892,22 +20816,6 @@ msgid "Shadow map clip start, below which objects will not generate shadows" msgstr "Ближняя граница отсечения для теневого буфера, до которой расчёт теней не производится" -msgid "Samples" -msgstr "Сэмплы" - - -msgid "Number of shadow buffer samples" -msgstr "Количество сэмплов теневого буфера" - - -msgid "Shadow Buffer Size" -msgstr "Размер теневого буфера" - - -msgid "Resolution of the shadow buffer, higher values give crisper shadows but use more memory" -msgstr "Разрешение теневого буфера. Чем выше — тем чётче тень, но требуется больше памяти" - - msgid "Shadow Color" msgstr "Цвет тени" @@ -25919,6 +25827,10 @@ msgid "Format of multiview media" msgstr "Формат среды мультипросмотра" +msgid "Multi-View" +msgstr "Мультивид" + + msgid "Image Preview" msgstr "Предпросмотр изображения" @@ -30219,6 +30131,10 @@ msgid "Minimum for measuring thickness" msgstr "Минимум для измерения толщины" +msgid "Samples" +msgstr "Сэмплы" + + msgid "Number of samples to test per face" msgstr "Количество сэмплов для тестирования на грань" @@ -57177,6 +57093,10 @@ msgid "Dynamic topology alters the mesh topology while sculpting" msgstr "Динамическая топология изменяет топологию сетки во время скульптинга" +msgid "Falloff Type" +msgstr "Тип спада" + + msgid "Grow Face Set" msgstr "Увеличить набор граней" @@ -59845,6 +59765,10 @@ msgid "Align UVs on Y axis" msgstr "Выровнять UV по оси Y" +msgid "Correct Aspect" +msgstr "Коррекция соотн. сторон" + + msgctxt "Operator" msgid "Average Islands Scale" msgstr "Усреднить масштаб островов" @@ -59871,10 +59795,6 @@ msgid "Clip UV coordinates to bounds after unwrapping" msgstr "Отсекать UV-координаты по границам после развёртки" -msgid "Correct Aspect" -msgstr "Коррекция соотн. сторон" - - msgid "Map UVs taking image aspect ratio into account" msgstr "Создать UV-карту с учётом соотношения сторон изображения" @@ -69954,10 +69874,6 @@ msgid "Single stereo camera system, adjust the stereo settings in the camera pan msgstr "Система из одной стереокамеры; настраивается в параметрах стерео панели камеры" -msgid "Multi-View" -msgstr "Мультивид" - - msgid "Multi camera system, adjust the cameras individually" msgstr "Система с несколькими камерами и индивидуальной настройкой камер" @@ -78776,14 +78692,6 @@ msgid "Length of rays, defines how far away other faces give occlusion effect" msgstr "Длина лучей, определяет, на каком расстоянии друг от друга грани дают эффект окклюзии" -msgid "Use Ambient Occlusion" -msgstr "Использовать Ambient Occlusion" - - -msgid "Use Ambient Occlusion to add shadowing based on distance between objects" -msgstr "Использовать Ambient Occlusion для добавления затенения на основе расстояния между объектами" - - msgid "World Mist" msgstr "Туман окружающей среды" diff --git a/locale/po/sk.po b/locale/po/sk.po index 8b1812bf14f..53fc1ac9fbb 100644 --- a/locale/po/sk.po +++ b/locale/po/sk.po @@ -1,10 +1,10 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" -"PO-Revision-Date: 2023-06-28 07:43+0200\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" +"PO-Revision-Date: 2023-07-07 08:28+0200\n" "Last-Translator: Jozef Matta \n" "Language-Team: Jozef Matta\n" "Language: sk_SK\n" @@ -1287,6 +1287,10 @@ msgid "Quaternion" msgstr "Kvaternión" +msgid "Floating point quaternion rotation" +msgstr "Rotácia kvaterniónov s pohyblivou desatinnou čiarkou" + + msgid "Domain" msgstr "Oblasť pôsobnosti" @@ -1427,6 +1431,14 @@ msgid "Geometry attribute that stores integer values" msgstr "Atribút geometrie, ktorý uchováva celočíselné hodnoty" +msgid "Quaternion Attribute" +msgstr "Atribút kvaterniónu" + + +msgid "Geometry attribute that stores rotation" +msgstr "Atribút geometrie, ktorý uchováva rotáciu" + + msgid "String Attribute" msgstr "Reťazec atribútu" @@ -2019,6 +2031,10 @@ msgid "Grease Pencil" msgstr "Pastelka" +msgid "Grease Pencil data-blocks" +msgstr "Blok údajov pastelky" + + msgid "Hair Curves" msgstr "Krivky vlasov" @@ -2207,6 +2223,10 @@ msgid "Simulations" msgstr "Simulácia" +msgid "Simulation data-blocks" +msgstr "Bloky údajov simulácie" + + msgid "Sounds" msgstr "Zvuky" @@ -2519,6 +2539,14 @@ msgid "Collection of screens" msgstr "Kolekcia obrazoviek" +msgid "Main Simulations" +msgstr "Hlavná simulácia" + + +msgid "Collection of simulations" +msgstr "Kolekcia simulácií" + + msgid "Main Sounds" msgstr "Hlavné zvuky" @@ -3385,10 +3413,18 @@ msgid "Bone Matrix" msgstr "Matrica kostí" +msgid "3×3 bone matrix" +msgstr "Matrica kostí 3x3" + + msgid "Bone Armature-Relative Matrix" msgstr "Matrica kostí relatívnej armatúry" +msgid "4×4 bone matrix relative to armature" +msgstr "Matrica kostí 4×4 vzhľadom na armatúru" + + msgid "Parent" msgstr "Rodič" @@ -4640,6 +4676,11 @@ msgid "Path of an object inside of an Alembic archive" msgstr "Cesta objektu vnútri archívu Alembic" +msgctxt "File browser" +msgid "Path" +msgstr "Cesta" + + msgid "Object path" msgstr "Cesta objektu" @@ -5635,6 +5676,22 @@ msgid "The inputs are invalid, or the algorithm has been improperly called" msgstr "Vstupy sú neplatné, alebo algoritmus bol nesprávne nazvaný" +msgid "Collection Child" +msgstr "Kolekcia potomkov" + + +msgid "Child collection with its collection related settings" +msgstr "Kolekcia potomkov s nastaveniami súvisiacimi s kolekciou" + + +msgid "Light Linking" +msgstr "Prepojenie svetla" + + +msgid "Light linking settings of the collection object" +msgstr "Nastavenia prepojenia svetla kolekcie objektu" + + msgid "Collection Children" msgstr "Kolekcia potomkov" @@ -5643,6 +5700,22 @@ msgid "Collection of child collections" msgstr "Kolekcia kolekcií potomkov" +msgid "Collection Light Linking" +msgstr "Prepojenie svetla kolekcie" + + +msgid "Light linking settings of objects and children collections of a collection" +msgstr "Nastavenia prepojenia svetla objektov a kolekcií potomkov kolekcie" + + +msgid "Link State" +msgstr "Stav prepojenia" + + +msgid "Light or shadow receiving state of the object or collection" +msgstr "Stav prijímania svetla alebo tieňa objektu alebo kolekcie" + + msgid "Include" msgstr "Zahrnúť" @@ -5651,6 +5724,18 @@ msgid "Exclude" msgstr "Vylúčiť" +msgid "Collection Object" +msgstr "Kolekcia objektov" + + +msgid "Object of a collection with its collection related settings" +msgstr "Kolekcie objektov s nastaveniami súvisiacimi s kolekciou" + + +msgid "Light linking settings of the collection" +msgstr "Nastavenia prepojenia svetla v kolekcii" + + msgid "Collection Objects" msgstr "Kolekcia objektov" @@ -9812,6 +9897,11 @@ msgid "Font" msgstr "Písmo" +msgctxt "ID" +msgid "Grease Pencil (legacy)" +msgstr "Pastelka (staršia verzia)" + + msgctxt "ID" msgid "Grease Pencil" msgstr "Pastelka" @@ -10289,6 +10379,31 @@ msgid "Multiplier for wave influence of this brush" msgstr "Násobiteľ pre vplyv vlny tohto štetca" +msgctxt "Simulation" +msgid "Wave Type" +msgstr "Typ vlny" + + +msgctxt "Simulation" +msgid "Depth Change" +msgstr "Zmena hĺbky" + + +msgctxt "Simulation" +msgid "Obstacle" +msgstr "Prekážka" + + +msgctxt "Simulation" +msgid "Force" +msgstr "Sila" + + +msgctxt "Simulation" +msgid "Reflect Only" +msgstr "Len odraz" + + msgid "Canvas Settings" msgstr "Nastavenie plátna" @@ -10557,6 +10672,10 @@ msgid "Anti-Aliasing" msgstr "Anti-Aliasing" +msgid "Use 5× multisampling to smooth paint edges" +msgstr "Použitie viacnásobného snímania 5× na vyhladenie okrajov farby" + + msgid "Enable to make surface changes disappear over time" msgstr "Povolí vytrácanie zmien povrchu v priebehu času" @@ -12091,10 +12210,50 @@ msgid "Adjust the offset to the beginning/end" msgstr "Prispôsobiť posuv začiatku/konca" +msgctxt "ParticleSettings" +msgid "Kink" +msgstr "Skrútenie" + + msgid "Type of periodic offset on the curve" msgstr "Typ periodického posuvu krivky" +msgctxt "ParticleSettings" +msgid "None" +msgstr "Nie je" + + +msgctxt "ParticleSettings" +msgid "Braid" +msgstr "Vrkoč" + + +msgctxt "ParticleSettings" +msgid "Curl" +msgstr "Kučera" + + +msgctxt "ParticleSettings" +msgid "Radial" +msgstr "Radiálne" + + +msgctxt "ParticleSettings" +msgid "Roll" +msgstr "Kývať" + + +msgctxt "ParticleSettings" +msgid "Rotation" +msgstr "Rotácia" + + +msgctxt "ParticleSettings" +msgid "Wave" +msgstr "Zvlniť" + + msgid "The distance from which particles are affected fully" msgstr "Vzdialenosť úplného ovplyvnenia častíc" @@ -12704,10 +12863,6 @@ msgid "Show scenes" msgstr "Zobrazí scény" -msgid "Show materials, nodetrees, textures and Freestyle's linestyles" -msgstr "Zobrazí materiály, stromy ulov, textúry a typy čiar Voľný štýl" - - msgid "Directory" msgstr "Priečinok" @@ -18717,6 +18872,34 @@ msgid "Grid scale" msgstr "Mierka mriežky" +msgid "Collection of related drawings" +msgstr "Kolekcia súvisiacich kresieb" + + +msgid "Set layer visibility" +msgstr "Nastaviť viditeľnosť vrstvy" + + +msgid "Grease Pencil Layer Group" +msgstr "Skupina vrstiev Pastelky" + + +msgid "Group of Grease Pencil layers" +msgstr "Skupina vrstiev Pastelky" + + +msgid "Set layer group visibility" +msgstr "Nastaviť viditeľnosť skupiny vrstiev" + + +msgid "Protect group from further editing and/or frame changes" +msgstr "Chrániť skupinu pred ďalšími úpravami a/alebo zmenami snímok" + + +msgid "Group name" +msgstr "Názov skupiny" + + msgid "Grease Pencil Layers" msgstr "Vrstvy pastelky" @@ -18761,6 +18944,10 @@ msgid "Active index in layer mask array" msgstr "Aktívny index v poli vrstiev masky" +msgid "Collection of Grease Pencil layers" +msgstr "Kolekcia vrstiev Pastelky" + + msgid "Active Grease Pencil layer" msgstr "Aktívna vrstva pastelky" @@ -21599,6 +21786,14 @@ msgid "Collections that are immediate children of this collection" msgstr "Kolekcie priamych potomkov tejto kolekcie" +msgid "Children collections their parent-collection-specific settings" +msgstr "Kolekcie potomkov s nastaveniami špecifickými pre ich kolekcie rodičov" + + +msgid "Objects of the collection with their parent-collection-specific settings" +msgstr "Kolekcie objektov s ich nastaveniami špecifickými pre kolekcie rodičov" + + msgid "Collection Color" msgstr "Farba kolekcie" @@ -22263,10 +22458,6 @@ msgid "Whether the selected text is italics" msgstr "Určuje, či je vybraný text kurzíva" -msgid "Selected Smallcaps" -msgstr "Vybrané malé písmo" - - msgid "Whether the selected text is small caps" msgstr "Určuje, či je vybraný text malé písmo" @@ -23327,6 +23518,18 @@ msgid "Grease Pencil data-block" msgstr "Blok údajov pastelky" +msgid "Layer Groups" +msgstr "Skupiny vrstiev" + + +msgid "Grease Pencil layer groups" +msgstr "Skupiny vrstiev Pastelky" + + +msgid "Grease Pencil layers" +msgstr "Vrstvy Pastelky" + + msgid "Image data-block referencing an external or packed image" msgstr "Blok údajov obrázku odkazujúci na externý alebo zabalený obrázok" @@ -23960,10 +24163,6 @@ msgid "Diffuse reflection multiplier" msgstr "Násobiteľ rozptylového odrazu" -msgid "Falloff distance - the light is at half the original intensity at this point" -msgstr "Dopad vzdialenosti - svetlo má v tomto bode polovicu pôvodnej intenzity" - - msgid "Node tree for node based lights" msgstr "Uzol stromu pre uzol základného svetla" @@ -24049,14 +24248,6 @@ msgid "Directional area Light" msgstr "Svetlo smerovej oblasti" -msgid "Constant Coefficient" -msgstr "Konštantný koeficient" - - -msgid "Constant distance attenuation coefficient" -msgstr "Koeficient konštantnej vzdialenosti útlmu" - - msgid "Contact Shadow Bias" msgstr "Skreslenie dotyku tieňa" @@ -24090,66 +24281,6 @@ msgid "Light energy emitted over the entire area of the light in all directions" msgstr "Energia svetla vyžarovaná cez celú oblasť svetla vo všetkých smeroch" -msgid "Custom light falloff curve" -msgstr "Vlastná krivka dopadu svetla" - - -msgid "Falloff Type" -msgstr "Typ dopadu" - - -msgid "Intensity Decay with distance" -msgstr "Rozpad intenzity so vzdialenosťou" - - -msgid "Inverse Linear" -msgstr "Lineárna inverzia" - - -msgid "Inverse Square" -msgstr "Inverzný štvorec" - - -msgid "Inverse Coefficients" -msgstr "Koeficienty inverzie" - - -msgid "Lin/Quad Weighted" -msgstr "Vyváženie čiara/štvorec" - - -msgid "Linear Attenuation" -msgstr "Lineárny útlm" - - -msgid "Linear distance attenuation" -msgstr "Lineárna vzdialenosť útlmu" - - -msgid "Linear Coefficient" -msgstr "Lineárny koeficient" - - -msgid "Linear distance attenuation coefficient" -msgstr "Lineárny koeficient vzdialenosti útlmu" - - -msgid "Quadratic Attenuation" -msgstr "Kvadratický útlm" - - -msgid "Quadratic distance attenuation" -msgstr "Vzdialenosť kvadratického útlmu" - - -msgid "Quadratic Coefficient" -msgstr "Kvadratický koeficient" - - -msgid "Quadratic distance attenuation coefficient" -msgstr "Koeficient vzdialenosti kvadratickéhu útlmu" - - msgid "Shadow Buffer Bias" msgstr "Skreslenie zásobníka tieňa" @@ -24166,22 +24297,6 @@ msgid "Shadow map clip start, below which objects will not generate shadows" msgstr "Strih začiatku mapy tieňov, za ktorým objekty nebudú generovať tiene" -msgid "Samples" -msgstr "Snímky" - - -msgid "Number of shadow buffer samples" -msgstr "Počet snímok zásobníka tieňov" - - -msgid "Shadow Buffer Size" -msgstr "Veľkosť zásobníka tieňov" - - -msgid "Resolution of the shadow buffer, higher values give crisper shadows but use more memory" -msgstr "Rozlíšenie zásobníka tieňov, vyššie hodnoty dávajú ostrejšie tiene, ale spotrebujú viac pamäte" - - msgid "Shadow Color" msgstr "Farba tieňa" @@ -24350,6 +24465,14 @@ msgid "Control how fast the probe influence decreases" msgstr "Ovládanie zníženia rýchlosti vplyvu snímača" +msgid "Bake Samples" +msgstr "Zapiecť snímky" + + +msgid "Number of ray directions to evaluate when baking" +msgstr "Počet smerov lúčov na vyhodnotenie pri zapečení" + + msgid "Resolution X" msgstr "Rozlíšenie X" @@ -24438,6 +24561,14 @@ msgid "Show the parallax correction volume in the 3D view" msgstr "Zobrazí objem korekcie paralaxy v 3D zobrazení" +msgid "Surfel Density" +msgstr "Hustota povrchu" + + +msgid "Number of surfels per unit distance (higher values improve quality)" +msgstr "Počet povrchov na jednotku vzdialenosti (vyššie hodnoty zlepšujú kvalitu)" + + msgid "Type of light probe" msgstr "Typ snímača svetla" @@ -25323,6 +25454,14 @@ msgid "Node tree outputs" msgstr "Výstupy uzlu stromu" +msgid "Panels" +msgstr "Panely" + + +msgid "UI panels for structuring the node tree interface" +msgstr "Panely užívateľského rozhrania na štruktúrovanie rozhrania stromu uzlov" + + msgid "Node Tree type (deprecated, bl_idname is the actual node tree type identifier)" msgstr "Typ uzla stromu (zastarané, bl_idname je identifikátor typu skutočného uzla stromu)" @@ -25375,6 +25514,54 @@ msgid "Max size of a tile (smaller values gives better distribution of multiple msgstr "Maximálna veľkosť políčka (menšie hodnoty dávajú lepšiu viacvláknovú distribúciu, avšak viac navýšenia)" +msgid "32×32" +msgstr "32×32\v\v" + + +msgid "Chunksize of 32×32" +msgstr "Veľkosť kúskov 32x32" + + +msgid "64×64" +msgstr "64×64" + + +msgid "Chunksize of 64×64" +msgstr "Veľkosť kúskov 64x64" + + +msgid "128×128" +msgstr "128×128" + + +msgid "Chunksize of 128×128" +msgstr "Veľkosť kúskov 128x128" + + +msgid "256×256" +msgstr "256×256" + + +msgid "Chunksize of 256×256" +msgstr "Veľkosť kúskov 256x256" + + +msgid "512×512" +msgstr "512×512" + + +msgid "Chunksize of 512×512" +msgstr "Veľkosť kúskov 512x512" + + +msgid "1024×1024" +msgstr "1024×1024" + + +msgid "Chunksize of 1024×1024" +msgstr "Veľkosť kúskov 1024x1024" + + msgid "Edit Quality" msgstr "Kvalita úpravy" @@ -25427,6 +25614,14 @@ msgid "Composites full image result as fast as possible" msgstr "Čo najrýchlejšie zloží celý výsledok obrázka" +msgid "Realtime GPU" +msgstr "GPU v reálnom čase" + + +msgid "Use GPU accelerated compositing with more limited functionality" +msgstr "Použijete GPU akcelerovanú kompozíciu s obmedzenejšou funkčnosťou" + + msgid "Render Quality" msgstr "Kvalita prekreslenia" @@ -25743,10 +25938,30 @@ msgid "Origin offset distance" msgstr "Vzdialenosť posuvu počiatku" +msgctxt "Image" +msgid "Empty Image Side" +msgstr "Strana obrázka prázdneho" + + msgid "Show front/back side" msgstr "Zobrazí prednú/zadnú stranu" +msgctxt "Image" +msgid "Both" +msgstr "Oba" + + +msgctxt "Image" +msgid "Front" +msgstr "Predná" + + +msgctxt "Image" +msgid "Back" +msgstr "Spätná" + + msgid "Settings for using the object as a field in physics simulation" msgstr "Nastavenie použitia objektu ako poľa pri simulácii fyziky" @@ -25831,6 +26046,10 @@ msgid "Only render shadows and reflections on this object, for compositing rende msgstr "Na tomto objekte prekresľujte iba tiene a odrazy, aby ste mohli kompozične prekresľovať skutočné zábery. Objekty s týmto nastavením sa považujú za objekty, ktoré už existujú v záberoch, objekty bez tohto nastavenia sú syntetické objekty, ktoré sa do nich komponujú" +msgid "Light linking settings" +msgstr "Nastavenia prepojenia svetla" + + msgid "Lightgroup" msgstr "Skupina svetiel" @@ -26207,6 +26426,10 @@ msgid "Shape Key Lock" msgstr "Zamknúť kľúčový tvar" +msgid "Only show the active shape key at full value" +msgstr "Zobrazí len plnú hodnotu aktívneho kľúčového tvaru" + + msgid "Display Texture Space" msgstr "Zobraziť priestor textúry" @@ -26323,6 +26546,10 @@ msgid "Shape Key Edit Mode" msgstr "Režim úpravy kľúčového tvaru" +msgid "Display shape keys in edit mode (for meshes only)" +msgstr "Zobrazí kľúčový tvar v režime editácie (len pre povrchové siete)" + + msgid "Use Simulation Cache" msgstr "Použiť simulačný zásobník" @@ -26827,6 +27054,16 @@ msgid "Type of periodic offset on the path" msgstr "Typ pravidelného posuvu na dráhe" +msgctxt "ParticleSettings" +msgid "Nothing" +msgstr "Žiadny" + + +msgctxt "ParticleSettings" +msgid "Spiral" +msgstr "Špirála" + + msgid "Amplitude Clump" msgstr "Amplitúda zhluku" @@ -28057,6 +28294,14 @@ msgid "Top-Left 3D Editor" msgstr "3D editor hore-vľavo" +msgid "Simulation data-block" +msgstr "Blok údajov simulácie" + + +msgid "Node tree defining the simulation" +msgstr "Strom uzlov definujúcich simuláciu" + + msgid "Sound data-block referencing an external or packed sound file" msgstr "Blok údajov zvuku odkazujúci na externý alebo zbalený zvukový súbor" @@ -29454,6 +29699,14 @@ msgid "Maintained by community developers" msgstr "Udržiavané komunitou vývojárov" +msgid "Testing" +msgstr "Testovacie" + + +msgid "Newly contributed scripts (excluded from release builds)" +msgstr "Nové príspevky skriptov (vylúčené z uvoľnenej zostavy)" + + msgid "Asset Blend Path" msgstr "Cesta prelínania aktív" @@ -30206,6 +30459,10 @@ msgid "Format of multiview media" msgstr "Formát viacnásobného zobrazenia média" +msgid "Multi-View" +msgstr "Viacnásobné zobrazenie" + + msgid "Tile Number" msgstr "Číslo dlaždice" @@ -31390,21 +31647,37 @@ msgid "Media Play/Pause" msgstr "Prehrať/Pozastaviť médium" +msgid "⏯" +msgstr "⏯" + + msgctxt "UI_Events_KeyMaps" msgid "Media Stop" msgstr "Zastaviť médium" +msgid "⏹" +msgstr "⏹" + + msgctxt "UI_Events_KeyMaps" msgid "Media First" msgstr "Prvé médium" +msgid "⏮" +msgstr "⏮" + + msgctxt "UI_Events_KeyMaps" msgid "Media Last" msgstr "Posledné médium" +msgid "⏭" +msgstr "⏭" + + msgctxt "UI_Events_KeyMaps" msgid "Text Input" msgstr "Textový vstup" @@ -34156,6 +34429,14 @@ msgid "Add Attribute" msgstr "Pridať atribút" +msgid "Light Linking Specials" +msgstr "Špeciálne prepojenie svetla" + + +msgid "Shadow Linking Specials" +msgstr "Špeciálne prepojenie tieňov" + + msgid "Bone Group Specials" msgstr "Špeciálne skupiny kostí" @@ -34220,6 +34501,10 @@ msgid "F-Curve Context Menu" msgstr "Kontextová ponuka F-krivky" +msgid "Add Extra" +msgstr "Pridať Špeciálne" + + msgid "Mask Context Menu" msgstr "Kontextová ponuka masky" @@ -35189,6 +35474,10 @@ msgid "Minimum for measuring thickness" msgstr "Minimum pre meranie hrúbky" +msgid "Samples" +msgstr "Snímky" + + msgid "Number of samples to test per face" msgstr "Počet snímok na plôšku pre test" @@ -42223,6 +42512,10 @@ msgid "Colors are treated alpha premultiplied, or colors output straight (alpha msgstr "Farby sú ošetrené prednásobením alfa, alebo rovno výstupnými farbami (alfa je nastavená na 1)" +msgid "Convert Colorspace" +msgstr "Konvertovať farebný priestor" + + msgid "From" msgstr "Z" @@ -42555,6 +42848,11 @@ msgid "Distance to grow/shrink (number of iterations)" msgstr "Vzdialenosť pre nárast/zmrštenie (počet opakovaní)" +msgctxt "Image" +msgid "Edge" +msgstr "Hrana" + + msgid "Edge to inset" msgstr "Hrana na vloženie" @@ -42904,14 +43202,42 @@ msgid "Tracking Object" msgstr "Sledovanie objektu" +msgid "Kuwahara" +msgstr "Kuwahara" + + +msgid "Size of filter. Larger values give stronger stylized effect" +msgstr "Veľkosť filtra. Väčšie hodnoty poskytujú silnejší štylizovaný efekt" + + msgid "Smoothing" msgstr "Vyhladenie" +msgid "Smoothing degree before applying filter. Higher values remove details and give smoother edges" +msgstr "Stupeň vyhladenia pred použitím filtra. Vyššie hodnoty odstraňujú detaily a poskytujú hladšie okraje" + + +msgid "Variation of Kuwahara filter to use" +msgstr "Variácia Kuwahara filtra na použitie" + + +msgid "Classic" +msgstr "Klasická" + + +msgid "Fast but less accurate variation" +msgstr "Rýchla, ale menej presná variácia" + + msgid "Anisotropic" msgstr "Anizotropná" +msgid "Accurate but slower variation" +msgstr "Presná, ale pomalšia variácia" + + msgid "Lens Distortion" msgstr "Skreslenie objektívom" @@ -44244,6 +44570,14 @@ msgid "Create a mesh that encloses all points in the input geometry with the sma msgstr "Vytvára povrchovú sieť, ktorá obklopuje všetky body vstupnej geometrie s najmenším počtom bodov" +msgid "Corners of Edge" +msgstr "Rohy hrán" + + +msgid "Retrieve face corners connected to edges" +msgstr "Vyhľadá rohy plôšok pripojených k hranám" + + msgid "Corners of Face" msgstr "Rohy plôšky" @@ -46130,6 +46464,10 @@ msgid "Multiscatter GGX" msgstr "Viacbodový GGX" +msgid "GGX with additional correction to account for multiple scattering, preserve energy and prevent unexpected darkening at high roughness" +msgstr "GGX s dodatočnou korekciou na zohľadnenie viacnásobného rozptylu, zachovanie energie a zabránenie neočakávanému stmavnutiu pri vysokej drsnosti" + + msgid "Diffuse BSDF" msgstr "BSDF Rozptyl" @@ -47454,6 +47792,10 @@ msgid "Computes the radius of the n-sphere inscribed in the voronoi cell" msgstr "Vypočíta polomer n-gule vpísanej do bunky voronoi" +msgid "Normalize output Distance to 0.0 to 1.0 range" +msgstr "Normalizácia výstupu Vzdialenosť na rozsah 0,0 až 1,0" + + msgid "Wave Texture" msgstr "Textúra Vlna" @@ -48037,6 +48379,34 @@ msgid "Node Outputs" msgstr "Výstupy uzla" +msgid "Panel in the node group interface" +msgstr "Panel v rozhraní skupiny uzlov" + + +msgid "Name of the socket panel" +msgstr "Názov panela zásuvky" + + +msgid "Node Tree Socket Panels" +msgstr "Panely zásuviek stromu uzlov" + + +msgid "Collection of socket panels in a node tree" +msgstr "Kolekcia panelov zásuviek v strome uzlov" + + +msgid "Active panel" +msgstr "Aktívny panel" + + +msgid "Active Index" +msgstr "Aktívny index" + + +msgid "Index of the active panel" +msgstr "Index aktívneho panela" + + msgid "Node Socket" msgstr "Zásuvka uzla" @@ -48245,6 +48615,14 @@ msgid "Object socket of a node" msgstr "Zásuvka objektu pre uzol" +msgid "Rotation Node Socket" +msgstr "Zásuvka uzla rotácie" + + +msgid "Rotation value socket of a node" +msgstr "Zásuvka hodnoty uzla rotácie" + + msgid "Shader Node Socket" msgstr "Zásuvka uzla tieňovača" @@ -48321,6 +48699,10 @@ msgid "Hide the socket input value even when the socket is not connected" msgstr "Skryje vstupnú hodnotu zásuvky, aj keď zásuvka nie je pripojená" +msgid "Panel to group sockets together in the UI" +msgstr "Panel na zoskupovanie zásuviek v užívateľskom rozhraní" + + msgid "Boolean Node Socket Interface" msgstr "Rozhranie zásuvky uzlov logických hodnôt" @@ -48365,6 +48747,10 @@ msgid "Object Node Socket Interface" msgstr "Rozhranie zásuvky uzla objektu" +msgid "Rotation Node Socket Interface" +msgstr "Rozhranie zásuvky uzla rotácie" + + msgid "Shader Node Socket Interface" msgstr "Rozhranie zásuvky uzla tieňovača" @@ -48461,6 +48847,26 @@ msgid "Collection of object grease pencil modifiers" msgstr "Kolekcia modifikátorov objektu pastelky" +msgid "Object Light Linking" +msgstr "Prepojenie svetla objektu" + + +msgid "Blocker Collection" +msgstr "Kolekcia blokátorov" + + +msgid "Collection which defines objects which block light from this emitter" +msgstr "Kolekcia definujúca objekty, ktoré blokujú svetlo z tohto žiariča" + + +msgid "Receiver Collection" +msgstr "Kolekcia prijímačov" + + +msgid "Collection which defines light linking relation of this emitter" +msgstr "Kolekcia definujúca vzťah prepojenia svetla tohto žiariča" + + msgid "Object Line Art" msgstr "Objekt čiarovej grafiky" @@ -52654,10 +53060,31 @@ msgid "(De)select all control points" msgstr "Vyberie (zruší výber) všetkých riadiacich bodov" +msgctxt "Operator" +msgid "Select Ends" +msgstr "Vybrať konce" + + msgid "Select end points of curves" msgstr "Vyberie koncové body kriviek" +msgid "Amount Back" +msgstr "Množstvo vzadu" + + +msgid "Number of points to select from the back" +msgstr "Počet bodov na výber zozadu" + + +msgid "Amount Front" +msgstr "Množstvo vpredu" + + +msgid "Number of points to select from the front" +msgstr "Počet bodov na výber spredu" + + msgid "Shrink the selection by one point" msgstr "Zmenší výber o jeden bod" @@ -54736,10 +55163,6 @@ msgid "Force keeping channels for bones" msgstr "Kanály na udržiavanie pevnosti kostí" -msgid "if all keyframes are identical in a rig, force keeping the minimal animation. When off, all possible channels for the bones will be exported, even if empty (minimal animation, 2 keyframes)" -msgstr "ak sú všetky kľúčové snímky vo výbave identické, vynúti si zachovanie minimálnej animácie. Ak je vypnuté, budú exportované všetky možné kanály pre kosti, aj keď sú prázdne (minimálna animácia, 2 kľúčové snímky)" - - msgid "Force keeping channel for objects" msgstr "Kanál vynúteného zachovania pre objekty" @@ -56129,6 +56552,15 @@ msgid "Name of color attribute" msgstr "Názov atribútu farby" +msgctxt "Operator" +msgid "Run Node Group" +msgstr "Spustiť skupinu uzlov" + + +msgid "Execute a node group on geometry" +msgstr "Spustí skupinu uzlov na geometrii" + + msgctxt "Operator" msgid "Gizmo Select" msgstr "Vybrať manipulačný prvok" @@ -58127,6 +58559,11 @@ msgid "Front" msgstr "Spredu" +msgctxt "View3D" +msgid "Side" +msgstr "Z boku" + + msgctxt "View3D" msgid "Top" msgstr "Zhora" @@ -58635,6 +59072,10 @@ msgid "Blend selected keyframes to their left or right neighbor" msgstr "Prelínanie vybraných kľúčových snímok s ich ľavou alebo pravou susednou" +msgid "The blend factor with 0 being the current frame" +msgstr "Faktor zmiešavania, pričom 0 je aktuálna snímka" + + msgctxt "Operator" msgid "Breakdown" msgstr "Rozklad" @@ -59190,6 +59631,118 @@ msgid "Switch brush to smooth mode for duration of stroke" msgstr "Prepnúť štetec na režim vyhladenia počas trvania ťahu" +msgctxt "Operator" +msgid "Grease Pencil Draw Mode Toggle" +msgstr "Prepnúť režim kreslenia Pastelkou" + + +msgid "Enter/Exit draw mode for grease pencil" +msgstr "Vstup/výstup z režimu kreslenia pre Pastelku" + + +msgid "Insert a blank frame on the current scene frame" +msgstr "Vloží prázdnu snímku na aktuálnu snímku scény" + + +msgid "Insert a blank frame in all editable layers" +msgstr "Vloží prázdnu snímku do všetkých upraviteľných vrstiev" + + +msgid "Add a new Grease Pencil layer in the active object" +msgstr "Pridá novú vrstvu Pastelky v aktívnom objekte" + + +msgid "Name of the new layer" +msgstr "Názov novej vrstvy" + + +msgctxt "Operator" +msgid "Add New Layer Group" +msgstr "Pridať novú skupinu vrstiev" + + +msgid "Add a new Grease Pencil layer group in the active object" +msgstr "Pridá novú skupinu vrstiev Pastelky do aktívneho objektu" + + +msgid "Name of the new layer group" +msgstr "Názov novej skupiny vrstiev" + + +msgid "Remove the active Grease Pencil layer" +msgstr "Odstráni aktívnu vrstvu Pastelky" + + +msgctxt "Operator" +msgid "Reorder Layer" +msgstr "Zmeniť poradie vrstvy" + + +msgid "Reorder the active Grease Pencil layer" +msgstr "Zmení poradie aktívnej vrstvy Pastelky" + + +msgid "Above" +msgstr "Nad" + + +msgid "Below" +msgstr "Pod" + + +msgid "Target Name" +msgstr "Target Name" + + +msgid "Name of the target layer" +msgstr "Názov cieľovej vrstvy" + + +msgid "(De)select all visible strokes" +msgstr "Vyberie / Zruší výber všetkých viditeľných ťahov" + + +msgctxt "Operator" +msgid "Select Alternate" +msgstr "Vybrať alternatívu" + + +msgid "Select alternated points in strokes with already selected points" +msgstr "Vyberie striedavo body v ťahoch s už vybranými bodmi" + + +msgid "Deselect Ends" +msgstr "Deselect Ends" + + +msgid "(De)select the first and last point of each stroke" +msgstr "(Zruší výber)vyberie prvý a posledný bod každého ťahu" + + +msgid "Select end points of strokes" +msgstr "Vyberie koncové body ťahov" + + +msgid "Amount End" +msgstr "Množstvo koncov" + + +msgid "Number of points to select from the end" +msgstr "Počet bodov na výber koncov" + + +msgid "Amount Start" +msgstr "Množstvo začiatkov" + + +msgid "Number of points to select from the start" +msgstr "Počet bodov na výber začiatkov" + + +msgid "Selects random points from the current strokes selection" +msgstr "Vyberie náhodné body z aktuálneho výberu ťahov" + + msgctxt "Operator" msgid "Add Render Slot" msgstr "Pridať zásuvku prekreslenia" @@ -65110,6 +65663,33 @@ msgid "Remove the active input from a file output node" msgstr "Odstráni aktívny vstup z výstupného uzla súboru" +msgctxt "Operator" +msgid "Add Panel" +msgstr "Pridať panel" + + +msgid "Add a new panel to the tree" +msgstr "Pridá nový panel do stromu" + + +msgctxt "Operator" +msgid "Move Panel" +msgstr "Presunúť panel" + + +msgid "Move a panel to another position" +msgstr "Presunie panel na inú pozíciu" + + +msgctxt "Operator" +msgid "Remove Panel" +msgstr "Odstrániť panel" + + +msgid "Remove a panel from the tree" +msgstr "Odstráni panel zo stromu" + + msgid "Attach selected nodes" msgstr "Prepojiť vybrané uzly" @@ -65700,10 +66280,26 @@ msgid "Curve from Mesh or Text objects" msgstr "Krivka podľa objektov povrchovej siete alebo textu" +msgid "Mesh from Curve, Surface, Metaball, Text, or Point Cloud objects" +msgstr "Povrchová sieť z objektov krivky, povrchu, meta gule, textu alebo mračna bodov" + + +msgid "Grease Pencil (legacy) from Curve or Mesh objects" +msgstr "Pastelka (zastaralé) z objektov krivky alebo povrchovej siete objektu" + + +msgid "Point Cloud from Mesh objects" +msgstr "Mračno bodov z povrchovej siete objektu" + + msgid "Curves from evaluated curve data" msgstr "Krivky z vyhodnotených údajov krivky" +msgid "Grease Pencil from Grease Pencil (legacy)" +msgstr "Pastelka z Pastelky (zastaralé)" + + msgctxt "Operator" msgid "Copy Global Transform" msgstr "Kopírovať globálnu transformáciu" @@ -65996,6 +66592,15 @@ msgid "Move inputs and outputs from in the modifier to a new node group" msgstr "Presunie vstupy a výstupy z modifikátora do novej skupiny uzlov" +msgctxt "Operator" +msgid "Add Grease Pencil (legacy)" +msgstr "Pridať Pastelku (zastaralé)" + + +msgid "Add a Grease Pencil (legacy) object to the scene" +msgstr "Pridá objekt Pastelky (zastaralé) na scénu" + + msgid "Stroke offset for the line art modifier" msgstr "Posunúť ťah pre modifikátor čiarovej grafiky" @@ -66369,6 +66974,84 @@ msgid "Add a light object to the scene" msgstr "Pridá objekt svetla na scénu" +msgctxt "Operator" +msgid "New Light Linking Collection" +msgstr "Nová kolekcia prepojenia svetla" + + +msgid "Create new light linking collection used by the active emitter" +msgstr "Vytvorí novú kolekciu svetelných prepojení, ktorú používa aktívny žiarič" + + +msgctxt "Operator" +msgid "Link Blockers to Emitter" +msgstr "Prepojenie blokátorov so žiaričom" + + +msgid "Light link selected blockers to the active emitter object" +msgstr "Prepojí vybrané blokátory svetla s aktívnym objektom žiariča" + + +msgid "State of the shadow linking" +msgstr "Stav prepojenia tieňov" + + +msgid "Include selected blockers to cast shadows from the active emitter" +msgstr "Zahrnie vybrané blokátory na vrhanie tieňov z aktívneho žiariča" + + +msgid "Exclude selected blockers from casting shadows from the active emitter" +msgstr "Vylúči vybrané blokátory z vrhania tieňov z aktívneho žiariča" + + +msgctxt "Operator" +msgid "Select Light Linking Blockers" +msgstr "Vybrať blokátory prepojenia svetla" + + +msgid "Select all objects which block light from this emitter" +msgstr "Vyberie všetky objekty, ktoré blokujú svetlo z tohto žiariča" + + +msgctxt "Operator" +msgid "Link Receivers to Emitter" +msgstr "Prepojiť prijímače so žiaričom" + + +msgid "Light link selected receivers to the active emitter object" +msgstr "Prepojí vybrané prijímače svetla s aktívnym objektom žiariča" + + +msgid "State of the light linking" +msgstr "Stav prepojenia svetla" + + +msgid "Include selected receivers to receive light from the active emitter" +msgstr "Zahrnie vybrané prijímače na prijímanie svetla z aktívneho žiariča" + + +msgid "Exclude selected receivers from receiving light from the active emitter" +msgstr "Vylúči vybrané prijímače z prijímania svetla z aktívneho žiariča" + + +msgctxt "Operator" +msgid "Select Light Linking Receivers" +msgstr "Vybrať prijímače prepojenia svetla" + + +msgid "Select all objects which receive light from this emitter" +msgstr "Vyberie všetky objekty, ktoré prijímajú svetlo z tohto žiariča" + + +msgctxt "Operator" +msgid "Remove From Light Linking Collection" +msgstr "Odstrániť z kolekcie prepojenia svetla" + + +msgid "Remove this object or collection from the light linking collection" +msgstr "Odstráni tento objekt alebo kolekciu z kolekcie prepojenia svetla" + + msgctxt "Operator" msgid "Add Light Probe" msgstr "Pridať snímač svetla" @@ -66395,6 +67078,10 @@ msgid "Bake Light Cache" msgstr "Zapiecť zásobník svetla" +msgid "Bake irradiance volume light cache" +msgstr "Zásobník objemu na zapečenie žiarenia" + + msgid "Delay in millisecond before baking starts" msgstr "Oneskorenie v milisekundách pred začiatkom zapečenia" @@ -66444,6 +67131,18 @@ msgid "Delete cached indirect lighting" msgstr "Odstráni zásobník nepriameho osvetlenia" +msgid "Delete all light probes' baked lighting data" +msgstr "Odstráni všetky zapečené údaje o osvetlení svetelných snímačov" + + +msgid "Only delete selected light probes' baked lighting data" +msgstr "Odstráni zapečené údaje o osvetlení len vybraných svetelných snímačov" + + +msgid "Only delete the active light probe's baked lighting data" +msgstr "Odstráni zapečené údaje o osvetlení len aktívneho svetelného snímača" + + msgctxt "Operator" msgid "Bake Line Art" msgstr "Zapiecť čiarovú grafiku" @@ -68298,6 +68997,11 @@ msgid "Remove vertices which weight is below or equal to this limit" msgstr "Odstráni vrcholy, ktorých hmotnosť je nižšia alebo rovná tomuto limitu" +msgctxt "Operator" +msgid "Duplicate Vertex Group" +msgstr "Vytvoriť kópiu skupiny vrcholov" + + msgid "Make a copy of the active vertex group" msgstr "Vytvorí kópiu aktívnej skupiny vrcholov" @@ -69719,6 +70423,19 @@ msgid "Select linked faces under the cursor" msgstr "Vyberie prepojené plôšky pod kurzorom" +msgctxt "Operator" +msgid "Select Loop" +msgstr "Vybrať slučku" + + +msgid "Select face loop under the cursor" +msgstr "Vyberie slučky plôšok pod kurzorom" + + +msgid "If false, faces will be deselected" +msgstr "Ak je NEPRAVDA, výber plôšok sa zruší" + + msgid "Select Faces connected to existing selection" msgstr "Vyberie plôšky pripojené k existujúcemu výberu" @@ -71553,6 +72270,15 @@ msgid "Remove existing theme file if exists" msgstr "Odstrániť existujúci súbor motívu, ak existuje" +msgctxt "Operator" +msgid "Remove File Association" +msgstr "Odstrániť asociáciu súborov" + + +msgid "Remove this installation's associations with .blend files" +msgstr "Odstrániť asociácie tejto inštalácie s .blend súbormi" + + msgctxt "Operator" msgid "Add New Cache" msgstr "Pridať nový zásobník" @@ -73202,6 +73928,10 @@ msgid "Generic sculpt expand operator" msgstr "Generický operátor rozšírenia tvarovania" +msgid "Falloff Type" +msgstr "Typ dopadu" + + msgid "Initial falloff of the expand operation" msgstr "Počiatočný dopad operácie rozšírenia" @@ -74124,6 +74854,18 @@ msgid "The effect inputs to swap" msgstr "Vplyv vstupov na výmenu" +msgid "A → B" +msgstr "A → B" + + +msgid "B → C" +msgstr "B → C" + + +msgid "A → C" +msgstr "A → C" + + msgctxt "Operator" msgid "Change Effect Type" msgstr "Zmeniť typ efektu" @@ -74698,6 +75440,75 @@ msgid "Set render size and aspect from active sequence" msgstr "Nastaví veľkosti prekreslenia zo zobrazenia aktívnej sekvencie" +msgctxt "Operator" +msgid "Add Retiming Handle" +msgstr "Pridať manipulátor opätovného časovania" + + +msgid "Add retiming Handle" +msgstr "Pridá manipulátor opätovného časovania" + + +msgid "Timeline Frame" +msgstr "Snímka časovej osi" + + +msgid "Frame where handle will be added" +msgstr "Snímka, do ktorej bude pridaný manipulátor" + + +msgctxt "Operator" +msgid "Move Retiming Handle" +msgstr "Presunúť manipulátor opätovného časovania" + + +msgid "Move retiming handle" +msgstr "Presunie manipulátor opätovného časovania" + + +msgid "Handle Index" +msgstr "Index manipulátora" + + +msgid "Index of handle to be moved" +msgstr "Index manipulátora na presunutie" + + +msgctxt "Operator" +msgid "Remove Retiming Handle" +msgstr "Odstrániť manipulátor časovania" + + +msgid "Remove retiming handle" +msgstr "Odstráni manipulátor časovania" + + +msgid "Index of handle to be removed" +msgstr "Index manipulátora na odstránenie" + + +msgctxt "Operator" +msgid "Reset Retiming" +msgstr "Resetovať opätovné časovanie" + + +msgid "Reset strip retiming" +msgstr "Resetuje opätovné časovanie" + + +msgctxt "Operator" +msgid "Set Speed" +msgstr "Nastaviť rýchlosť" + + +msgid "Set speed of retimed segment" +msgstr "Nastaví rýchlosť časovaného segmentu" + + +msgid "New speed of retimed segment" +msgstr "Nová rýchlosť načasovaného segmentu" + + msgid "Use mouse to sample color in current frame" msgstr "Použije myš na snímku farby v aktuálnej snímke" @@ -75573,6 +76384,15 @@ msgid "Copy the texture settings and nodes" msgstr "Skopíruje nastavenia textúry a uzly" +msgctxt "Operator" +msgid "Add Text Editor Preset" +msgstr "Pridať predvoľbu textového editora" + + +msgid "Add or remove a Text Editor Preset" +msgstr "Pridá alebo odstráni predvoľbu textového editora" + + msgctxt "Operator" msgid "Text Auto Complete" msgstr "Automatické dokončovanie textu" @@ -75677,10 +76497,36 @@ msgid "Line number to jump to" msgstr "Číslo riadka na skočenie" +msgctxt "Operator" +msgid "Open Text File at point" +msgstr "Otvoriť textový súbor na bode" + + +msgid "Edit text file in external text editor" +msgstr "Upraví textový súbor v externom textovom editore" + + +msgctxt "Operator" +msgid "Jump to File at Point (Internal)" +msgstr "Skočiť na súbor v bode (interné)" + + +msgid "Jump to a file for the internal text editor" +msgstr "Skočí na súbor pre interný textový editor" + + msgid "Column" msgstr "Stĺpec" +msgid "Column to jump to" +msgstr "Stĺpec pre skok na" + + +msgid "Line to jump to" +msgstr "Riadok, na ktorý sa má preskočiť" + + msgctxt "Operator" msgid "Line Number" msgstr "Číslo riadka" @@ -76014,6 +76860,14 @@ msgid "Edge Slide" msgstr "Posúvať hranu" +msgid "Allow Navigation" +msgstr "Povoliť navigáciu" + + +msgid "Allow navigation while transforming" +msgstr "Povolí navigáciu počas transformácie" + + msgid "Correct UVs" msgstr "Oprava UV" @@ -76034,6 +76888,10 @@ msgid "Snap to Elements" msgstr "Prichytí na prvky" +msgid "Snap to increments" +msgstr "Prichytí na prírastky" + + msgid "Snap to vertices" msgstr "Prichytí na vrcholy" @@ -77068,6 +77926,15 @@ msgid "Rename the active item in the data-set view" msgstr "Premenuje aktívnu položku v sústave údajov pohľadu" +msgctxt "Operator" +msgid "View Filter" +msgstr "Zobraziť filter" + + +msgid "Start entering filter text for the data-set in focus" +msgstr "Začať zadávať text filtra pre zameraný súbor údajov" + + msgctxt "Operator" msgid "Align" msgstr "Zarovnať" @@ -77142,6 +78009,10 @@ msgid "Axis to align to" msgstr "Zarovnať os na" +msgid "Correct Aspect" +msgstr "Správny pomer" + + msgid "Method to calculate rotation angle" msgstr "Metóda výpočtu uhla rotácie" @@ -77201,10 +78072,6 @@ msgid "Clip UV coordinates to bounds after unwrapping" msgstr "Pripne UV súradnice na okraje po rozvinutí" -msgid "Correct Aspect" -msgstr "Správny pomer" - - msgid "Map UVs taking image aspect ratio into account" msgstr "UV mapa berúca do úvahy pomer strán obrázku" @@ -77665,6 +78532,10 @@ msgid "Clear pinning for the selection instead of setting it" msgstr "Odstráni pripnutie výberu namiesto nastavenia" +msgid "Invert pinning for the selection instead of setting it" +msgstr "Invertuje pripnutie výberu namiesto jeho nastavenia" + + msgctxt "Operator" msgid "Project from View" msgstr "Premietnuť z pohľadu" @@ -78326,6 +79197,10 @@ msgid "Extrude Individual and Move" msgstr "Vysunúť jedotlivo a presunúť" +msgid "Allow navigation" +msgstr "Povoliť navigáciu" + + msgctxt "Operator" msgid "Extrude Manifold Along Normals" msgstr "Vysunúť vyvinuté pozdĺž normálov" @@ -81239,6 +82114,10 @@ msgid "Exit Blender after saving" msgstr "Ukončiť Blender po uložení" +msgid "Save the current Blender file with a numerically incremented name that does not overwrite any existing files" +msgstr "Uloží aktuálny súbor Blenderu s číselne zvýšeným názvom, ktorý neprepíše žiadne existujúce súbory" + + msgctxt "Operator" msgid "Save Preferences" msgstr "Uložiť predvoľby" @@ -81730,10 +82609,6 @@ msgid "Path Mask" msgstr "Maska cesty" -msgid "Import only the primitive at the given path and its descendents. Multiple paths may be specified in a list delimited by commas or semicolons" -msgstr "Importuje iba prvotný tvar na danej ceste a jeho potomkov. Viacero ciest možno zadať v zozname ohraničenom čiarkami alebo bodkočiarkami" - - msgid "Read mesh color attributes" msgstr "Čítať atribúty farby povrchovej siete" @@ -82873,6 +83748,10 @@ msgid "Shadow Terminator" msgstr "Ukončenie tieňa" +msgid "Shadow Linking" +msgstr "Prepojenie tieňov" + + msgid "Ray Visibility" msgstr "Viditeľnosť lúča" @@ -83302,6 +84181,10 @@ msgid "Predefined node color" msgstr "Preddefinovanie farby uzla" +msgid "Node Panels" +msgstr "Panely uzlov" + + msgid "Simulation State" msgstr "Stav simulácie" @@ -83666,6 +84549,11 @@ msgid "Blade" msgstr "Čepeľ" +msgctxt "Operator" +msgid "Retime" +msgstr "Znovu časovať" + + msgid "Feature Weights" msgstr "Vlastnosti vplyvov" @@ -83853,6 +84741,10 @@ msgid "Operating System Settings" msgstr "Nastavenia operačného systému" +msgid "Text Editor Presets" +msgstr "Predvoľby textového editora" + + msgid "Bone Color Sets" msgstr "Sústavy farieb kostí" @@ -85695,6 +86587,10 @@ msgid "Pose Matrix" msgstr "Matrica pózy" +msgid "Final 4×4 matrix after constraints and drivers are applied, in the armature object space" +msgstr "Konečná matrica 4×4 po aplikácii vynútení a ovládačov v priestore objektu armatúry" + + msgid "Alternative access to location/scale/rotation relative to the parent and own rest bone" msgstr "Alternatívny prístup k polohe/mierke/rotácii vzhľadom na rodičovské a vlastné zostatkové kosti" @@ -85703,6 +86599,10 @@ msgid "Channel Matrix" msgstr "Matrica kanála" +msgid "4×4 matrix of the bone's location/rotation/scale channels (including animation and drivers) and the effect of bone constraints" +msgstr "Matrica 4×4 kanálov polohy/rotácie/mierky kosti (vrátane animácie a ovládačov) a vplyv vynútení kosti" + + msgid "Parent of this pose bone" msgstr "Rodič tejto pózy kosti" @@ -86300,6 +87200,14 @@ msgid "Enable the new EEVEE codebase, requires restart" msgstr "Povolí novú databázu EEVEE, vyžaduje reštart" +msgid "Overlay Next" +msgstr "Prekryť ďalšie" + + +msgid "Enable the new Overlay codebase, requires restart" +msgstr "Povolí novú kódovú základňu Prekrytia, vyžaduje reštart" + + msgid "Workbench Next" msgstr "Ďalší Pracovný stôl" @@ -86348,6 +87256,14 @@ msgid "Enable Cycles debugging options for developers" msgstr "Povolí vývojárom možnosť ladenia cyklov" +msgid "Experimental Compositors" +msgstr "Experimentálne kompozítory" + + +msgid "Enable compositor full frame and realtime GPU execution mode options (no tiling, reduces execution time and memory usage)" +msgstr "Povolí kompozítor v režime plnej snímky a v režime vykonávania GPU v reálnom čase (bez dlaždíc, znižuje čas vykonávania a využitie pamäte)" + + msgid "Extended Asset Browser" msgstr "Rozšírený prehliadač aktív" @@ -86356,6 +87272,14 @@ msgid "Enable Asset Browser editor and operators to manage regular data-blocks a msgstr "Povolí editoru a operátorom prehliadača aktív spravovať bežné bloky údajov ako aktíva, nielen ako pózy" +msgid "Grease Pencil 3.0" +msgstr "Pastelka 3.0" + + +msgid "Enable the new grease pencil 3.0 codebase" +msgstr "Povolí novú Pastelku 3.0" + + msgid "New Curves Tools" msgstr "Nové nástroje kriviek" @@ -86380,6 +87304,10 @@ msgid "Enables visibility of the new Volume nodes in the UI" msgstr "Povolí viditeľnosť nových uzlov objemov v užívateľskom rozhraní" +msgid "Enable node panels UI for grouping sockets in node groups" +msgstr "Povolí užívateľské rozhranie panelov uzlov na zoskupovanie zásuviek do skupín uzlov" + + msgid "Override Templates" msgstr "Šablóny prepisu" @@ -86388,6 +87316,14 @@ msgid "Enable library override template in the Python API" msgstr "Povolí šablóny prepisu knižnice v rozhraní API jazyka Python" +msgid "Rotation Socket" +msgstr "Zásuvka rotácie" + + +msgid "Enable the new rotation node socket type" +msgstr "Povolí nový typ zásuvky uzla rotácie" + + msgid "Sculpt Texture Paint" msgstr "Maľovanie tvarovania textúry" @@ -86620,6 +87556,36 @@ msgid "The directory for storing temporary save files" msgstr "Priečinok na skladovanie dočasne uložených súborov" +msgid "" +"Command to launch the text editor, either a full path or a command in $PATH.\n" +"Use the internal editor when left blank" +msgstr "" +"Príkaz na spustenie textového editora, buď úplná cesta, alebo príkaz v $PATH.\n" +"Použiť interný editor, ak zostane prázdny" + + +msgid "Text Editor Args" +msgstr "Argumenty textového editora" + + +msgid "" +"Defines the specific format of the arguments with which the text editor opens files. The supported expansions are as follows:\n" +"\n" +"$filepath The absolute path of the file.\n" +"$line The line to open at (Optional).\n" +"$column The column to open from the beginning of the line (Optional).\n" +"$line0 & column0 start at zero.\n" +"Example: -f $filepath -l $line -c $column" +msgstr "" +"Definuje špecifický formát argumentov, pomocou ktorých textový editor otvára súbory. Podporované rozšírenia sú nasledovné:\n" +"\n" +"$filepath Absolútna cesta k súboru.\n" +"$line Riadok, na ktorom sa má súbor otvoriť (nepovinné).\n" +"$column Stĺpec, ktorý sa má otvoriť od začiatku riadku ( nepovinné).\n" +"$line0 a column0 začínajú od nuly.\n" +"Príklad: -f $filepath -l $line -c $column" + + msgid "The default directory to search for textures" msgstr "Predvolený priečinok na vyhľadanie textúr" @@ -87104,6 +88070,22 @@ msgid "Quality of anisotropic filtering" msgstr "Kvalita anizotropného filtrovania" +msgid "2×" +msgstr "2×" + + +msgid "4×" +msgstr "4×" + + +msgid "8×" +msgstr "8×" + + +msgid "16×" +msgstr "16×" + + msgid "Audio Device" msgstr "Audio zariadenie" @@ -87352,6 +88334,14 @@ msgid "Use GLSL shaders for display transform and display image with 2D texture" msgstr "Použije tieňovače GLSL na transformáciu zobrazenia a zobrazenie obrázka s 2D textúrou" +msgid "Is Microsoft Store Install" +msgstr "Je inštalácia obchodu Microsoft Store" + + +msgid "Whether this blender installation is a sandboxed Microsoft Store version" +msgstr "Určuje, či je táto inštalácia Blenderu verziou so systémom sandbox v obchode Microsoft Store" + + msgid "Legacy Compute Device Type" msgstr "Typ staršieho výpočtového zariadenia" @@ -87376,6 +88366,14 @@ msgid "Memory cache limit (in megabytes)" msgstr "Limit zásobníka pamäte (v megabajtoch)" +msgid "Register for All Users" +msgstr "Registrovať pre všetkých užívateľov" + + +msgid "Make this Blender version open blend files for all users. Requires elevated privileges" +msgstr "Vytvorí túto verziu Blenderu, ktorá bude otvárať blend súbory pre všetkých užívateľov. Vyžaduje zvýšené oprávnenia" + + msgid "Maximum number of lines to store for the console buffer" msgstr "Maximálny počet riadkov uložených v zásobníku konzoly" @@ -88836,26 +89834,56 @@ msgid "Combination of true displacement and bump mapping for finer detail" msgstr "Kombinácia skutočného posunutia a mapovania nerovností pre jemnejší detail" +msgctxt "Light" +msgid "Emission Sampling" +msgstr "Snímanie emisie" + + msgid "Sampling strategy for emissive surfaces" msgstr "Stratégia snímania pre emitujúce povrchy" +msgctxt "Light" +msgid "None" +msgstr "Nie je" + + msgid "Do not use this surface as a light for sampling" msgstr "Nepoužívajte tento povrch ako svetlo pre snímanie" +msgctxt "Light" +msgid "Auto" +msgstr "Automaticky" + + msgid "Automatically determine if the surface should be treated as a light for sampling, based on estimated emission intensity" msgstr "Automatické určenie, či by sa s povrchom malo zaobchádzať ako so svetlom na snímanie, na základe odhadovanej intenzity emisií" +msgctxt "Light" +msgid "Front" +msgstr "Predná" + + msgid "Treat only front side of the surface as a light, usually for closed meshes whose interior is not visible" msgstr "Spracováva iba prednú stranu povrchu ako svetlo, zvyčajne pre uzavreté povrchové siete, ktorých vnútro nie je viditeľné" +msgctxt "Light" +msgid "Back" +msgstr "Spätná" + + msgid "Treat only back side of the surface as a light for sampling" msgstr "Spracováva iba zadnú stranu povrchu ako svetlo pre snímanie" +msgctxt "Light" +msgid "Front and Back" +msgstr "Spredu a zozadu" + + msgid "Treat surface as a light for sampling, emitting from both the front and back side" msgstr "Spracováva povrch ako svetlo na snímanie, vyžarované z prednej aj zadnej strany" @@ -89432,6 +90460,38 @@ msgid "Maximum number of glossy reflection bounces, bounded by total maximum" msgstr "Maximálny počet odleskových odrazov ohraničený celkovým maximálnym odrazom" +msgid "Directional Sampling Type" +msgstr "Smerový typ snímania" + + +msgid "Type of the directional sampling used for guiding" +msgstr "Typ smerového snímania vzoriek používaného na vodenie" + + +msgid "Diffuse Product MIS" +msgstr "Produkt rozptylu MIS" + + +msgid "Guided diffuse BSDF component based on the incoming light distribution and the cosine product (closed form product)" +msgstr "Riadená difúzna zložka BSDF na základe rozloženia prichádzajúceho svetla a kosínusového súčinu (súčin v uzavretom tvare)" + + +msgid "Re-sampled Importance Sampling" +msgstr "Opätovné snímanie dôležitosti" + + +msgid "Perform RIS sampling to guided based on the product of the incoming light distribution and the BSDF" +msgstr "Vykoná snimanie RIS na základe súčinu distribúcie prichádzajúceho svetla a BSDF" + + +msgid "Roughness-based" +msgstr "Na základe drsnosti" + + +msgid "Adjust the guiding probability based on the roughness of the material components" +msgstr "Nastaví pravdepodobnosti vodenia na základe drsnosti zložiek materiálu" + + msgid "Guiding Distribution Type" msgstr "Typ vodiacej distribúcie" @@ -89464,6 +90524,14 @@ msgid "Use von Mises-Fisher models as directional distribution" msgstr "Použite modely von Mises-Fisher ako smerové rozloženie" +msgid "Guiding Roughness Threshold" +msgstr "Prah drsnosti vodenia" + + +msgid "The minimal roughness value of a material to apply guiding" +msgstr "Minimálna hodnota drsnosti materiálu na použitie vodenia" + + msgid "Training Samples" msgstr "Cvičné snímky" @@ -90580,6 +91648,14 @@ msgid "Property that stores arbitrary, user defined properties" msgstr "Vlastnosť, ktorá ukladá ľubovoľné, užívateľom definované vlastnosti" +msgid "Quaternion Attribute Value" +msgstr "Hodnota atribútu kvaternión" + + +msgid "Rotation value in geometry attribute" +msgstr "Hodnota rotácie v atribúte geometrie" + + msgid "Read-only Integer" msgstr "Celé číslo len na čítanie" @@ -91180,6 +92256,10 @@ msgid "Automatic pixel size, depends on the user interface scale" msgstr "Automatická veľkosť pixelov, závisí od mierky užívateľského rozhrania" +msgid "1×" +msgstr "1×" + + msgid "Render at full resolution" msgstr "Prekresliť v plnom rozlíšení" @@ -91424,6 +92504,10 @@ msgid "Add the file format extensions to the rendered file name (eg: filename + msgstr "Pridá prípony súborov do názvu prekreslenia súboru (napr.: filename +. jpg)" +msgid "Use Freestyle" +msgstr "Použiť Voľný štýl" + + msgid "Draw stylized strokes using Freestyle" msgstr "Nakreslí štylizované ťahy použitím Voľného štýlu" @@ -91640,10 +92724,6 @@ msgid "Single stereo camera system, adjust the stereo settings in the camera pan msgstr "Jeden stereo kamerový systém, nastavenie stereo nastavenia na paneli kamery" -msgid "Multi-View" -msgstr "Viacnásobné zobrazenie" - - msgid "Multi camera system, adjust the cameras individually" msgstr "Kamerový systém viacnásobného zobrazenia, nastaví kamery jednotlivo" @@ -91688,6 +92768,22 @@ msgid "Active index in render view array" msgstr "Aktívny index v poli zobrazenia prekreslenia" +msgid "Retiming Handle" +msgstr "Manipulátor opätovného časovania" + + +msgid "Handle mapped to particular frame that can be moved to change playback speed" +msgstr "Manipulátor mapovaný na konkrétnu snímku, ktorú je možné presunúť a zmeniť tak rýchlosť prehrávania" + + +msgid "Position of retiming handle in timeline" +msgstr "Poloha manipulátora opätovného časovania na časovej osi" + + +msgid "Collection of RetimingHandle" +msgstr "Kolekcia manipulátorov opätovného časovania" + + msgid "Constraint influencing Objects inside Rigid Body Simulation" msgstr "Vynútenie ovplyvňujúce objekty vnútri Simulácie pevného telesa" @@ -93923,6 +95019,10 @@ msgid "Sequence strip to load a video" msgstr "Sekvenčný pás na načítanie videa" +msgid "Retiming Handles" +msgstr "Manipulátor zmeny časovania" + + msgid "Stream Index" msgstr "Index prúdenia" @@ -94499,6 +95599,14 @@ msgid "Type of filter to use for image transformation" msgstr "Typ filtra na použitie pre transformáciu obrázku" +msgid "Subsampling (3×3)" +msgstr "Medzisnímkovanie (3×3)" + + +msgid "Use nearest with 3×3 subsamples during rendering" +msgstr "Používanie najbližších 3×3 medzisnímok počas prekresľovania" + + msgid "Move along X axis" msgstr "Presúvať pozdĺž osi X" @@ -95007,6 +96115,11 @@ msgid "Use object as center of rotation" msgstr "Použije objekt ako stred otáčania" +msgctxt "GPencil" +msgid "Wave" +msgstr "Zvlniť" + + msgid "Use wave effect" msgstr "Použiť efekt vlny" @@ -96512,6 +97625,29 @@ msgid "Node tree being displayed and edited" msgstr "Strom uzla, ktorý sa má zobraziť a upraviť" +msgctxt "ID" +msgid "Geometry Nodes Type" +msgstr "Typ uzlov geometrie" + + +msgctxt "ID" +msgid "Modifier" +msgstr "Modifikátor" + + +msgid "Edit node group from active object's active modifier" +msgstr "Upraví skupiny uzlov z aktívneho modifikátora aktívneho objektu" + + +msgctxt "ID" +msgid "Operator" +msgstr "Operátor" + + +msgid "Edit any geometry node group for use as an operator" +msgstr "Upraví ľubovoľnú skupinu uzlov geometrie na použitie ako operátor" + + msgid "Data-block whose nodes are being edited" msgstr "Blok údajov upravovaného uzla" @@ -100746,6 +101882,18 @@ msgid "Type of element to snap to" msgstr "Typ prvku na prichytenie" +msgid "Type of element for the 'Snap With' to snap to" +msgstr "Typ prvku, ku ktorému sa má \" Prichytiť s\" prichytiť" + + +msgid "Project Mode" +msgstr "Režim projektu" + + +msgid "Type of element for individual transformed elements to snap to" +msgstr "Typ prvku, ku ktorému sa majú jednotlivé transformované prvky prichytiť" + + msgid "Snap to" msgstr "Prichytiť ku" @@ -102828,6 +103976,18 @@ msgid "Type of the path element" msgstr "Typ prvku cesty" +msgid "Name that can be displayed in the UI for this element" +msgstr "Názov, ktorý sa môže zobraziť v užívateľskom rozhraní pre tento prvok" + + +msgid "Node ID" +msgstr "ID uzla" + + +msgid "Simulation Output Node ID" +msgstr "Simulation Output Node ID" + + msgid "Volume Display" msgstr "Zobraziť objem" @@ -102864,6 +104024,10 @@ msgid "Fine" msgstr "Jemné" +msgid "Display box for each leaf node containing 8×8 voxels" +msgstr "Pole zobrazenia pre každý uzol listu obsahujúce 8 × 8 voxelov" + + msgid "Type of wireframe display" msgstr "Typ zobrazenia drôteného rámu" @@ -103241,14 +104405,6 @@ msgid "Length of rays, defines how far away other faces give occlusion effect" msgstr "Dĺžka lúčov definuje, ako ďaleko od iných plôšok dáva efekt pohlcovania" -msgid "Use Ambient Occlusion" -msgstr "Použiť pohlcovanie okolím" - - -msgid "Use Ambient Occlusion to add shadowing based on distance between objects" -msgstr "Na pridanie tieňovania na základe vzdialenosti medzi objektami použije pohlcovanie okolím" - - msgid "World Mist" msgstr "Zahmlený svet" @@ -104096,6 +105252,14 @@ msgid "Causes select-all ('A' key) to de-select in the case a selection exists" msgstr "Udalosť Vybrať všetko (klávesa 'A') zruší výber v prípade, že existuje výber" +msgid "Navigate during Transform" +msgstr "Navigácia počas transformácie" + + +msgid "Enable view navigation while using transform operators. Proportional Influence, Automatic Constraints and Auto IK Chain Length shortcuts will require holding Alt key" +msgstr "Povolí navigáciu v zobrazení pri používaní operátorov transformácie. Klávesové skratky Proporcionálny vplyv, Automatické vynútenia a Automatická dĺžka reťazca IK budú vyžadovať pridržanie klávesy Alt" + + msgid "Tweak Select: Mouse Select & Move" msgstr "Ladenie výberu: Vybrať myšou a presunúť" @@ -105798,6 +106962,16 @@ msgid "Clear Constraints" msgstr "Zmazať vynútenie" +msgctxt "WindowManager" +msgid "Set Snap Base" +msgstr "Nastaviť základné uchytenie" + + +msgctxt "WindowManager" +msgid "Set Snap Base (Off)" +msgstr "Nastaviť základné uchytenie (vypnúť)" + + msgctxt "WindowManager" msgid "Snap Invert" msgstr "Invertovať prichytenie" @@ -106139,10 +107313,6 @@ msgid "or AMD with macOS %s or newer" msgstr "alebo AMD so systémom macOS %s alebo novším" -msgid " - intel-level-zero-gpu version %s or newer" -msgstr " - Intel-level-zero-GPU verzia %s alebo novšia" - - msgid "Noise Threshold" msgstr "Prah šumu" @@ -106888,10 +108058,18 @@ msgid "No vars to display" msgstr "Žiadna premenná na zobrazenie" +msgid "Demo text \"%s\" created with %s file(s){:,d}" +msgstr "Ukážkový text \"%s\" vytvorený pomocou %s súboru(ov){:,d}" + + msgid "Search *.blend recursively" msgstr "Vyhľadávanie *.blend rekurzívne" +msgid "Writes: %s config text" +msgstr "Napíše: %s konfiguračný text" + + msgid "Generate Settings:" msgstr "Generovať nastavenia:" @@ -106904,6 +108082,10 @@ msgid "Render Settings:" msgstr "Nastaviť prekreslenie:" +msgid "Can't load %s config, run: File -> Demo Mode (Setup)" +msgstr "Nemožno načítať konfiguráciu %s, spustiť: Súbor -> Demo režim (Nastavenie)" + + msgid "Demo Mode:" msgstr "Demo režim:" @@ -107524,6 +108706,18 @@ msgid "Current frame not within strip framerange" msgstr "Aktuálna snímka sa nenachádza v rozsahu pásov" +msgid "Text Editor Args Format must contain $filepath" +msgstr "Formát argumentov textového editora musí obsahovať $filepath" + + +msgid "Exception parsing template: %r" +msgstr "Výnimka pri analyzovaní šablóny: %r" + + +msgid "Exception running external editor: %r" +msgstr "Výnimka pri spustení externého editora: %r" + + msgid "Reload Start-Up file to restore settings" msgstr "Obnoviť pôvodný súbor a obnoviť nastavenia" @@ -108445,6 +109639,11 @@ msgid "Remove All Groups" msgstr "Odstrániť všetky skupiny" +msgctxt "Operator" +msgid "Add Group" +msgstr "Pridať skupinu" + + msgid "Interpolation U" msgstr "Interpolácia U" @@ -109804,6 +111003,16 @@ msgid "Bake Cubemap Only" msgstr "Zapiecť iba kockové rozloženie" +msgctxt "Operator" +msgid "Bake Light Caches" +msgstr "Zapiecť zásobník svetla" + + +msgctxt "Operator" +msgid "Delete Light Caches" +msgstr "Odstrániť zásobník svetla" + + msgid "Shadow Resolution" msgstr "Rozlíšenie tieňov" @@ -109901,6 +111110,11 @@ msgid "Tiles" msgstr "Dlaždice" +msgctxt "Amount" +msgid "Even" +msgstr "Rovnomerne" + + msgid "Odd" msgstr "Nepárne" @@ -110797,6 +112011,11 @@ msgid "Unpin" msgstr "Odopnúť" +msgctxt "Operator" +msgid "Invert Pins" +msgstr "Invertovať pripnutia" + + msgctxt "Operator" msgid "Clear Seam" msgstr "Zrušiť šev" @@ -112151,6 +113370,11 @@ msgid "Back to Previous" msgstr "Späť na predošlé" +msgctxt "Operator" +msgid "Save Incremental" +msgstr "Uložiť narastajúco" + + msgctxt "Operator" msgid "Save Copy..." msgstr "Uložiť kópiu..." @@ -112191,6 +113415,11 @@ msgid "Wavefront (.obj)" msgstr "Wavefront (.obj)" +msgctxt "Operator" +msgid "Stanford PLY (.ply)" +msgstr "Stanford PLY (.ply)" + + msgctxt "Operator" msgid "STL (.stl) (experimental)" msgstr "STL (.stl) (experimentálne)" @@ -112490,6 +113719,14 @@ msgid "Render Cache" msgstr "Zásobník prekreslenia" +msgid "Program" +msgstr "Program" + + +msgid "Arguments" +msgstr "Argumenty" + + msgid "I18n Branches" msgstr "Vetvy i18n" @@ -112564,6 +113801,24 @@ msgid "Requires a restart of Blender to take effect" msgstr "Pre nadobudnutie účinku vyžaduje reštart Blenderu" +msgid "Open blend files with this Blender version" +msgstr "Otvorí blend súbory touto verziou Blenderu" + + +msgctxt "Operator" +msgid "Register" +msgstr "Registrovať" + + +msgctxt "Operator" +msgid "Unregister" +msgstr "Zrušiť registráciu" + + +msgid "For All Users" +msgstr "Pre všetkých užívateľov" + + msgid "Player" msgstr "Hráč" @@ -112835,6 +114090,16 @@ msgid "Similar" msgstr "Podobné" +msgctxt "Operator" +msgid "First" +msgstr "Prvá" + + +msgctxt "Operator" +msgid "Last" +msgstr "Posledná" + + msgctxt "Operator" msgid "Set Color Attribute" msgstr "Nastaviť atribút farby" @@ -113673,6 +114938,11 @@ msgid "Outline" msgstr "Obrys" +msgctxt "GPencil" +msgid "Join" +msgstr "Spojiť" + + msgctxt "Operator" msgid "Set as Active Material" msgstr "Nastaviť ako aktívny materiál" @@ -113811,6 +115081,10 @@ msgid "Snap To" msgstr "Prichytiť na" +msgid "Snap Individual Elements To" +msgstr "Prichytiť jednotlivé prvky na" + + msgid "Fade Inactive Layers" msgstr "Vytrácanie neaktívnych vrstiev" @@ -113888,6 +115162,21 @@ msgid "Color Attribute" msgstr "Atribút farby" +msgctxt "Operator" +msgid "Empty" +msgstr "Prázdny" + + +msgctxt "Operator" +msgid "Stroke" +msgstr "Ťah" + + +msgctxt "Operator" +msgid "Suzanne" +msgstr "Zuzana" + + msgctxt "Operator" msgid "Point Cloud" msgstr "Mračno bodov" @@ -114835,6 +116124,11 @@ msgid "Add UVs" msgstr "Pridať UV" +msgctxt "GPencil" +msgid "Boundary" +msgstr "Okraj" + + msgid "Ignore Transparent" msgstr "Ignorovať priehľadné" @@ -115285,6 +116579,18 @@ msgid "Data corruption: data-block '%s' is using another local data-block ('%s') msgstr "Poškodené údaje: blok údajov „%s“ používa ako odkaz na prepis knižnice iný lokálny blok údajov („%s“)" +msgid "Light Linking for %s" +msgstr "Prepojenie svetla pre %s" + + +msgid "Shadow Linking for %s" +msgstr "Prepojenie tieňa pre %s" + + +msgid "Cannot unlink unsupported '%s' from light linking collection '%s'" +msgstr "Nemožno zrušiť prepojenie nepodporovaného '%s' z kolekcie prepojenia svetla '%s'" + + msgid "MaskLayer" msgstr "Vrstva masky" @@ -115357,6 +116663,10 @@ msgid "LightProbe" msgstr "SnimacSvetla" +msgid "GreasePencil" +msgstr "Pastelka" + + msgid "No new files have been packed" msgstr "Neboli zbalené žiadne nové súbory" @@ -116166,6 +117476,10 @@ msgid "GpencilMode" msgstr "Režim pastelky" +msgid "Gpencil" +msgstr "Pastelka" + + msgid "UV/Image" msgstr "UV/Obrázok" @@ -116178,6 +117492,10 @@ msgid "Select ID" msgstr "Vybrať ID" +msgid "Select-Next" +msgstr "Vybrať ďalší" + + msgid "Workbench" msgstr "Pracovný stôl" @@ -117424,6 +118742,30 @@ msgid "Grease Pencil has no active paint tool" msgstr "Pastelka nemá žiadny aktívny nástroj maľovania" +msgid "Line: ESC to cancel, LMB set origin, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to align, Alt to center, E: extrude, G: grab" +msgstr "Riadok: ESC zrušenie, ĽTM nastavenie počiatku, Enter/STM potvrdenie, koliesko/+- nastavenie čísla delenia, Shift zarovnanie, Alt vycentrovanie, E: vysunutie, G: uchopenie" + + +msgid "Polyline: ESC to cancel, LMB to set, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to align, G: grab" +msgstr "Polygónová čiara: ESC pre zrušenie, ĽTM nastavenie, Enter/STM potvrdenie, koliesko/+- nastavenie čísla delenia, Shift zarovnanie, G: uchopenie" + + +msgid "Rectangle: ESC to cancel, LMB set origin, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to square, Alt to center, G: grab" +msgstr "Obdĺžnik: ESC zrušenie, ĽTM nastavenie počiatku, Enter/STM potvrdenie, koliesko/+- nastavenie čísla delenia, Shift štvorec, Alt vycentrovanie, G: uchopenie" + + +msgid "Circle: ESC to cancel, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to square, Alt to center, G: grab" +msgstr "Kruh: ESC zrušenie, Enter/STM potvrdenie, koliesko/+- nastavenie čísla delenia, Shift štvorec, Alt vycentrovanie, G: uchopenie" + + +msgid "Arc: ESC to cancel, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to square, Alt to center, M: Flip, E: extrude, G: grab" +msgstr "Oblúk: ESC zrušenie, Enter/STM potvrdenie, koliesko/+- nastavenie čísla delenia, Shift štvorec, Alt vycentrovanie, M: preklopenie, E: vysunutie, G: uchopenie" + + +msgid "Curve: ESC to cancel, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to square, Alt to center, E: extrude, G: grab" +msgstr "Krivka: ESC zrušenie, Enter/STM potvrdenie, koliesko/+- nastavenie čísla delenia, Shift štvorec, Alt vycentrovanie, E: vysunutie, G: uchopenie" + + msgid "Primitives can only be added in Draw or Edit modes" msgstr "Prvotné tvary môžu byť pridané iba v režime kreslenia alebo editácie" @@ -117496,6 +118838,14 @@ msgid "GPencil Weight Smear: LMB to smear | RMB/Escape to Exit" msgstr "Rozmazanie váhy Pastelky: ĽTM na rozostrenie | PTM/Escape na ukončenie" +msgid "Skin_light" +msgstr "Svetlo_pokozky" + + +msgid "Skin_shadow" +msgstr "Tien_pokozky" + + msgid "Failed to set value" msgstr "Nepodarilo sa nastaviť hodnotu" @@ -117903,6 +119253,10 @@ msgid "Drag" msgstr "Ťahať" +msgid "Add to light linking collection" +msgstr "Pridať do kolekcie prepojenia svetla" + + msgid "Double click to rename" msgstr "Dvojklik na premenovanie" @@ -118219,6 +119573,10 @@ msgid "Browse Particle Settings to be linked" msgstr "Prehľadávať nastavenia častíc na prepojenie" +msgid "Browse Grease Pencil (legacy) Data to be linked" +msgstr "Prehľadávať Pastelku (staršie) Údaje, ktoré sa majú prepojiť" + + msgid "Browse Movie Clip to be linked" msgstr "Prehľadávať filmový klip na prepojenie" @@ -120381,6 +121739,30 @@ msgid "Rigid Body World has no associated physics data to export" msgstr "Pevné teleso sveta nemá žiadne súvisiace údaje fyziky na exportovanie" +msgid "3D Local View " +msgstr "Lokálne 3D zobrazenie " + + +msgid "3D View " +msgstr "3D zobrazenie" + + +msgid "Frame:" +msgstr "Snímka:" + + +msgid "Time:" +msgstr "Čas:" + + +msgid "Mem:%.2fM (Peak %.2fM)" +msgstr "Pamäť:%.2fM (Špička %.2fM)" + + +msgid "Mem:%.2fM, Peak: %.2fM" +msgstr "Pamäť: %.2fM, Špička: %.2fM" + + msgid "Cannot write a single file with an animation format selected" msgstr "Nemožno zapísať samostatný súbor s vybratým formátom animácie" @@ -121194,6 +122576,10 @@ msgid "Track the selected markers forward by one frame" msgstr "Snímanie vybraných značiek dopredu o jednu snímku" +msgid "New lines unsupported, call this operator multiple times" +msgstr "Nové riadky nie sú podporované, volá tento operátor viackrát" + + msgid "Unassigned" msgstr "Nepriradené" @@ -121695,6 +123081,10 @@ msgid "Can't Load Image" msgstr "Nemožno načítať obrázok" +msgid "%d × %d, " +msgstr "%d × %d, " + + msgid "%d float channel(s)" msgstr "%d kanál(ov) pohyblivej čiarky" @@ -122151,6 +123541,10 @@ msgid "Color field based on:" msgstr "Pole farieb založených na:" +msgid "• {}" +msgstr "• {}" + + msgid "Empty Geometry" msgstr "Prázdna geometria" @@ -122215,6 +123609,10 @@ msgid "Accessed named attributes:" msgstr "Prístup k pomenovaným atribútom:" +msgid " • \"{}\": " +msgstr " • \"{}\": " + + msgid "read" msgstr "read" @@ -122712,6 +124110,14 @@ msgid "Could not create library override from one or more of the selected data-b msgstr "Nepodarilo sa vytvoriť prepis knižnice z jedného alebo viacerých vybraných blokov údajov" +msgid "Cannot clear embedded library override '%s', only overrides of real data-blocks can be directly cleared" +msgstr "Nemožno vymazať vložený prepis knižnice '%s', priamo možno vymazať len prepisy skutočných blokov údajov" + + +msgid "Cannot clear linked library override '%s', only local overrides can be directly cleared" +msgstr "Nemožno vymazať prepis prepojenej knižnice '%s', priamo možno vymazať len lokálne prepisy" + + msgid "Current File" msgstr "Aktuálny súbor" @@ -122744,6 +124150,18 @@ msgid "Added through override" msgstr "Pridané cez prepis" +msgid "Protected from override" +msgstr "Chránené proti prepisu" + + +msgid "Additive override" +msgstr "Prídavný prepis" + + +msgid "Multiplicative override" +msgstr "Viacnásobný prepis" + + msgid "(empty)" msgstr "(prázdne)" @@ -122932,6 +124350,18 @@ msgid "Select movie or image strips" msgstr "Vyberie filmové alebo obrazové pásy" +msgid "No handle available" +msgstr "Žiadny dostupný manipulátor" + + +msgid "Can not create handle inside of speed transition" +msgstr "Nemožno vytvoriť manipulátor vnútri prechodu rýchlosti" + + +msgid "This strip type can not be retimed" +msgstr "Tento typ pásu nemožno opätovne časovať" + + msgid "No active sequence!" msgstr "Žiadna aktívna sekvencia!" @@ -122968,6 +124398,10 @@ msgid "Data Set" msgstr "Nastavenie údajov" +msgid "Unsupported column type" +msgstr "Nepodporovaný typ stĺpca" + + msgid "File Modified Outside and Inside Blender" msgstr "Súbor upravený mimo a vnútri Blendera" @@ -123064,6 +124498,10 @@ msgid "Undo History" msgstr "Späť v histórii" +msgid "Registration not possible from Microsoft Store installations" +msgstr "Registrácia nie je možná z inštalácií obchodu Microsoft Store" + + msgid "File association registered" msgstr "Registrovaná asociácia súborov" @@ -123072,10 +124510,26 @@ msgid "Unable to register file association" msgstr "Nemožno zaregistrovať asociáciu súborov" +msgid "Unregistration not possible from Microsoft Store installations" +msgstr "Zrušenie registrácie nie je možné z inštalácií obchodu Microsoft Store" + + +msgid "File association unregistered" +msgstr "Asociácia súborov neregistrovaná" + + +msgid "Unable to unregister file association" +msgstr "Nemožno zrušiť registráciu asociácie súborov" + + msgid "There is no asset library to remove" msgstr "Neexistuje žiadna knižnica materiálov na odstránenie" +msgid "Not available for Microsoft Store installations" +msgstr "Nie je k dispozícii pre inštalácie v obchode Microsoft Store" + + msgid "Windows-only operator" msgstr "Len Windows operátor" @@ -123712,6 +125166,10 @@ msgid " or Alt) Even Thickness %s" msgstr " alebo Alt) rovnomerné hrúbky %s" +msgid "'Shrink/Fatten' meshes is only supported in edit mode" +msgstr "'Zmrštiť/Rozšíriť' povrchové siete je podporované len v režime editácie" + + msgid "Tilt: %s° %s" msgstr "Náklon: %s° %s" @@ -123901,6 +125359,10 @@ msgid "Overwrite %s" msgstr "Prepísať %s" +msgid "Failed to set preview: no ID in context (incorrect context?)" +msgstr "Nepodarilo sa nastaviť náhľad: v kontexte nie je žiadne ID (nesprávny kontext?)" + + msgid "Incorrect context for running data-block fake user toggling" msgstr "Nesprávny kontext pre spustenie prepínania bloku údajov falošného užívateľa" @@ -124227,62 +125689,6 @@ msgid "No active object or active object isn't a GPencil object" msgstr "Žiadny aktívny objekt ani aktívny objekt nie je objektom Pastelky" -msgid "Object type mismatch, Alembic object path pointed to Camera when importing, but not any more." -msgstr "Nesúlad typu objektu, cesta k objektu Alembic pri importe ukazovala na Kameru, ale už nie." - - -msgid "Object type mismatch, Alembic object path points to Camera." -msgstr "Nesúlad typu objektu, cesta k objektu Alembic ukazuje na Kameru." - - -msgid "Object type mismatch, Alembic object path pointed to Curves when importing, but not any more." -msgstr "Nesúlad typu objektu, cesta k objektu Alembic pri importe ukazovala na Krivky, ale už nie." - - -msgid "Object type mismatch, Alembic object path points to Curves." -msgstr "Nesúlad typu objektu, cesta k objektu Alembic ukazuje na Krivky." - - -msgid "Object type mismatch, Alembic object path pointed to PolyMesh when importing, but not any more." -msgstr "Nesúlad typu objektu, cesta k objektu Alembic pri importe ukazovala na Mnohouholníkovú povrchovú sieť, ale už nie." - - -msgid "Object type mismatch, Alembic object path points to PolyMesh." -msgstr "Nesúlad typu objektu, cesta k objektu Alembic ukazuje na Mnohouholníkovú povrchovú sieť." - - -msgid "Object type mismatch, Alembic object path pointed to SubD when importing, but not any more." -msgstr "Nesúlad typu objektu, cesta k objektu Alembic pri importe ukazovala na Delenie, ale už nie." - - -msgid "Object type mismatch, Alembic object path points to SubD." -msgstr "Nesúlad typu objektu, cesta k objektu Alembic ukazuje na Delenie." - - -msgid "Object type mismatch, Alembic object path pointed to NURBS when importing, but not any more." -msgstr "Nesúlad typu objektu, cesta objektu Alembic pri importe ukazovala na NURBS, ale už nie." - - -msgid "Object type mismatch, Alembic object path points to NURBS." -msgstr "Nesúlad typu objektu, cesta objektu Alembic pri importe ukazovala na NURBS." - - -msgid "Object type mismatch, Alembic object path pointed to Points when importing, but not any more." -msgstr "Nesúlad typu objektu, cesta k objektu Alembic ukazovala na Body pri importe, ale už nie." - - -msgid "Object type mismatch, Alembic object path points to Points." -msgstr "Nesúlad typu objektu, cesta k objektu Alembic ukazovala na Body pri importe." - - -msgid "Object type mismatch, Alembic object path pointed to XForm when importing, but not any more." -msgstr "Nesúlad typu objektu, cesta k objektu Alembic pri importe ukazovala na XForm, ale už nie." - - -msgid "Object type mismatch, Alembic object path points to XForm." -msgstr "Nesúlad typu objektu, cesta k objektu Alembic pri importe ukazovala na XForm." - - msgid "Could not open Alembic archive for reading, see console for detail" msgstr "Nepodarilo sa otvoriť archív Alembic na čítanie! Podrobnosti nájdete v časti konzola" @@ -124455,6 +125861,14 @@ msgid "USD Export: couldn't construct relative file path for .vdb file, absolute msgstr "USD Export: nebolo možné vytvoriť relatívnu cestu súboru pre súbor .vdb, namiesto toho sa použije absolútna cesta" +msgid "Asset data can only be assigned to assets. Use asset_mark() to mark as an asset" +msgstr "Údaje o aktívach možno priradiť len k aktívam. Na označenie ako aktíva použite funkciu asset_mark()" + + +msgid "Asset data cannot be None" +msgstr "Údaje o aktívach nemôžu byť žiadne" + + msgid "Override template experimental feature is disabled" msgstr "Experimentálna funkcia šablóny prepisu je vypnutá" @@ -124495,6 +125909,10 @@ msgid "Registering id property class: '%s' is too long, maximum length is %d" msgstr "Registrácia triedy vlastností ID: '%s' je príliš dlhý, maximálna dĺžka je %d" +msgid "'%s' is of a type that cannot be an asset" +msgstr "'%s' je typ, ktorý nemôže byť aktívom" + + msgid "ID '%s' isn't an override" msgstr "ID '%s' nie je prepísaný" @@ -125247,6 +126665,14 @@ msgid "Unable to move sockets in built-in node" msgstr "Nemožno presunúť zásuvky vo vstavanom uzle" +msgid "Panel is not in the node tree interface" +msgstr "Panel nie je v rozhraní stromu uzlov" + + +msgid "Unable to create panel" +msgstr "Nemožno vytvoriť panel" + + msgid "%s '%s', bl_idname '%s' could not be unregistered" msgstr "%s '%s', bl_idname '%s' nemožno zrušiť registráciu" @@ -126913,6 +128339,11 @@ msgid "End Radius" msgstr "Koncový polomer" +msgctxt "NodeTree" +msgid "Rotations" +msgstr "Rotácie" + + msgid "Number of points in one rotation of the spiral" msgstr "Počet bodov v jednej rotácii špirály" @@ -127105,6 +128536,14 @@ msgid "Surface has no mesh" msgstr "Povrch nemá povrchovú sieť" +msgid "Evaluated surface missing UV map: \"{}\"" +msgstr "Vyhodnotená chýbajúca UV mapa povrchu: \"{}\"" + + +msgid "Original surface missing UV map: \"{}\"" +msgstr "Chýba pôvodná UV mapa povrchu: \"{}\"" + + msgid "Evaluated surface missing attribute: \"rest_position\"" msgstr "Chýba atribút vyhodnoteného povrchu: \"rest_position\"" @@ -127113,6 +128552,10 @@ msgid "Curves are not attached to any UV map" msgstr "Krivky nie sú pripojené k žiadnej UV mape" +msgid "Invalid surface UVs on {} curves" +msgstr "Neplatné UV povrchy na krivkách {}" + + msgid "The parts of the geometry to be deleted" msgstr "Časti geometrie na odstránenie" @@ -127706,6 +129149,14 @@ msgid "Half the width of the narrow band in voxel units" msgstr "Polovica šírky úzkeho pásma vo voxelových jednotkách" +msgid "The edge to retrieve data from. Defaults to the edge from the context" +msgstr "Hrana, z ktorej sa majú načítať údaje. Predvolené nastavenie je hrana z kontextu" + + +msgid "Values that sort the corners attached to the edge" +msgstr "Hodnoty, ktoré triedia rohy pripojené k hrane" + + msgid "Which of the sorted corners to output" msgstr "Určuje, ktorý zo zoradených rohov na výstup" @@ -127714,6 +129165,22 @@ msgid "Corner Index" msgstr "Index rohov" +msgid "A corner of the input edge in its face's winding order, chosen by the sort index" +msgstr "Roh vstupnej hrany v poradí navíjania jej plôšky, vybraný podľa indexu triedenia" + + +msgid "The number of faces or corners connected to each edge" +msgstr "Počet plôšok alebo rohov pripojených ku každej hrane" + + +msgid "Corner of Edge" +msgstr "Roh hrany" + + +msgid "Edge Corner Count" +msgstr "Počet rohov hrany" + + msgid "The face to retrieve data from. Defaults to the face from the context" msgstr "Plôška na načítanie údajov. Predvolené hodnoty plôšky z kontextu" @@ -127918,6 +129385,14 @@ msgid "Hit Distance" msgstr "Vzdialenosť zásahu" +msgid "Attribute does not exist: \"{}\"" +msgstr "Atribút neexistuje: \"{}\"" + + +msgid "Cannot delete built-in attribute: \"{}\"" +msgstr "Nemožno odstrániť zabudovaný atribút: \"{}\"" + + msgid "Which element to retrieve a value from on the geometry" msgstr "Určuje, ktorý prvok na načítanie hodnoty v geometrii" @@ -128030,6 +129505,10 @@ msgid "Add a new simulation input and output nodes to the node tree" msgstr "Pridá nové vstupné a výstupné uzly simulácie do stromu uzlov" +msgid "Failed to write to attribute \"{}\" with domain \"{}\" and type \"{}\"" +msgstr "Failed to write to attribute \"{}\" with domain \"{}\" and type \"{}\"" + + msgid "Delimiter" msgstr "Obmedzovač" @@ -128466,6 +129945,18 @@ msgid "Sun disc not available in Eevee" msgstr "Slnečný kotúč v Eevee nie je dostupný" +msgid "The number of Voronoi layers to sum" +msgstr "Počet vrstiev Voronoi, ktoré sa majú sčítať" + + +msgid "The influence of a Voronoi layer relative to that of the previous layer" +msgstr "Vplyv vrstvy Voronoi vzhľadom na vplyv predošlej vrstvy" + + +msgid "The scale of a Voronoi layer relative to that of the previous layer" +msgstr "Mierka vrstvy Voronoi vzhľadom na mierku predošlej vrstvy" + + msgid "Detail Scale" msgstr "Mierka detailu" @@ -128658,18 +130149,6 @@ msgid "%s: failed to load '%s'" msgstr "%s: nepodarilo sa načítať '%s'" -msgid "reading render result: dimensions don't match, expected %dx%d" -msgstr "čítanie výsledku prekresľovania: rozmery sa nezhodujú, očakáva sa %dx%d" - - -msgid "reading render result: expected channel \"%s.%s\" or \"%s\" not found" -msgstr "čítanie výsledku prekresľovania: očakávaný kanál \"%s.%s\" alebo \"%s\" nebol nájdený" - - -msgid "reading render result: expected channel \"%s.%s\" not found" -msgstr "čítanie výsledku prekresľovania: očakávaný kanál \"%s.%s\" nebol nájdený" - - msgctxt "Sequence" msgid "Color Balance" msgstr "Vyvážiť farbu" @@ -128860,6 +130339,10 @@ msgid "Unable to save an unsaved file with an empty or unset \"filepath\" proper msgstr "Nemožno uložiť neuložený súbor s prázdnou alebo nenastavenou vlastnosťou \"filepath\"" +msgid "Unable to find an available incremented file name" +msgstr "Nemožno nájsť dostupný narastajúci názov súboru" + + msgid "Engine '%s' not available for scene '%s' (an add-on may need to be installed or enabled)" msgstr "Mechanizmus '%s' nie je k dispozícii pre scénu '%s' (doplnok je potrebné nainštalovať alebo zapnúť)" @@ -129516,6 +130999,14 @@ msgid "whole milk" msgstr "plnotučné mlieko" +msgid "internal" +msgstr "interne" + + +msgid "visual studio code" +msgstr "kód vizuálneho štúdia" + + msgid "Blurry Footage" msgstr "Rozostrené zábery" diff --git a/locale/po/sr.po b/locale/po/sr.po index 825ff1b647a..8963deba1a5 100644 --- a/locale/po/sr.po +++ b/locale/po/sr.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2012-09-07 22:32+0100\n" "Last-Translator: Nikola Radovanovic \n" "Language-Team: Nikola Radovanovic\n" @@ -6438,10 +6438,6 @@ msgid "Light color" msgstr "Боја светлости" -msgid "Falloff distance - the light is at half the original intensity at this point" -msgstr "Удаљеност опадања - светлост има половину своје вредности у овој тачки" - - msgid "Omnidirectional point light source" msgstr "Омни тачка као извор светлости" @@ -6458,18 +6454,6 @@ msgid "Directional area light source" msgstr "Усмерени површински извор светлости" -msgid "Falloff Type" -msgstr "Врста опадања" - - -msgid "Samples" -msgstr "Узорака" - - -msgid "Number of shadow buffer samples" -msgstr "Број узорака умекшане сенке" - - msgid "Rectangle" msgstr "Правоугаоник" @@ -9487,6 +9471,10 @@ msgid "Minimum for measuring thickness" msgstr "Најмања измерена дебљина" +msgid "Samples" +msgstr "Узорака" + + msgid "Number of samples to test per face" msgstr "Број узорака рендерованих за сваки пиксел" @@ -18674,6 +18662,10 @@ msgid "Ignore Background Click" msgstr "Игнориши клик на позадину" +msgid "Falloff Type" +msgstr "Врста опадања" + + msgid "Operator" msgstr "Оператор" diff --git a/locale/po/sr@latin.po b/locale/po/sr@latin.po index 899be838324..7b0febc7b3c 100644 --- a/locale/po/sr@latin.po +++ b/locale/po/sr@latin.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2012-09-07 22:32+0100\n" "Last-Translator: Nikola Radovanovic \n" "Language-Team: Nikola Radovanovic\n" @@ -6438,10 +6438,6 @@ msgid "Light color" msgstr "Boja svetlosti" -msgid "Falloff distance - the light is at half the original intensity at this point" -msgstr "Udaljenost opadanja - svetlost ima polovinu svoje vrednosti u ovoj tački" - - msgid "Omnidirectional point light source" msgstr "Omni tačka kao izvor svetlosti" @@ -6458,18 +6454,6 @@ msgid "Directional area light source" msgstr "Usmereni površinski izvor svetlosti" -msgid "Falloff Type" -msgstr "Vrsta opadanja" - - -msgid "Samples" -msgstr "Uzoraka" - - -msgid "Number of shadow buffer samples" -msgstr "Broj uzoraka umekšane senke" - - msgid "Rectangle" msgstr "Pravougaonik" @@ -9487,6 +9471,10 @@ msgid "Minimum for measuring thickness" msgstr "Najmanja izmerena debljina" +msgid "Samples" +msgstr "Uzoraka" + + msgid "Number of samples to test per face" msgstr "Broj uzoraka renderovanih za svaki piksel" @@ -18674,6 +18662,10 @@ msgid "Ignore Background Click" msgstr "Ignoriši klik na pozadinu" +msgid "Falloff Type" +msgstr "Vrsta opadanja" + + msgid "Operator" msgstr "Operator" diff --git a/locale/po/sv.po b/locale/po/sv.po index 1aa037680e3..0529bda2688 100644 --- a/locale/po/sv.po +++ b/locale/po/sv.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: \n" "Last-Translator: Arvid Rudling \n" "Language-Team: \n" @@ -1001,10 +1001,6 @@ msgid "Compositing" msgstr "Komponering" -msgid "Samples" -msgstr "Samplar" - - msgid "Size Y" msgstr "Storlek Y" @@ -1313,6 +1309,10 @@ msgid "Root" msgstr "Rot" +msgid "Samples" +msgstr "Samplar" + + msgid "Active Clone" msgstr "Klona aktivt" diff --git a/locale/po/th.po b/locale/po/th.po index 6cd6ea016b9..0122ea5a460 100644 --- a/locale/po/th.po +++ b/locale/po/th.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2019-12-08 17:40+0700\n" "Last-Translator: gongpha \n" "Language-Team: Thai Translation Team \n" @@ -1541,14 +1541,6 @@ msgid "Area" msgstr "พื้นที่" -msgid "Inverse Square" -msgstr "จัตุรัสผกผัน" - - -msgid "Samples" -msgstr "ตัวอย่าง" - - msgid "Rectangle" msgstr "สี่เหลี่ยม" @@ -2213,6 +2205,10 @@ msgid "Root" msgstr "ฐาน" +msgid "Samples" +msgstr "ตัวอย่าง" + + msgid "Intersect" msgstr "ตัดกัน" diff --git a/locale/po/tr.po b/locale/po/tr.po index a6e24415bf7..0cbdd991337 100644 --- a/locale/po/tr.po +++ b/locale/po/tr.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2023-07-02 21:35+0300\n" "Last-Translator: Emir SARI \n" "Language-Team: Turkish \n" diff --git a/locale/po/uk.po b/locale/po/uk.po index 7e30f9e2dd3..ac5f0e272cc 100644 --- a/locale/po/uk.po +++ b/locale/po/uk.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2021-03-01 19:15+0000\n" "Last-Translator: lxlalexlxl \n" "Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/lxlalexlxl/blender/language/uk_UA/)\n" @@ -11403,10 +11403,6 @@ msgid "Show scenes" msgstr "Показ сцен" -msgid "Show materials, nodetrees, textures and Freestyle's linestyles" -msgstr "Показ матеріалів, дерев вузлів, текстур та стилів ліній Freestyle" - - msgid "Directory" msgstr "Тека" @@ -20537,10 +20533,6 @@ msgid "Cycles light settings" msgstr "Устави освітлення Cycles" -msgid "Falloff distance - the light is at half the original intensity at this point" -msgstr "Відстань спаду - інтенсивність світла у цій точці становить половину початкової" - - msgid "Node tree for node based lights" msgstr "Дерево вузлів для базованих на вузлах освітлювачів" @@ -20618,14 +20610,6 @@ msgid "Directional area Light" msgstr "Направлений площинний Освітлювач" -msgid "Constant Coefficient" -msgstr "Постійний коефіцієнт" - - -msgid "Constant distance attenuation coefficient" -msgstr "Постійний коефіцієнт згасання з відстанню" - - msgid "Contact Shadow Bias" msgstr "Відхил Тіні Контакту" @@ -20654,66 +20638,6 @@ msgid "Light energy emitted over the entire area of the light in all directions" msgstr "Енергія світла, емітована на всю область освітлювача у всіх напрямках" -msgid "Custom light falloff curve" -msgstr "Власна крива спаду освітлення" - - -msgid "Falloff Type" -msgstr "Тип спаду" - - -msgid "Intensity Decay with distance" -msgstr "Зменшення інтенсивності з відстанню" - - -msgid "Inverse Linear" -msgstr "Обернено пропорційно" - - -msgid "Inverse Square" -msgstr "Обернено до квадрату" - - -msgid "Inverse Coefficients" -msgstr "Обернути коефіцієнти" - - -msgid "Lin/Quad Weighted" -msgstr "Лін/квад виважено" - - -msgid "Linear Attenuation" -msgstr "Лінійне послаблення" - - -msgid "Linear distance attenuation" -msgstr "Лінійне послаблення з відстанню" - - -msgid "Linear Coefficient" -msgstr "Лінійний коефіцієнт" - - -msgid "Linear distance attenuation coefficient" -msgstr "Лінійний коефіцієнт згасання з відстанню" - - -msgid "Quadratic Attenuation" -msgstr "Квадратичне послаблення" - - -msgid "Quadratic distance attenuation" -msgstr "Квадратичне послаблення з відстанню" - - -msgid "Quadratic Coefficient" -msgstr "Квадратичний коефіцієнт" - - -msgid "Quadratic distance attenuation coefficient" -msgstr "Квадратичний коефіцієнт згасання з відстанню" - - msgid "Shadow Buffer Bias" msgstr "Похибка тіньового буфера" @@ -20730,22 +20654,6 @@ msgid "Shadow map clip start, below which objects will not generate shadows" msgstr "Ближня межа відсікання для тіньового буфера, нижче від якої об'єкти не будуть генерувати тіні" -msgid "Samples" -msgstr "Вибірки" - - -msgid "Number of shadow buffer samples" -msgstr "Кількість вибірок буфера тіней" - - -msgid "Shadow Buffer Size" -msgstr "Розмір буфера тіней" - - -msgid "Resolution of the shadow buffer, higher values give crisper shadows but use more memory" -msgstr "Роздільність тіньового буфера. Більші значення дають чіткіші тіні, але потребують більше пам'яті" - - msgid "Shadow Color" msgstr "Колір тіні" @@ -26075,6 +25983,10 @@ msgid "Format of multiview media" msgstr "Формат багатовиглядних медіаданих" +msgid "Multi-View" +msgstr "Багато-вигляд" + + msgid "Image Preview" msgstr "Перегляд зображення" @@ -30418,6 +30330,10 @@ msgid "Minimum for measuring thickness" msgstr "Найменша вимірювана товщина" +msgid "Samples" +msgstr "Вибірки" + + msgid "Number of samples to test per face" msgstr "Кількість вибірок грані на тест" @@ -61400,6 +61316,10 @@ msgid "Edit Dyntopo Detail Size" msgstr "Редагувати Розмір Детальності Динтопо" +msgid "Falloff Type" +msgstr "Тип спаду" + + msgctxt "Operator" msgid "Face Set Box Gesture" msgstr "Набір Граней Коробки Жестом" @@ -64789,6 +64709,10 @@ msgid "Align UVs on Y axis" msgstr "Вирівняти UV за віссю Y" +msgid "Correct Aspect" +msgstr "Виправити Пропорцію Боків" + + msgctxt "Operator" msgid "Average Islands Scale" msgstr "Усереднити масштаб островів" @@ -64815,10 +64739,6 @@ msgid "Clip UV coordinates to bounds after unwrapping" msgstr "Відсікати UV-координати вздовж меж після розгортання" -msgid "Correct Aspect" -msgstr "Виправити Пропорцію Боків" - - msgid "Map UVs taking image aspect ratio into account" msgstr "Розкласти UVи з урахуванням пропорції боків зображення" @@ -76139,10 +76059,6 @@ msgid "Single stereo camera system, adjust the stereo settings in the camera pan msgstr "Система одиничної стерео камери, наладнуйте дані параметри стерео на панелі камери" -msgid "Multi-View" -msgstr "Багато-вигляд" - - msgid "Multi camera system, adjust the cameras individually" msgstr "Багатокамерна система, наладнуйте кожну камеру окремо" @@ -86101,14 +86017,6 @@ msgid "Length of rays, defines how far away other faces give occlusion effect" msgstr "Довжина променів; визначає, на якій відстані грані дають ефект оклюзії" -msgid "Use Ambient Occlusion" -msgstr "Вжити загороду оточення (АО)" - - -msgid "Use Ambient Occlusion to add shadowing based on distance between objects" -msgstr "Використати загороду оточення (АО), щоб додати відтінення залежно від відстані між об'єктами" - - msgid "World Mist" msgstr "Імла світу" diff --git a/locale/po/vi.po b/locale/po/vi.po index 67b2e89b3ee..6c0be7acb7e 100644 --- a/locale/po/vi.po +++ b/locale/po/vi.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2022-08-19 12:33+0700\n" "Last-Translator: HỒ NHỰT CHÂU \n" "Language-Team: Tỉnh An Giang, Đình Bình Phú\n" @@ -12276,10 +12276,6 @@ msgid "Show scenes" msgstr "Hiện các cảnh" -msgid "Show materials, nodetrees, textures and Freestyle's linestyles" -msgstr "Hiện vật liệu, cây giao điểm, chất liệu, và phong cách nét của Phong Cạch Tự Do" - - msgid "Directory" msgstr "Thư Mục" @@ -22750,10 +22746,6 @@ msgid "Diffuse reflection multiplier" msgstr "Hệ số để nhân tán xạ phản xạ" -msgid "Falloff distance - the light is at half the original intensity at this point" -msgstr "Khoảng cách giảm sáng - khoảng cách cường độ ánh sáng là phần nửa ban đầu tại điểm này" - - msgid "Node tree for node based lights" msgstr "Cây giao điểm cho đèn cơ sở giao điểm" @@ -22839,14 +22831,6 @@ msgid "Directional area Light" msgstr "Đèn điện tích định hướng" -msgid "Constant Coefficient" -msgstr "Hệ Số Hằng Số" - - -msgid "Constant distance attenuation coefficient" -msgstr "Hệ số hằng số cho sự giảm khoảng cách" - - msgid "Contact Shadow Bias" msgstr "Thành Kiến Bóng Tối Đụng" @@ -22880,66 +22864,6 @@ msgid "Light energy emitted over the entire area of the light in all directions" msgstr "Năng lượng ánh sáng được trên toàn diện tích của đèn cho mỗi hướng" -msgid "Custom light falloff curve" -msgstr "Đường cong tùy chọn để giảm ánh sáng" - - -msgid "Falloff Type" -msgstr "Loại Sự Giảm" - - -msgid "Intensity Decay with distance" -msgstr "Sự Giảm Cường Độ tùy cách xa" - - -msgid "Inverse Linear" -msgstr "Nghịch Biến Bậc Một" - - -msgid "Inverse Square" -msgstr "Nghịch Biến Bậc Hai" - - -msgid "Inverse Coefficients" -msgstr "Hệ Số Đảo Nghịch" - - -msgid "Lin/Quad Weighted" -msgstr "Được Quyền Lượng Bậc Một/Hai" - - -msgid "Linear Attenuation" -msgstr "Sự Giảm Bậc Một" - - -msgid "Linear distance attenuation" -msgstr "Sự giảm tùy khoảng cách bậc một" - - -msgid "Linear Coefficient" -msgstr "Hệ Số Bậc Một" - - -msgid "Linear distance attenuation coefficient" -msgstr "Hệ số bậc một cho sự giảm tùy khoảng cách" - - -msgid "Quadratic Attenuation" -msgstr "Sự Giảm Bậc Hai" - - -msgid "Quadratic distance attenuation" -msgstr "Sự giảm tùy khoảng cách bậc hai" - - -msgid "Quadratic Coefficient" -msgstr "Hệ Số Bậc Hai" - - -msgid "Quadratic distance attenuation coefficient" -msgstr "Hệ số bậc hai cho sự giảm tùy khoảng cách" - - msgid "Shadow Buffer Bias" msgstr "Thành Kiến Đệm Bóng Tối" @@ -22956,22 +22880,6 @@ msgid "Shadow map clip start, below which objects will not generate shadows" msgstr "Bản đồ bóng tối không thể thấy vật thể gần hơn này và không chế tạo bóng tối" -msgid "Samples" -msgstr "Mẫu Vật" - - -msgid "Number of shadow buffer samples" -msgstr "Số lượng mẫu vật cho đệm bóng tối" - - -msgid "Shadow Buffer Size" -msgstr "Kích Cỡ Đệm Bóng Tối" - - -msgid "Resolution of the shadow buffer, higher values give crisper shadows but use more memory" -msgstr "Độ phân giải của đệm bóng tối, giá trị càng cao có bóng tối càng rõ nhưng sử dụng bộ nhớ càng nhiều hơn" - - msgid "Shadow Color" msgstr "Màu Bóng Tối" @@ -28795,6 +28703,10 @@ msgid "Format of multiview media" msgstr "Định dạng của phương tiện đa màn" +msgid "Multi-View" +msgstr "Đa-Màn" + + msgid "Tile Number" msgstr "Số Ô" @@ -33659,6 +33571,10 @@ msgid "Minimum for measuring thickness" msgstr "Cực tiểu cho đo bề dày" +msgid "Samples" +msgstr "Mẫu Vật" + + msgid "Number of samples to test per face" msgstr "Số lượng mẫu vật để kiểm tra cho mỗi mặt" @@ -69424,6 +69340,10 @@ msgid "Generic sculpt expand operator" msgstr "Thao tác mở rộng khắc tổng quát" +msgid "Falloff Type" +msgstr "Loại Sự Giảm" + + msgid "Initial falloff of the expand operation" msgstr "Dộ giảm của thao tác mở rộng" @@ -73191,6 +73111,10 @@ msgid "Align UVs on Y axis" msgstr "Sắp xếp UV trên trục Y" +msgid "Correct Aspect" +msgstr "Sửa Tỉ Lệ Cạnh Ảnh" + + msgctxt "Operator" msgid "Average Islands Scale" msgstr "Phóng To Đặo Trung Bình" @@ -73225,10 +73149,6 @@ msgid "Clip UV coordinates to bounds after unwrapping" msgstr "Kẹp lại tọa độ UV đến ranh giới sau gỡ ra" -msgid "Correct Aspect" -msgstr "Sửa Tỉ Lệ Cạnh Ảnh" - - msgid "Map UVs taking image aspect ratio into account" msgstr "Chiếu UV tùy tỉ lệ cạnh ảnh" @@ -86508,10 +86428,6 @@ msgid "Single stereo camera system, adjust the stereo settings in the camera pan msgstr "Một hệ thống máy quay phim nhị kênh, chỉnh cài đặt nhị kênh trong bảng máy quay phim" -msgid "Multi-View" -msgstr "Đa-Màn" - - msgid "Multi camera system, adjust the cameras individually" msgstr "Hệ thống máy quay phim, chỉnh các máy quay phim riêng" @@ -97441,14 +97357,6 @@ msgid "Length of rays, defines how far away other faces give occlusion effect" msgstr "Bề dài của tia, cho chỉ định cách xa cho mặt khác có hiệu ứng che khuất" -msgid "Use Ambient Occlusion" -msgstr "Dùng Che Khuất Bao Quanh" - - -msgid "Use Ambient Occlusion to add shadowing based on distance between objects" -msgstr "Dùng Che Khuất Bao Quanh để kèm bóng tối tùy khoảng cách giữa vật thể" - - msgid "World Mist" msgstr "Sương Mù Thế Giới" diff --git a/locale/po/zh_CN.po b/locale/po/zh_CN.po index 9c32fac63f6..2fd96ae5a58 100644 --- a/locale/po/zh_CN.po +++ b/locale/po/zh_CN.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: \n" "Last-Translator: DeathBlood\n" "Language-Team: \n" @@ -12544,10 +12544,6 @@ msgid "Show scenes" msgstr "显示场景" -msgid "Show materials, nodetrees, textures and Freestyle's linestyles" -msgstr "显示材质,节点树,纹理和Freestyle的线条样式" - - msgid "Directory" msgstr "文件夹" @@ -23417,10 +23413,6 @@ msgid "Diffuse reflection multiplier" msgstr "漫射反射乘数" -msgid "Falloff distance - the light is at half the original intensity at this point" -msgstr "衰减距离 - 此点的光线强度较初始值减半" - - msgid "Node tree for node based lights" msgstr "基于节点灯光的节点树" @@ -23506,14 +23498,6 @@ msgid "Directional area Light" msgstr "定向面光源" -msgid "Constant Coefficient" -msgstr "恒定系数" - - -msgid "Constant distance attenuation coefficient" -msgstr "恒定距离衰减系数" - - msgid "Contact Shadow Bias" msgstr "接触阴影偏移" @@ -23547,66 +23531,6 @@ msgid "Light energy emitted over the entire area of the light in all directions" msgstr "向四面八方发射至整个区域的光能" -msgid "Custom light falloff curve" -msgstr "自定义灯光衰减曲线" - - -msgid "Falloff Type" -msgstr "衰减类型" - - -msgid "Intensity Decay with distance" -msgstr "随距离的衰减强度" - - -msgid "Inverse Linear" -msgstr "反向线性" - - -msgid "Inverse Square" -msgstr "反向平方" - - -msgid "Inverse Coefficients" -msgstr "反向系数" - - -msgid "Lin/Quad Weighted" -msgstr "线性 / 平方加权" - - -msgid "Linear Attenuation" -msgstr "线性衰减" - - -msgid "Linear distance attenuation" -msgstr "线性距离衰减" - - -msgid "Linear Coefficient" -msgstr "多项式系数" - - -msgid "Linear distance attenuation coefficient" -msgstr "线性距离衰减" - - -msgid "Quadratic Attenuation" -msgstr "平方衰减" - - -msgid "Quadratic distance attenuation" -msgstr "二次间隔衰减" - - -msgid "Quadratic Coefficient" -msgstr "二次系数" - - -msgid "Quadratic distance attenuation coefficient" -msgstr "二次间隔衰减系数" - - msgid "Shadow Buffer Bias" msgstr "阴影缓冲偏移" @@ -23623,22 +23547,6 @@ msgid "Shadow map clip start, below which objects will not generate shadows" msgstr "阴影映射区裁剪起始点, 越过此点的物体将不产生阴影" -msgid "Samples" -msgstr "采样" - - -msgid "Number of shadow buffer samples" -msgstr "阴影缓冲采样次数" - - -msgid "Shadow Buffer Size" -msgstr "阴影缓冲尺寸" - - -msgid "Resolution of the shadow buffer, higher values give crisper shadows but use more memory" -msgstr "阴影缓冲精度, 值越高, 阴影越清晰, 但会消耗更多内存" - - msgid "Shadow Color" msgstr "阴影色彩" @@ -29549,6 +29457,10 @@ msgid "Format of multiview media" msgstr "多视图媒体格式" +msgid "Multi-View" +msgstr "多视图" + + msgid "Tile Number" msgstr "分块号" @@ -34485,6 +34397,10 @@ msgid "Minimum for measuring thickness" msgstr "用于衡量宽度的最小值" +msgid "Samples" +msgstr "采样" + + msgid "Number of samples to test per face" msgstr "针对各个面的测试采样数" @@ -71452,6 +71368,10 @@ msgid "Generic sculpt expand operator" msgstr "通用雕刻扩展操作" +msgid "Falloff Type" +msgstr "衰减类型" + + msgid "Initial falloff of the expand operation" msgstr "初始化扩展操作的衰减" @@ -75346,6 +75266,10 @@ msgid "Axis to align to" msgstr "要对齐的轴" +msgid "Correct Aspect" +msgstr "校正高宽比例" + + msgid "Method to calculate rotation angle" msgstr "旋转角度的计算方法" @@ -75405,10 +75329,6 @@ msgid "Clip UV coordinates to bounds after unwrapping" msgstr "展开后将 UV 裁剪至边界框" -msgid "Correct Aspect" -msgstr "校正高宽比例" - - msgid "Map UVs taking image aspect ratio into account" msgstr "根据图像比例计算 UV 的高宽比" @@ -89202,10 +89122,6 @@ msgid "Single stereo camera system, adjust the stereo settings in the camera pan msgstr "单立体声摄像机系统,调整摄像机面板中的立体声设置" -msgid "Multi-View" -msgstr "多视图" - - msgid "Multi camera system, adjust the cameras individually" msgstr "多摄像机系统,单独的调节摄像机" @@ -100559,14 +100475,6 @@ msgid "Length of rays, defines how far away other faces give occlusion effect" msgstr "光线长度, 定义表面产生闭塞效果的距离" -msgid "Use Ambient Occlusion" -msgstr "使用环境光遮蔽 (AO)" - - -msgid "Use Ambient Occlusion to add shadowing based on distance between objects" -msgstr "基于物体的间距, 用 AO 添加阴影" - - msgid "World Mist" msgstr "世界迷雾" @@ -103306,10 +103214,6 @@ msgid "or AMD with macOS %s or newer" msgstr "或者AMD搭配 macOS %s 或更新版本" -msgid " - intel-level-zero-gpu version %s or newer" -msgstr " - intel-level-zero-gpu 版本 %s 或更新版本" - - msgid "Noise Threshold" msgstr "噪波阈值" diff --git a/locale/po/zh_TW.po b/locale/po/zh_TW.po index 69e3e018507..af3dc25d232 100644 --- a/locale/po/zh_TW.po +++ b/locale/po/zh_TW.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.0.0 Alpha (b'44ee5b38ac1b')\n" +"Project-Id-Version: Blender 4.0.0 Alpha (b'2f5245b4340a')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-07-04 16:07:54\n" +"POT-Creation-Date: 2023-07-10 12:34:48\n" "PO-Revision-Date: 2023-01-28 11:09+0800\n" "Last-Translator: Cheng-Chia Tseng \n" "Language-Team: Chinese (Traditional) \n" @@ -13657,10 +13657,6 @@ msgid "Light color" msgstr "光照色彩" -msgid "Falloff distance - the light is at half the original intensity at this point" -msgstr "衰落距離 - 位於此點時光照為原始強度的一半" - - msgid "Specular Factor" msgstr "高光係數" @@ -13706,42 +13702,6 @@ msgid "Directional area light source" msgstr "定向區域光源" -msgid "Falloff Type" -msgstr "衰減類型" - - -msgid "Intensity Decay with distance" -msgstr "隨著距離減弱的強度" - - -msgid "Inverse Linear" -msgstr "反轉線性" - - -msgid "Inverse Square" -msgstr "反轉平方" - - -msgid "Lin/Quad Weighted" -msgstr "線性/二次型權重" - - -msgid "Linear Attenuation" -msgstr "線性衰減" - - -msgid "Linear distance attenuation" -msgstr "線性距離衰減" - - -msgid "Quadratic Attenuation" -msgstr "二次型衰減" - - -msgid "Quadratic distance attenuation" -msgstr "二次型距離衰減" - - msgid "Shadow Buffer Bias" msgstr "陰影緩衝偏差" @@ -13754,22 +13714,6 @@ msgid "Shadow map clip start, below which objects will not generate shadows" msgstr "陰影映射剪輯結束,沒到這裡物體不會生成陰影" -msgid "Samples" -msgstr "取樣" - - -msgid "Number of shadow buffer samples" -msgstr "陰影緩衝取樣的數量" - - -msgid "Shadow Buffer Size" -msgstr "陰影緩衝大小" - - -msgid "Resolution of the shadow buffer, higher values give crisper shadows but use more memory" -msgstr "陰影緩衝的解析度,較高的值可有較鮮銳的陰影,但消耗較多記憶體" - - msgid "Shadow Color" msgstr "陰影色彩" @@ -17555,6 +17499,10 @@ msgid "Format of multiview media" msgstr "多重視圖媒體的格式" +msgid "Multi-View" +msgstr "多重視圖" + + msgid "Image Preview" msgstr "影像預覽" @@ -19534,6 +19482,10 @@ msgid "Minimum for measuring thickness" msgstr "測量厚度的最小值" +msgid "Samples" +msgstr "取樣" + + msgid "Number of samples to test per face" msgstr "每個面要測試的樣本數" @@ -38917,6 +38869,10 @@ msgid "Dynamic topology alters the mesh topology while sculpting" msgstr "動態拓樸可在雕塑時修改網格拓樸" +msgid "Falloff Type" +msgstr "衰減類型" + + msgctxt "Operator" msgid "Face Sets Visibility" msgstr "面集可見性" @@ -40947,6 +40903,10 @@ msgid "Align UVs on Y axis" msgstr "對齊 UV 至 Y 軸" +msgid "Correct Aspect" +msgstr "校正寬長比" + + msgctxt "Operator" msgid "Average Islands Scale" msgstr "平均島塊縮放" @@ -40973,10 +40933,6 @@ msgid "Clip UV coordinates to bounds after unwrapping" msgstr "拆解之後將 UV 座標軸修剪至邊界" -msgid "Correct Aspect" -msgstr "校正寬長比" - - msgid "Map UVs taking image aspect ratio into account" msgstr "根據影像寬長比映射 UV" @@ -47178,10 +47134,6 @@ msgid "Single stereo camera system, adjust the stereo settings in the camera pan msgstr "單一立體攝影機系統,請在攝影機面板中調整立體設定" -msgid "Multi-View" -msgstr "多重視圖" - - msgid "Render Slot" msgstr "算繪槽" @@ -52732,14 +52684,6 @@ msgid "Length of rays, defines how far away other faces give occlusion effect" msgstr "光線長度,定義其他表面生成遮擋效果的距離有多遠" -msgid "Use Ambient Occlusion" -msgstr "使用周遭遮擋" - - -msgid "Use Ambient Occlusion to add shadowing based on distance between objects" -msgstr "使用周遭遮擋功能來根據物體間的距離添加陰影" - - msgid "World Mist" msgstr "世界迷霧" -- 2.30.2 From 113004687da5802e680b4f271b45c6b9391bb84b Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Mon, 10 Jul 2023 14:55:38 +0200 Subject: [PATCH 098/115] Refactor: Mesh Merge By Distance - Deduplicate code; - Support no customdata interpolation for edges; - Reduce number of required elements in context arrays. With 74772c6920, the merge by distance code for meshes now supports optional interpolation of custom data for vertices. As this can be advantageous for performance and memory, it seems convenient to support the same for edges (and in the future polygons and corners). So this commit reworks the code that finds the edge groups to match the same used for vertices and thus deduplicating and simplifying the code. Conveniently the `edge_ctx_map` array is no longer needed and can be removed to save memory. However it was necessary to create another array (which is usually smaller) called `double_edges` (to match `double_verts`). --- **Results:** The profiling result depends on some factors such as: - interpolate or not interpolate customdata; - affect a large or small portion of the mesh; The best case is when the customdata **is not** interpolated and the operation affects **large** portions of the mesh: | Before: | After: | Factor: | | ---------- | ---------- | ------- | | 1256.61 ms | 1073.218 ms| -14.44% | The worst case is when the customdata **is not** interpolated and the operation affects **small** portions of the mesh: | Before: | After: | Factor: | | --------- | --------- | ------- | | 1077.50 ms| 1086.7 ms| +0.85% | Pull Request: https://projects.blender.org/blender/blender/pulls/109836 --- .../geometry/GEO_mesh_merge_by_distance.hh | 4 +- .../geometry/intern/mesh_merge_by_distance.cc | 603 ++++++++---------- 2 files changed, 260 insertions(+), 347 deletions(-) diff --git a/source/blender/geometry/GEO_mesh_merge_by_distance.hh b/source/blender/geometry/GEO_mesh_merge_by_distance.hh index ba77d18f0e3..6e6622c9f49 100644 --- a/source/blender/geometry/GEO_mesh_merge_by_distance.hh +++ b/source/blender/geometry/GEO_mesh_merge_by_distance.hh @@ -52,7 +52,7 @@ std::optional mesh_merge_by_distance_connected(const Mesh &mesh, * this is not supported and will likely generate corrupted geometry. * * \param vert_dest_map_len: The number of non '-1' values in `vert_dest_map`. (not the size) - * \param do_mix_vert_data: If true, the groups of vertices in the `vert_dest_map_len`, defined by + * \param do_mix_data: If true, the groups of vertices in the `vert_dest_map_len`, defined by * source vertices with the same target plus the target vertex, will have their custom data * interpolated into the resulting vertex. If false, only the custom data of the target vertex will * remain. @@ -60,6 +60,6 @@ std::optional mesh_merge_by_distance_connected(const Mesh &mesh, Mesh *mesh_merge_verts(const Mesh &mesh, MutableSpan vert_dest_map, int vert_dest_map_len, - const bool do_mix_vert_data); + const bool do_mix_data); } // namespace blender::geometry diff --git a/source/blender/geometry/intern/mesh_merge_by_distance.cc b/source/blender/geometry/intern/mesh_merge_by_distance.cc index 963561d9682..3aae042bd2f 100644 --- a/source/blender/geometry/intern/mesh_merge_by_distance.cc +++ b/source/blender/geometry/intern/mesh_merge_by_distance.cc @@ -40,16 +40,10 @@ namespace blender::geometry { #define ELEM_MERGED int(-2) struct WeldEdge { - union { - int flag; - struct { - /* Indices relative to the original Mesh. */ - int edge_dest; - int edge_orig; - int vert_a; - int vert_b; - }; - }; + /* Indices relative to the original Mesh. */ + int edge_orig; + int vert_a; + int vert_b; }; struct WeldLoop { @@ -86,17 +80,11 @@ struct WeldPoly { }; struct WeldMesh { - /* Group of vertices to be merged. */ - Array vert_group_map; /* Maps the vertex group offset from the target vert index. */ - Array vert_groups_offs; - Array vert_groups_buffer; + Vector double_verts; + Vector double_edges; /* Group of edges to be merged. */ - Array edge_groups_offs; - Array edge_groups_buffer; - /* From the original edge index, this indicates which group it is going to be merged. */ - Array edge_groups_map; - Array edge_groups_verts; + Array edge_dest_map; /* References all polygons and loops that will be affected. */ Vector wloop; @@ -152,26 +140,23 @@ static bool weld_iter_loop_of_poly_begin(WeldLoopOfPolyIter &iter, static bool weld_iter_loop_of_poly_next(WeldLoopOfPolyIter &iter); -static void weld_assert_edge_kill_len(Span wedge, const int supposed_kill_len) +static void weld_assert_edge_kill_len(Span edge_dest_map, const int expected_kill_len) { int kills = 0; - const WeldEdge *we = &wedge[0]; - for (int i = wedge.size(); i--; we++) { - int edge_dest = we->edge_dest; - /* Magically includes collapsed edges. */ - if (edge_dest != OUT_OF_CONTEXT) { + for (const int edge_orig : edge_dest_map.index_range()) { + if (!ELEM(edge_dest_map[edge_orig], edge_orig, OUT_OF_CONTEXT)) { kills++; } } - BLI_assert(kills == supposed_kill_len); + BLI_assert(kills == expected_kill_len); } static void weld_assert_poly_and_loop_kill_len(WeldMesh *weld_mesh, const Span corner_verts, const Span corner_edges, const OffsetIndices polys, - const int supposed_poly_kill_len, - const int supposed_loop_kill_len) + const int expected_poly_kill_len, + const int expected_loop_kill_len) { int poly_kills = 0; int loop_kills = corner_verts.size(); @@ -253,8 +238,8 @@ static void weld_assert_poly_and_loop_kill_len(WeldMesh *weld_mesh, } } - BLI_assert(poly_kills == supposed_poly_kill_len); - BLI_assert(loop_kills == supposed_loop_kill_len); + BLI_assert(poly_kills == expected_poly_kill_len); + BLI_assert(loop_kills == expected_loop_kill_len); } static void weld_assert_poly_no_vert_repetition(const WeldPoly &wp, @@ -347,66 +332,6 @@ static Vector weld_vert_ctx_alloc_and_setup(MutableSpan vert_dest_map, return wvert; } -/** - * Create groups of vertices to merge. - * - * \return r_vert_groups_map: Map that points out the group of vertices that a vertex belongs to. - * \return r_vert_groups_buffer: Buffer containing the indices of all vertices that merge. - * \return r_vert_groups_offs: Array that indicates where each vertex group starts in the buffer. - */ -static void weld_vert_groups_setup(Span wvert, - Span vert_dest_map, - const int vert_kill_len, - Array &r_vert_groups_map, - Array &r_vert_groups_buffer, - Array &r_vert_groups_offs) -{ - r_vert_groups_map.reinitialize(vert_dest_map.size()); - r_vert_groups_map.fill(OUT_OF_CONTEXT); - - /* Add +1 to allow calculation of the length of the last group. */ - const int vert_groups_len = wvert.size() - vert_kill_len; - r_vert_groups_offs.reinitialize(vert_groups_len + 1); - r_vert_groups_offs.fill(0); - - int wgroups_len = 0; - for (int vert_orig : wvert) { - if (vert_dest_map[vert_orig] == vert_orig) { - /* Indicate the index of the vertex group */ - r_vert_groups_map[vert_orig] = wgroups_len; - wgroups_len++; - } - else { - r_vert_groups_map[vert_orig] = ELEM_MERGED; - } - } - - for (int vert_orig : wvert) { - int vert_dest = vert_dest_map[vert_orig]; - int group_index = r_vert_groups_map[vert_dest]; - r_vert_groups_offs[group_index]++; - } - - int offs = 0; - for (const int i : IndexRange(vert_groups_len)) { - offs += r_vert_groups_offs[i]; - r_vert_groups_offs[i] = offs; - } - r_vert_groups_offs[vert_groups_len] = offs; - - BLI_assert(offs == wvert.size()); - - r_vert_groups_buffer.reinitialize(offs); - - /* Use a reverse for loop to ensure that indexes are assigned in ascending order. */ - for (int i = wvert.size(); i--;) { - int vert_orig = wvert[i]; - int vert_dest = vert_dest_map[vert_orig]; - int group_index = r_vert_groups_map[vert_dest]; - r_vert_groups_buffer[--r_vert_groups_offs[group_index]] = vert_orig; - } -} - /** \} */ /* -------------------------------------------------------------------- */ @@ -417,16 +342,13 @@ static void weld_vert_groups_setup(Span wvert, * Alloc Weld Edges. * * \return r_edge_dest_map: First step to create map of indices pointing edges that will be merged. - * \return r_edge_ctx_map: Map of indices pointing original edges to weld context edges. */ static Vector weld_edge_ctx_alloc_and_find_collapsed(Span edges, Span vert_dest_map, MutableSpan r_edge_dest_map, - MutableSpan r_edge_ctx_map, int *r_edge_collapsed_len) { /* Edge Context. */ - int wedge_len = 0; int edge_collapsed_len = 0; Vector wedge; @@ -438,27 +360,20 @@ static Vector weld_edge_ctx_alloc_and_find_collapsed(Span edges, int v_dest_1 = vert_dest_map[v1]; int v_dest_2 = vert_dest_map[v2]; if ((v_dest_1 != OUT_OF_CONTEXT) || (v_dest_2 != OUT_OF_CONTEXT)) { - WeldEdge we{}; - we.vert_a = (v_dest_1 != OUT_OF_CONTEXT) ? v_dest_1 : v1; - we.vert_b = (v_dest_2 != OUT_OF_CONTEXT) ? v_dest_2 : v2; - we.edge_dest = OUT_OF_CONTEXT; - we.edge_orig = i; + const int vert_a = (v_dest_1 != OUT_OF_CONTEXT) ? v_dest_1 : v1; + const int vert_b = (v_dest_2 != OUT_OF_CONTEXT) ? v_dest_2 : v2; - if (we.vert_a == we.vert_b) { - we.flag = ELEM_COLLAPSED; + if (vert_a == vert_b) { edge_collapsed_len++; r_edge_dest_map[i] = ELEM_COLLAPSED; } else { + wedge.append({i, vert_a, vert_b}); r_edge_dest_map[i] = i; } - - wedge.append(we); - r_edge_ctx_map[i] = wedge_len++; } else { r_edge_dest_map[i] = OUT_OF_CONTEXT; - r_edge_ctx_map[i] = OUT_OF_CONTEXT; } } @@ -469,42 +384,35 @@ static Vector weld_edge_ctx_alloc_and_find_collapsed(Span edges, /** * Configure Weld Edges. * - * \param r_vlinks: An uninitialized buffer used to compute groups of WeldEdges attached to each - * weld target vertex. It doesn't need to be passed as a parameter but this is - * done to reduce allocations. * \return r_edge_dest_map: Map of indices pointing edges that will be merged. * \return r_wedge: Weld edges. `flag` and `edge_dest` members will be set here. - * \return r_edge_kill_len: Number of edges to be destroyed by merging or collapsing. + * \return r_edge_double_kill_len: Number of edges to be destroyed by merging or collapsing. */ -static void weld_edge_find_doubles(int remain_edge_ctx_len, +static void weld_edge_find_doubles(Span wedge, int mvert_num, MutableSpan r_edge_dest_map, - MutableSpan r_wedge, - int *r_edge_kill_len) + int *r_edge_double_kill_len) { - if (remain_edge_ctx_len == 0) { + /* Setup Edge Overlap. */ + int edge_double_kill_len = 0; + + if (wedge.size() == 0) { + *r_edge_double_kill_len = edge_double_kill_len; return; } - /* Setup Edge Overlap. */ - int edge_double_len = 0; - /* Add +1 to allow calculation of the length of the last group. */ Array v_links(mvert_num + 1, 0); - for (WeldEdge &we : r_wedge) { - if (we.flag == ELEM_COLLAPSED) { - BLI_assert(r_edge_dest_map[we.edge_orig] == ELEM_COLLAPSED); - continue; - } - + for (const WeldEdge &we : wedge) { + BLI_assert(r_edge_dest_map[we.edge_orig] != ELEM_COLLAPSED); BLI_assert(we.vert_a != we.vert_b); v_links[we.vert_a]++; v_links[we.vert_b]++; } int link_len = 0; - for (const int i : IndexRange(v_links.size() - 1)) { + for (const int i : IndexRange(mvert_num)) { link_len += v_links[i]; v_links[i] = link_len; } @@ -514,12 +422,9 @@ static void weld_edge_find_doubles(int remain_edge_ctx_len, Array link_edge_buffer(link_len); /* Use a reverse for loop to ensure that indexes are assigned in ascending order. */ - for (int i = r_wedge.size(); i--;) { - const WeldEdge &we = r_wedge[i]; - if (we.flag == ELEM_COLLAPSED) { - continue; - } - + for (int i = wedge.size(); i--;) { + const WeldEdge &we = wedge[i]; + BLI_assert(r_edge_dest_map[we.edge_orig] != ELEM_COLLAPSED); int dst_vert_a = we.vert_a; int dst_vert_b = we.vert_b; @@ -527,11 +432,11 @@ static void weld_edge_find_doubles(int remain_edge_ctx_len, link_edge_buffer[--v_links[dst_vert_b]] = i; } - for (const int i : r_wedge.index_range()) { - const WeldEdge &we = r_wedge[i]; - if (we.edge_dest != OUT_OF_CONTEXT) { - /* No need to retest edges. - * (Already includes collapsed edges). */ + for (const int i : wedge.index_range()) { + const WeldEdge &we = wedge[i]; + BLI_assert(r_edge_dest_map[we.edge_orig] != OUT_OF_CONTEXT); + if (r_edge_dest_map[we.edge_orig] != we.edge_orig) { + /* Already a duplicate. */ continue; } @@ -552,6 +457,7 @@ static void weld_edge_find_doubles(int remain_edge_ctx_len, int *edges_ctx_b = &link_edge_buffer[link_b]; int edge_orig = we.edge_orig; + const int edge_double_len_prev = edge_double_kill_len; for (; edges_len_a--; edges_ctx_a++) { int e_ctx_a = *edges_ctx_a; if (e_ctx_a == i) { @@ -566,104 +472,23 @@ static void weld_edge_find_doubles(int remain_edge_ctx_len, } int e_ctx_b = *edges_ctx_b; if (e_ctx_a == e_ctx_b) { - WeldEdge *we_b = &r_wedge[e_ctx_b]; - BLI_assert(ELEM(we_b->vert_a, dst_vert_a, dst_vert_b)); - BLI_assert(ELEM(we_b->vert_b, dst_vert_a, dst_vert_b)); - BLI_assert(we_b->edge_dest == OUT_OF_CONTEXT); - BLI_assert(we_b->edge_orig != edge_orig); - r_edge_dest_map[we_b->edge_orig] = edge_orig; - we_b->edge_dest = edge_orig; - edge_double_len++; + const WeldEdge &we_b = wedge[e_ctx_b]; + BLI_assert(ELEM(we_b.vert_a, dst_vert_a, dst_vert_b)); + BLI_assert(ELEM(we_b.vert_b, dst_vert_a, dst_vert_b)); + BLI_assert(we_b.edge_orig != edge_orig); + BLI_assert(r_edge_dest_map[we_b.edge_orig] == we_b.edge_orig); + r_edge_dest_map[we_b.edge_orig] = edge_orig; + edge_double_kill_len++; } } - } - - *r_edge_kill_len += edge_double_len; - -#ifdef USE_WELD_DEBUG - weld_assert_edge_kill_len(r_wedge, *r_edge_kill_len); -#endif -} - -/** - * Create groups of edges to merge. - * - * \return r_edge_groups_map: Map that points out the group of edges that an edge belongs to. - * \return r_edge_groups_buffer: Buffer containing the indices of all edges that merge. - * \return r_edge_groups_offs: Array that indicates where each edge group starts in the buffer. - */ -static void weld_edge_groups_setup(const int edges_len, - const int edge_kill_len, - MutableSpan wedge, - Span wedge_map, - MutableSpan r_edge_groups_map, - Array &r_edge_groups_buffer, - Array &r_edge_groups_offs, - Array &r_edge_groups_verts) -{ - int wgroups_len = wedge.size() - edge_kill_len; - - r_edge_groups_verts.reinitialize(wgroups_len); - - wgroups_len = 0; - for (const int i : IndexRange(edges_len)) { - int edge_ctx = wedge_map[i]; - if (edge_ctx != OUT_OF_CONTEXT) { - WeldEdge *we = &wedge[edge_ctx]; - int edge_dest = we->edge_dest; - if (edge_dest != OUT_OF_CONTEXT) { - BLI_assert(edge_dest != we->edge_orig); - r_edge_groups_map[i] = ELEM_MERGED; - } - else { - we->edge_dest = we->edge_orig; - r_edge_groups_verts[wgroups_len] = {we->vert_a, we->vert_b}; - r_edge_groups_map[i] = wgroups_len; - wgroups_len++; - } - } - else { - r_edge_groups_map[i] = OUT_OF_CONTEXT; + if (edge_double_len_prev == edge_double_kill_len) { + /* This edge would form a group with only one element. For better performance, mark these + * edges and avoid forming these groups. */ + r_edge_dest_map[edge_orig] = OUT_OF_CONTEXT; } } - BLI_assert(wgroups_len == wedge.size() - edge_kill_len); - - if (wgroups_len == 0) { - /* All edges in the context are collapsed. */ - return; - } - - /* Add +1 to allow calculation of the length of the last group. */ - r_edge_groups_offs.reinitialize(wgroups_len + 1); - r_edge_groups_offs.fill(0); - - for (const WeldEdge &we : wedge) { - if (we.flag == ELEM_COLLAPSED) { - continue; - } - int group_index = r_edge_groups_map[we.edge_dest]; - r_edge_groups_offs[group_index]++; - } - - int offs = 0; - for (const int i : IndexRange(wgroups_len)) { - offs += r_edge_groups_offs[i]; - r_edge_groups_offs[i] = offs; - } - r_edge_groups_offs[wgroups_len] = offs; - - r_edge_groups_buffer.reinitialize(offs); - - /* Use a reverse for loop to ensure that indexes are assigned in ascending order. */ - for (int i = wedge.size(); i--;) { - const WeldEdge &we = wedge[i]; - if (we.flag == ELEM_COLLAPSED) { - continue; - } - int group_index = r_edge_groups_map[we.edge_dest]; - r_edge_groups_buffer[--r_edge_groups_offs[group_index]] = we.edge_orig; - } + *r_edge_double_kill_len = edge_double_kill_len; } /** \} */ @@ -1017,7 +842,7 @@ static void weld_poly_split_recursive(Span vert_dest_map, /** * Alloc Weld Polygons and Weld Loops. * - * \param remain_edge_ctx_len: Context weld edges that won't be destroyed by merging or collapsing. + * \param remain_edge_ctx_len: Context weld edges that won't be destroyed by merging. * \param r_vlinks: An uninitialized buffer used to compute groups of WeldPolys attached to each * weld target vertex. It doesn't need to be passed as a parameter but this is * done to reduce allocations. @@ -1376,7 +1201,7 @@ static void weld_poly_find_doubles(const Span corner_verts, static void weld_mesh_context_create(const Mesh &mesh, MutableSpan vert_dest_map, const int vert_kill_len, - const bool do_vert_group, + const bool get_doubles, WeldMesh *r_weld_mesh) { const Span edges = mesh.edges(); @@ -1387,19 +1212,22 @@ static void weld_mesh_context_create(const Mesh &mesh, Vector wvert = weld_vert_ctx_alloc_and_setup(vert_dest_map, vert_kill_len); r_weld_mesh->vert_kill_len = vert_kill_len; - Array edge_dest_map(edges.size()); - Array edge_ctx_map(edges.size()); - Vector wedge = weld_edge_ctx_alloc_and_find_collapsed( - edges, vert_dest_map, edge_dest_map, edge_ctx_map, &r_weld_mesh->edge_kill_len); + r_weld_mesh->edge_dest_map.reinitialize(edges.size()); - weld_edge_find_doubles(wedge.size() - r_weld_mesh->edge_kill_len, - mesh.totvert, - edge_dest_map, - wedge, - &r_weld_mesh->edge_kill_len); + int edge_collapsed_len, edge_double_kill_len; + Vector wedge = weld_edge_ctx_alloc_and_find_collapsed( + edges, vert_dest_map, r_weld_mesh->edge_dest_map, &edge_collapsed_len); + + weld_edge_find_doubles(wedge, mesh.totvert, r_weld_mesh->edge_dest_map, &edge_double_kill_len); + + r_weld_mesh->edge_kill_len = edge_collapsed_len + edge_double_kill_len; + +#ifdef USE_WELD_DEBUG + weld_assert_edge_kill_len(r_weld_mesh->edge_dest_map, r_weld_mesh->edge_kill_len); +#endif weld_poly_loop_ctx_alloc( - polys, corner_verts, corner_edges, vert_dest_map, edge_dest_map, r_weld_mesh); + polys, corner_verts, corner_edges, vert_dest_map, r_weld_mesh->edge_dest_map, r_weld_mesh); weld_poly_loop_ctx_setup_collapsed_and_split( #ifdef USE_WELD_DEBUG @@ -1408,7 +1236,7 @@ static void weld_mesh_context_create(const Mesh &mesh, polys, #endif vert_dest_map, - wedge.size() - r_weld_mesh->edge_kill_len, + wedge.size() - edge_double_kill_len, r_weld_mesh); weld_poly_find_doubles(corner_verts, @@ -1419,25 +1247,15 @@ static void weld_mesh_context_create(const Mesh &mesh, edges.size(), r_weld_mesh); - if (do_vert_group) { - weld_vert_groups_setup(wvert, - vert_dest_map, - vert_kill_len, - r_weld_mesh->vert_group_map, - r_weld_mesh->vert_groups_buffer, - r_weld_mesh->vert_groups_offs); + if (get_doubles) { + r_weld_mesh->double_verts = std::move(wvert); + r_weld_mesh->double_edges.reserve(wedge.size()); + for (WeldEdge &we : wedge) { + if (r_weld_mesh->edge_dest_map[we.edge_orig] >= 0) { + r_weld_mesh->double_edges.append(we.edge_orig); + } + } } - - weld_edge_groups_setup(edges.size(), - r_weld_mesh->edge_kill_len, - wedge, - edge_ctx_map, - edge_dest_map, - r_weld_mesh->edge_groups_buffer, - r_weld_mesh->edge_groups_offs, - r_weld_mesh->edge_groups_verts); - - r_weld_mesh->edge_groups_map = std::move(edge_dest_map); } /** \} */ @@ -1446,6 +1264,75 @@ static void weld_mesh_context_create(const Mesh &mesh, /** \name CustomData * \{ */ +/** + * \brief Create groups to merge. + * + * This function creates groups for merging elements based on the provided `dest_map`. + * + * \param dest_map: Map that defines the source and target elements. The source elements will be + * merged into the target. Each target corresponds to a group. + * \param double_elems: Affected elements in `dest_map` that will compose groups. + * Used for performance only. + * + * \return r_groups_map: Map that points out the group of elements that an element belongs to. + * \return r_groups_buffer: Buffer containing the indices of all elements that merge. + * \return r_groups_offs: Array that indicates where each element group starts in the buffer. + */ +static void merge_groups_create(Span dest_map, + Span double_elems, + Array &r_groups_map, + Array &r_groups_buffer, + Array &r_groups_offs) +{ + r_groups_map.reinitialize(dest_map.size()); + r_groups_map.fill(OUT_OF_CONTEXT); + + int wgroups_len = 0; + for (const int elem_orig : double_elems) { + const int elem_dest = dest_map[elem_orig]; + if (elem_dest == elem_orig) { + r_groups_map[elem_orig] = wgroups_len; + wgroups_len++; + } + else { + r_groups_map[elem_orig] = ELEM_MERGED; + } + } + + if (wgroups_len == 0) { + /* All elems in the context are collapsed or do not form groups. */ + return; + } + + /* Add +1 to allow calculation of the length of the last group. */ + r_groups_offs.reinitialize(wgroups_len + 1); + r_groups_offs.fill(0); + + for (const int elem_orig : double_elems) { + const int elem_dest = dest_map[elem_orig]; + const int group_index = r_groups_map[elem_dest]; + r_groups_offs[group_index]++; + } + + int offs = 0; + for (const int i : IndexRange(wgroups_len)) { + offs += r_groups_offs[i]; + r_groups_offs[i] = offs; + } + r_groups_offs[wgroups_len] = offs; + + r_groups_buffer.reinitialize(offs); + BLI_assert(r_groups_buffer.size() == double_elems.size()); + + /* Use a reverse for loop to ensure that indexes are assigned in ascending order. */ + for (int i = double_elems.size(); i--;) { + const int elem_orig = double_elems[i]; + const int elem_dest = dest_map[elem_orig]; + const int group_index = r_groups_map[elem_dest]; + r_groups_buffer[--r_groups_offs[group_index]] = elem_orig; + } +} + static void customdata_weld( const CustomData *source, CustomData *dest, const int *src_indices, int count, int dest_index) { @@ -1541,6 +1428,96 @@ static void customdata_weld( } } +static void merge_customdata_all(const CustomData *source, + CustomData *dest, + Span dest_map, + Span double_elems, + const int dest_size, + const bool do_mix_data, + Array &r_final_map) +{ + UNUSED_VARS_NDEBUG(dest_size); + + const int source_size = dest_map.size(); + + MutableSpan groups_map; + Array groups_buffer, groups_offs; + if (do_mix_data) { + merge_groups_create(dest_map, double_elems, r_final_map, groups_buffer, groups_offs); + + /** + * Be careful when setting values to this array as it uses the same buffer as #r_final_map. + * This map will be used to adjust the index of vertices and edges in the new edges and loops. + */ + groups_map = r_final_map; + } + else { + r_final_map.reinitialize(source_size); + } + + bool finalize_map = false; + int dest_index = 0; + for (int i = 0; i < source_size; i++) { + const int source_index = i; + int count = 0; + while (i < source_size && dest_map[i] == OUT_OF_CONTEXT) { + r_final_map[i] = dest_index + count; + count++; + i++; + } + if (count) { + CustomData_copy_data(source, dest, source_index, dest_index, count); + dest_index += count; + } + if (i == source_size) { + break; + } + if (dest_map[i] == i) { + if (do_mix_data) { + const int grp_index = groups_map[i]; + const int grp_buffer_offs = groups_offs[grp_index]; + const int grp_buffer_len = groups_offs[grp_index + 1] - grp_buffer_offs; + customdata_weld(source, dest, &groups_buffer[grp_buffer_offs], grp_buffer_len, dest_index); + } + else { + CustomData_copy_data(source, dest, i, dest_index, 1); + } + r_final_map[i] = dest_index; + dest_index++; + } + else if (dest_map[i] == ELEM_COLLAPSED) { + /* Any value will do. This field must not be accessed anymore. */ + r_final_map[i] = 0; + } + else { + const int elem_dest = dest_map[i]; + BLI_assert(elem_dest != OUT_OF_CONTEXT); + BLI_assert(dest_map[elem_dest] == elem_dest); + if (elem_dest < i) { + r_final_map[i] = r_final_map[elem_dest]; + BLI_assert(r_final_map[i] < dest_size); + } + else { + /* Mark as negative to set at the end. */ + r_final_map[i] = -elem_dest; + finalize_map = true; + } + } + } + + if (finalize_map) { + for (int i : r_final_map.index_range()) { + if (r_final_map[i] < 0) { + r_final_map[i] = r_final_map[-r_final_map[i]]; + BLI_assert(r_final_map[i] < dest_size); + } + BLI_assert(r_final_map[i] >= 0); + } + } + + BLI_assert(dest_index == dest_size); +} + /** \} */ /* -------------------------------------------------------------------- */ @@ -1550,7 +1527,7 @@ static void customdata_weld( static Mesh *create_merged_mesh(const Mesh &mesh, MutableSpan vert_dest_map, const int removed_vertex_count, - const bool do_mix_vert_data) + const bool do_mix_data) { #ifdef USE_WELD_DEBUG_TIME SCOPED_TIMER(__func__); @@ -1563,8 +1540,7 @@ static Mesh *create_merged_mesh(const Mesh &mesh, const int totedge = mesh.totedge; WeldMesh weld_mesh; - weld_mesh_context_create( - mesh, vert_dest_map, removed_vertex_count, do_mix_vert_data, &weld_mesh); + weld_mesh_context_create(mesh, vert_dest_map, removed_vertex_count, do_mix_data, &weld_mesh); const int result_nverts = totvert - weld_mesh.vert_kill_len; const int result_nedges = totedge - weld_mesh.edge_kill_len; @@ -1580,99 +1556,36 @@ static Mesh *create_merged_mesh(const Mesh &mesh, /* Vertices. */ - MutableSpan vert_final_map; - Array vert_final_map_local; - if (!weld_mesh.vert_group_map.is_empty()) { - /* Be careful when setting values to this array as it uses the same buffer as #vert_group_map. - * This map will be used to adjust edges and loops to point to new vertex indices. */ - vert_final_map = weld_mesh.vert_group_map; - } - else { - vert_final_map_local.reinitialize(totvert); - vert_final_map = vert_final_map_local; - } + Array vert_final_map; - int dest_index = 0; - for (int i = 0; i < totvert; i++) { - int source_index = i; - int count = 0; - while (i < totvert && vert_dest_map[i] == OUT_OF_CONTEXT) { - vert_final_map[i] = dest_index + count; - count++; - i++; - } - if (count) { - CustomData_copy_data(&mesh.vdata, &result->vdata, source_index, dest_index, count); - dest_index += count; - } - if (i == totvert) { - break; - } - if (vert_dest_map[i] == i) { - if (do_mix_vert_data) { - int *group_offs = &weld_mesh.vert_groups_offs[weld_mesh.vert_group_map[i]]; - int *src_indices = &weld_mesh.vert_groups_buffer[*group_offs]; - int count = *(group_offs + 1) - *group_offs; - customdata_weld(&mesh.vdata, &result->vdata, src_indices, count, dest_index); - } - else { - CustomData_copy_data(&mesh.vdata, &result->vdata, i, dest_index, 1); - } - vert_final_map[i] = dest_index; - dest_index++; - } - } - - BLI_assert(dest_index == result_nverts); + merge_customdata_all(&mesh.vdata, + &result->vdata, + vert_dest_map, + weld_mesh.double_verts, + result_nverts, + do_mix_data, + vert_final_map); /* Edges. */ - /* Be careful when editing this array as it uses the same buffer as #WeldMesh::edge_groups_map. - * This map will be used to adjust edges and loops to point to new edge indices. */ - MutableSpan edge_final_map = weld_mesh.edge_groups_map; + Array edge_final_map; - dest_index = 0; - for (int i = 0; i < totedge; i++) { - const int source_index = i; - int count = 0; - while (i < totedge && weld_mesh.edge_groups_map[i] == OUT_OF_CONTEXT) { - edge_final_map[i] = dest_index + count; - count++; - i++; - } - if (count) { - CustomData_copy_data(&mesh.edata, &result->edata, source_index, dest_index, count); - int2 *edge = &dst_edges[dest_index]; - dest_index += count; - for (; count--; edge++) { - (*edge)[0] = vert_final_map[(*edge)[0]]; - (*edge)[1] = vert_final_map[(*edge)[1]]; - } - } - if (i == totedge) { - break; - } - if (weld_mesh.edge_groups_map[i] != ELEM_MERGED) { - const int wegpr_index = weld_mesh.edge_groups_map[i]; - const int wegrp_offs = weld_mesh.edge_groups_offs[wegpr_index]; - const int wegrp_len = weld_mesh.edge_groups_offs[wegpr_index + 1] - wegrp_offs; - int2 &wegrp_verts = weld_mesh.edge_groups_verts[wegpr_index]; - customdata_weld(&mesh.edata, - &result->edata, - &weld_mesh.edge_groups_buffer[wegrp_offs], - wegrp_len, - dest_index); - int2 &edge = dst_edges[dest_index]; - edge[0] = vert_final_map[wegrp_verts[0]]; - edge[1] = vert_final_map[wegrp_verts[1]]; + merge_customdata_all(&mesh.edata, + &result->edata, + weld_mesh.edge_dest_map, + weld_mesh.double_edges, + result_nedges, + do_mix_data, + edge_final_map); - edge_final_map[i] = dest_index; - dest_index++; - } + for (int2 &edge : dst_edges) { + edge[0] = vert_final_map[edge[0]]; + edge[1] = vert_final_map[edge[1]]; + BLI_assert(edge[0] != edge[1]); + BLI_assert(IN_RANGE_INCL(edge[0], 0, result_nverts - 1)); + BLI_assert(IN_RANGE_INCL(edge[1], 0, result_nverts - 1)); } - BLI_assert(dest_index == result_nedges); - /* Polys/Loops. */ int r_i = 0; -- 2.30.2 From 37d1d4cb07e6af0beebdee76e80e3d684e1a8a76 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Mon, 10 Jul 2023 14:57:40 +0200 Subject: [PATCH 099/115] Transform: Support navigation from NDOF devices This commit implements the `VIEW3D_OT_ndof_orbit`, `VIEW3D_OT_ndof_orbit_zoom`, `VIEW3D_OT_ndof_pan` and `VIEW3D_OT_ndof_all` operators to the `ED_view3d_navigation_` utility so that these operations can be used in the transform operators. Pull Request: https://projects.blender.org/blender/blender/pulls/109792 --- .../editors/space_view3d/view3d_navigate.cc | 29 +++- .../editors/space_view3d/view3d_navigate.h | 9 +- .../space_view3d/view3d_navigate_ndof.c | 127 +++++++++--------- 3 files changed, 99 insertions(+), 66 deletions(-) diff --git a/source/blender/editors/space_view3d/view3d_navigate.cc b/source/blender/editors/space_view3d/view3d_navigate.cc index 6bcdac4cc0d..349454ba4e3 100644 --- a/source/blender/editors/space_view3d/view3d_navigate.cc +++ b/source/blender/editors/space_view3d/view3d_navigate.cc @@ -75,6 +75,10 @@ const char *viewops_operator_idname_get(eV3D_OpMode nav_type) return "VIEW3D_OT_ndof_orbit"; case V3D_OP_MODE_NDOF_ORBIT_ZOOM: return "VIEW3D_OT_ndof_orbit_zoom"; + case V3D_OP_MODE_NDOF_PAN: + return "VIEW3D_OT_ndof_pan"; + case V3D_OP_MODE_NDOF_ALL: + return "VIEW3D_OT_ndof_all"; #endif case V3D_OP_MODE_NONE: break; @@ -186,9 +190,18 @@ static int view3d_navigation_invoke_generic(bContext *C, return viewrotate_invoke_impl(vod, event); case V3D_OP_MODE_MOVE: return viewmove_invoke_impl(vod, event); - case V3D_OP_MODE_VIEW_PAN: { + case V3D_OP_MODE_VIEW_PAN: return viewpan_invoke_impl(vod, ptr); - } +#ifdef WITH_INPUT_NDOF + case V3D_OP_MODE_NDOF_ORBIT: + return ndof_orbit_invoke_impl(C, vod, event); + case V3D_OP_MODE_NDOF_ORBIT_ZOOM: + return ndof_orbit_zoom_invoke_impl(C, vod, event); + case V3D_OP_MODE_NDOF_PAN: + return ndof_pan_invoke_impl(C, vod, event); + case V3D_OP_MODE_NDOF_ALL: + return ndof_all_invoke_impl(C, vod, event); +#endif default: break; } @@ -530,7 +543,7 @@ static void viewops_data_init_context(bContext *C, ViewOpsData *vod) vod->rv3d = static_cast(vod->region->regiondata); } -static void viewops_data_state_capture(ViewOpsData *vod) +static void viewops_data_state_capture(ViewOpsData *vod, const bool calc_dist) { Depsgraph *depsgraph = vod->depsgraph; View3D *v3d = vod->v3d; @@ -539,7 +552,7 @@ static void viewops_data_state_capture(ViewOpsData *vod) /* Set the view from the camera, if view locking is enabled. * we may want to make this optional but for now its needed always. * NOTE: This changes the value of `rv3d->dist`. */ - ED_view3d_camera_lock_init(depsgraph, v3d, rv3d); + ED_view3d_camera_lock_init_ex(depsgraph, v3d, rv3d, calc_dist); copy_v3_v3(vod->init.ofs, rv3d->ofs); copy_v3_v3(vod->init.ofs_lock, rv3d->ofs_lock); @@ -635,6 +648,7 @@ static void viewops_data_init_navigation(bContext *C, RegionView3D *rv3d = vod->rv3d; eViewOpsFlag viewops_flag = viewops_flag_from_prefs(); + bool calc_rv3d_dist = true; if (use_cursor_init) { viewops_flag |= VIEWOPS_FLAG_USE_MOUSE_INIT; @@ -653,7 +667,10 @@ static void viewops_data_init_navigation(bContext *C, #ifdef WITH_INPUT_NDOF case V3D_OP_MODE_NDOF_ORBIT: case V3D_OP_MODE_NDOF_ORBIT_ZOOM: + case V3D_OP_MODE_NDOF_PAN: + case V3D_OP_MODE_NDOF_ALL: viewops_flag &= ~VIEWOPS_FLAG_DEPTH_NAVIGATE; + calc_rv3d_dist = false; break; #endif default: @@ -693,7 +710,7 @@ static void viewops_data_init_navigation(bContext *C, vod->use_dyn_ofs = false; } - viewops_data_state_capture(vod); + viewops_data_state_capture(vod, calc_rv3d_dist); if (viewops_flag & VIEWOPS_FLAG_PERSP_ENSURE) { if (ED_view3d_persp_ensure(depsgraph, vod->v3d, vod->region)) { @@ -2074,6 +2091,8 @@ static int view3d_navigation_invoke( #ifdef WITH_INPUT_NDOF case V3D_OP_MODE_NDOF_ORBIT: case V3D_OP_MODE_NDOF_ORBIT_ZOOM: + case V3D_OP_MODE_NDOF_PAN: + case V3D_OP_MODE_NDOF_ALL: #endif case V3D_OP_MODE_NONE: break; diff --git a/source/blender/editors/space_view3d/view3d_navigate.h b/source/blender/editors/space_view3d/view3d_navigate.h index 4c5383a1e4d..52f1223285d 100644 --- a/source/blender/editors/space_view3d/view3d_navigate.h +++ b/source/blender/editors/space_view3d/view3d_navigate.h @@ -44,12 +44,14 @@ typedef enum eV3D_OpMode { #ifdef WITH_INPUT_NDOF V3D_OP_MODE_NDOF_ORBIT, V3D_OP_MODE_NDOF_ORBIT_ZOOM, + V3D_OP_MODE_NDOF_PAN, + V3D_OP_MODE_NDOF_ALL, #endif } eV3D_OpMode; #ifndef WITH_INPUT_NDOF # define V3D_OP_MODE_LEN V3D_OP_MODE_DOLLY + 1 #else -# define V3D_OP_MODE_LEN V3D_OP_MODE_NDOF_ORBIT_ZOOM + 1 +# define V3D_OP_MODE_LEN V3D_OP_MODE_NDOF_ALL + 1 #endif enum eV3D_OpPropFlag { @@ -272,6 +274,11 @@ void VIEW3D_OT_move(struct wmOperatorType *ot); #ifdef WITH_INPUT_NDOF struct wmNDOFMotionData; +int ndof_orbit_invoke_impl(bContext *C, ViewOpsData *vod, const wmEvent *event); +int ndof_orbit_zoom_invoke_impl(bContext *C, ViewOpsData *vod, const wmEvent *event); +int ndof_pan_invoke_impl(bContext *C, ViewOpsData *vod, const wmEvent *event); +int ndof_all_invoke_impl(bContext *C, ViewOpsData *vod, const wmEvent *event); + /** * Called from both fly mode and walk mode, */ diff --git a/source/blender/editors/space_view3d/view3d_navigate_ndof.c b/source/blender/editors/space_view3d/view3d_navigate_ndof.c index ea4becbade7..e3a7e8ef8fc 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_ndof.c +++ b/source/blender/editors/space_view3d/view3d_navigate_ndof.c @@ -356,14 +356,11 @@ void view3d_ndof_fly(const wmNDOFMotionData *ndof, * 2D orthographic style NDOF navigation within the camera view. * Support navigating the camera view instead of leaving the camera-view and navigating in 3D. */ -static int view3d_ndof_cameraview_pan_zoom(bContext *C, const wmEvent *event) +static int view3d_ndof_cameraview_pan_zoom(ViewOpsData *vod, const wmNDOFMotionData *ndof) { - const wmNDOFMotionData *ndof = event->customdata; - View3D *v3d = CTX_wm_view3d(C); - ARegion *region = CTX_wm_region(C); - RegionView3D *rv3d = region->regiondata; - - ED_view3d_smooth_view_force_finish(C, v3d, region); + View3D *v3d = vod->v3d; + ARegion *region = vod->region; + RegionView3D *rv3d = vod->rv3d; if (v3d->camera && (rv3d->persp == RV3D_CAMOB) && (v3d->flag2 & V3D_LOCK_CAMERA) == 0) { /* pass */ @@ -423,32 +420,22 @@ static int view3d_ndof_cameraview_pan_zoom(bContext *C, const wmEvent *event) /** \name NDOF Orbit/Translate Operator * \{ */ -static int ndof_orbit_invoke(bContext *C, wmOperator *op, const wmEvent *event) +int ndof_orbit_invoke_impl(bContext *C, ViewOpsData *vod, const wmEvent *event) { if (event->type != NDOF_MOTION) { return OPERATOR_CANCELLED; } - const Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); - ViewOpsData *vod; - View3D *v3d; - RegionView3D *rv3d; + const Depsgraph *depsgraph = vod->depsgraph; + View3D *v3d = vod->v3d; + RegionView3D *rv3d = vod->rv3d; char xform_flag = 0; const wmNDOFMotionData *ndof = event->customdata; - vod = op->customdata = viewops_data_create(C, event, V3D_OP_MODE_NDOF_ORBIT, false); - - ED_view3d_smooth_view_force_finish(C, vod->v3d, vod->region); - - v3d = vod->v3d; - rv3d = vod->rv3d; - /* off by default, until changed later this function */ rv3d->rot_angle = 0.0f; - ED_view3d_camera_lock_init_ex(depsgraph, v3d, rv3d, false); - if (ndof->progress != P_FINISHING) { const bool has_rotation = ndof_has_rotate(ndof, rv3d); /* if we can't rotate, fallback to translate (locked axis views) */ @@ -475,18 +462,24 @@ static int ndof_orbit_invoke(bContext *C, wmOperator *op, const wmEvent *event) ED_region_tag_redraw(vod->region); - viewops_data_free(C, op->customdata); - op->customdata = NULL; - return OPERATOR_FINISHED; } +static int ndof_orbit_invoke(bContext *C, wmOperator *op, const wmEvent *event) +{ + if (event->type != NDOF_MOTION) { + return OPERATOR_CANCELLED; + } + + return view3d_navigate_invoke_impl(C, op, event, V3D_OP_MODE_NDOF_ORBIT); +} + void VIEW3D_OT_ndof_orbit(wmOperatorType *ot) { /* identifiers */ ot->name = "NDOF Orbit View"; ot->description = "Orbit the view using the 3D mouse"; - ot->idname = "VIEW3D_OT_ndof_orbit"; + ot->idname = viewops_operator_idname_get(V3D_OP_MODE_NDOF_ORBIT); /* api callbacks */ ot->invoke = ndof_orbit_invoke; @@ -502,39 +495,28 @@ void VIEW3D_OT_ndof_orbit(wmOperatorType *ot) /** \name NDOF Orbit/Zoom Operator * \{ */ -static int ndof_orbit_zoom_invoke(bContext *C, wmOperator *op, const wmEvent *event) +int ndof_orbit_zoom_invoke_impl(bContext *C, ViewOpsData *vod, const wmEvent *event) { if (event->type != NDOF_MOTION) { return OPERATOR_CANCELLED; } + const wmNDOFMotionData *ndof = event->customdata; + if (U.ndof_flag & NDOF_CAMERA_PAN_ZOOM) { - const int camera_retval = view3d_ndof_cameraview_pan_zoom(C, event); + const int camera_retval = view3d_ndof_cameraview_pan_zoom(vod, ndof); if (camera_retval != OPERATOR_PASS_THROUGH) { return camera_retval; } } - const Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); - ViewOpsData *vod; - View3D *v3d; - RegionView3D *rv3d; + View3D *v3d = vod->v3d; + RegionView3D *rv3d = vod->rv3d; char xform_flag = 0; - const wmNDOFMotionData *ndof = event->customdata; - - vod = op->customdata = viewops_data_create(C, event, V3D_OP_MODE_NDOF_ORBIT_ZOOM, false); - - ED_view3d_smooth_view_force_finish(C, vod->v3d, vod->region); - - v3d = vod->v3d; - rv3d = vod->rv3d; - /* off by default, until changed later this function */ rv3d->rot_angle = 0.0f; - ED_view3d_camera_lock_init_ex(depsgraph, v3d, rv3d, false); - if (ndof->progress == P_FINISHING) { /* pass */ } @@ -587,7 +569,7 @@ static int ndof_orbit_zoom_invoke(bContext *C, wmOperator *op, const wmEvent *ev } } - ED_view3d_camera_lock_sync(depsgraph, v3d, rv3d); + ED_view3d_camera_lock_sync(vod->depsgraph, v3d, rv3d); if (xform_flag) { ED_view3d_camera_lock_autokey( v3d, rv3d, C, xform_flag & HAS_ROTATE, xform_flag & HAS_TRANSLATE); @@ -595,18 +577,24 @@ static int ndof_orbit_zoom_invoke(bContext *C, wmOperator *op, const wmEvent *ev ED_region_tag_redraw(vod->region); - viewops_data_free(C, op->customdata); - op->customdata = NULL; - return OPERATOR_FINISHED; } +static int ndof_orbit_zoom_invoke(bContext *C, wmOperator *op, const wmEvent *event) +{ + if (event->type != NDOF_MOTION) { + return OPERATOR_CANCELLED; + } + + return view3d_navigate_invoke_impl(C, op, event, V3D_OP_MODE_NDOF_ORBIT_ZOOM); +} + void VIEW3D_OT_ndof_orbit_zoom(wmOperatorType *ot) { /* identifiers */ ot->name = "NDOF Orbit View with Zoom"; ot->description = "Orbit and zoom the view using the 3D mouse"; - ot->idname = "VIEW3D_OT_ndof_orbit_zoom"; + ot->idname = viewops_operator_idname_get(V3D_OP_MODE_NDOF_ORBIT_ZOOM); /* api callbacks */ ot->invoke = ndof_orbit_zoom_invoke; @@ -622,23 +610,25 @@ void VIEW3D_OT_ndof_orbit_zoom(wmOperatorType *ot) /** \name NDOF Pan/Zoom Operator * \{ */ -static int ndof_pan_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *event) +int ndof_pan_invoke_impl(bContext *C, ViewOpsData *vod, const wmEvent *event) { if (event->type != NDOF_MOTION) { return OPERATOR_CANCELLED; } + const wmNDOFMotionData *ndof = event->customdata; + if (U.ndof_flag & NDOF_CAMERA_PAN_ZOOM) { - const int camera_retval = view3d_ndof_cameraview_pan_zoom(C, event); + const int camera_retval = view3d_ndof_cameraview_pan_zoom(vod, ndof); if (camera_retval != OPERATOR_PASS_THROUGH) { return camera_retval; } } - const Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); - View3D *v3d = CTX_wm_view3d(C); - RegionView3D *rv3d = CTX_wm_region_view3d(C); - const wmNDOFMotionData *ndof = event->customdata; + const Depsgraph *depsgraph = vod->depsgraph; + View3D *v3d = vod->v3d; + RegionView3D *rv3d = vod->rv3d; + ARegion *region = vod->region; char xform_flag = 0; const bool has_translate = ndof_has_translate(ndof, v3d, rv3d); @@ -654,8 +644,7 @@ static int ndof_pan_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *e ED_view3d_camera_lock_init_ex(depsgraph, v3d, rv3d, false); if (ndof->progress != P_FINISHING) { - ScrArea *area = CTX_wm_area(C); - ARegion *region = CTX_wm_region(C); + ScrArea *area = vod->area; if (has_translate || has_zoom) { view3d_ndof_pan_zoom(ndof, area, region, has_translate, has_zoom); @@ -668,17 +657,26 @@ static int ndof_pan_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *e ED_view3d_camera_lock_autokey(v3d, rv3d, C, false, xform_flag & HAS_TRANSLATE); } - ED_region_tag_redraw(CTX_wm_region(C)); + ED_region_tag_redraw(region); return OPERATOR_FINISHED; } +static int ndof_pan_invoke(bContext *C, wmOperator *op, const wmEvent *event) +{ + if (event->type != NDOF_MOTION) { + return OPERATOR_CANCELLED; + } + + return view3d_navigate_invoke_impl(C, op, event, V3D_OP_MODE_NDOF_PAN); +} + void VIEW3D_OT_ndof_pan(wmOperatorType *ot) { /* identifiers */ ot->name = "NDOF Pan View"; ot->description = "Pan the view with the 3D mouse"; - ot->idname = "VIEW3D_OT_ndof_pan"; + ot->idname = viewops_operator_idname_get(V3D_OP_MODE_NDOF_PAN); /* api callbacks */ ot->invoke = ndof_pan_invoke; @@ -697,7 +695,7 @@ void VIEW3D_OT_ndof_pan(wmOperatorType *ot) /** * wraps #ndof_orbit_zoom but never restrict to orbit. */ -static int ndof_all_invoke(bContext *C, wmOperator *op, const wmEvent *event) +int ndof_all_invoke_impl(bContext *C, ViewOpsData *vod, const wmEvent *event) { /* weak!, but it works */ const int ndof_flag = U.ndof_flag; @@ -705,19 +703,28 @@ static int ndof_all_invoke(bContext *C, wmOperator *op, const wmEvent *event) U.ndof_flag &= ~NDOF_MODE_ORBIT; - ret = ndof_orbit_zoom_invoke(C, op, event); + ret = ndof_orbit_zoom_invoke_impl(C, vod, event); U.ndof_flag = ndof_flag; return ret; } +static int ndof_all_invoke(bContext *C, wmOperator *op, const wmEvent *event) +{ + if (event->type != NDOF_MOTION) { + return OPERATOR_CANCELLED; + } + + return view3d_navigate_invoke_impl(C, op, event, V3D_OP_MODE_NDOF_ALL); +} + void VIEW3D_OT_ndof_all(wmOperatorType *ot) { /* identifiers */ ot->name = "NDOF Transform View"; ot->description = "Pan and rotate the view with the 3D mouse"; - ot->idname = "VIEW3D_OT_ndof_all"; + ot->idname = viewops_operator_idname_get(V3D_OP_MODE_NDOF_ALL); /* api callbacks */ ot->invoke = ndof_all_invoke; -- 2.30.2 From 7cebb61486bc337d0c531fa1fd9958b1ca1ff0e6 Mon Sep 17 00:00:00 2001 From: Ray Molenkamp Date: Mon, 10 Jul 2023 15:07:37 +0200 Subject: [PATCH 100/115] Cleanup: CMake: Modernize bf_dna dependencies There's quite a few libraries that depend on dna_type_offsets.h but had gotten to it by just adding the folder that contains it to their includes INC section without declaring a dependency to bf_dna in the LIB section. which occasionally lead to the lib building before bf_dna and the header being missing, while this generally gets fixed in CMake by adding bf_dna to the LIB section of the lib, however until last week all libraries in the LIB section were linked as INTERFACE so adding it in there did not resolve the build issue. To make things still build, we sprinkled add_dependencies wherever we needed it to force a build order. This diff : Declares public include folders for the bf_dna target so there's no more fudging the INC section required to get to them. Removes all dna related paths from the INC section for all libraries. Adds an alias target bf:dna to signify it has been updated to modern cmake Declares a dependency on bf::dna for all libraries that require it Removes (almost) all calls to add_dependencies for bf_dna Future work: Because of the manual dependency management that was done, there is now some "clutter" with libs depending on bf_dna that realistically don't. Example bf_intern_opencolorio itself has no dependency on bf_dna at all, doesn't need it, doesn't use it. However the dna include folder had been added to it in the past since bf_blenlib uses dna headers in some of its public headers and bf_intern_opencolorio does use those blenlib headers. Given bf_blenlib now correctly declares the dependency on bf_dna as public bf_intern_opencolorio will get the dna header directory automatically from CMake, hence some cleanup could be done for bf_intern_opencolorio Because 99% of the changes in this diff have been automated, this diff does not seek to address these issues as there is no easy way to determine why a certain dependency is in place. A developer will have to make a pass a this at some later point in time. As I'd rather not mix automated and manual labour. There are a few libraries that could not be automatically processed (ie bf_blendthumb) that also will need this manual look-over. Pull Request: https://projects.blender.org/blender/blender/pulls/109835 --- intern/cycles/blender/CMakeLists.txt | 2 +- intern/ghost/CMakeLists.txt | 2 +- intern/mantaflow/CMakeLists.txt | 2 +- intern/opencolorio/CMakeLists.txt | 2 +- source/blender/asset_system/CMakeLists.txt | 2 +- source/blender/blenfont/CMakeLists.txt | 2 +- source/blender/blenkernel/CMakeLists.txt | 6 +----- source/blender/blenlib/CMakeLists.txt | 3 +-- source/blender/blenlib/tests/performance/CMakeLists.txt | 2 +- source/blender/blenloader/CMakeLists.txt | 6 +----- source/blender/blentranslation/CMakeLists.txt | 2 +- source/blender/bmesh/CMakeLists.txt | 2 +- source/blender/compositor/CMakeLists.txt | 6 +----- .../blender/compositor/realtime_compositor/CMakeLists.txt | 6 +----- source/blender/depsgraph/CMakeLists.txt | 2 +- source/blender/draw/CMakeLists.txt | 6 +----- source/blender/editors/animation/CMakeLists.txt | 2 +- source/blender/editors/armature/CMakeLists.txt | 2 +- source/blender/editors/asset/CMakeLists.txt | 2 +- source/blender/editors/curve/CMakeLists.txt | 2 +- source/blender/editors/curves/CMakeLists.txt | 2 +- source/blender/editors/geometry/CMakeLists.txt | 2 +- source/blender/editors/gizmo_library/CMakeLists.txt | 2 +- source/blender/editors/gpencil_legacy/CMakeLists.txt | 2 +- source/blender/editors/grease_pencil/CMakeLists.txt | 2 +- source/blender/editors/interface/CMakeLists.txt | 2 +- source/blender/editors/io/CMakeLists.txt | 2 +- source/blender/editors/lattice/CMakeLists.txt | 2 +- source/blender/editors/mask/CMakeLists.txt | 2 +- source/blender/editors/mesh/CMakeLists.txt | 2 +- source/blender/editors/metaball/CMakeLists.txt | 2 +- source/blender/editors/object/CMakeLists.txt | 5 +---- source/blender/editors/physics/CMakeLists.txt | 2 +- source/blender/editors/render/CMakeLists.txt | 2 +- source/blender/editors/scene/CMakeLists.txt | 2 +- source/blender/editors/screen/CMakeLists.txt | 2 +- source/blender/editors/sculpt_paint/CMakeLists.txt | 2 +- source/blender/editors/sound/CMakeLists.txt | 2 +- source/blender/editors/space_action/CMakeLists.txt | 4 +--- source/blender/editors/space_api/CMakeLists.txt | 2 +- source/blender/editors/space_buttons/CMakeLists.txt | 4 +--- source/blender/editors/space_clip/CMakeLists.txt | 6 +----- source/blender/editors/space_console/CMakeLists.txt | 6 +----- source/blender/editors/space_file/CMakeLists.txt | 4 +--- source/blender/editors/space_graph/CMakeLists.txt | 4 +--- source/blender/editors/space_image/CMakeLists.txt | 4 +--- source/blender/editors/space_info/CMakeLists.txt | 4 +--- source/blender/editors/space_nla/CMakeLists.txt | 4 +--- source/blender/editors/space_node/CMakeLists.txt | 4 +--- source/blender/editors/space_outliner/CMakeLists.txt | 4 +--- source/blender/editors/space_script/CMakeLists.txt | 6 +----- source/blender/editors/space_sequencer/CMakeLists.txt | 4 +--- source/blender/editors/space_spreadsheet/CMakeLists.txt | 4 +--- source/blender/editors/space_statusbar/CMakeLists.txt | 4 +--- source/blender/editors/space_text/CMakeLists.txt | 6 +----- source/blender/editors/space_topbar/CMakeLists.txt | 4 +--- source/blender/editors/space_userpref/CMakeLists.txt | 6 +----- source/blender/editors/space_view3d/CMakeLists.txt | 6 +----- source/blender/editors/transform/CMakeLists.txt | 2 +- source/blender/editors/undo/CMakeLists.txt | 2 +- source/blender/editors/util/CMakeLists.txt | 2 +- source/blender/editors/uvedit/CMakeLists.txt | 2 +- source/blender/freestyle/CMakeLists.txt | 2 +- source/blender/functions/CMakeLists.txt | 2 +- source/blender/geometry/CMakeLists.txt | 3 +-- source/blender/gpencil_modifiers_legacy/CMakeLists.txt | 5 +---- source/blender/gpu/CMakeLists.txt | 2 +- source/blender/ikplugin/CMakeLists.txt | 2 +- source/blender/imbuf/CMakeLists.txt | 2 +- source/blender/imbuf/intern/cineon/CMakeLists.txt | 2 +- source/blender/imbuf/intern/oiio/CMakeLists.txt | 2 +- source/blender/imbuf/intern/openexr/CMakeLists.txt | 2 +- source/blender/io/alembic/CMakeLists.txt | 2 +- source/blender/io/avi/CMakeLists.txt | 2 +- source/blender/io/collada/CMakeLists.txt | 2 +- source/blender/io/common/CMakeLists.txt | 2 +- source/blender/io/gpencil/CMakeLists.txt | 2 +- source/blender/io/ply/CMakeLists.txt | 2 +- source/blender/io/stl/CMakeLists.txt | 2 +- source/blender/io/usd/CMakeLists.txt | 2 +- source/blender/io/wavefront_obj/CMakeLists.txt | 2 +- source/blender/makesdna/intern/CMakeLists.txt | 6 ++++-- source/blender/makesrna/intern/CMakeLists.txt | 8 +------- source/blender/modifiers/CMakeLists.txt | 8 +------- source/blender/nodes/CMakeLists.txt | 6 +----- source/blender/nodes/composite/CMakeLists.txt | 6 +----- source/blender/nodes/function/CMakeLists.txt | 2 +- source/blender/nodes/geometry/CMakeLists.txt | 2 +- source/blender/nodes/shader/CMakeLists.txt | 2 +- source/blender/nodes/texture/CMakeLists.txt | 2 +- source/blender/python/bmesh/CMakeLists.txt | 2 +- source/blender/python/generic/CMakeLists.txt | 2 +- source/blender/python/gpu/CMakeLists.txt | 2 +- source/blender/python/intern/CMakeLists.txt | 2 +- source/blender/python/mathutils/CMakeLists.txt | 2 +- source/blender/render/CMakeLists.txt | 2 +- source/blender/sequencer/CMakeLists.txt | 6 +----- source/blender/shader_fx/CMakeLists.txt | 2 +- source/blender/simulation/CMakeLists.txt | 2 +- source/blender/windowmanager/CMakeLists.txt | 6 +----- source/creator/CMakeLists.txt | 2 +- 101 files changed, 104 insertions(+), 208 deletions(-) diff --git a/intern/cycles/blender/CMakeLists.txt b/intern/cycles/blender/CMakeLists.txt index f8ae1129a59..68fc84e6bf9 100644 --- a/intern/cycles/blender/CMakeLists.txt +++ b/intern/cycles/blender/CMakeLists.txt @@ -6,7 +6,6 @@ set(INC .. ../../guardedalloc ../../mikktspace - ../../../source/blender/makesdna ../../../source/blender/makesrna ../../../source/blender/blenkernel ../../../source/blender/blenlib @@ -60,6 +59,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna cycles_bvh cycles_device cycles_graph diff --git a/intern/ghost/CMakeLists.txt b/intern/ghost/CMakeLists.txt index 6a9f5e52436..e4de08b9df1 100644 --- a/intern/ghost/CMakeLists.txt +++ b/intern/ghost/CMakeLists.txt @@ -7,7 +7,6 @@ set(INC ../clog ../../source/blender/blenlib ../../source/blender/imbuf - ../../source/blender/makesdna ) set(INC_SYS @@ -75,6 +74,7 @@ set(SRC set(LIB ${Epoxy_LIBRARIES} + PRIVATE bf::dna ) if(WITH_VULKAN_BACKEND) diff --git a/intern/mantaflow/CMakeLists.txt b/intern/mantaflow/CMakeLists.txt index 5938831c18f..e43c91f7739 100644 --- a/intern/mantaflow/CMakeLists.txt +++ b/intern/mantaflow/CMakeLists.txt @@ -25,7 +25,6 @@ endif() set(INC extern intern/strings - ../../source/blender/makesdna ../../source/blender/blenlib ) @@ -74,6 +73,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna extern_mantaflow ${PYTHON_LINKFLAGS} diff --git a/intern/opencolorio/CMakeLists.txt b/intern/opencolorio/CMakeLists.txt index 55d15a97286..9376b7fe2e6 100644 --- a/intern/opencolorio/CMakeLists.txt +++ b/intern/opencolorio/CMakeLists.txt @@ -8,7 +8,6 @@ set(INC ../../source/blender/blenlib ../../source/blender/gpu ../../source/blender/gpu/intern - ../../source/blender/makesdna ) set(INC_SYS @@ -25,6 +24,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna ) if(WITH_OPENCOLORIO) diff --git a/source/blender/asset_system/CMakeLists.txt b/source/blender/asset_system/CMakeLists.txt index 1bc2e85c4fa..24ec2314817 100644 --- a/source/blender/asset_system/CMakeLists.txt +++ b/source/blender/asset_system/CMakeLists.txt @@ -7,7 +7,6 @@ set(INC intern ../blenkernel ../blenlib - ../makesdna ../../../intern/clog ../../../intern/guardedalloc ) @@ -43,6 +42,7 @@ set(SRC set(LIB bf_blenkernel + PRIVATE bf::dna ) diff --git a/source/blender/blenfont/CMakeLists.txt b/source/blender/blenfont/CMakeLists.txt index 1cde61b4879..9a5b664128e 100644 --- a/source/blender/blenfont/CMakeLists.txt +++ b/source/blender/blenfont/CMakeLists.txt @@ -9,7 +9,6 @@ set(INC ../blentranslation ../gpu ../imbuf - ../makesdna ../makesrna ../../../intern/guardedalloc ) @@ -34,6 +33,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna bf_gpu bf_intern_guardedalloc diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index 4629495d2e6..967c31d53d1 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -17,7 +17,6 @@ set(INC ../gpu ../ikplugin ../imbuf - ../makesdna ../makesrna ../modifiers ../nodes @@ -38,8 +37,6 @@ set(INC ../../../extern/curve_fit_nd ../../../extern/fmtlib/include - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -539,6 +536,7 @@ set(LIB bf_blentranslation bf_bmesh bf_depsgraph + PRIVATE bf::dna bf_draw bf_functions bf_gpencil_modifiers_legacy @@ -819,8 +817,6 @@ endif() blender_add_lib(bf_blenkernel "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") -# Needed so we can use dna_type_offsets.h for defaults initialization. -add_dependencies(bf_blenkernel bf_dna) # RNA_prototypes.h add_dependencies(bf_blenkernel bf_rna) diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt index 1d6fef955fd..4c6c79d86f1 100644 --- a/source/blender/blenlib/CMakeLists.txt +++ b/source/blender/blenlib/CMakeLists.txt @@ -9,8 +9,6 @@ endif() set(INC . .. - # ../blenkernel # don't add this back! - ../makesdna ../../../intern/eigen ../../../intern/guardedalloc ) @@ -390,6 +388,7 @@ set(SRC ) set(LIB + PUBLIC bf::dna bf_intern_eigen bf_intern_guardedalloc extern_wcwidth diff --git a/source/blender/blenlib/tests/performance/CMakeLists.txt b/source/blender/blenlib/tests/performance/CMakeLists.txt index e3207de027e..9d184047e94 100644 --- a/source/blender/blenlib/tests/performance/CMakeLists.txt +++ b/source/blender/blenlib/tests/performance/CMakeLists.txt @@ -6,7 +6,6 @@ set(INC . .. ../.. - ../../../makesdna ../../../../../intern/guardedalloc ) @@ -15,6 +14,7 @@ set(INC_SYS set(LIB PRIVATE bf_blenlib + PRIVATE bf::dna PRIVATE bf_intern_guardedalloc PRIVATE bf::intern::atomic ) diff --git a/source/blender/blenloader/CMakeLists.txt b/source/blender/blenloader/CMakeLists.txt index 030825b280c..e0242a7e737 100644 --- a/source/blender/blenloader/CMakeLists.txt +++ b/source/blender/blenloader/CMakeLists.txt @@ -13,7 +13,6 @@ set(INC ../editors/include ../gpu ../imbuf - ../makesdna ../makesrna ../nodes ../render @@ -23,8 +22,6 @@ set(INC ../../../intern/guardedalloc ../bmesh - # for writefile.c: dna_type_offsets.h - ${CMAKE_BINARY_DIR}/source/blender/makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -67,6 +64,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna ) if(WITH_BUILDINFO) @@ -97,8 +95,6 @@ endif() blender_add_lib(bf_blenloader "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") -# needed so writefile.c can use dna_type_offsets.h -add_dependencies(bf_blenloader bf_dna) # RNA_prototypes.h add_dependencies(bf_blenloader bf_rna) diff --git a/source/blender/blentranslation/CMakeLists.txt b/source/blender/blentranslation/CMakeLists.txt index df0efd250af..5303aa03e3b 100644 --- a/source/blender/blentranslation/CMakeLists.txt +++ b/source/blender/blentranslation/CMakeLists.txt @@ -7,7 +7,6 @@ set(INC ../blenkernel ../blenlib ../imbuf - ../makesdna ../makesrna ../../../intern/guardedalloc ../../../intern/locale @@ -27,6 +26,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna ) if(WITH_INTERNATIONAL) diff --git a/source/blender/bmesh/CMakeLists.txt b/source/blender/bmesh/CMakeLists.txt index c983443372f..ee27f3378ea 100644 --- a/source/blender/bmesh/CMakeLists.txt +++ b/source/blender/bmesh/CMakeLists.txt @@ -8,7 +8,6 @@ set(INC ../blenlib ../blentranslation ../depsgraph - ../makesdna ../../../intern/clog ../../../intern/eigen ../../../intern/guardedalloc @@ -171,6 +170,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna extern_rangetree PRIVATE bf::intern::atomic ) diff --git a/source/blender/compositor/CMakeLists.txt b/source/blender/compositor/CMakeLists.txt index b3d0716e480..6f556a0ba94 100644 --- a/source/blender/compositor/CMakeLists.txt +++ b/source/blender/compositor/CMakeLists.txt @@ -15,7 +15,6 @@ if(WITH_COMPOSITOR_CPU) ../blentranslation ../depsgraph ../imbuf - ../makesdna ../makesrna ../nodes ../windowmanager @@ -27,8 +26,6 @@ if(WITH_COMPOSITOR_CPU) ../../../intern/clog ../../../intern/guardedalloc - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -601,6 +598,7 @@ if(WITH_COMPOSITOR_CPU) set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna extern_clew PRIVATE bf::intern::atomic ) @@ -675,8 +673,6 @@ if(WITH_COMPOSITOR_CPU) blender_add_test_lib(bf_compositor_tests "${TEST_SRC}" "${INC};${TEST_INC}" "${INC_SYS}" "${LIB};${TEST_LIB}") endif() - # Needed so we can use dna_type_offsets.h for defaults initialization. - add_dependencies(bf_compositor bf_dna) # RNA_prototypes.h add_dependencies(bf_compositor bf_rna) diff --git a/source/blender/compositor/realtime_compositor/CMakeLists.txt b/source/blender/compositor/realtime_compositor/CMakeLists.txt index 071bd60690a..7b780ecfa47 100644 --- a/source/blender/compositor/realtime_compositor/CMakeLists.txt +++ b/source/blender/compositor/realtime_compositor/CMakeLists.txt @@ -12,15 +12,12 @@ set(INC ../../draw ../../gpu ../../imbuf - ../../makesdna ../../makesrna ../../nodes ../../render ../../gpu/intern ../../../../intern/guardedalloc - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../../makesdna/intern ) set(INC_SYS @@ -101,6 +98,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna bf_gpu bf_nodes bf_imbuf @@ -311,5 +309,3 @@ endif() blender_add_lib(bf_realtime_compositor "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") -# Needed so we can use dna_type_offsets.h -add_dependencies(bf_realtime_compositor bf_dna) diff --git a/source/blender/depsgraph/CMakeLists.txt b/source/blender/depsgraph/CMakeLists.txt index e04f235cee6..8fcfd8a4877 100644 --- a/source/blender/depsgraph/CMakeLists.txt +++ b/source/blender/depsgraph/CMakeLists.txt @@ -9,7 +9,6 @@ set(INC ../bmesh ../draw ../functions - ../makesdna ../makesrna ../modifiers ../sequencer @@ -155,6 +154,7 @@ set(SRC set(LIB bf_blenkernel + PRIVATE bf::dna PRIVATE bf::intern::atomic ) diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index 5fb334aa7dd..0b6615a0ab4 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -19,7 +19,6 @@ set(INC ../gpu ../gpu/intern ../imbuf - ../makesdna ../makesrna ../nodes ../render @@ -33,8 +32,6 @@ set(INC ../../../intern/guardedalloc ../../../intern/opensubdiv - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../makesdna/intern ) set(SRC @@ -359,6 +356,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna bf_realtime_compositor bf_windowmanager PRIVATE bf::intern::atomic @@ -890,8 +888,6 @@ endif() blender_add_lib(bf_draw "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") -# Needed so we can use dna_type_offsets.h for defaults initialization. -add_dependencies(bf_draw bf_dna) if(WITH_GTESTS) if(WITH_OPENGL_DRAW_TESTS) diff --git a/source/blender/editors/animation/CMakeLists.txt b/source/blender/editors/animation/CMakeLists.txt index e8e82c5149d..232d2a95cff 100644 --- a/source/blender/editors/animation/CMakeLists.txt +++ b/source/blender/editors/animation/CMakeLists.txt @@ -9,7 +9,6 @@ set(INC ../../blentranslation ../../depsgraph ../../gpu - ../../makesdna ../../makesrna ../../sequencer ../../windowmanager @@ -48,6 +47,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna ) if(WITH_PYTHON) diff --git a/source/blender/editors/armature/CMakeLists.txt b/source/blender/editors/armature/CMakeLists.txt index 75d3e56a2f0..11222730a43 100644 --- a/source/blender/editors/armature/CMakeLists.txt +++ b/source/blender/editors/armature/CMakeLists.txt @@ -12,7 +12,6 @@ set(INC ../../blentranslation ../../depsgraph ../../gpu - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/clog @@ -51,6 +50,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna ) diff --git a/source/blender/editors/asset/CMakeLists.txt b/source/blender/editors/asset/CMakeLists.txt index 84e7e75b094..324818f35d6 100644 --- a/source/blender/editors/asset/CMakeLists.txt +++ b/source/blender/editors/asset/CMakeLists.txt @@ -10,7 +10,6 @@ set(INC ../../blenlib ../../blenloader ../../blentranslation - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/clog @@ -54,6 +53,7 @@ set(SRC set(LIB bf_blenkernel bf_blenloader + PRIVATE bf::dna ) blender_add_lib(bf_editor_asset "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") diff --git a/source/blender/editors/curve/CMakeLists.txt b/source/blender/editors/curve/CMakeLists.txt index 8be77c09662..99ccdfa662d 100644 --- a/source/blender/editors/curve/CMakeLists.txt +++ b/source/blender/editors/curve/CMakeLists.txt @@ -9,7 +9,6 @@ set(INC ../../blentranslation ../../depsgraph ../../gpu - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/clog @@ -40,6 +39,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna extern_curve_fit_nd ) diff --git a/source/blender/editors/curves/CMakeLists.txt b/source/blender/editors/curves/CMakeLists.txt index 893b1f82c4c..fb6147794cf 100644 --- a/source/blender/editors/curves/CMakeLists.txt +++ b/source/blender/editors/curves/CMakeLists.txt @@ -11,7 +11,6 @@ set(INC ../../functions ../../geometry ../../gpu - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/clog @@ -35,6 +34,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna ) if(WITH_TBB) diff --git a/source/blender/editors/geometry/CMakeLists.txt b/source/blender/editors/geometry/CMakeLists.txt index 79137034590..7468ca62a73 100644 --- a/source/blender/editors/geometry/CMakeLists.txt +++ b/source/blender/editors/geometry/CMakeLists.txt @@ -10,7 +10,6 @@ set(INC ../../blentranslation ../../depsgraph ../../functions - ../../makesdna ../../makesrna ../../nodes ../../windowmanager @@ -35,6 +34,7 @@ set(SRC set(LIB bf_blenkernel bf_depsgraph + PRIVATE bf::dna bf_editor_object bf_windowmanager ) diff --git a/source/blender/editors/gizmo_library/CMakeLists.txt b/source/blender/editors/gizmo_library/CMakeLists.txt index dfe3dfd0dc4..659057dd8a7 100644 --- a/source/blender/editors/gizmo_library/CMakeLists.txt +++ b/source/blender/editors/gizmo_library/CMakeLists.txt @@ -10,7 +10,6 @@ set(INC ../../bmesh ../../depsgraph ../../gpu - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/clog @@ -44,6 +43,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna ) diff --git a/source/blender/editors/gpencil_legacy/CMakeLists.txt b/source/blender/editors/gpencil_legacy/CMakeLists.txt index 2d7539d7686..3ace2b5aaa8 100644 --- a/source/blender/editors/gpencil_legacy/CMakeLists.txt +++ b/source/blender/editors/gpencil_legacy/CMakeLists.txt @@ -11,7 +11,6 @@ set(INC ../../depsgraph ../../gpu ../../imbuf - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/guardedalloc @@ -62,6 +61,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna ) if(WITH_POTRACE) diff --git a/source/blender/editors/grease_pencil/CMakeLists.txt b/source/blender/editors/grease_pencil/CMakeLists.txt index a80a4b3deef..caac2312729 100644 --- a/source/blender/editors/grease_pencil/CMakeLists.txt +++ b/source/blender/editors/grease_pencil/CMakeLists.txt @@ -10,7 +10,6 @@ set(INC ../../depsgraph ../../gpu ../../imbuf - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/guardedalloc @@ -33,6 +32,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna ) blender_add_lib(bf_editor_grease_pencil "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") diff --git a/source/blender/editors/interface/CMakeLists.txt b/source/blender/editors/interface/CMakeLists.txt index 84c2784f93c..081394a2826 100644 --- a/source/blender/editors/interface/CMakeLists.txt +++ b/source/blender/editors/interface/CMakeLists.txt @@ -16,7 +16,6 @@ set(INC ../../functions ../../gpu ../../imbuf - ../../makesdna ../../makesrna ../../nodes ../../python @@ -99,6 +98,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna bf_editor_datafiles ) diff --git a/source/blender/editors/io/CMakeLists.txt b/source/blender/editors/io/CMakeLists.txt index ef136a0e58a..d91be1e45b3 100644 --- a/source/blender/editors/io/CMakeLists.txt +++ b/source/blender/editors/io/CMakeLists.txt @@ -17,7 +17,6 @@ set(INC ../../io/stl ../../io/usd ../../io/wavefront_obj - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/guardedalloc @@ -54,6 +53,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna ) if(WITH_OPENCOLLADA) diff --git a/source/blender/editors/lattice/CMakeLists.txt b/source/blender/editors/lattice/CMakeLists.txt index 713d1b59704..dec7351562e 100644 --- a/source/blender/editors/lattice/CMakeLists.txt +++ b/source/blender/editors/lattice/CMakeLists.txt @@ -7,7 +7,6 @@ set(INC ../../blenkernel ../../blenlib ../../depsgraph - ../../makesdna ../../makesrna ../../render ../../windowmanager @@ -29,6 +28,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna ) blender_add_lib(bf_editor_lattice "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") diff --git a/source/blender/editors/mask/CMakeLists.txt b/source/blender/editors/mask/CMakeLists.txt index 3f6e437b247..486b20f90b7 100644 --- a/source/blender/editors/mask/CMakeLists.txt +++ b/source/blender/editors/mask/CMakeLists.txt @@ -8,7 +8,6 @@ set(INC ../../blenlib ../../depsgraph ../../gpu - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/guardedalloc @@ -32,6 +31,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna ) diff --git a/source/blender/editors/mesh/CMakeLists.txt b/source/blender/editors/mesh/CMakeLists.txt index efc07c3725c..26f1cca7fd3 100644 --- a/source/blender/editors/mesh/CMakeLists.txt +++ b/source/blender/editors/mesh/CMakeLists.txt @@ -16,7 +16,6 @@ set(INC ../../geometry ../../gpu ../../imbuf - ../../makesdna ../../makesrna ../../render ../../windowmanager @@ -66,6 +65,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna bf_windowmanager ) diff --git a/source/blender/editors/metaball/CMakeLists.txt b/source/blender/editors/metaball/CMakeLists.txt index bb302a1ae70..4e284149d51 100644 --- a/source/blender/editors/metaball/CMakeLists.txt +++ b/source/blender/editors/metaball/CMakeLists.txt @@ -8,7 +8,6 @@ set(INC ../../blenlib ../../depsgraph ../../gpu - ../../makesdna ../../makesrna ../../render ../../windowmanager @@ -29,6 +28,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna ) blender_add_lib(bf_editor_metaball "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") diff --git a/source/blender/editors/object/CMakeLists.txt b/source/blender/editors/object/CMakeLists.txt index 7f1f403381a..1f2bb9a9d30 100644 --- a/source/blender/editors/object/CMakeLists.txt +++ b/source/blender/editors/object/CMakeLists.txt @@ -15,7 +15,6 @@ set(INC ../../gpu ../../ikplugin ../../imbuf - ../../makesdna ../../makesrna ../../modifiers ../../python @@ -25,8 +24,6 @@ set(INC ../../../../intern/clog ../../../../intern/guardedalloc - # dna_type_offsets.h in BLO_read_write.h - ${CMAKE_BINARY_DIR}/source/blender/makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -68,6 +65,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna bf_editor_mesh bf_editor_grease_pencil bf_render @@ -87,6 +85,5 @@ endif() blender_add_lib(bf_editor_object "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") -add_dependencies(bf_editor_object bf_dna) # RNA_prototypes.h add_dependencies(bf_editor_object bf_rna) diff --git a/source/blender/editors/physics/CMakeLists.txt b/source/blender/editors/physics/CMakeLists.txt index 2d8375dae01..915bd11dfed 100644 --- a/source/blender/editors/physics/CMakeLists.txt +++ b/source/blender/editors/physics/CMakeLists.txt @@ -9,7 +9,6 @@ set(INC ../../blentranslation ../../depsgraph ../../gpu - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/clog @@ -42,6 +41,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna ) if(WITH_MOD_FLUID) diff --git a/source/blender/editors/render/CMakeLists.txt b/source/blender/editors/render/CMakeLists.txt index 59ff7aecee6..db37f17a95e 100644 --- a/source/blender/editors/render/CMakeLists.txt +++ b/source/blender/editors/render/CMakeLists.txt @@ -13,7 +13,6 @@ set(INC ../../draw ../../gpu ../../imbuf - ../../makesdna ../../makesrna ../../nodes ../../render @@ -37,6 +36,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna bf_draw ) diff --git a/source/blender/editors/scene/CMakeLists.txt b/source/blender/editors/scene/CMakeLists.txt index 45de4756556..99a1f0fb0f8 100644 --- a/source/blender/editors/scene/CMakeLists.txt +++ b/source/blender/editors/scene/CMakeLists.txt @@ -8,7 +8,6 @@ set(INC ../../blenlib ../../blentranslation ../../depsgraph - ../../makesdna ../../makesrna ../../sequencer ../../windowmanager @@ -26,6 +25,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna ) diff --git a/source/blender/editors/screen/CMakeLists.txt b/source/blender/editors/screen/CMakeLists.txt index ae2aede3e64..05a11e7d191 100644 --- a/source/blender/editors/screen/CMakeLists.txt +++ b/source/blender/editors/screen/CMakeLists.txt @@ -13,7 +13,6 @@ set(INC ../../depsgraph ../../gpu ../../imbuf - ../../makesdna ../../makesrna ../../sequencer ../../windowmanager @@ -45,6 +44,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna bf_editor_datafiles bf_editor_space_sequencer ) diff --git a/source/blender/editors/sculpt_paint/CMakeLists.txt b/source/blender/editors/sculpt_paint/CMakeLists.txt index 1af93781129..b695459c838 100644 --- a/source/blender/editors/sculpt_paint/CMakeLists.txt +++ b/source/blender/editors/sculpt_paint/CMakeLists.txt @@ -15,7 +15,6 @@ set(INC ../../geometry ../../gpu ../../imbuf - ../../makesdna ../../makesrna ../../nodes ../../render @@ -97,6 +96,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna PRIVATE bf::intern::atomic ) diff --git a/source/blender/editors/sound/CMakeLists.txt b/source/blender/editors/sound/CMakeLists.txt index f624d1df690..20858484ac8 100644 --- a/source/blender/editors/sound/CMakeLists.txt +++ b/source/blender/editors/sound/CMakeLists.txt @@ -7,7 +7,6 @@ set(INC ../../blenkernel ../../blenlib ../../depsgraph - ../../makesdna ../../makesrna ../../sequencer ../../windowmanager @@ -29,6 +28,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna ) if(WITH_AUDASPACE) diff --git a/source/blender/editors/space_action/CMakeLists.txt b/source/blender/editors/space_action/CMakeLists.txt index 0fb65608816..9732c865c7c 100644 --- a/source/blender/editors/space_action/CMakeLists.txt +++ b/source/blender/editors/space_action/CMakeLists.txt @@ -10,13 +10,10 @@ set(INC ../../blentranslation ../../depsgraph ../../gpu - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/guardedalloc - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../../makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -39,6 +36,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna ) diff --git a/source/blender/editors/space_api/CMakeLists.txt b/source/blender/editors/space_api/CMakeLists.txt index 15d577d77f6..5959e378420 100644 --- a/source/blender/editors/space_api/CMakeLists.txt +++ b/source/blender/editors/space_api/CMakeLists.txt @@ -9,7 +9,6 @@ set(INC ../../blenkernel ../../blenlib ../../gpu - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/guardedalloc @@ -24,6 +23,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna bf_editor_geometry bf_editor_space_action bf_editor_space_buttons diff --git a/source/blender/editors/space_buttons/CMakeLists.txt b/source/blender/editors/space_buttons/CMakeLists.txt index e0468207b94..4dfdef96eb6 100644 --- a/source/blender/editors/space_buttons/CMakeLists.txt +++ b/source/blender/editors/space_buttons/CMakeLists.txt @@ -9,14 +9,11 @@ set(INC ../../blenloader ../../blentranslation ../../gpu - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/guardedalloc ../../bmesh - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../../makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -34,6 +31,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna ) diff --git a/source/blender/editors/space_clip/CMakeLists.txt b/source/blender/editors/space_clip/CMakeLists.txt index 1a5e50a02a3..70295625ffc 100644 --- a/source/blender/editors/space_clip/CMakeLists.txt +++ b/source/blender/editors/space_clip/CMakeLists.txt @@ -12,13 +12,10 @@ set(INC ../../depsgraph ../../gpu ../../imbuf - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/guardedalloc - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../../makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -54,12 +51,11 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna ) blender_add_lib(bf_editor_space_clip "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") -# Needed so we can use dna_type_offsets.h for defaults initialization. -add_dependencies(bf_editor_space_clip bf_dna) # RNA_prototypes.h add_dependencies(bf_editor_space_clip bf_rna) diff --git a/source/blender/editors/space_console/CMakeLists.txt b/source/blender/editors/space_console/CMakeLists.txt index 447c31cba16..72392118335 100644 --- a/source/blender/editors/space_console/CMakeLists.txt +++ b/source/blender/editors/space_console/CMakeLists.txt @@ -9,13 +9,10 @@ set(INC ../../blenlib ../../blenloader ../../gpu - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/guardedalloc - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../../makesdna/intern ) set(INC_SYS @@ -32,6 +29,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna ) if(WITH_PYTHON) @@ -41,5 +39,3 @@ endif() blender_add_lib(bf_editor_space_console "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") -# dna_type_offsets.h -add_dependencies(bf_editor_space_console bf_dna) diff --git a/source/blender/editors/space_file/CMakeLists.txt b/source/blender/editors/space_file/CMakeLists.txt index c09f2d698ff..e6f6db5f810 100644 --- a/source/blender/editors/space_file/CMakeLists.txt +++ b/source/blender/editors/space_file/CMakeLists.txt @@ -13,15 +13,12 @@ set(INC ../../blentranslation ../../gpu ../../imbuf - ../../makesdna ../../makesrna ../../render ../../windowmanager ../../../../intern/guardedalloc ../../../../extern/fmtlib/include - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../../makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -50,6 +47,7 @@ set(SRC set(LIB bf_blenkernel + PRIVATE bf::dna extern_fmtlib PRIVATE bf::intern::atomic ) diff --git a/source/blender/editors/space_graph/CMakeLists.txt b/source/blender/editors/space_graph/CMakeLists.txt index d6642979643..86f6770b3ee 100644 --- a/source/blender/editors/space_graph/CMakeLists.txt +++ b/source/blender/editors/space_graph/CMakeLists.txt @@ -10,13 +10,10 @@ set(INC ../../blentranslation ../../depsgraph ../../gpu - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/guardedalloc - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../../makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -41,6 +38,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna ) if(WITH_AUDASPACE) diff --git a/source/blender/editors/space_image/CMakeLists.txt b/source/blender/editors/space_image/CMakeLists.txt index 5239a978827..c4993c8e50b 100644 --- a/source/blender/editors/space_image/CMakeLists.txt +++ b/source/blender/editors/space_image/CMakeLists.txt @@ -14,15 +14,12 @@ set(INC ../../draw ../../gpu ../../imbuf - ../../makesdna ../../makesrna ../../render ../../windowmanager ../../../../intern/clog ../../../../intern/guardedalloc - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../../makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -45,6 +42,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna bf_editor_uvedit ) diff --git a/source/blender/editors/space_info/CMakeLists.txt b/source/blender/editors/space_info/CMakeLists.txt index bc46a8a6bfd..2fe666c93d1 100644 --- a/source/blender/editors/space_info/CMakeLists.txt +++ b/source/blender/editors/space_info/CMakeLists.txt @@ -13,13 +13,10 @@ set(INC ../../depsgraph ../../gpu ../../imbuf - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/guardedalloc - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../../makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -40,6 +37,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna ) diff --git a/source/blender/editors/space_nla/CMakeLists.txt b/source/blender/editors/space_nla/CMakeLists.txt index 79eab77314e..9ab67b7dc07 100644 --- a/source/blender/editors/space_nla/CMakeLists.txt +++ b/source/blender/editors/space_nla/CMakeLists.txt @@ -10,13 +10,10 @@ set(INC ../../blentranslation ../../depsgraph ../../gpu - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/guardedalloc - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../../makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -39,6 +36,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna ) diff --git a/source/blender/editors/space_node/CMakeLists.txt b/source/blender/editors/space_node/CMakeLists.txt index aa8ea981f4e..e0c917c201a 100644 --- a/source/blender/editors/space_node/CMakeLists.txt +++ b/source/blender/editors/space_node/CMakeLists.txt @@ -17,7 +17,6 @@ set(INC ../../geometry ../../gpu ../../imbuf - ../../makesdna ../../makesrna ../../nodes ../../render @@ -25,8 +24,6 @@ set(INC ../../../../intern/guardedalloc ../../../../extern/fmtlib/include - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../../makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -58,6 +55,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna bf_editor_screen extern_fmtlib ) diff --git a/source/blender/editors/space_outliner/CMakeLists.txt b/source/blender/editors/space_outliner/CMakeLists.txt index cfd10ec134c..0f7552d436c 100644 --- a/source/blender/editors/space_outliner/CMakeLists.txt +++ b/source/blender/editors/space_outliner/CMakeLists.txt @@ -11,15 +11,12 @@ set(INC ../../depsgraph ../../gpu ../../imbuf - ../../makesdna ../../makesrna ../../sequencer ../../windowmanager ../../../../intern/clog ../../../../intern/guardedalloc - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../../makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -114,6 +111,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna bf_editor_undo ) diff --git a/source/blender/editors/space_script/CMakeLists.txt b/source/blender/editors/space_script/CMakeLists.txt index 6db584a0cc1..ffbc91ddc60 100644 --- a/source/blender/editors/space_script/CMakeLists.txt +++ b/source/blender/editors/space_script/CMakeLists.txt @@ -9,13 +9,10 @@ set(INC ../../blenloader ../../blentranslation ../../gpu - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/guardedalloc - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../../makesdna/intern ) set(INC_SYS @@ -30,6 +27,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna ) if(WITH_PYTHON) @@ -42,5 +40,3 @@ endif() blender_add_lib(bf_editor_space_script "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") -# dna_type_offsets.h -add_dependencies(bf_editor_space_script bf_dna) diff --git a/source/blender/editors/space_sequencer/CMakeLists.txt b/source/blender/editors/space_sequencer/CMakeLists.txt index efdec92d2df..48e65789975 100644 --- a/source/blender/editors/space_sequencer/CMakeLists.txt +++ b/source/blender/editors/space_sequencer/CMakeLists.txt @@ -13,14 +13,11 @@ set(INC ../../draw ../../gpu ../../imbuf - ../../makesdna ../../makesrna ../../sequencer ../../windowmanager ../../../../intern/guardedalloc - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../../makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -53,6 +50,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna bf_editor_interface bf_editor_util PRIVATE bf::intern::atomic diff --git a/source/blender/editors/space_spreadsheet/CMakeLists.txt b/source/blender/editors/space_spreadsheet/CMakeLists.txt index e53d00c1066..d137baa1637 100644 --- a/source/blender/editors/space_spreadsheet/CMakeLists.txt +++ b/source/blender/editors/space_spreadsheet/CMakeLists.txt @@ -13,14 +13,11 @@ set(INC ../../depsgraph ../../functions ../../gpu - ../../makesdna ../../makesrna ../../nodes ../../windowmanager ../../../../intern/guardedalloc - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../../makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -56,6 +53,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna ) if(WITH_OPENVDB) diff --git a/source/blender/editors/space_statusbar/CMakeLists.txt b/source/blender/editors/space_statusbar/CMakeLists.txt index fbd7995c276..db9a8a62b2d 100644 --- a/source/blender/editors/space_statusbar/CMakeLists.txt +++ b/source/blender/editors/space_statusbar/CMakeLists.txt @@ -9,13 +9,10 @@ set(INC ../../blenloader ../../blentranslation ../../gpu - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/guardedalloc - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../../makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -30,6 +27,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna ) diff --git a/source/blender/editors/space_text/CMakeLists.txt b/source/blender/editors/space_text/CMakeLists.txt index 9958f33e6c1..6850dac8715 100644 --- a/source/blender/editors/space_text/CMakeLists.txt +++ b/source/blender/editors/space_text/CMakeLists.txt @@ -10,13 +10,10 @@ set(INC ../../blenloader ../../blentranslation ../../gpu - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/guardedalloc - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../../makesdna/intern ) set(INC_SYS @@ -42,6 +39,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna ) @@ -55,5 +53,3 @@ endif() blender_add_lib(bf_editor_space_text "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") -# dna_type_offsets.h -add_dependencies(bf_editor_space_text bf_dna) diff --git a/source/blender/editors/space_topbar/CMakeLists.txt b/source/blender/editors/space_topbar/CMakeLists.txt index b832752c0f1..2478df1ccfe 100644 --- a/source/blender/editors/space_topbar/CMakeLists.txt +++ b/source/blender/editors/space_topbar/CMakeLists.txt @@ -9,13 +9,10 @@ set(INC ../../blenloader ../../blentranslation ../../gpu - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/guardedalloc - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../../makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -28,6 +25,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna ) diff --git a/source/blender/editors/space_userpref/CMakeLists.txt b/source/blender/editors/space_userpref/CMakeLists.txt index 6c2afdb9675..47c8fb9af3a 100644 --- a/source/blender/editors/space_userpref/CMakeLists.txt +++ b/source/blender/editors/space_userpref/CMakeLists.txt @@ -7,13 +7,10 @@ set(INC ../../blenkernel ../../blenlib ../../blenloader - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/guardedalloc - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../../makesdna/intern ) set(INC_SYS @@ -28,9 +25,8 @@ set(SRC ) set(LIB + PRIVATE bf::dna ) blender_add_lib(bf_editor_space_userpref "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") -# dna_type_offsets.h -add_dependencies(bf_editor_space_userpref bf_dna) diff --git a/source/blender/editors/space_view3d/CMakeLists.txt b/source/blender/editors/space_view3d/CMakeLists.txt index 4ebdfcbd6d6..3dfb589f1d6 100644 --- a/source/blender/editors/space_view3d/CMakeLists.txt +++ b/source/blender/editors/space_view3d/CMakeLists.txt @@ -15,15 +15,12 @@ set(INC ../../draw ../../gpu ../../imbuf - ../../makesdna ../../makesrna ../../render ../../windowmanager ../../../../intern/guardedalloc ../../../../intern/mantaflow/extern - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../../makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -76,6 +73,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna bf_editor_curves bf_editor_lattice bf_editor_mesh @@ -96,7 +94,5 @@ endif() blender_add_lib(bf_editor_space_view3d "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") -# Needed so we can use dna_type_offsets.h for defaults initialization. -add_dependencies(bf_editor_space_view3d bf_dna) # RNA_prototypes.h add_dependencies(bf_editor_space_view3d bf_rna) diff --git a/source/blender/editors/transform/CMakeLists.txt b/source/blender/editors/transform/CMakeLists.txt index 1757604417b..5132d6e345c 100644 --- a/source/blender/editors/transform/CMakeLists.txt +++ b/source/blender/editors/transform/CMakeLists.txt @@ -12,7 +12,6 @@ set(INC ../../depsgraph ../../gpu ../../ikplugin - ../../makesdna ../../makesrna ../../render ../../sequencer @@ -122,6 +121,7 @@ set(LIB bf_blenkernel bf_blenlib bf_bmesh + PRIVATE bf::dna bf_editor_mask bf_gpu ) diff --git a/source/blender/editors/undo/CMakeLists.txt b/source/blender/editors/undo/CMakeLists.txt index 8f64964483f..0a55e462f2d 100644 --- a/source/blender/editors/undo/CMakeLists.txt +++ b/source/blender/editors/undo/CMakeLists.txt @@ -9,7 +9,6 @@ set(INC ../../blenlib ../../blenloader ../../blentranslation - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/clog @@ -31,6 +30,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna bf_editor_curve bf_editor_curves bf_editor_lattice diff --git a/source/blender/editors/util/CMakeLists.txt b/source/blender/editors/util/CMakeLists.txt index d3605f2b97e..8ddff989970 100644 --- a/source/blender/editors/util/CMakeLists.txt +++ b/source/blender/editors/util/CMakeLists.txt @@ -14,7 +14,6 @@ set(INC ../../depsgraph ../../gpu ../../imbuf - ../../makesdna ../../makesrna ../../sequencer ../../windowmanager @@ -110,6 +109,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna ) diff --git a/source/blender/editors/uvedit/CMakeLists.txt b/source/blender/editors/uvedit/CMakeLists.txt index 321d48bd88e..ee93860ec47 100644 --- a/source/blender/editors/uvedit/CMakeLists.txt +++ b/source/blender/editors/uvedit/CMakeLists.txt @@ -11,7 +11,6 @@ set(INC ../../depsgraph ../../geometry ../../gpu - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/eigen @@ -42,6 +41,7 @@ set(SRC set(LIB bf_bmesh + PRIVATE bf::dna ) diff --git a/source/blender/freestyle/CMakeLists.txt b/source/blender/freestyle/CMakeLists.txt index a7c48f1675b..ff807214baa 100644 --- a/source/blender/freestyle/CMakeLists.txt +++ b/source/blender/freestyle/CMakeLists.txt @@ -530,6 +530,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna bf_python_mathutils ${PYTHON_LINKFLAGS} @@ -543,7 +544,6 @@ set(INC ../blentranslation ../depsgraph ../imbuf - ../makesdna ../makesrna ../python ../python/intern diff --git a/source/blender/functions/CMakeLists.txt b/source/blender/functions/CMakeLists.txt index 4cd5277fc48..f03cb91a8e6 100644 --- a/source/blender/functions/CMakeLists.txt +++ b/source/blender/functions/CMakeLists.txt @@ -5,7 +5,6 @@ set(INC . ../blenlib - ../makesdna ../../../intern/guardedalloc ) @@ -51,6 +50,7 @@ set(SRC set(LIB bf_blenlib + PRIVATE bf::dna ) if(WITH_TBB) diff --git a/source/blender/geometry/CMakeLists.txt b/source/blender/geometry/CMakeLists.txt index 9a7cbe88514..df79f57b105 100644 --- a/source/blender/geometry/CMakeLists.txt +++ b/source/blender/geometry/CMakeLists.txt @@ -8,11 +8,9 @@ set(INC ../blenlib ../blentranslation ../functions - ../makesdna ../makesrna ../../../intern/eigen ../../../intern/guardedalloc - ${CMAKE_BINARY_DIR}/source/blender/makesdna/intern ) set(SRC @@ -62,6 +60,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna ) if(WITH_OPENVDB) diff --git a/source/blender/gpencil_modifiers_legacy/CMakeLists.txt b/source/blender/gpencil_modifiers_legacy/CMakeLists.txt index ee4a9502cc0..d3a0dd95f36 100644 --- a/source/blender/gpencil_modifiers_legacy/CMakeLists.txt +++ b/source/blender/gpencil_modifiers_legacy/CMakeLists.txt @@ -12,15 +12,12 @@ set(INC ../bmesh ../depsgraph ../editors/include - ../makesdna ../makesrna ../render ../windowmanager ../../../intern/eigen ../../../intern/guardedalloc - # dna_type_offsets.h in BLO_read_write.h - ${CMAKE_BINARY_DIR}/source/blender/makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -93,10 +90,10 @@ list(APPEND LIB endif() set(LIB + PRIVATE bf::dna ) blender_add_lib(bf_gpencil_modifiers_legacy "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") -add_dependencies(bf_gpencil_modifiers_legacy bf_dna) # RNA_prototypes.h add_dependencies(bf_gpencil_modifiers_legacy bf_rna) diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt index a82a1ef9dcf..221c9070bf1 100644 --- a/source/blender/gpu/CMakeLists.txt +++ b/source/blender/gpu/CMakeLists.txt @@ -21,7 +21,6 @@ set(INC ../bmesh ../draw ../imbuf - ../makesdna ../makesrna # For theme color access. @@ -326,6 +325,7 @@ set(METAL_SRC ) set(LIB + PRIVATE bf::dna PRIVATE bf::intern::atomic ${Epoxy_LIBRARIES} ) diff --git a/source/blender/ikplugin/CMakeLists.txt b/source/blender/ikplugin/CMakeLists.txt index 6245d4e7c2d..76d6689b1f1 100644 --- a/source/blender/ikplugin/CMakeLists.txt +++ b/source/blender/ikplugin/CMakeLists.txt @@ -8,7 +8,6 @@ set(INC . ../blenkernel ../blenlib - ../makesdna ../../../intern/guardedalloc ) @@ -24,6 +23,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna ) if(WITH_IK_SOLVER) diff --git a/source/blender/imbuf/CMakeLists.txt b/source/blender/imbuf/CMakeLists.txt index ac82b81cd33..de4d130dc6d 100644 --- a/source/blender/imbuf/CMakeLists.txt +++ b/source/blender/imbuf/CMakeLists.txt @@ -8,7 +8,6 @@ set(INC ../blenlib ../blenloader ../gpu - ../makesdna ../makesrna ../sequencer ../../../intern/guardedalloc @@ -79,6 +78,7 @@ set(LIB bf_blenkernel bf_blenlib bf_blenloader + PRIVATE bf::dna bf_imbuf_openimageio bf_intern_guardedalloc bf_intern_memutil diff --git a/source/blender/imbuf/intern/cineon/CMakeLists.txt b/source/blender/imbuf/intern/cineon/CMakeLists.txt index 1f993f79fa2..7663cdabb45 100644 --- a/source/blender/imbuf/intern/cineon/CMakeLists.txt +++ b/source/blender/imbuf/intern/cineon/CMakeLists.txt @@ -8,7 +8,6 @@ set(INC ../.. ../../../blenkernel ../../../blenlib - ../../../makesdna ../../../../../intern/guardedalloc ) @@ -30,6 +29,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna ) if(WITH_IMAGE_CINEON) diff --git a/source/blender/imbuf/intern/oiio/CMakeLists.txt b/source/blender/imbuf/intern/oiio/CMakeLists.txt index 8a7c718a0f5..6191ca47fe0 100644 --- a/source/blender/imbuf/intern/oiio/CMakeLists.txt +++ b/source/blender/imbuf/intern/oiio/CMakeLists.txt @@ -8,7 +8,6 @@ set(INC ../.. ../../../blenkernel ../../../blenlib - ../../../makesdna ../../../../../intern/guardedalloc ../../../../../intern/utfconv ) @@ -28,6 +27,7 @@ set(SRC set(LIB ${OPENIMAGEIO_LIBRARIES} ${PUGIXML_LIBRARIES} + PRIVATE bf::dna ) if(WITH_IMAGE_OPENEXR) diff --git a/source/blender/imbuf/intern/openexr/CMakeLists.txt b/source/blender/imbuf/intern/openexr/CMakeLists.txt index 44807deff2b..958c0e61ce0 100644 --- a/source/blender/imbuf/intern/openexr/CMakeLists.txt +++ b/source/blender/imbuf/intern/openexr/CMakeLists.txt @@ -8,7 +8,6 @@ set(INC ../.. ../../../blenkernel ../../../blenlib - ../../../makesdna ../../../../../intern/guardedalloc ../../../../../intern/utfconv ) @@ -23,6 +22,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna ) if(WITH_IMAGE_OPENEXR) diff --git a/source/blender/io/alembic/CMakeLists.txt b/source/blender/io/alembic/CMakeLists.txt index c93f3f3f563..636b93fdaf4 100644 --- a/source/blender/io/alembic/CMakeLists.txt +++ b/source/blender/io/alembic/CMakeLists.txt @@ -12,7 +12,6 @@ set(INC ../../bmesh ../../depsgraph ../../editors/include - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/clog @@ -93,6 +92,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna bf_io_common ${ALEMBIC_LIBRARIES} diff --git a/source/blender/io/avi/CMakeLists.txt b/source/blender/io/avi/CMakeLists.txt index 627d6e54f73..b811b9ab1e7 100644 --- a/source/blender/io/avi/CMakeLists.txt +++ b/source/blender/io/avi/CMakeLists.txt @@ -6,7 +6,6 @@ set(INC . ../../blenlib ../../imbuf - ../../makesdna ../../../../intern/guardedalloc ) @@ -33,6 +32,7 @@ set(SRC set(LIB ${JPEG_LIBRARIES} + PRIVATE bf::dna ) blender_add_lib(bf_avi "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") diff --git a/source/blender/io/collada/CMakeLists.txt b/source/blender/io/collada/CMakeLists.txt index 9d01247d7c7..e2b0ab6db08 100644 --- a/source/blender/io/collada/CMakeLists.txt +++ b/source/blender/io/collada/CMakeLists.txt @@ -27,7 +27,6 @@ set(INC ../../depsgraph ../../editors/include ../../imbuf - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/guardedalloc @@ -117,6 +116,7 @@ set(LIB ${OPENCOLLADA_LIBRARIES} ${PCRE_LIBRARIES} ${XML2_LIBRARIES} + PRIVATE bf::dna ) if(WITH_BUILDINFO) diff --git a/source/blender/io/common/CMakeLists.txt b/source/blender/io/common/CMakeLists.txt index a897b2ed79f..1726db8d83e 100644 --- a/source/blender/io/common/CMakeLists.txt +++ b/source/blender/io/common/CMakeLists.txt @@ -7,7 +7,6 @@ set(INC ../../blenkernel ../../blenlib ../../depsgraph - ../../makesdna ../../../../intern/guardedalloc ../../makesrna ) @@ -35,6 +34,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna ) blender_add_lib(bf_io_common "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") diff --git a/source/blender/io/gpencil/CMakeLists.txt b/source/blender/io/gpencil/CMakeLists.txt index 9213a4f1218..3444ab9abea 100644 --- a/source/blender/io/gpencil/CMakeLists.txt +++ b/source/blender/io/gpencil/CMakeLists.txt @@ -11,7 +11,6 @@ set(INC ../../bmesh ../../depsgraph ../../editors/include - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/clog @@ -42,6 +41,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna bf_io_common ) diff --git a/source/blender/io/ply/CMakeLists.txt b/source/blender/io/ply/CMakeLists.txt index c9da6f7f4a5..8d7692b48bb 100644 --- a/source/blender/io/ply/CMakeLists.txt +++ b/source/blender/io/ply/CMakeLists.txt @@ -13,7 +13,6 @@ set(INC ../../bmesh ../../depsgraph ../../geometry - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/guardedalloc @@ -56,6 +55,7 @@ set(SRC set(LIB bf_blenkernel + PRIVATE bf::dna bf_io_common extern_fmtlib ) diff --git a/source/blender/io/stl/CMakeLists.txt b/source/blender/io/stl/CMakeLists.txt index f146e0ca8cc..4f0cea2da83 100644 --- a/source/blender/io/stl/CMakeLists.txt +++ b/source/blender/io/stl/CMakeLists.txt @@ -12,7 +12,6 @@ set(INC ../../bmesh/intern ../../depsgraph ../../editors/include - ../../makesdna ../../makesrna ../../nodes ../../windowmanager @@ -39,6 +38,7 @@ set(SRC set(LIB bf_blenkernel + PRIVATE bf::dna bf_io_common ) diff --git a/source/blender/io/usd/CMakeLists.txt b/source/blender/io/usd/CMakeLists.txt index bd150f6a072..d966935f683 100644 --- a/source/blender/io/usd/CMakeLists.txt +++ b/source/blender/io/usd/CMakeLists.txt @@ -54,7 +54,6 @@ set(INC ../../depsgraph ../../editors/include ../../imbuf - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/guardedalloc @@ -130,6 +129,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna bf_imbuf bf_io_common ) diff --git a/source/blender/io/wavefront_obj/CMakeLists.txt b/source/blender/io/wavefront_obj/CMakeLists.txt index 8d54fb65b68..3dd050576e9 100644 --- a/source/blender/io/wavefront_obj/CMakeLists.txt +++ b/source/blender/io/wavefront_obj/CMakeLists.txt @@ -13,7 +13,6 @@ set(INC ../../bmesh/intern ../../depsgraph ../../editors/include - ../../makesdna ../../makesrna ../../nodes ../../windowmanager @@ -59,6 +58,7 @@ set(SRC set(LIB bf_blenkernel + PRIVATE bf::dna bf_io_common extern_fmtlib ) diff --git a/source/blender/makesdna/intern/CMakeLists.txt b/source/blender/makesdna/intern/CMakeLists.txt index c7a195a6704..83502647f91 100644 --- a/source/blender/makesdna/intern/CMakeLists.txt +++ b/source/blender/makesdna/intern/CMakeLists.txt @@ -5,11 +5,11 @@ # message(STATUS "Configuring makesdna") set(INC - .. + PUBLIC .. + PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ../../blenlib ../../imbuf ../../../../intern/guardedalloc - ${CMAKE_CURRENT_BINARY_DIR} ) set(INC_SYS @@ -140,6 +140,8 @@ set_source_files_properties( ) blender_add_lib(bf_dna "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") +add_library(bf::dna ALIAS bf_dna) + # ----------------------------------------------------------------------------- diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt index fb40aedd0eb..495f68635c1 100644 --- a/source/blender/makesrna/intern/CMakeLists.txt +++ b/source/blender/makesrna/intern/CMakeLists.txt @@ -229,7 +229,6 @@ set(INC ../../gpu ../../ikplugin ../../imbuf - ../../makesdna ../../modifiers ../../nodes ../../sequencer @@ -243,10 +242,7 @@ set(INC ../../../../intern/memutil ../../../../intern/mantaflow/extern - ${CMAKE_BINARY_DIR}/source/blender/makesdna/intern - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../../makesdna/intern # RNA_prototypes.h ${CMAKE_CURRENT_BINARY_DIR}/../../makesrna/ ) @@ -466,7 +462,7 @@ set(SRC ) set(LIB - bf_dna + PRIVATE bf::dna bf_editor_space_api bf_editor_animation @@ -490,5 +486,3 @@ set(LIB blender_add_lib(bf_rna "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") -# Needed so we can use dna_type_offsets.h for defaults initialization. -add_dependencies(bf_blenkernel bf_dna) diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt index 59492773fd4..2d546092429 100644 --- a/source/blender/modifiers/CMakeLists.txt +++ b/source/blender/modifiers/CMakeLists.txt @@ -15,7 +15,6 @@ set(INC ../editors/include ../functions ../geometry - ../makesdna ../makesrna ../nodes ../render @@ -23,8 +22,6 @@ set(INC ../../../intern/eigen ../../../intern/guardedalloc - # dna_type_offsets.h in BLO_read_write.h - ${CMAKE_BINARY_DIR}/source/blender/makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -114,6 +111,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PUBLIC bf::dna ) if(WITH_ALEMBIC) @@ -220,9 +218,5 @@ endif() blender_add_lib(bf_modifiers "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") -# Some modifiers include BLO_read_write.h, which includes dna_type_offsets.h -# which is generated by bf_dna. Need to ensure compilaiton order here. -# Also needed so we can use dna_type_offsets.h for defaults initialization. -add_dependencies(bf_modifiers bf_dna) # RNA_prototypes.h add_dependencies(bf_modifiers bf_rna) diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt index 6ea3ce538e4..79d71e5bf91 100644 --- a/source/blender/nodes/CMakeLists.txt +++ b/source/blender/nodes/CMakeLists.txt @@ -26,15 +26,12 @@ set(INC ../geometry ../gpu ../imbuf - ../makesdna ../makesrna ../render ../windowmanager ../../../extern/fmtlib/include ../../../intern/guardedalloc - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -85,6 +82,7 @@ set(SRC set(LIB bf_bmesh + PRIVATE bf::dna bf_functions bf_nodes_composite bf_nodes_function @@ -150,7 +148,5 @@ endif() blender_add_lib(bf_nodes "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") -# Needed so we can use dna_type_offsets.h for defaults initialization. -add_dependencies(bf_nodes bf_dna) # RNA_prototypes.h add_dependencies(bf_nodes bf_rna) diff --git a/source/blender/nodes/composite/CMakeLists.txt b/source/blender/nodes/composite/CMakeLists.txt index 60f1c07f917..a3d8b287950 100644 --- a/source/blender/nodes/composite/CMakeLists.txt +++ b/source/blender/nodes/composite/CMakeLists.txt @@ -14,7 +14,6 @@ set(INC ../../functions ../../gpu ../../imbuf - ../../makesdna ../../makesrna ../../render ../../windowmanager @@ -23,8 +22,6 @@ set(INC ../../compositor/realtime_compositor/cached_resources ../../../../intern/guardedalloc - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../../makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -132,6 +129,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna bf_realtime_compositor ) @@ -166,7 +164,5 @@ if(WITH_UNITY_BUILD) set_target_properties(bf_nodes_composite PROPERTIES UNITY_BUILD_BATCH_SIZE 10) endif() -# Needed so we can use dna_type_offsets.h for defaults initialization. -add_dependencies(bf_nodes_composite bf_dna) # RNA_prototypes.h add_dependencies(bf_nodes_composite bf_rna) diff --git a/source/blender/nodes/function/CMakeLists.txt b/source/blender/nodes/function/CMakeLists.txt index b1d86497339..6db290c38c1 100644 --- a/source/blender/nodes/function/CMakeLists.txt +++ b/source/blender/nodes/function/CMakeLists.txt @@ -11,7 +11,6 @@ set(INC ../../blentranslation ../../editors/include ../../functions - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/guardedalloc @@ -48,6 +47,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna bf_functions ) diff --git a/source/blender/nodes/geometry/CMakeLists.txt b/source/blender/nodes/geometry/CMakeLists.txt index 9ba6c45c03c..65d388ab5cf 100644 --- a/source/blender/nodes/geometry/CMakeLists.txt +++ b/source/blender/nodes/geometry/CMakeLists.txt @@ -16,7 +16,6 @@ set(INC ../../geometry ../../gpu ../../imbuf - ../../makesdna ../../makesrna ../../render ../../windowmanager @@ -202,6 +201,7 @@ set(SRC set(LIB bf_bmesh + PRIVATE bf::dna bf_functions bf_geometry bf_nodes diff --git a/source/blender/nodes/shader/CMakeLists.txt b/source/blender/nodes/shader/CMakeLists.txt index 95d566d0332..1f351a1f076 100644 --- a/source/blender/nodes/shader/CMakeLists.txt +++ b/source/blender/nodes/shader/CMakeLists.txt @@ -14,7 +14,6 @@ set(INC ../../functions ../../gpu ../../imbuf - ../../makesdna ../../makesrna ../../render ../../windowmanager @@ -129,6 +128,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna bf_functions bf_intern_sky bf_nodes diff --git a/source/blender/nodes/texture/CMakeLists.txt b/source/blender/nodes/texture/CMakeLists.txt index 2ae29460909..0cac2ce9d43 100644 --- a/source/blender/nodes/texture/CMakeLists.txt +++ b/source/blender/nodes/texture/CMakeLists.txt @@ -12,7 +12,6 @@ set(INC ../../blentranslation ../../depsgraph ../../imbuf - ../../makesdna ../../makesrna ../../render ../../windowmanager @@ -61,6 +60,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna bf_nodes ) diff --git a/source/blender/python/bmesh/CMakeLists.txt b/source/blender/python/bmesh/CMakeLists.txt index ac5fa6564b8..75be92bb899 100644 --- a/source/blender/python/bmesh/CMakeLists.txt +++ b/source/blender/python/bmesh/CMakeLists.txt @@ -8,7 +8,6 @@ set(INC ../../blenlib ../../bmesh ../../depsgraph - ../../makesdna ../../../../intern/guardedalloc ) @@ -41,6 +40,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna bf_python_mathutils ${PYTHON_LINKFLAGS} diff --git a/source/blender/python/generic/CMakeLists.txt b/source/blender/python/generic/CMakeLists.txt index 7f2340f36fb..bda96cbbf21 100644 --- a/source/blender/python/generic/CMakeLists.txt +++ b/source/blender/python/generic/CMakeLists.txt @@ -7,7 +7,6 @@ set(INC ../../blenkernel ../../blenlib ../../gpu - ../../makesdna ../../makesrna ../../../../intern/clog ../../../../intern/guardedalloc @@ -46,6 +45,7 @@ set(LIB ${Epoxy_LIBRARIES} ${PYTHON_LINKFLAGS} ${PYTHON_LIBRARIES} + PRIVATE bf::dna ) if(WITH_PYTHON_MODULE) diff --git a/source/blender/python/gpu/CMakeLists.txt b/source/blender/python/gpu/CMakeLists.txt index 0dac9ef617a..83b87c2b710 100644 --- a/source/blender/python/gpu/CMakeLists.txt +++ b/source/blender/python/gpu/CMakeLists.txt @@ -9,7 +9,6 @@ set(INC ../../editors/include ../../gpu ../../imbuf - ../../makesdna ../../../../intern/guardedalloc ) @@ -63,6 +62,7 @@ set(LIB ${Epoxy_LIBRARIES} ${PYTHON_LINKFLAGS} ${PYTHON_LIBRARIES} + PRIVATE bf::dna ) blender_add_lib(bf_python_gpu "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") diff --git a/source/blender/python/intern/CMakeLists.txt b/source/blender/python/intern/CMakeLists.txt index 77588f904b0..4b88c60c2dc 100644 --- a/source/blender/python/intern/CMakeLists.txt +++ b/source/blender/python/intern/CMakeLists.txt @@ -13,7 +13,6 @@ set(INC ../../gpu ../../imbuf ../../imbuf/intern/oiio - ../../makesdna ../../makesrna ../../windowmanager ../../../../intern/clog @@ -123,6 +122,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna bf_editor_animation bf_editor_interface bf_editor_space_api diff --git a/source/blender/python/mathutils/CMakeLists.txt b/source/blender/python/mathutils/CMakeLists.txt index f6fb3910916..16efefbc5e4 100644 --- a/source/blender/python/mathutils/CMakeLists.txt +++ b/source/blender/python/mathutils/CMakeLists.txt @@ -9,7 +9,6 @@ set(INC ../../bmesh ../../depsgraph ../../imbuf - ../../makesdna ../../../../intern/guardedalloc ) @@ -45,6 +44,7 @@ set(SRC set(LIB bf_blenlib + PRIVATE bf::dna bf_imbuf bf_python_ext diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt index 4bb69d9df28..96cc185af63 100644 --- a/source/blender/render/CMakeLists.txt +++ b/source/blender/render/CMakeLists.txt @@ -16,7 +16,6 @@ set(INC ../gpu ../gpu/intern ../imbuf - ../makesdna ../makesrna ../nodes ../sequencer @@ -60,6 +59,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna bf_realtime_compositor PRIVATE bf::intern::atomic ) diff --git a/source/blender/sequencer/CMakeLists.txt b/source/blender/sequencer/CMakeLists.txt index 89ad1054f9b..f05158c5c0c 100644 --- a/source/blender/sequencer/CMakeLists.txt +++ b/source/blender/sequencer/CMakeLists.txt @@ -12,15 +12,12 @@ set(INC ../blentranslation ../depsgraph ../imbuf - ../makesdna ../makesrna ../render ../windowmanager ../../../intern/clog ../../../intern/guardedalloc - # dna_type_offsets.h - ${CMAKE_CURRENT_BINARY_DIR}/../makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -90,6 +87,7 @@ set(SRC set(LIB bf_blenkernel bf_blenlib + PRIVATE bf::dna PRIVATE bf::intern::atomic ) @@ -108,7 +106,5 @@ endif() blender_add_lib(bf_sequencer "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") -# Needed so we can use dna_type_offsets.h. -add_dependencies(bf_sequencer bf_dna) # RNA_prototypes.h add_dependencies(bf_sequencer bf_rna) diff --git a/source/blender/shader_fx/CMakeLists.txt b/source/blender/shader_fx/CMakeLists.txt index 6e4e01c184a..4ec15b557c4 100644 --- a/source/blender/shader_fx/CMakeLists.txt +++ b/source/blender/shader_fx/CMakeLists.txt @@ -12,7 +12,6 @@ set(INC ../bmesh ../depsgraph ../editors/include - ../makesdna ../makesrna ../render ../windowmanager @@ -46,6 +45,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna ) diff --git a/source/blender/simulation/CMakeLists.txt b/source/blender/simulation/CMakeLists.txt index 14cdf946fd8..0934e2208ab 100644 --- a/source/blender/simulation/CMakeLists.txt +++ b/source/blender/simulation/CMakeLists.txt @@ -10,7 +10,6 @@ set(INC ../depsgraph ../functions ../imbuf - ../makesdna ../makesrna ../nodes ../../../intern/guardedalloc @@ -35,6 +34,7 @@ set(SRC set(LIB bf_blenkernel + PRIVATE bf::dna ) if(WITH_OPENMP_STATIC) diff --git a/source/blender/windowmanager/CMakeLists.txt b/source/blender/windowmanager/CMakeLists.txt index a8955c90ccf..0d5cb02e5bf 100644 --- a/source/blender/windowmanager/CMakeLists.txt +++ b/source/blender/windowmanager/CMakeLists.txt @@ -18,7 +18,6 @@ set(INC ../draw ../gpu ../imbuf - ../makesdna ../makesrna ../nodes ../render @@ -29,8 +28,6 @@ set(INC ../../../intern/memutil ../bmesh - # for writefile.c: dna_type_offsets.h - ${CMAKE_BINARY_DIR}/source/blender/makesdna/intern # RNA_prototypes.h ${CMAKE_BINARY_DIR}/source/blender/makesrna ) @@ -102,6 +99,7 @@ set(SRC ) set(LIB + PRIVATE bf::dna bf_editor_screen bf_sequencer ) @@ -204,7 +202,5 @@ endif() blender_add_lib_nolist(bf_windowmanager "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") -# Needed so we can use dna_type_offsets.h for defaults initialization. -add_dependencies(bf_windowmanager bf_dna) # RNA_prototypes.h add_dependencies(bf_windowmanager bf_rna) diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index 8f572d71a81..f1a4298a958 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -13,13 +13,13 @@ set(INC ../blender/imbuf ../blender/io/usd ../blender/bmesh - ../blender/makesdna ../blender/makesrna ../blender/render ../blender/windowmanager ) set(LIB + PRIVATE bf::dna bf_windowmanager ) -- 2.30.2 From d1884e01c85473c98189c68dbfe363c26a8c6f29 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 10 Jul 2023 15:52:10 +0200 Subject: [PATCH 101/115] Cleanup: make format --- scripts/modules/bl_i18n_utils/utils_spell_check.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/modules/bl_i18n_utils/utils_spell_check.py b/scripts/modules/bl_i18n_utils/utils_spell_check.py index 968bf922dc6..8202e05c27b 100644 --- a/scripts/modules/bl_i18n_utils/utils_spell_check.py +++ b/scripts/modules/bl_i18n_utils/utils_spell_check.py @@ -453,7 +453,7 @@ class SpellChecker: "quaternion", "quaternions", "quintic", "samplerate", - "sandboxed", + "sandboxed", "sawtooth", "scrollback", "scrollbar", -- 2.30.2 From fa29d28d731e3010f8fff34a5a14e24783dea847 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Mon, 10 Jul 2023 15:56:33 +0200 Subject: [PATCH 102/115] Fix #109889: Trying to append/link from the current file does give proper error message. Logic in FileBrowser and/or `BKE_blendfile_library_path_explode` probably changed at some point, and the generic 'invalid filetype' error message was reached before the path is compared to current blendfile path. --- .../windowmanager/intern/wm_files_link.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/source/blender/windowmanager/intern/wm_files_link.c b/source/blender/windowmanager/intern/wm_files_link.c index 282c37dfe99..413a3f77128 100644 --- a/source/blender/windowmanager/intern/wm_files_link.c +++ b/source/blender/windowmanager/intern/wm_files_link.c @@ -220,16 +220,23 @@ static int wm_link_append_exec(bContext *C, wmOperator *op) BLI_path_join(filepath, sizeof(filepath), root, relname); /* test if we have a valid data */ - if (!BKE_blendfile_library_path_explode(filepath, libname, &group, &name)) { - BKE_reportf(op->reports, RPT_ERROR, "'%s': not a library", filepath); + const bool is_librarypath_valid = BKE_blendfile_library_path_explode( + filepath, libname, &group, &name); + + /* NOTE: Need to also check filepath, as typically libname is an empty string here (when trying + * to append from current file from the filebrowser e.g.). */ + if (BLI_path_cmp(BKE_main_blendfile_path(bmain), filepath) == 0 || + BLI_path_cmp(BKE_main_blendfile_path(bmain), libname) == 0) + { + BKE_reportf(op->reports, RPT_ERROR, "'%s': cannot use current file as library", filepath); return OPERATOR_CANCELLED; } - if (!group) { + if (!group || !name) { BKE_reportf(op->reports, RPT_ERROR, "'%s': nothing indicated", filepath); return OPERATOR_CANCELLED; } - if (BLI_path_cmp(BKE_main_blendfile_path(bmain), libname) == 0) { - BKE_reportf(op->reports, RPT_ERROR, "'%s': cannot use current file as library", filepath); + if (!is_librarypath_valid) { + BKE_reportf(op->reports, RPT_ERROR, "'%s': not a library", filepath); return OPERATOR_CANCELLED; } -- 2.30.2 From 80f105e924fa2d0ec1880d453d23756caa6026a7 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Mon, 10 Jul 2023 16:02:31 +0200 Subject: [PATCH 103/115] Fix #109462: Incorrect "No Cache" simulation cache invalidation The "No Cache" simulation nodes option effectively changes the cache to work in a "realtime mode" where there are only two states, the current and previous frame. Whenever the current frame doesn't increase, the previous state should reset. This didn't happen properly, and it was hard to verify because the code was shared with the regular "cache on" mode. Instead, separate the caching more in the code, using a different struct to store the two "realtime" states. Also clarify that we don't support animation of the "No Cache" option by disabling support for that in RNA. Pull Request: https://projects.blender.org/blender/blender/pulls/109741 --- .../blenkernel/BKE_simulation_state.hh | 11 +- .../blenkernel/intern/simulation_state.cc | 11 +- source/blender/makesrna/intern/rna_object.cc | 3 +- source/blender/modifiers/intern/MOD_nodes.cc | 161 +++++++++++------- 4 files changed, 109 insertions(+), 77 deletions(-) diff --git a/source/blender/blenkernel/BKE_simulation_state.hh b/source/blender/blenkernel/BKE_simulation_state.hh index 65f788aae27..30c210154d7 100644 --- a/source/blender/blenkernel/BKE_simulation_state.hh +++ b/source/blender/blenkernel/BKE_simulation_state.hh @@ -150,6 +150,13 @@ struct StatesAroundFrame { const ModifierSimulationStateAtFrame *next = nullptr; }; +struct ModifierSimulationCacheRealtime { + std::unique_ptr prev_state; + std::unique_ptr current_state; + SubFrame prev_frame; + SubFrame current_frame; +}; + class ModifierSimulationCache { private: mutable std::mutex states_at_frames_mutex_; @@ -170,6 +177,9 @@ class ModifierSimulationCache { public: CacheState cache_state = CacheState::Valid; + /** A non-persistent cache used only to pass simulation state data from one frame to the next. */ + ModifierSimulationCacheRealtime realtime_cache; + void try_discover_bake(StringRefNull absolute_bake_dir); bool has_state_at_frame(const SubFrame &frame) const; @@ -184,7 +194,6 @@ class ModifierSimulationCache { } void reset(); - void clear_prev_states(); }; /** diff --git a/source/blender/blenkernel/intern/simulation_state.cc b/source/blender/blenkernel/intern/simulation_state.cc index ac4356a8901..f1998d51104 100644 --- a/source/blender/blenkernel/intern/simulation_state.cc +++ b/source/blender/blenkernel/intern/simulation_state.cc @@ -232,20 +232,13 @@ void ModifierSimulationState::ensure_bake_loaded(const bNodeTree &ntree) const bake_loaded_ = true; } -void ModifierSimulationCache::clear_prev_states() -{ - std::lock_guard lock(states_at_frames_mutex_); - std::unique_ptr temp = std::move(states_at_frames_.last()); - states_at_frames_.clear_and_shrink(); - bdata_sharing_.reset(); - states_at_frames_.append(std::move(temp)); -} - void ModifierSimulationCache::reset() { std::lock_guard lock(states_at_frames_mutex_); states_at_frames_.clear(); bdata_sharing_.reset(); + this->realtime_cache.current_state.reset(); + this->realtime_cache.prev_state.reset(); this->cache_state = CacheState::Valid; } diff --git a/source/blender/makesrna/intern/rna_object.cc b/source/blender/makesrna/intern/rna_object.cc index 9cc2443b9ca..65308e7b746 100644 --- a/source/blender/makesrna/intern/rna_object.cc +++ b/source/blender/makesrna/intern/rna_object.cc @@ -3506,7 +3506,8 @@ static void rna_def_object(BlenderRNA *brna) prop = RNA_def_property(srna, "use_simulation_cache", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, nullptr, "flag", OB_FLAG_USE_SIMULATION_CACHE); RNA_def_property_ui_text( - prop, "Use Simulation Cache", "Cache all frames during simulation nodes playback"); + prop, "Use Simulation Cache", "Cache frames during simulation nodes playback"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, nullptr); rna_def_object_visibility(srna); diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc index 1be2ec91596..fc78d9ab88a 100644 --- a/source/blender/modifiers/intern/MOD_nodes.cc +++ b/source/blender/modifiers/intern/MOD_nodes.cc @@ -677,78 +677,115 @@ static void prepare_simulation_states_for_evaluation(const NodesModifierData &nm } } - if (DEG_is_active(ctx.depsgraph)) { + if (ctx.object->flag & OB_FLAG_USE_SIMULATION_CACHE) { + if (DEG_is_active(ctx.depsgraph)) { - { - /* Invalidate cached data on user edits. */ - if (nmd.modifier.flag & eModifierFlag_UserModified) { - if (simulation_cache.cache_state != bke::sim::CacheState::Baked) { - simulation_cache.invalidate(); + { + /* Invalidate cached data on user edits. */ + if (nmd.modifier.flag & eModifierFlag_UserModified) { + if (simulation_cache.cache_state != bke::sim::CacheState::Baked) { + simulation_cache.invalidate(); + } } } - } - { - /* Reset cached data if necessary. */ + { + /* Reset cached data if necessary. */ + const bke::sim::StatesAroundFrame sim_states = simulation_cache.get_states_around_frame( + current_frame); + if (simulation_cache.cache_state == bke::sim::CacheState::Invalid && + (current_frame == start_frame || + (sim_states.current == nullptr && sim_states.prev == nullptr && + sim_states.next != nullptr))) + { + simulation_cache.reset(); + } + } + /* Decide if a new simulation state should be created in this evaluation. */ const bke::sim::StatesAroundFrame sim_states = simulation_cache.get_states_around_frame( current_frame); - if (simulation_cache.cache_state == bke::sim::CacheState::Invalid && - (current_frame == start_frame || - (sim_states.current == nullptr && sim_states.prev == nullptr && - sim_states.next != nullptr))) - { - simulation_cache.reset(); + if (simulation_cache.cache_state != bke::sim::CacheState::Baked) { + if (sim_states.current == nullptr) { + if (is_start_frame || !simulation_cache.has_states()) { + bke::sim::ModifierSimulationState ¤t_sim_state = + simulation_cache.get_state_at_frame_for_write(current_frame); + exec_data.current_simulation_state_for_write = ¤t_sim_state; + exec_data.simulation_time_delta = 0.0f; + if (!is_start_frame) { + /* When starting a new simulation at another frame than the start frame, + * it can't match what would be baked, so invalidate it immediately. */ + simulation_cache.invalidate(); + } + } + else if (sim_states.prev != nullptr && sim_states.next == nullptr) { + const float max_delta_frames = 1.0f; + const float scene_delta_frames = float(current_frame) - float(sim_states.prev->frame); + const float delta_frames = std::min(max_delta_frames, scene_delta_frames); + if (delta_frames != scene_delta_frames) { + simulation_cache.invalidate(); + } + bke::sim::ModifierSimulationState ¤t_sim_state = + simulation_cache.get_state_at_frame_for_write(current_frame); + exec_data.current_simulation_state_for_write = ¤t_sim_state; + const float delta_seconds = delta_frames / FPS; + exec_data.simulation_time_delta = delta_seconds; + } + } } } - /* Decide if a new simulation state should be created in this evaluation. */ + + /* Load read-only states to give nodes access to cached data. */ const bke::sim::StatesAroundFrame sim_states = simulation_cache.get_states_around_frame( current_frame); - if (simulation_cache.cache_state != bke::sim::CacheState::Baked) { - if (sim_states.current == nullptr) { - if (is_start_frame || !simulation_cache.has_states()) { - bke::sim::ModifierSimulationState ¤t_sim_state = - simulation_cache.get_state_at_frame_for_write(current_frame); - exec_data.current_simulation_state_for_write = ¤t_sim_state; - exec_data.simulation_time_delta = 0.0f; - if (!is_start_frame) { - /* When starting a new simulation at another frame than the start frame, it can't match - * what would be baked, so invalidate it immediately. */ - simulation_cache.invalidate(); - } - } - else if (sim_states.prev != nullptr && sim_states.next == nullptr) { - const float max_delta_frames = 1.0f; - const float scene_delta_frames = float(current_frame) - float(sim_states.prev->frame); - const float delta_frames = std::min(max_delta_frames, scene_delta_frames); - if (delta_frames != scene_delta_frames) { - simulation_cache.invalidate(); - } - bke::sim::ModifierSimulationState ¤t_sim_state = - simulation_cache.get_state_at_frame_for_write(current_frame); - exec_data.current_simulation_state_for_write = ¤t_sim_state; - const float delta_seconds = delta_frames / FPS; - exec_data.simulation_time_delta = delta_seconds; - } + if (sim_states.current) { + sim_states.current->state.ensure_bake_loaded(*nmd.node_group); + exec_data.current_simulation_state = &sim_states.current->state; + } + if (sim_states.prev) { + sim_states.prev->state.ensure_bake_loaded(*nmd.node_group); + exec_data.prev_simulation_state = &sim_states.prev->state; + if (sim_states.next) { + sim_states.next->state.ensure_bake_loaded(*nmd.node_group); + exec_data.next_simulation_state = &sim_states.next->state; + exec_data.simulation_state_mix_factor = + (float(current_frame) - float(sim_states.prev->frame)) / + (float(sim_states.next->frame) - float(sim_states.prev->frame)); } } } + else { + if (DEG_is_active(ctx.depsgraph)) { + bke::sim::ModifierSimulationCacheRealtime &realtime_cache = simulation_cache.realtime_cache; - /* Load read-only states to give nodes access to cached data. */ - const bke::sim::StatesAroundFrame sim_states = simulation_cache.get_states_around_frame( - current_frame); - if (sim_states.current) { - sim_states.current->state.ensure_bake_loaded(*nmd.node_group); - exec_data.current_simulation_state = &sim_states.current->state; - } - if (sim_states.prev) { - sim_states.prev->state.ensure_bake_loaded(*nmd.node_group); - exec_data.prev_simulation_state = &sim_states.prev->state; - if (sim_states.next) { - sim_states.next->state.ensure_bake_loaded(*nmd.node_group); - exec_data.next_simulation_state = &sim_states.next->state; - exec_data.simulation_state_mix_factor = - (float(current_frame) - float(sim_states.prev->frame)) / - (float(sim_states.next->frame) - float(sim_states.prev->frame)); + /* Reset the cache when going backwards in time. */ + if (realtime_cache.prev_frame >= current_frame) { + simulation_cache.reset(); + } + + /* Advance in time, making the last "current" state the new "previous" state. */ + realtime_cache.prev_frame = realtime_cache.current_frame; + realtime_cache.prev_state = std::move(realtime_cache.current_state); + if (realtime_cache.prev_state) { + exec_data.prev_simulation_state = realtime_cache.prev_state.get(); + } + + /* Create a new current state used to pass the data to the next frame. */ + realtime_cache.current_state = std::make_unique(); + realtime_cache.current_frame = current_frame; + exec_data.current_simulation_state_for_write = realtime_cache.current_state.get(); + exec_data.current_simulation_state = exec_data.current_simulation_state_for_write; + + /* Calculate the delta time. */ + if (realtime_cache.prev_state) { + const float max_delta_frames = 1.0f; + const float scene_delta_frames = float(current_frame) - float(realtime_cache.prev_frame); + const float delta_frames = std::min(max_delta_frames, scene_delta_frames); + const float delta_seconds = delta_frames / FPS; + exec_data.simulation_time_delta = delta_seconds; + } + else { + exec_data.simulation_time_delta = 0.0f; + } } } } @@ -841,14 +878,6 @@ static void modifyGeometry(ModifierData *md, nmd_orig->runtime_eval_log = eval_log.release(); } - if (DEG_is_active(ctx->depsgraph)) { - /* When caching is turned off, remove all states except the last which was just created in this - * evaluation. Check if active status to avoid changing original data in other depsgraphs. */ - if (!(ctx->object->flag & OB_FLAG_USE_SIMULATION_CACHE)) { - nmd_orig->simulation_cache->ptr->clear_prev_states(); - } - } - if (use_orig_index_verts || use_orig_index_edges || use_orig_index_polys) { if (Mesh *mesh = geometry_set.get_mesh_for_write()) { /* Add #CD_ORIGINDEX layers if they don't exist already. This is required because the -- 2.30.2 From baf1c79668b6e1c146308c751191dd76d01053a9 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Mon, 10 Jul 2023 10:09:36 -0400 Subject: [PATCH 104/115] Geometry Nodes: Remove assets loading warning from 3D view header This isn't really helpful at this point, and is ugly/distracting when starting Blender. It's not that bad if more menus show up with a bit of a delay anyway. --- source/blender/editors/geometry/node_group_operator.cc | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/source/blender/editors/geometry/node_group_operator.cc b/source/blender/editors/geometry/node_group_operator.cc index 183d4819763..d564769e87c 100644 --- a/source/blender/editors/geometry/node_group_operator.cc +++ b/source/blender/editors/geometry/node_group_operator.cc @@ -505,14 +505,9 @@ void ui_template_node_operator_asset_root_items(uiLayout &layout, bContext &C) } asset::AssetItemTree &tree = get_static_item_tree(); tree = build_catalog_tree(C); - - const bool loading_finished = all_loading_finished(); - if (tree.catalogs.is_empty() && loading_finished) { + if (tree.catalogs.is_empty()) { return; } - if (!loading_finished) { - uiItemL(&layout, IFACE_("Loading Asset Libraries"), ICON_INFO); - } asset_system::AssetLibrary *all_library = ED_assetlist_library_get_once_available( asset_system::all_library_reference()); -- 2.30.2 From d579ac2b3f80f729951c83fe67d996e5adad8760 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 10 Jul 2023 16:33:32 +0200 Subject: [PATCH 105/115] Refactor: Use ImBuf to store passes in RenderResult Doing so avoids having duplicated logic for working with pixel data which is being passed throughout the render pipeline. Notable changes: - ImBug can now store GPU texture. This is not very finished part of the API, which will be worked further to support tiling for very-high-res images. - Implicit sharing is removed from the image buffer, as it is no longer needed. There should be no functional changes on user level with this change. Ref #108618 Pull Request: https://projects.blender.org/blender/blender/pulls/109788 --- source/blender/blenkernel/intern/image.cc | 123 ++------ .../blender/blenkernel/intern/image_save.cc | 19 +- .../operations/COM_CompositorOperation.cc | 3 +- .../draw/engines/eevee/eevee_cryptomatte.c | 4 +- .../blender/draw/engines/eevee/eevee_render.c | 4 +- .../draw/engines/eevee_next/eevee_instance.cc | 5 +- .../draw/engines/gpencil/gpencil_render.c | 10 +- .../engines/workbench/workbench_engine.cc | 9 +- .../draw/engines/workbench/workbench_render.c | 6 +- .../interface/eyedroppers/eyedropper_color.cc | 2 +- .../blender/editors/render/render_internal.cc | 13 +- .../blender/editors/render/render_opengl.cc | 6 +- .../blender/editors/render/render_preview.cc | 19 +- .../editors/space_image/image_buttons.c | 8 +- .../blender_interface/FRS_freestyle.cpp | 4 +- source/blender/imbuf/IMB_imbuf.h | 20 +- source/blender/imbuf/IMB_imbuf_types.h | 27 +- source/blender/imbuf/intern/allocimbuf.cc | 80 +---- source/blender/makesrna/intern/rna_render.cc | 24 +- source/blender/render/RE_pipeline.h | 102 ++---- source/blender/render/intern/compositor.cc | 5 +- source/blender/render/intern/engine.cc | 8 +- source/blender/render/intern/pipeline.cc | 42 +-- source/blender/render/intern/render_result.cc | 290 +++++++----------- source/blender/sequencer/intern/render.c | 10 +- 25 files changed, 315 insertions(+), 528 deletions(-) diff --git a/source/blender/blenkernel/intern/image.cc b/source/blender/blenkernel/intern/image.cc index 5d12e6815ad..3850c11b371 100644 --- a/source/blender/blenkernel/intern/image.cc +++ b/source/blender/blenkernel/intern/image.cc @@ -3987,12 +3987,9 @@ static ImBuf *image_load_sequence_multilayer(Image *ima, ImageUser *iuser, int e if (ima->rr) { RenderPass *rpass = BKE_image_multilayer_index(ima->rr, iuser); - if (rpass) { - // printf("load from pass %s\n", rpass->name); - ibuf = IMB_allocImBuf(ima->rr->rectx, ima->rr->recty, 32, 0); - ibuf->channels = rpass->channels; - - IMB_assign_shared_float_buffer(ibuf, rpass->buffer.data, rpass->buffer.sharing_info); + if (rpass && rpass->ibuf) { + ibuf = rpass->ibuf; + IMB_refImBuf(ibuf); BKE_imbuf_stamp_info(ima->rr, ibuf); @@ -4295,15 +4292,12 @@ static ImBuf *image_get_ibuf_multilayer(Image *ima, ImageUser *iuser) if (ima->rr) { RenderPass *rpass = BKE_image_multilayer_index(ima->rr, iuser); - if (rpass) { - ibuf = IMB_allocImBuf(ima->rr->rectx, ima->rr->recty, 32, 0); + if (rpass && rpass->ibuf) { + ibuf = rpass->ibuf; + IMB_refImBuf(ibuf); image_init_after_load(ima, iuser, ibuf); - IMB_assign_shared_float_buffer(ibuf, rpass->buffer.data, rpass->buffer.sharing_info); - - ibuf->channels = rpass->channels; - BKE_imbuf_stamp_info(ima->rr, ibuf); image_assign_ibuf(ima, ibuf, iuser ? iuser->multi_index : IMA_NO_INDEX, 0); @@ -4318,15 +4312,10 @@ static ImBuf *image_get_ibuf_multilayer(Image *ima, ImageUser *iuser) /* always returns a single ibuf, also during render progress */ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **r_lock) { - Render *re; RenderView *rv; - RenderBuffer *combined_buffer; - RenderByteBuffer *byte_buffer; + ImBuf *pass_ibuf = nullptr; float dither; - int channels, layer, pass; - ImBuf *ibuf; - int from_render = (ima->render_slot == ima->last_render_slot); - int actview; + const int from_render = (ima->render_slot == ima->last_render_slot); if (!(iuser && iuser->scene)) { return nullptr; @@ -4337,12 +4326,11 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **r_loc return nullptr; } - re = RE_GetSceneRender(iuser->scene); + Render *re = RE_GetSceneRender(iuser->scene); - channels = 4; - layer = iuser->layer; - pass = iuser->pass; - actview = iuser->view; + const int layer = iuser->layer; + const int pass = iuser->pass; + int actview = iuser->view; if (BKE_image_is_stereo(ima) && (iuser->flag & IMA_SHOW_STEREO)) { actview = iuser->multiview_eye; @@ -4355,7 +4343,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **r_loc } else if ((slot = BKE_image_get_renderslot(ima, ima->render_slot))->render) { rres = *(slot->render); - rres.have_combined = ((RenderView *)rres.views.first)->combined_buffer.data != nullptr; + rres.have_combined = ((RenderView *)rres.views.first)->ibuf != nullptr; } if (!(rres.rectx > 0 && rres.recty > 0)) { @@ -4380,12 +4368,10 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **r_loc /* this gives active layer, composite or sequence result */ if (rv == nullptr) { - byte_buffer = &rres.byte_buffer; - combined_buffer = &rres.combined_buffer; + pass_ibuf = rres.ibuf; } else { - byte_buffer = &rv->byte_buffer; - combined_buffer = &rv->combined_buffer; + pass_ibuf = rv->ibuf; } dither = iuser->scene->r.dither_intensity; @@ -4394,13 +4380,8 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **r_loc if (rres.have_combined && layer == 0) { /* pass */ } - else if (byte_buffer && byte_buffer->data && layer == 0) { - /* rect32 is set when there's a Sequence pass, this pass seems - * to have layer=0 (this is from image_buttons.c) - * in this case we ignore float buffer, because it could have - * hung from previous pass which was float - */ - combined_buffer = nullptr; + else if (pass_ibuf && pass_ibuf->byte_buffer.data && layer == 0) { + /* pass */ } else if (rres.layers.first) { RenderLayer *rl = static_cast( @@ -4408,78 +4389,24 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **r_loc if (rl) { RenderPass *rpass = image_render_pass_get(rl, pass, actview, nullptr); if (rpass) { - combined_buffer = &rpass->buffer; + pass_ibuf = rpass->ibuf; if (pass != 0) { - channels = rpass->channels; dither = 0.0f; /* don't dither passes */ } } } } - ibuf = image_get_cached_ibuf_for_index_entry(ima, IMA_NO_INDEX, 0, nullptr); + if (pass_ibuf) { + /* TODO(sergey): Perhaps its better to assign dither when ImBuf is allocated for the render + * result. It will avoid modification here, and allow comparing render results with different + * dither applied to them. */ + pass_ibuf->dither = dither; - /* make ibuf if needed, and initialize it */ - if (ibuf == nullptr) { - ibuf = IMB_allocImBuf(rres.rectx, rres.recty, 32, 0); - image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0); + IMB_refImBuf(pass_ibuf); } - /* Set color space settings for a byte buffer. - * - * This is mainly to make it so color management treats byte buffer - * from render result with Save Buffers enabled as final display buffer - * and doesn't apply any color management on it. - * - * For other cases we need to be sure it stays to default byte buffer space. - */ - if (ibuf->byte_buffer.data != byte_buffer->data) { - const char *colorspace = IMB_colormanagement_role_colorspace_name_get(COLOR_ROLE_DEFAULT_BYTE); - IMB_colormanagement_assign_byte_colorspace(ibuf, colorspace); - } - - /* invalidate color managed buffers if render result changed */ - BLI_thread_lock(LOCK_COLORMANAGE); - if (combined_buffer && (ibuf->x != rres.rectx || ibuf->y != rres.recty || - ibuf->float_buffer.data != combined_buffer->data)) - { - ibuf->userflags |= IB_DISPLAY_BUFFER_INVALID; - } - - ibuf->x = rres.rectx; - ibuf->y = rres.recty; - ibuf->channels = channels; - - imb_freerectImBuf(ibuf); - - if (byte_buffer) { - IMB_assign_shared_byte_buffer(ibuf, byte_buffer->data, byte_buffer->sharing_info); - } - else { - IMB_assign_byte_buffer(ibuf, nullptr, IB_DO_NOT_TAKE_OWNERSHIP); - } - - if (combined_buffer) { - IMB_assign_shared_float_buffer(ibuf, combined_buffer->data, combined_buffer->sharing_info); - } - else { - IMB_assign_float_buffer(ibuf, nullptr, IB_DO_NOT_TAKE_OWNERSHIP); - } - - /* TODO(sergey): Make this faster by either simply referencing the stamp - * or by changing both ImBuf and RenderResult to use same data type to - * store metadata. */ - if (ibuf->metadata != nullptr) { - IMB_metadata_free(ibuf->metadata); - ibuf->metadata = nullptr; - } - BKE_imbuf_stamp_info(&rres, ibuf); - - BLI_thread_unlock(LOCK_COLORMANAGE); - - ibuf->dither = dither; - - return ibuf; + return pass_ibuf; } static int image_get_multiview_index(Image *ima, ImageUser *iuser) diff --git a/source/blender/blenkernel/intern/image_save.cc b/source/blender/blenkernel/intern/image_save.cc index 4629dba5852..438fa729a4a 100644 --- a/source/blender/blenkernel/intern/image_save.cc +++ b/source/blender/blenkernel/intern/image_save.cc @@ -736,7 +736,7 @@ bool BKE_image_render_write_exr(ReportList *reports, /* Compositing result. */ if (rr->have_combined) { LISTBASE_FOREACH (RenderView *, rview, &rr->views) { - if (!rview->combined_buffer.data) { + if (!rview->ibuf || !rview->ibuf->float_buffer.data) { continue; } @@ -757,8 +757,8 @@ bool BKE_image_render_write_exr(ReportList *reports, float *output_rect = (save_as_render) ? image_exr_from_scene_linear_to_output( - rview->combined_buffer.data, rr->rectx, rr->recty, 4, imf, tmp_output_rects) : - rview->combined_buffer.data; + rview->ibuf->float_buffer.data, rr->rectx, rr->recty, 4, imf, tmp_output_rects) : + rview->ibuf->float_buffer.data; for (int a = 0; a < channels; a++) { char passname[EXR_PASS_MAXNAME]; @@ -814,11 +814,14 @@ bool BKE_image_render_write_exr(ReportList *reports, const bool pass_half_float = half_float && pass_RGBA; /* Color-space conversion only happens on RGBA passes. */ - float *output_rect = - (save_as_render && pass_RGBA) ? - image_exr_from_scene_linear_to_output( - rp->buffer.data, rr->rectx, rr->recty, rp->channels, imf, tmp_output_rects) : - rp->buffer.data; + float *output_rect = (save_as_render && pass_RGBA) ? + image_exr_from_scene_linear_to_output(rp->ibuf->float_buffer.data, + rr->rectx, + rr->recty, + rp->channels, + imf, + tmp_output_rects) : + rp->ibuf->float_buffer.data; for (int a = 0; a < std::min(channels, rp->channels); a++) { /* Save Combined as RGBA or RGB if single layer save. */ diff --git a/source/blender/compositor/operations/COM_CompositorOperation.cc b/source/blender/compositor/operations/COM_CompositorOperation.cc index d941e54893e..5f73e9c5631 100644 --- a/source/blender/compositor/operations/COM_CompositorOperation.cc +++ b/source/blender/compositor/operations/COM_CompositorOperation.cc @@ -59,8 +59,9 @@ void CompositorOperation::deinit_execution() if (rr) { RenderView *rv = RE_RenderViewGetByName(rr, view_name_); + ImBuf *ibuf = RE_RenderViewEnsureImBuf(rr, rv); - RE_RenderBuffer_assign_data(&rv->combined_buffer, output_buffer_); + IMB_assign_float_buffer(ibuf, output_buffer_, IB_TAKE_OWNERSHIP); rr->have_combined = true; } diff --git a/source/blender/draw/engines/eevee/eevee_cryptomatte.c b/source/blender/draw/engines/eevee/eevee_cryptomatte.c index f9754d366ab..fcc02164439 100644 --- a/source/blender/draw/engines/eevee/eevee_cryptomatte.c +++ b/source/blender/draw/engines/eevee/eevee_cryptomatte.c @@ -46,6 +46,8 @@ #include "DNA_modifier_types.h" #include "DNA_particle_types.h" +#include "IMB_imbuf_types.h" + #include "eevee_private.h" /* -------------------------------------------------------------------- */ @@ -582,7 +584,7 @@ static void eevee_cryptomatte_extract_render_passes( const int pass_offset = pass * 2; SNPRINTF_RLEN(cryptomatte_pass_name, render_pass_name_format, pass); RenderPass *rp_object = RE_pass_find_by_name(rl, cryptomatte_pass_name, viewname); - float *rp_buffer_data = rp_object->buffer.data; + float *rp_buffer_data = rp_object->ibuf->float_buffer.data; for (int y = 0; y < rect_height; y++) { for (int x = 0; x < rect_width; x++) { const int accum_buffer_offset = (rect_offset_x + x + diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c index 446fd25731b..981ae178f64 100644 --- a/source/blender/draw/engines/eevee/eevee_render.c +++ b/source/blender/draw/engines/eevee/eevee_render.c @@ -31,6 +31,8 @@ #include "RE_pipeline.h" +#include "IMB_imbuf_types.h" + #include "eevee_private.h" bool EEVEE_render_init(EEVEE_Data *ved, RenderEngine *engine, Depsgraph *depsgraph) @@ -267,7 +269,7 @@ static void eevee_render_color_result(RenderLayer *rl, num_channels, 0, GPU_DATA_FLOAT, - rp->buffer.data); + rp->ibuf->float_buffer.data); } static void eevee_render_result_combined(RenderLayer *rl, diff --git a/source/blender/draw/engines/eevee_next/eevee_instance.cc b/source/blender/draw/engines/eevee_next/eevee_instance.cc index 7d95631a127..44450299725 100644 --- a/source/blender/draw/engines/eevee_next/eevee_instance.cc +++ b/source/blender/draw/engines/eevee_next/eevee_instance.cc @@ -17,6 +17,7 @@ #include "DNA_ID.h" #include "DNA_lightprobe_types.h" #include "DNA_modifier_types.h" +#include "IMB_imbuf_types.h" #include "RE_pipeline.h" #include "eevee_engine.h" @@ -362,7 +363,9 @@ void Instance::render_read_result(RenderLayer *render_layer, const char *view_na RenderPass *vector_rp = RE_pass_find_by_name( render_layer, vector_pass_name.c_str(), view_name); if (vector_rp) { - memset(vector_rp->buffer.data, 0, sizeof(float) * 4 * vector_rp->rectx * vector_rp->recty); + memset(vector_rp->ibuf->float_buffer.data, + 0, + sizeof(float) * 4 * vector_rp->rectx * vector_rp->recty); } } } diff --git a/source/blender/draw/engines/gpencil/gpencil_render.c b/source/blender/draw/engines/gpencil/gpencil_render.c index a63ffef377c..d110a97fddb 100644 --- a/source/blender/draw/engines/gpencil/gpencil_render.c +++ b/source/blender/draw/engines/gpencil/gpencil_render.c @@ -17,6 +17,8 @@ #include "RE_pipeline.h" +#include "IMB_imbuf_types.h" + #include "gpencil_engine.h" void GPENCIL_render_init(GPENCIL_Data *vedata, @@ -50,8 +52,8 @@ void GPENCIL_render_init(GPENCIL_Data *vedata, RenderPass *rpass_z_src = RE_pass_find_by_name(render_layer, RE_PASSNAME_Z, viewname); RenderPass *rpass_col_src = RE_pass_find_by_name(render_layer, RE_PASSNAME_COMBINED, viewname); - float *pix_z = (rpass_z_src) ? rpass_z_src->buffer.data : NULL; - float *pix_col = (rpass_col_src) ? rpass_col_src->buffer.data : NULL; + float *pix_z = (rpass_z_src) ? rpass_z_src->ibuf->float_buffer.data : NULL; + float *pix_col = (rpass_col_src) ? rpass_col_src->ibuf->float_buffer.data : NULL; if (!pix_z || !pix_col) { RE_engine_set_error_message(engine, @@ -161,7 +163,7 @@ static void GPENCIL_render_result_z(RenderLayer *rl, if ((view_layer->passflag & SCE_PASS_Z) != 0) { RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_Z, viewname); - float *ro_buffer_data = rp->buffer.data; + float *ro_buffer_data = rp->ibuf->float_buffer.data; GPU_framebuffer_read_depth(vedata->fbl->render_fb, rect->xmin, @@ -223,7 +225,7 @@ static void GPENCIL_render_result_combined(RenderLayer *rl, 4, 0, GPU_DATA_FLOAT, - rp->buffer.data); + rp->ibuf->float_buffer.data); } void GPENCIL_render_to_image(void *ved, diff --git a/source/blender/draw/engines/workbench/workbench_engine.cc b/source/blender/draw/engines/workbench/workbench_engine.cc index 81509ad5f0f..9c70b8ac514 100644 --- a/source/blender/draw/engines/workbench/workbench_engine.cc +++ b/source/blender/draw/engines/workbench/workbench_engine.cc @@ -14,6 +14,7 @@ #include "ED_paint.h" #include "ED_view3d.h" #include "GPU_capabilities.h" +#include "IMB_imbuf_types.h" #include "draw_common.hh" #include "draw_sculpt.hh" @@ -656,7 +657,7 @@ static void write_render_color_output(RenderLayer *layer, 4, 0, GPU_DATA_FLOAT, - rp->buffer.data); + rp->ibuf->float_buffer.data); } } @@ -675,13 +676,13 @@ static void write_render_z_output(RenderLayer *layer, BLI_rcti_size_x(rect), BLI_rcti_size_y(rect), GPU_DATA_FLOAT, - rp->buffer.data); + rp->ibuf->float_buffer.data); int pix_num = BLI_rcti_size_x(rect) * BLI_rcti_size_y(rect); /* Convert GPU depth [0..1] to view Z [near..far] */ if (DRW_view_is_persp_get(nullptr)) { - for (float &z : MutableSpan(rp->buffer.data, pix_num)) { + for (float &z : MutableSpan(rp->ibuf->float_buffer.data, pix_num)) { if (z == 1.0f) { z = 1e10f; /* Background */ } @@ -697,7 +698,7 @@ static void write_render_z_output(RenderLayer *layer, float far = DRW_view_far_distance_get(nullptr); float range = fabsf(far - near); - for (float &z : MutableSpan(rp->buffer.data, pix_num)) { + for (float &z : MutableSpan(rp->ibuf->float_buffer.data, pix_num)) { if (z == 1.0f) { z = 1e10f; /* Background */ } diff --git a/source/blender/draw/engines/workbench/workbench_render.c b/source/blender/draw/engines/workbench/workbench_render.c index a965e888b88..d8ef38108ff 100644 --- a/source/blender/draw/engines/workbench/workbench_render.c +++ b/source/blender/draw/engines/workbench/workbench_render.c @@ -24,6 +24,8 @@ #include "DEG_depsgraph.h" #include "DEG_depsgraph_query.h" +#include "IMB_imbuf_types.h" + #include "RE_pipeline.h" #include "workbench_private.h" @@ -104,7 +106,7 @@ static void workbench_render_result_z(RenderLayer *rl, const char *viewname, con if ((view_layer->passflag & SCE_PASS_Z) != 0) { RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_Z, viewname); - float *rp_buffer_data = rp->buffer.data; + float *rp_buffer_data = rp->ibuf->float_buffer.data; GPU_framebuffer_bind(dfbl->default_fb); GPU_framebuffer_read_depth(dfbl->default_fb, @@ -208,7 +210,7 @@ void workbench_render(void *ved, RenderEngine *engine, RenderLayer *render_layer 4, 0, GPU_DATA_FLOAT, - rp->buffer.data); + rp->ibuf->float_buffer.data); workbench_render_result_z(render_layer, viewname, rect); } diff --git a/source/blender/editors/interface/eyedroppers/eyedropper_color.cc b/source/blender/editors/interface/eyedroppers/eyedropper_color.cc index 7ad8ddbe1b9..5709fd098f5 100644 --- a/source/blender/editors/interface/eyedroppers/eyedropper_color.cc +++ b/source/blender/editors/interface/eyedroppers/eyedropper_color.cc @@ -182,7 +182,7 @@ static bool eyedropper_cryptomatte_sample_renderlayer_fl(RenderLayer *render_lay const int y = int(fpos[1] * render_pass->recty); const int offset = 4 * (y * render_pass->rectx + x); zero_v3(r_col); - r_col[0] = render_pass->buffer.data[offset]; + r_col[0] = render_pass->ibuf->float_buffer.data[offset]; return true; } } diff --git a/source/blender/editors/render/render_internal.cc b/source/blender/editors/render/render_internal.cc index 5b0102fbd10..4a022bca06b 100644 --- a/source/blender/editors/render/render_internal.cc +++ b/source/blender/editors/render/render_internal.cc @@ -204,16 +204,19 @@ static void image_buffer_rect_update(RenderJob *rj, */ /* TODO(sergey): Need to check has_combined here? */ if (iuser->pass == 0) { - RenderView *rv; const int view_id = BKE_scene_multiview_view_id_get(&scene->r, viewname); - rv = RE_RenderViewGetById(rr, view_id); + const RenderView *rv = RE_RenderViewGetById(rr, view_id); + + if (rv->ibuf == nullptr) { + return; + } /* find current float rect for display, first case is after composite... still weak */ - if (rv->combined_buffer.data) { - rectf = rv->combined_buffer.data; + if (rv->ibuf->float_buffer.data) { + rectf = rv->ibuf->float_buffer.data; } else { - if (rv->byte_buffer.data) { + if (rv->ibuf->byte_buffer.data) { /* special case, currently only happens with sequencer rendering, * which updates the whole frame, so we can only mark display buffer * as invalid here (sergey) diff --git a/source/blender/editors/render/render_opengl.cc b/source/blender/editors/render/render_opengl.cc index 0da07b2da9f..578559cf792 100644 --- a/source/blender/editors/render/render_opengl.cc +++ b/source/blender/editors/render/render_opengl.cc @@ -194,8 +194,7 @@ static void screen_opengl_views_setup(OGLRender *oglrender) RenderView *rv_del = rv->next; BLI_remlink(&rr->views, rv_del); - RE_RenderBuffer_data_free(&rv_del->combined_buffer); - RE_RenderByteBuffer_data_free(&rv_del->byte_buffer); + IMB_freeImBuf(rv_del->ibuf); MEM_freeN(rv_del); } @@ -219,8 +218,7 @@ static void screen_opengl_views_setup(OGLRender *oglrender) BLI_remlink(&rr->views, rv_del); - RE_RenderBuffer_data_free(&rv_del->combined_buffer); - RE_RenderByteBuffer_data_free(&rv_del->byte_buffer); + IMB_freeImBuf(rv_del->ibuf); MEM_freeN(rv_del); } diff --git a/source/blender/editors/render/render_preview.cc b/source/blender/editors/render/render_preview.cc index 8f02729c11e..eafbc3e11c8 100644 --- a/source/blender/editors/render/render_preview.cc +++ b/source/blender/editors/render/render_preview.cc @@ -668,7 +668,7 @@ static bool ed_preview_draw_rect( rv = nullptr; } - if (rv && rv->combined_buffer.data) { + if (rv && rv->ibuf) { if (abs(rres.rectx - newx) < 2 && abs(rres.recty - newy) < 2) { newrect->xmax = max_ii(newrect->xmax, rect->xmin + rres.rectx + offx); newrect->ymax = max_ii(newrect->ymax, rect->ymin + rres.recty); @@ -677,13 +677,8 @@ static bool ed_preview_draw_rect( float fx = rect->xmin + offx; float fy = rect->ymin; - ImBuf *ibuf = IMB_allocImBuf(rres.rectx, rres.recty, 0, 0); - IMB_assign_float_buffer(ibuf, rv->combined_buffer.data, IB_DO_NOT_TAKE_OWNERSHIP); - ED_draw_imbuf( - ibuf, fx, fy, false, &scene->view_settings, &scene->display_settings, 1.0f, 1.0f); - - IMB_freeImBuf(ibuf); + rv->ibuf, fx, fy, false, &scene->view_settings, &scene->display_settings, 1.0f, 1.0f); ok = true; } @@ -1062,9 +1057,11 @@ static void shader_preview_texture(ShaderPreview *sp, Tex *tex, Scene *sce, Rend /* Create buffer in empty RenderView created in the init step. */ RenderResult *rr = RE_AcquireResultWrite(re); RenderView *rv = (RenderView *)rr->views.first; - RE_RenderBuffer_assign_data(&rv->combined_buffer, - static_cast(MEM_callocN(sizeof(float[4]) * width * height, - "texture render result"))); + ImBuf *rv_ibuf = RE_RenderViewEnsureImBuf(rr, rv); + IMB_assign_float_buffer(rv_ibuf, + static_cast(MEM_callocN(sizeof(float[4]) * width * height, + "texture render result")), + IB_TAKE_OWNERSHIP); RE_ReleaseResult(re); /* Get texture image pool (if any) */ @@ -1072,7 +1069,7 @@ static void shader_preview_texture(ShaderPreview *sp, Tex *tex, Scene *sce, Rend BKE_texture_fetch_images_for_pool(tex, img_pool); /* Fill in image buffer. */ - float *rect_float = rv->combined_buffer.data; + float *rect_float = rv_ibuf->float_buffer.data; float tex_coord[3] = {0.0f, 0.0f, 0.0f}; bool color_manage = BKE_scene_check_color_management_enabled(sce); diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c index f06b08e0279..a511d7b9e6e 100644 --- a/source/blender/editors/space_image/image_buttons.c +++ b/source/blender/editors/space_image/image_buttons.c @@ -128,10 +128,14 @@ static bool ui_imageuser_slot_menu_step(bContext *C, int direction, void *image_ static const char *ui_imageuser_layer_fake_name(RenderResult *rr) { RenderView *rv = RE_RenderViewGetById(rr, 0); - if (rv->combined_buffer.data) { + ImBuf *ibuf = rv->ibuf; + if (!ibuf) { + return NULL; + } + if (ibuf->float_buffer.data) { return IFACE_("Composite"); } - if (rv->byte_buffer.data) { + if (ibuf->byte_buffer.data) { return IFACE_("Sequence"); } return NULL; diff --git a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp index 068724027f2..304c486f7eb 100644 --- a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp +++ b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp @@ -47,6 +47,8 @@ using namespace Freestyle; #include "DEG_depsgraph_query.h" +#include "IMB_imbuf.h" + #include "pipeline.hh" #include "FRS_freestyle.h" @@ -447,7 +449,7 @@ static void prepare(Render *re, ViewLayer *view_layer, Depsgraph *depsgraph) RenderLayer *rl = RE_GetRenderLayer(re->result, view_layer->name); bool diffuse = false, z = false; for (RenderPass *rpass = (RenderPass *)rl->passes.first; rpass; rpass = rpass->next) { - float *rpass_buffer_data = rpass->buffer.data; + float *rpass_buffer_data = rpass->ibuf->float_buffer.data; if (STREQ(rpass->name, RE_PASSNAME_DIFFUSE_COLOR)) { controller->setPassDiffuse(rpass_buffer_data, rpass->rectx, rpass->recty); diffuse = true; diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h index 616dc8db181..49128a6ec08 100644 --- a/source/blender/imbuf/IMB_imbuf.h +++ b/source/blender/imbuf/IMB_imbuf.h @@ -44,7 +44,6 @@ #include "../blenlib/BLI_sys_types.h" #include "../gpu/GPU_texture.h" -#include "BLI_implicit_sharing.h" #include "BLI_utildefines.h" #include "IMB_imbuf_types.h" @@ -152,19 +151,6 @@ struct ImBuf *IMB_allocFromBuffer(const uint8_t *byte_buffer, unsigned int h, unsigned int channels); -/** - * Assign the content of the corresponding buffer using an implicitly shareable data pointer. - * - * \note Does not modify the topology (width, height, number of channels) - * or the mipmaps in any way. - */ -void IMB_assign_shared_byte_buffer(struct ImBuf *ibuf, - uint8_t *buffer_data, - const ImplicitSharingInfoHandle *implicit_sharing); -void IMB_assign_shared_float_buffer(struct ImBuf *ibuf, - float *buffer_data, - const ImplicitSharingInfoHandle *implicit_sharing); - /** * Assign the content of the corresponding buffer with the given data and ownership. * The current content of the buffer is released corresponding to its ownership configuration. @@ -847,9 +833,13 @@ bool imb_addrectfloatImBuf(struct ImBuf *ibuf, const unsigned int channels); void imb_freerectfloatImBuf(struct ImBuf *ibuf); void imb_freemipmapImBuf(struct ImBuf *ibuf); -/** Free all pixel data (associated with image size). */ +/** Free all CPU pixel data (associated with image size). */ void imb_freerectImbuf_all(struct ImBuf *ibuf); +/* Free the GPU textures of the given image buffer, leaving the CPU buffers unchanged. + * The ibuf can be nullptr, in which case the function does nothing. */ +void IMB_free_gpu_textures(struct ImBuf *ibuf); + /** * Threaded processors. */ diff --git a/source/blender/imbuf/IMB_imbuf_types.h b/source/blender/imbuf/IMB_imbuf_types.h index c8d3879235d..ad628b605d4 100644 --- a/source/blender/imbuf/IMB_imbuf_types.h +++ b/source/blender/imbuf/IMB_imbuf_types.h @@ -4,12 +4,12 @@ #pragma once -#include "BLI_implicit_sharing.h" - #include "DNA_vec_types.h" /* for rcti */ #include "BLI_sys_types.h" +struct GPUTexture; + #ifdef __cplusplus extern "C" { #endif @@ -172,17 +172,14 @@ typedef enum ImBufOwnership { /* Different storage specialization. * - * Note on the implicit sharing - * ---------------------------- + * NOTE: Avoid direct assignments and allocations, use the buffer utilities from the IMB_imbuf.h + * instead. * - * The buffer allows implicitly sharing data with other users of such data. In this case the - * ownership is set to IB_DO_NOT_TAKE_OWNERSHIP. */ -/* TODO(sergey): Once everything is C++ replace with a template. */ + * Accessing the data pointer directly is fine and is an expected way of accessing it. */ typedef struct ImBufByteBuffer { uint8_t *data; ImBufOwnership ownership; - const ImplicitSharingInfoHandle *implicit_sharing; struct ColorSpace *colorspace; } ImBufByteBuffer; @@ -190,11 +187,20 @@ typedef struct ImBufByteBuffer { typedef struct ImBufFloatBuffer { float *data; ImBufOwnership ownership; - const ImplicitSharingInfoHandle *implicit_sharing; struct ColorSpace *colorspace; } ImBufFloatBuffer; +typedef struct ImBufGPU { + /* Texture which corresponds to the state of the ImBug on the GPU. + * + * Allocation is supposed to happen outside of the ImBug module from a proper GPU context. + * De-referencing the ImBuf or its GPU texture can happen from any state. */ + /* TODO(sergey): This should become a list of textures, to support having high-res ImBuf on GPU + * without hitting hardware limitations. */ + struct GPUTexture *texture; +} ImBufGPU; + /** \} */ /* -------------------------------------------------------------------- */ @@ -236,6 +242,9 @@ typedef struct ImBuf { */ ImBufFloatBuffer float_buffer; + /* Image buffer on the GPU. */ + ImBufGPU gpu; + /** Resolution in pixels per meter. Multiply by `0.0254` for DPI. */ double ppm[2]; diff --git a/source/blender/imbuf/intern/allocimbuf.cc b/source/blender/imbuf/intern/allocimbuf.cc index 745c932efd7..ac09242ec6c 100644 --- a/source/blender/imbuf/intern/allocimbuf.cc +++ b/source/blender/imbuf/intern/allocimbuf.cc @@ -23,10 +23,11 @@ #include "MEM_guardedalloc.h" -#include "BLI_implicit_sharing.hh" #include "BLI_threads.h" #include "BLI_utildefines.h" +#include "GPU_texture.h" + static SpinLock refcounter_spin; void imb_refcounter_lock_init() @@ -67,16 +68,12 @@ void imb_mmap_unlock() * buffer to its defaults. */ template static void imb_free_buffer(BufferType &buffer) { - if (buffer.implicit_sharing) { - blender::implicit_sharing::free_shared_data(&buffer.data, &buffer.implicit_sharing); - } - else if (buffer.data) { + if (buffer.data) { switch (buffer.ownership) { case IB_DO_NOT_TAKE_OWNERSHIP: break; case IB_TAKE_OWNERSHIP: - BLI_assert(buffer.implicit_sharing == nullptr); MEM_freeN(buffer.data); break; } @@ -85,7 +82,6 @@ template static void imb_free_buffer(BufferType &buffer) /* Reset buffer to defaults. */ buffer.data = nullptr; buffer.ownership = IB_DO_NOT_TAKE_OWNERSHIP; - buffer.implicit_sharing = nullptr; } /* Allocate pixel storage of the given buffer. The buffer owns the allocated memory. @@ -101,7 +97,6 @@ bool imb_alloc_buffer( } buffer.ownership = IB_TAKE_OWNERSHIP; - buffer.implicit_sharing = nullptr; return true; } @@ -119,12 +114,6 @@ template void imb_make_writeable_buffer(BufferType &buffer) buffer.data = static_cast(MEM_dupallocN(buffer.data)); buffer.ownership = IB_TAKE_OWNERSHIP; - if (buffer.implicit_sharing) { - buffer.implicit_sharing->remove_user_and_delete_if_last(); - buffer.implicit_sharing = nullptr; - } - break; - case IB_TAKE_OWNERSHIP: break; } @@ -157,30 +146,6 @@ auto imb_steal_buffer_data(BufferType &buffer) -> decltype(BufferType::data) return nullptr; } -/* Assign the new data of the buffer which is implicitly shared via the given handle. - * The old content of the buffer is freed using imb_free_buffer. */ -template -void imb_assign_shared_buffer(BufferType &buffer, - decltype(BufferType::data) buffer_data, - const ImplicitSharingInfoHandle *implicit_sharing) -{ - imb_free_buffer(buffer); - - if (implicit_sharing) { - BLI_assert(buffer_data != nullptr); - - blender::implicit_sharing::copy_shared_pointer( - buffer_data, implicit_sharing, &buffer.data, &buffer.implicit_sharing); - } - else { - BLI_assert(buffer_data == nullptr); - buffer.data = nullptr; - buffer.implicit_sharing = nullptr; - } - - buffer.ownership = IB_DO_NOT_TAKE_OWNERSHIP; -} - void imb_freemipmapImBuf(ImBuf *ibuf) { int a; @@ -244,6 +209,16 @@ void imb_freerectImbuf_all(ImBuf *ibuf) freeencodedbufferImBuf(ibuf); } +void IMB_free_gpu_textures(ImBuf *ibuf) +{ + if (!ibuf || !ibuf->gpu.texture) { + return; + } + + GPU_texture_free(ibuf->gpu.texture); + ibuf->gpu.texture = nullptr; +} + void IMB_freeImBuf(ImBuf *ibuf) { if (ibuf == nullptr) { @@ -267,6 +242,7 @@ void IMB_freeImBuf(ImBuf *ibuf) "'.blend' relative \"//\" must not be used in ImBuf!"); imb_freerectImbuf_all(ibuf); + IMB_free_gpu_textures(ibuf); IMB_metadata_free(ibuf->metadata); colormanage_cache_free(ibuf); @@ -459,32 +435,6 @@ void IMB_make_writable_float_buffer(ImBuf *ibuf) imb_make_writeable_buffer(ibuf->float_buffer); } -void IMB_assign_shared_byte_buffer(ImBuf *ibuf, - uint8_t *buffer_data, - const ImplicitSharingInfoHandle *implicit_sharing) -{ - imb_free_buffer(ibuf->byte_buffer); - ibuf->flags &= ~IB_rect; - - if (buffer_data) { - imb_assign_shared_buffer(ibuf->byte_buffer, buffer_data, implicit_sharing); - ibuf->flags |= IB_rect; - } -} - -void IMB_assign_shared_float_buffer(ImBuf *ibuf, - float *buffer_data, - const ImplicitSharingInfoHandle *implicit_sharing) -{ - imb_free_buffer(ibuf->float_buffer); - ibuf->flags &= ~IB_rectfloat; - - if (buffer_data) { - imb_assign_shared_buffer(ibuf->float_buffer, buffer_data, implicit_sharing); - ibuf->flags |= IB_rectfloat; - } -} - void IMB_assign_byte_buffer(ImBuf *ibuf, uint8_t *buffer_data, const ImBufOwnership ownership) { imb_free_buffer(ibuf->byte_buffer); @@ -626,8 +576,6 @@ ImBuf *IMB_dupImBuf(const ImBuf *ibuf1) return nullptr; } - /* TODO(sergey): Use implicit sharing. */ - if (ibuf1->byte_buffer.data) { flags |= IB_rect; } diff --git a/source/blender/makesrna/intern/rna_render.cc b/source/blender/makesrna/intern/rna_render.cc index f964866a920..80df76fcc61 100644 --- a/source/blender/makesrna/intern/rna_render.cc +++ b/source/blender/makesrna/intern/rna_render.cc @@ -93,6 +93,7 @@ const EnumPropertyItem rna_enum_bake_pass_type_items[] = { # include "GPU_capabilities.h" # include "GPU_shader.h" # include "IMB_colormanagement.h" +# include "IMB_imbuf_types.h" # include "DEG_depsgraph_query.h" @@ -499,15 +500,30 @@ static int rna_RenderPass_rect_get_length(const PointerRNA *ptr, static void rna_RenderPass_rect_get(PointerRNA *ptr, float *values) { RenderPass *rpass = (RenderPass *)ptr->data; - memcpy( - values, rpass->buffer.data, sizeof(float) * rpass->rectx * rpass->recty * rpass->channels); + const size_t size_in_bytes = sizeof(float) * rpass->rectx * rpass->recty * rpass->channels; + const float *buffer = rpass->ibuf ? rpass->ibuf->float_buffer.data : nullptr; + + if (!buffer) { + /* No float buffer to read from, initialize to all zeroes. */ + memset(values, 0, size_in_bytes); + return; + } + + memcpy(values, buffer, size_in_bytes); } void rna_RenderPass_rect_set(PointerRNA *ptr, const float *values) { RenderPass *rpass = (RenderPass *)ptr->data; - memcpy( - rpass->buffer.data, values, sizeof(float) * rpass->rectx * rpass->recty * rpass->channels); + float *buffer = rpass->ibuf ? rpass->ibuf->float_buffer.data : nullptr; + + if (!buffer) { + /* Only writing to an already existing buffer is supported. */ + return; + } + + const size_t size_in_bytes = sizeof(float) * rpass->rectx * rpass->recty * rpass->channels; + memcpy(buffer, values, size_in_bytes); } static RenderPass *rna_RenderPass_find_by_type(RenderLayer *rl, int passtype, const char *view) diff --git a/source/blender/render/RE_pipeline.h b/source/blender/render/RE_pipeline.h index 6e93d84597e..f30be7d2e60 100644 --- a/source/blender/render/RE_pipeline.h +++ b/source/blender/render/RE_pipeline.h @@ -42,43 +42,14 @@ extern "C" { /* only used as handle */ typedef struct Render Render; -/* Buffer of a floating point values which uses implicit sharing. - * - * The buffer is allocated by render passes creation, and then is shared with the render result - * and image buffer. - * - * The GPU texture is an optional read-only copy of the render buffer in GPU memory. */ -typedef struct RenderBuffer { - float *data; - const ImplicitSharingInfoHandle *sharing_info; - struct GPUTexture *gpu_texture; -} RenderBuffer; - -/* Specialized render buffer to store 8bpp passes. */ -typedef struct RenderByteBuffer { - uint8_t *data; - const ImplicitSharingInfoHandle *sharing_info; - struct GPUTexture *gpu_texture; -} RenderByteBuffer; - -/* Render Result usage: - * - * - render engine allocates/frees and delivers raw floating point rects - * - right now it's full rects, but might become tiles or file - * - the display client has to allocate display rects, sort out what to display, - * and how it's converted - */ - typedef struct RenderView { struct RenderView *next, *prev; char name[64]; /* EXR_VIEW_MAXNAME */ - /* if this exists, result of composited layers */ - RenderBuffer combined_buffer; - - /* optional, 32 bits version of picture, used for sequencer, OpenGL render and image curves */ - RenderByteBuffer byte_buffer; - + /* Image buffer of a composited layer or a sequencer output. + * The ibuf is only allocated if it has an actual data in one of its buffers (float, byte, or + * GPU). */ + struct ImBuf *ibuf; } RenderView; typedef struct RenderPass { @@ -87,7 +58,14 @@ typedef struct RenderPass { char name[64]; /* amount defined in IMB_openexr.h */ char chan_id[8]; /* amount defined in IMB_openexr.h */ - RenderBuffer buffer; + /* Image buffer which contains data of this pass. + * + * The data can be either CPU side stored in ibuf->float_buffer, or a GPU-side stored in + * ibuf->gpu (during rendering, i.e.). + * + * The pass data storage is lazily allocated, and until data is actually provided (via either CPU + * buffer of GPU texture) the ibuf is not allocated. */ + struct ImBuf *ibuf; int rectx, recty; @@ -126,14 +104,10 @@ typedef struct RenderResult { /* target image size */ int rectx, recty; - /* The following byte, combined, and z buffers are for temporary storage only, - * for RenderResult structs created in #RE_AcquireResultImage - which do not have RenderView */ - - /* Optional, 32 bits version of picture, used for OpenGL render and image curves. */ - RenderByteBuffer byte_buffer; - - /* if this exists, a copy of one of layers, or result of composited layers */ - RenderBuffer combined_buffer; + /* The temporary storage to pass image data from #RE_AcquireResultImage. + * Is null pointer when the RenderResult is not coming from the #RE_AcquireResultImage, and is + * a pointer to an existing ibuf in either RenderView or a RenderPass otherwise. */ + struct ImBuf *ibuf; /* coordinates within final image (after cropping) */ rcti tilerect; @@ -285,9 +259,9 @@ void RE_render_result_rect_from_ibuf(struct RenderResult *rr, struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name); float *RE_RenderLayerGetPass(struct RenderLayer *rl, const char *name, const char *viewname); -RenderBuffer *RE_RenderLayerGetPassBuffer(struct RenderLayer *rl, - const char *name, - const char *viewname); +struct ImBuf *RE_RenderLayerGetPassImBuf(struct RenderLayer *rl, + const char *name, + const char *viewname); bool RE_HasSingleLayer(struct Render *re); @@ -510,42 +484,8 @@ struct RenderView *RE_RenderViewGetByName(struct RenderResult *rr, const char *v RenderResult *RE_DuplicateRenderResult(RenderResult *rr); -/** - * Create new render buffer which takes ownership of the given data. - * Creates an implicit sharing handle for the data as well. */ -RenderBuffer RE_RenderBuffer_new(float *data); - -/** - * Assign the buffer data. - * - * The current buffer data is freed and the new one is assigned, and the implicit sharing for it. - */ -void RE_RenderBuffer_assign_data(RenderBuffer *render_buffer, float *data); - -/** - * Effectively `lhs = rhs`. The lhs will share the same buffer as the rhs (with an increased user - * counter). - * - * The current content of the lhs is freed. - * The rhs and its data is allowed to be nullptr, in which case the lhs's data will be nullptr - * after this call. - */ -void RE_RenderBuffer_assign_shared(RenderBuffer *lhs, const RenderBuffer *rhs); - -/** - * Free data of the given buffer. - * - * The data and implicit sharing information of the buffer is set to nullptr after this call. - * The buffer itself is not freed. - */ -void RE_RenderBuffer_data_free(RenderBuffer *render_buffer); - -/* Implementation of above, but for byte buffer. */ -/* TODO(sergey): Once everything is C++ we can remove the duplicated API. */ -RenderByteBuffer RE_RenderByteBuffer_new(uint8_t *data); -void RE_RenderByteBuffer_assign_data(RenderByteBuffer *render_buffer, uint8_t *data); -void RE_RenderByteBuffer_assign_shared(RenderByteBuffer *lhs, const RenderByteBuffer *rhs); -void RE_RenderByteBuffer_data_free(RenderByteBuffer *render_buffer); +struct ImBuf *RE_RenderPassEnsureImBuf(RenderPass *render_pass); +struct ImBuf *RE_RenderViewEnsureImBuf(const RenderResult *render_result, RenderView *render_view); #ifdef __cplusplus } diff --git a/source/blender/render/intern/compositor.cc b/source/blender/render/intern/compositor.cc index bbb2932cb23..82e1242bad5 100644 --- a/source/blender/render/intern/compositor.cc +++ b/source/blender/render/intern/compositor.cc @@ -226,7 +226,7 @@ class Context : public realtime_compositor::Context { RenderPass *rpass = (RenderPass *)BLI_findstring( &rl->passes, pass_name, offsetof(RenderPass, name)); - if (rpass && rpass->buffer.data) { + if (rpass && rpass->ibuf && rpass->ibuf->float_buffer.data) { input_texture = RE_pass_ensure_gpu_texture_cache(re, rpass); if (input_texture) { @@ -283,7 +283,8 @@ class Context : public realtime_compositor::Context { float *output_buffer = (float *)GPU_texture_read(output_texture_, GPU_DATA_FLOAT, 0); if (output_buffer) { - RE_RenderBuffer_assign_data(&rv->combined_buffer, output_buffer); + ImBuf *ibuf = RE_RenderViewEnsureImBuf(rr, rv); + IMB_assign_float_buffer(ibuf, output_buffer, IB_TAKE_OWNERSHIP); } /* TODO: z-buffer output. */ diff --git a/source/blender/render/intern/engine.cc b/source/blender/render/intern/engine.cc index 7b154b46bda..03cfb2fe908 100644 --- a/source/blender/render/intern/engine.cc +++ b/source/blender/render/intern/engine.cc @@ -43,6 +43,8 @@ # include "BPY_extern.h" #endif +#include "IMB_imbuf_types.h" + #include "RE_bake.h" #include "RE_engine.h" #include "RE_pipeline.h" @@ -216,8 +218,8 @@ static RenderResult *render_result_from_bake( /* Fill render passes from bake pixel array, to be read by the render engine. */ for (int ty = 0; ty < h; ty++) { size_t offset = ty * w * 4; - float *primitive = primitive_pass->buffer.data + offset; - float *differential = differential_pass->buffer.data + offset; + float *primitive = primitive_pass->ibuf->float_buffer.data + offset; + float *differential = differential_pass->ibuf->float_buffer.data + offset; size_t bake_offset = (y + ty) * image->width + x; const BakePixel *bake_pixel = pixels + bake_offset; @@ -284,7 +286,7 @@ static void render_result_to_bake(RenderEngine *engine, RenderResult *rr) const size_t offset = ty * w; const size_t bake_offset = (y + ty) * image->width + x; - const float *pass_rect = rpass->buffer.data + offset * channels_num; + const float *pass_rect = rpass->ibuf->float_buffer.data + offset * channels_num; const BakePixel *bake_pixel = pixels + bake_offset; float *bake_result = result + bake_offset * channels_num; diff --git a/source/blender/render/intern/pipeline.cc b/source/blender/render/intern/pipeline.cc index 047573ebc33..c40159136c0 100644 --- a/source/blender/render/intern/pipeline.cc +++ b/source/blender/render/intern/pipeline.cc @@ -228,16 +228,16 @@ void RE_FreeRenderResult(RenderResult *rr) render_result_free(rr); } -RenderBuffer *RE_RenderLayerGetPassBuffer(RenderLayer *rl, const char *name, const char *viewname) +ImBuf *RE_RenderLayerGetPassImBuf(RenderLayer *rl, const char *name, const char *viewname) { RenderPass *rpass = RE_pass_find_by_name(rl, name, viewname); - return rpass ? &rpass->buffer : nullptr; + return rpass ? rpass->ibuf : nullptr; } float *RE_RenderLayerGetPass(RenderLayer *rl, const char *name, const char *viewname) { - RenderPass *rpass = RE_pass_find_by_name(rl, name, viewname); - return rpass ? rpass->buffer.data : nullptr; + const ImBuf *ibuf = RE_RenderLayerGetPassImBuf(rl, name, viewname); + return ibuf ? ibuf->float_buffer.data : nullptr; } RenderLayer *RE_GetRenderLayer(RenderResult *rr, const char *name) @@ -381,7 +381,7 @@ void RE_AcquireResultImageViews(Render *re, RenderResult *rr) render_result_views_shallowcopy(rr, re->result); RenderView *rv = static_cast(rr->views.first); - rr->have_combined = (rv->combined_buffer.data != nullptr); + rr->have_combined = (rv->ibuf != nullptr); /* single layer */ RenderLayer *rl = render_get_single_layer(re, re->result); @@ -390,13 +390,9 @@ void RE_AcquireResultImageViews(Render *re, RenderResult *rr) * explicitly free it. So simply assign the buffers as a shallow copy here as well. */ if (rl) { - if (rv->combined_buffer.data == nullptr) { + if (rv->ibuf == nullptr) { LISTBASE_FOREACH (RenderView *, rview, &rr->views) { - RenderBuffer *buffer = RE_RenderLayerGetPassBuffer( - rl, RE_PASSNAME_COMBINED, rview->name); - if (buffer) { - rview->combined_buffer = *buffer; - } + rview->ibuf = RE_RenderLayerGetPassImBuf(rl, RE_PASSNAME_COMBINED, rview->name); } } } @@ -435,24 +431,20 @@ void RE_AcquireResultImage(Render *re, RenderResult *rr, const int view_id) /* `scene.rd.actview` view. */ rv = RE_RenderViewGetById(re->result, view_id); - rr->have_combined = (rv->combined_buffer.data != nullptr); + rr->have_combined = (rv->ibuf != nullptr); /* The render result uses shallow initialization, and the caller is not expected to * explicitly free it. So simply assign the buffers as a shallow copy here as well. * * The thread safety is ensured via the re->resultmutex. */ - rr->combined_buffer = rv->combined_buffer; - rr->byte_buffer = rv->byte_buffer; + rr->ibuf = rv->ibuf; /* active layer */ rl = render_get_single_layer(re, re->result); if (rl) { - if (rv->combined_buffer.data == nullptr) { - RenderBuffer *buffer = RE_RenderLayerGetPassBuffer(rl, RE_PASSNAME_COMBINED, rv->name); - if (buffer) { - rr->combined_buffer = *buffer; - } + if (rv->ibuf == nullptr) { + rr->ibuf = RE_RenderLayerGetPassImBuf(rl, RE_PASSNAME_COMBINED, rv->name); } } @@ -1311,8 +1303,8 @@ static void renderresult_stampinfo(Render *re) BKE_image_stamp_buf(re->scene, ob_camera_eval, (re->r.stamp & R_STAMP_STRIPMETA) ? rres.stamp_data : nullptr, - rres.byte_buffer.data, - rres.combined_buffer.data, + rres.ibuf->byte_buffer.data, + rres.ibuf->float_buffer.data, rres.rectx, rres.recty, 4); @@ -2594,7 +2586,7 @@ void RE_layer_load_from_file( IMB_float_from_rect(ibuf); } - memcpy(rpass->buffer.data, + memcpy(rpass->ibuf->float_buffer.data, ibuf->float_buffer.data, sizeof(float[4]) * layer->rectx * layer->recty); } @@ -2610,7 +2602,7 @@ void RE_layer_load_from_file( if (ibuf_clip) { IMB_rectcpy(ibuf_clip, ibuf, 0, 0, x, y, layer->rectx, layer->recty); - memcpy(rpass->buffer.data, + memcpy(rpass->ibuf->float_buffer.data, ibuf_clip->float_buffer.data, sizeof(float[4]) * layer->rectx * layer->recty); IMB_freeImBuf(ibuf_clip); @@ -2737,9 +2729,7 @@ RenderPass *RE_create_gp_pass(RenderResult *rr, const char *layername, const cha /* Clear previous pass if exist or the new image will be over previous one. */ RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_COMBINED, viewname); if (rp) { - rp->buffer.sharing_info->remove_user_and_delete_if_last(); - rp->buffer.sharing_info = nullptr; - + IMB_freeImBuf(rp->ibuf); BLI_freelinkN(&rl->passes, rp); } /* create a totally new pass */ diff --git a/source/blender/render/intern/render_result.cc b/source/blender/render/intern/render_result.cc index 96c2789d9c4..ccc061ee62a 100644 --- a/source/blender/render/intern/render_result.cc +++ b/source/blender/render/intern/render_result.cc @@ -54,8 +54,7 @@ static void render_result_views_free(RenderResult *rr) RenderView *rv = static_cast(rr->views.first); BLI_remlink(&rr->views, rv); - RE_RenderByteBuffer_data_free(&rv->byte_buffer); - RE_RenderBuffer_data_free(&rv->combined_buffer); + IMB_freeImBuf(rv->ibuf); MEM_freeN(rv); } @@ -75,7 +74,7 @@ void render_result_free(RenderResult *rr) while (rl->passes.first) { RenderPass *rpass = static_cast(rl->passes.first); - RE_RenderBuffer_data_free(&rpass->buffer); + IMB_freeImBuf(rpass->ibuf); BLI_freelinkN(&rl->passes, rpass); } @@ -85,8 +84,7 @@ void render_result_free(RenderResult *rr) render_result_views_free(rr); - RE_RenderByteBuffer_data_free(&rr->byte_buffer); - RE_RenderBuffer_data_free(&rr->combined_buffer); + IMB_freeImBuf(rr->ibuf); if (rr->text) { MEM_freeN(rr->text); @@ -119,10 +117,7 @@ void render_result_free_gpu_texture_caches(RenderResult *rr) { LISTBASE_FOREACH (RenderLayer *, rl, &rr->layers) { LISTBASE_FOREACH (RenderPass *, rpass, &rl->passes) { - if (rpass->buffer.gpu_texture) { - GPU_texture_free(rpass->buffer.gpu_texture); - rpass->buffer.gpu_texture = nullptr; - } + IMB_free_gpu_textures(rpass->ibuf); } } } @@ -143,8 +138,7 @@ void render_result_views_shallowcopy(RenderResult *dst, RenderResult *src) STRNCPY(rv->name, rview->name); - rv->combined_buffer = rview->combined_buffer; - rv->byte_buffer = rview->byte_buffer; + rv->ibuf = rview->ibuf; } } @@ -165,14 +159,19 @@ void render_result_views_shallowdelete(RenderResult *rr) static void render_layer_allocate_pass(RenderResult *rr, RenderPass *rp) { - if (rp->buffer.data != nullptr) { + if (rp->ibuf && rp->ibuf->float_buffer.data) { return; } + /* NOTE: In-lined manual allocation to support floating point buffers of an arbitrary number of + * channels. */ + const size_t rectsize = size_t(rr->rectx) * rr->recty * rp->channels; float *buffer_data = MEM_cnew_array(rectsize, rp->name); - rp->buffer = RE_RenderBuffer_new(buffer_data); + rp->ibuf = IMB_allocImBuf(rr->rectx, rr->recty, 32, 0); + rp->ibuf->channels = rp->channels; + IMB_assign_float_buffer(rp->ibuf, buffer_data, IB_TAKE_OWNERSHIP); if (STREQ(rp->name, RE_PASSNAME_VECTOR)) { /* initialize to max speed */ @@ -415,15 +414,27 @@ void RE_create_render_pass(RenderResult *rr, void RE_pass_set_buffer_data(RenderPass *pass, float *data) { - RE_RenderBuffer_assign_data(&pass->buffer, data); + ImBuf *ibuf = RE_RenderPassEnsureImBuf(pass); + + IMB_assign_float_buffer(ibuf, data, IB_TAKE_OWNERSHIP); } GPUTexture *RE_pass_ensure_gpu_texture_cache(Render *re, RenderPass *rpass) { - if (rpass->buffer.gpu_texture) { - return rpass->buffer.gpu_texture; + ImBuf *ibuf = rpass->ibuf; + + if (!ibuf) { + /* No existing GPU texture, but also no CPU side data to create it from. */ + return nullptr; } - if (rpass->buffer.data == nullptr) { + + if (ibuf->gpu.texture) { + /* Return existing GPU texture, regardless whether it also exists on CPU or not. */ + return ibuf->gpu.texture; + } + + if (ibuf->float_buffer.data == nullptr) { + /* No CPU side data to create the texture from. */ return nullptr; } @@ -431,20 +442,21 @@ GPUTexture *RE_pass_ensure_gpu_texture_cache(Render *re, RenderPass *rpass) (rpass->channels == 3) ? GPU_RGB16F : GPU_RGBA16F; - rpass->buffer.gpu_texture = GPU_texture_create_2d("RenderBuffer.gpu_texture", - rpass->rectx, - rpass->recty, - 1, - format, - GPU_TEXTURE_USAGE_GENERAL, - nullptr); + /* TODO(sergey): Use utility to assign the texture. */ + ibuf->gpu.texture = GPU_texture_create_2d("RenderBuffer.gpu_texture", + rpass->rectx, + rpass->recty, + 1, + format, + GPU_TEXTURE_USAGE_GENERAL, + nullptr); - if (rpass->buffer.gpu_texture) { - GPU_texture_update(rpass->buffer.gpu_texture, GPU_DATA_FLOAT, rpass->buffer.data); + if (ibuf->gpu.texture) { + GPU_texture_update(ibuf->gpu.texture, GPU_DATA_FLOAT, ibuf->float_buffer.data); re->result_has_gpu_texture_caches = true; } - return rpass->buffer.gpu_texture; + return ibuf->gpu.texture; } void RE_render_result_full_channel_name(char *fullname, @@ -543,6 +555,8 @@ static void ml_addpass_cb(void *base, RenderPass *rpass = MEM_cnew("loaded pass"); BLI_addtail(&rl->passes, rpass); + rpass->rectx = rr->rectx; + rpass->recty = rr->recty; rpass->channels = totchan; rl->passflag |= passtype_from_name(name); @@ -673,7 +687,7 @@ RenderResult *render_result_new_from_exr( rpass->recty = recty; if (rpass->channels >= 3) { - IMB_colormanagement_transform(rpass->buffer.data, + IMB_colormanagement_transform(rpass->ibuf->float_buffer.data, rpass->rectx, rpass->recty, rpass->channels, @@ -753,7 +767,11 @@ void render_result_merge(RenderResult *rr, RenderResult *rrpart) rpass = rpass->next) { /* For save buffers, skip any passes that are only saved to disk. */ - if (rpass->buffer.data == nullptr || rpassp->buffer.data == nullptr) { + if (rpass->ibuf == nullptr || rpassp->ibuf == nullptr) { + continue; + } + if (rpass->ibuf->float_buffer.data == nullptr || + rpassp->ibuf->float_buffer.data == nullptr) { continue; } /* Render-result have all passes, render-part only the active view's passes. */ @@ -761,7 +779,11 @@ void render_result_merge(RenderResult *rr, RenderResult *rrpart) continue; } - do_merge_tile(rr, rrpart, rpass->buffer.data, rpassp->buffer.data, rpass->channels); + do_merge_tile(rr, + rrpart, + rpass->ibuf->float_buffer.data, + rpassp->ibuf->float_buffer.data, + rpass->channels); /* manually get next render pass */ rpassp = rpassp->next; @@ -865,13 +887,23 @@ bool render_result_exr_file_read_path(RenderResult *rr, RE_render_result_full_channel_name( fullname, nullptr, rpass->name, rpass->view, rpass->chan_id, a); - if (IMB_exr_set_channel( - exrhandle, rl->name, fullname, xstride, ystride, rpass->buffer.data + a)) { + if (IMB_exr_set_channel(exrhandle, + rl->name, + fullname, + xstride, + ystride, + rpass->ibuf->float_buffer.data + a)) + { found_channels = true; } else if (rl_single) { - if (IMB_exr_set_channel( - exrhandle, nullptr, fullname, xstride, ystride, rpass->buffer.data + a)) { + if (IMB_exr_set_channel(exrhandle, + nullptr, + fullname, + xstride, + ystride, + rpass->ibuf->float_buffer.data + a)) + { found_channels = true; } else { @@ -998,8 +1030,10 @@ ImBuf *RE_render_result_rect_to_ibuf(RenderResult *rr, RenderView *rv = RE_RenderViewGetById(rr, view_id); /* if not exists, BKE_imbuf_write makes one */ - IMB_assign_shared_byte_buffer(ibuf, rv->byte_buffer.data, rv->byte_buffer.sharing_info); - IMB_assign_shared_float_buffer(ibuf, rv->combined_buffer.data, rv->combined_buffer.sharing_info); + if (rv->ibuf) { + IMB_assign_byte_buffer(ibuf, rv->ibuf->byte_buffer.data, IB_DO_NOT_TAKE_OWNERSHIP); + IMB_assign_float_buffer(ibuf, rv->ibuf->float_buffer.data, IB_DO_NOT_TAKE_OWNERSHIP); + } /* float factor for random dither, imbuf takes care of it */ ibuf->dither = dither; @@ -1041,34 +1075,36 @@ void RE_render_result_rect_from_ibuf(RenderResult *rr, const ImBuf *ibuf, const { RenderView *rv = RE_RenderViewGetById(rr, view_id); + ImBuf *rv_ibuf = RE_RenderViewEnsureImBuf(rr, rv); + if (ibuf->float_buffer.data) { rr->have_combined = true; - if (!rv->combined_buffer.data) { + if (!rv_ibuf->float_buffer.data) { float *data = MEM_cnew_array(4 * rr->rectx * rr->recty, "render_seq rectf"); - RE_RenderBuffer_assign_data(&rv->combined_buffer, data); + IMB_assign_float_buffer(rv_ibuf, data, IB_TAKE_OWNERSHIP); } - memcpy(rv->combined_buffer.data, + memcpy(rv_ibuf->float_buffer.data, ibuf->float_buffer.data, sizeof(float[4]) * rr->rectx * rr->recty); /* TSK! Since sequence render doesn't free the *rr render result, the old rect32 * can hang around when sequence render has rendered a 32 bits one before */ - RE_RenderByteBuffer_data_free(&rv->byte_buffer); + imb_freerectImBuf(rv_ibuf); } else if (ibuf->byte_buffer.data) { rr->have_combined = true; - if (!rv->byte_buffer.data) { + if (!rv_ibuf->byte_buffer.data) { uint8_t *data = MEM_cnew_array(4 * rr->rectx * rr->recty, "render_seq rect"); - RE_RenderByteBuffer_assign_data(&rv->byte_buffer, data); + IMB_assign_byte_buffer(rv_ibuf, data, IB_TAKE_OWNERSHIP); } - memcpy(rv->byte_buffer.data, ibuf->byte_buffer.data, sizeof(int) * rr->rectx * rr->recty); + memcpy(rv_ibuf->byte_buffer.data, ibuf->byte_buffer.data, sizeof(int) * rr->rectx * rr->recty); /* Same things as above, old rectf can hang around from previous render. */ - RE_RenderBuffer_data_free(&rv->combined_buffer); + imb_freerectfloatImBuf(rv_ibuf); } } @@ -1076,15 +1112,20 @@ void render_result_rect_fill_zero(RenderResult *rr, const int view_id) { RenderView *rv = RE_RenderViewGetById(rr, view_id); - if (rv->combined_buffer.data) { - memset(rv->combined_buffer.data, 0, sizeof(float[4]) * rr->rectx * rr->recty); - } - else if (rv->byte_buffer.data) { - memset(rv->byte_buffer.data, 0, 4 * rr->rectx * rr->recty); - } - else { + ImBuf *ibuf = RE_RenderViewEnsureImBuf(rr, rv); + + if (!ibuf->float_buffer.data && !ibuf->byte_buffer.data) { uint8_t *data = MEM_cnew_array(rr->rectx * rr->recty, "render_seq rect"); - RE_RenderByteBuffer_assign_data(&rv->byte_buffer, data); + IMB_assign_byte_buffer(ibuf, data, IB_TAKE_OWNERSHIP); + return; + } + + if (ibuf->float_buffer.data) { + memset(ibuf->float_buffer.data, 0, sizeof(float[4]) * rr->rectx * rr->recty); + } + + if (ibuf->byte_buffer.data) { + memset(ibuf->byte_buffer.data, 0, 4 * rr->rectx * rr->recty); } } @@ -1097,13 +1138,14 @@ void render_result_rect_get_pixels(RenderResult *rr, const int view_id) { RenderView *rv = RE_RenderViewGetById(rr, view_id); + ImBuf *ibuf = rv ? rv->ibuf : nullptr; - if (rv && rv->byte_buffer.data) { - memcpy(rect, rv->byte_buffer.data, sizeof(int) * rr->rectx * rr->recty); + if (ibuf->byte_buffer.data) { + memcpy(rect, ibuf->byte_buffer.data, sizeof(int) * rr->rectx * rr->recty); } - else if (rv && rv->combined_buffer.data) { + else if (ibuf->float_buffer.data) { IMB_display_buffer_transform_apply((uchar *)rect, - rv->combined_buffer.data, + ibuf->float_buffer.data, rr->rectx, rr->recty, 4, @@ -1130,13 +1172,17 @@ bool RE_HasCombinedLayer(const RenderResult *result) return false; } - return (rv->byte_buffer.data || rv->combined_buffer.data); + return (rv->ibuf); } bool RE_HasFloatPixels(const RenderResult *result) { LISTBASE_FOREACH (const RenderView *, rview, &result->views) { - if (rview->byte_buffer.data && !rview->combined_buffer.data) { + ImBuf *ibuf = rview->ibuf; + if (!ibuf) { + continue; + } + if (ibuf->byte_buffer.data && !ibuf->float_buffer.data) { return false; } } @@ -1177,9 +1223,7 @@ static RenderPass *duplicate_render_pass(RenderPass *rpass) RenderPass *new_rpass = MEM_cnew("new render pass", *rpass); new_rpass->next = new_rpass->prev = nullptr; - if (new_rpass->buffer.sharing_info != nullptr) { - new_rpass->buffer.sharing_info->add_user(); - } + new_rpass->ibuf = IMB_dupImBuf(rpass->ibuf); return new_rpass; } @@ -1201,19 +1245,7 @@ static RenderView *duplicate_render_view(RenderView *rview) { RenderView *new_rview = MEM_cnew("new render view", *rview); - /* Reset buffers, they are not supposed to be shallow-coped. */ - new_rview->combined_buffer = {}; - new_rview->byte_buffer = {}; - - if (rview->combined_buffer.data != nullptr) { - RE_RenderBuffer_assign_data(&new_rview->combined_buffer, - static_cast(MEM_dupallocN(rview->combined_buffer.data))); - } - - if (rview->byte_buffer.data != nullptr) { - RE_RenderByteBuffer_assign_data( - &new_rview->byte_buffer, static_cast(MEM_dupallocN(rview->byte_buffer.data))); - } + new_rview->ibuf = IMB_dupImBuf(rview->ibuf); return new_rview; } @@ -1233,115 +1265,27 @@ RenderResult *RE_DuplicateRenderResult(RenderResult *rr) BLI_addtail(&new_rr->views, new_rview); } - /* Reset buffers, they are not supposed to be shallow-coped. */ - new_rr->combined_buffer = {}; - new_rr->byte_buffer = {}; - - if (rr->combined_buffer.data) { - RE_RenderBuffer_assign_data(&new_rr->combined_buffer, - static_cast(MEM_dupallocN(rr->combined_buffer.data))); - } - if (rr->byte_buffer.data) { - RE_RenderByteBuffer_assign_data(&new_rr->byte_buffer, - static_cast(MEM_dupallocN(rr->byte_buffer.data))); - } + new_rr->ibuf = IMB_dupImBuf(rr->ibuf); new_rr->stamp_data = BKE_stamp_data_copy(new_rr->stamp_data); return new_rr; } -/* -------------------------------------------------------------------- - * Render buffer. - */ - -template static BufferType render_buffer_new(decltype(BufferType::data) data) +ImBuf *RE_RenderPassEnsureImBuf(RenderPass *render_pass) { - BufferType buffer; - - buffer.data = data; - buffer.sharing_info = blender::implicit_sharing::info_for_mem_free(data); - buffer.gpu_texture = nullptr; - - return buffer; -} - -template static void render_buffer_data_free(BufferType *render_buffer) -{ - if (!render_buffer->sharing_info) { - MEM_SAFE_FREE(render_buffer->data); - return; + if (!render_pass->ibuf) { + render_pass->ibuf = IMB_allocImBuf(render_pass->rectx, render_pass->recty, 32, 0); + render_pass->ibuf->channels = render_pass->channels; } - blender::implicit_sharing::free_shared_data(&render_buffer->data, &render_buffer->sharing_info); - - if (render_buffer->gpu_texture) { - GPU_texture_free(render_buffer->gpu_texture); - render_buffer->gpu_texture = nullptr; - } + return render_pass->ibuf; } -template -static void render_buffer_assign_data(BufferType *render_buffer, decltype(BufferType::data) data) +ImBuf *RE_RenderViewEnsureImBuf(const RenderResult *render_result, RenderView *render_view) { - render_buffer_data_free(render_buffer); - - if (!data) { - render_buffer->data = nullptr; - render_buffer->sharing_info = nullptr; - return; + if (!render_view->ibuf) { + render_view->ibuf = IMB_allocImBuf(render_result->rectx, render_result->recty, 32, 0); } - render_buffer->data = data; - render_buffer->sharing_info = blender::implicit_sharing::info_for_mem_free(data); -} - -template -static void render_buffer_assign_shared(BufferType *lhs, const BufferType *rhs) -{ - render_buffer_data_free(lhs); - - if (rhs) { - blender::implicit_sharing::copy_shared_pointer( - rhs->data, rhs->sharing_info, &lhs->data, &lhs->sharing_info); - } -} - -RenderBuffer RE_RenderBuffer_new(float *data) -{ - return render_buffer_new(data); -} - -void RE_RenderBuffer_assign_data(RenderBuffer *render_buffer, float *data) -{ - return render_buffer_assign_data(render_buffer, data); -} - -void RE_RenderBuffer_assign_shared(RenderBuffer *lhs, const RenderBuffer *rhs) -{ - render_buffer_assign_shared(lhs, rhs); -} - -void RE_RenderBuffer_data_free(RenderBuffer *render_buffer) -{ - render_buffer_data_free(render_buffer); -} - -RenderByteBuffer RE_RenderByteBuffer_new(uint8_t *data) -{ - return render_buffer_new(data); -} - -void RE_RenderByteBuffer_assign_data(RenderByteBuffer *render_buffer, uint8_t *data) -{ - return render_buffer_assign_data(render_buffer, data); -} - -void RE_RenderByteBuffer_assign_shared(RenderByteBuffer *lhs, const RenderByteBuffer *rhs) -{ - render_buffer_assign_shared(lhs, rhs); -} - -void RE_RenderByteBuffer_data_free(RenderByteBuffer *render_buffer) -{ - render_buffer_data_free(render_buffer); -} + return render_view->ibuf; +} \ No newline at end of file diff --git a/source/blender/sequencer/intern/render.c b/source/blender/sequencer/intern/render.c index dd967f8a904..8cefc79769d 100644 --- a/source/blender/sequencer/intern/render.c +++ b/source/blender/sequencer/intern/render.c @@ -1577,18 +1577,18 @@ static ImBuf *seq_render_scene_strip(const SeqRenderData *context, RE_AcquireResultImage(re, &rres, view_id); - if (rres.combined_buffer.data) { + if (rres.ibuf && rres.ibuf->float_buffer.data) { ibufs_arr[view_id] = IMB_allocImBuf(rres.rectx, rres.recty, 32, 0); - IMB_assign_shared_float_buffer( - ibufs_arr[view_id], rres.combined_buffer.data, rres.combined_buffer.sharing_info); + IMB_assign_float_buffer( + ibufs_arr[view_id], rres.ibuf->float_buffer.data, IB_DO_NOT_TAKE_OWNERSHIP); /* float buffers in the sequencer are not linear */ seq_imbuf_to_sequencer_space(context->scene, ibufs_arr[view_id], false); } - else if (rres.byte_buffer.data) { + else if (rres.ibuf->byte_buffer.data) { ibufs_arr[view_id] = IMB_allocImBuf(rres.rectx, rres.recty, 32, IB_rect); memcpy(ibufs_arr[view_id]->byte_buffer.data, - rres.byte_buffer.data, + rres.ibuf->byte_buffer.data, 4 * rres.rectx * rres.recty); } -- 2.30.2 From fc10d0418784c9905d640e3f4285cd7a325abc77 Mon Sep 17 00:00:00 2001 From: Joseph Eagar Date: Mon, 10 Jul 2023 07:35:41 -0700 Subject: [PATCH 106/115] Cleanup: remove unused variables --- source/blender/editors/sculpt_paint/sculpt_brush_types.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/blender/editors/sculpt_paint/sculpt_brush_types.cc b/source/blender/editors/sculpt_paint/sculpt_brush_types.cc index 43e0dc7276b..cd9c1d94752 100644 --- a/source/blender/editors/sculpt_paint/sculpt_brush_types.cc +++ b/source/blender/editors/sculpt_paint/sculpt_brush_types.cc @@ -1117,8 +1117,6 @@ void SCULPT_do_clay_strips_brush(Sculpt *sd, Object *ob, Span nodes) float temp[3]; float mat[4][4]; - float scale[4][4]; - float tmat[4][4]; SCULPT_calc_brush_plane(sd, ob, nodes, area_no_sp, area_co); SCULPT_tilt_apply_to_normal(area_no_sp, ss->cache, brush->tilt_strength_factor); -- 2.30.2 From 9e3bd8a2d006f90355cd7beb43380fe148cb1871 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Mon, 10 Jul 2023 16:26:49 +0200 Subject: [PATCH 107/115] Fix gitea inactive script duplicated results Although we had only 190 developers, the script was accusing a total of 365 developers (with 188 inactive). There were two problems here: * The gitea API was only using the `limit` paramater when an explicit page was passed. * There was a bug with the get_next_page code, that would skip the last page. I now made the page always an explicit argument passed to fetch_single. With this fix we now get: 190 developers with 98 inactive. --- tools/utils/gitea_inactive_developers.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/tools/utils/gitea_inactive_developers.py b/tools/utils/gitea_inactive_developers.py index cfd0c351245..d9a1cb521a1 100755 --- a/tools/utils/gitea_inactive_developers.py +++ b/tools/utils/gitea_inactive_developers.py @@ -81,16 +81,18 @@ def get_date_object(date_string: str) -> datetime.datetime: results_per_page = 25 -def get_next_page(headers: CaseInsensitiveDict[str], page: Optional[Page]) -> Optional[Page]: +def get_next_page(headers: CaseInsensitiveDict[str], page: Page) -> Optional[Page]: """ Parse the header looking for reference to next. """ total_count = int(assert_cast(str, headers.get('X-Total-Count'))) - next_page = Page(page + 1 if page else 1) - if next_page * results_per_page > total_count: + # If current page already accounts to all the results we need + # there is no need for extra pages. + if page * results_per_page >= total_count: return None + next_page = Page(page + 1) return next_page @@ -100,7 +102,7 @@ def fetch_single( api_token: str, method: str, data: Dict[str, str], - page: Optional[Page] = None, + page: Page, ) -> Tuple[List[object], Optional[Page]]: """Generic function to query a single item from the API. @@ -114,12 +116,10 @@ def fetch_single( params: Dict[str, Union[str, int]] = { 'limit': results_per_page, + 'page': page, **data, } - if page is not None: - params['page'] = page - logger.info(f"Calling {method} ({params=}).") response = requests.get(str(api_url / method), params=params, headers=headers) response.raise_for_status() @@ -140,12 +140,10 @@ def fetch_all( Yields: response_data - the result of fetch_single() """ - response_data, page = fetch_single(api_url, api_token, method, data) - yield from response_data if response_data is not None else () + page = Page(1) while page is not None: - response_data, page = fetch_single( - api_url, api_token, method, data, page=page) - yield from response_data + response_data, page = fetch_single(api_url, api_token, method, data, page) + yield from response_data if response_data is not None else () def fetch_team_members( -- 2.30.2 From b65dfb26f9f47ebd22dc649776a4849ea2bdaab2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Mon, 10 Jul 2023 17:03:17 +0200 Subject: [PATCH 108/115] EEVEE-Next: Shadow Tag: Fix uv calculation --- .../engines/eevee_next/shaders/eevee_shadow_tag_usage_comp.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tag_usage_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tag_usage_comp.glsl index d30b8b4ab93..b7c9a15360f 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tag_usage_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tag_usage_comp.glsl @@ -23,7 +23,7 @@ void main() return; } - vec2 uv = vec2(texel) / vec2(tex_size); + vec2 uv = (vec2(texel) + 0.5) / vec2(tex_size); vec3 vP = get_view_space_from_depth(uv, depth); vec3 P = transform_point(ViewMatrixInverse, vP); vec2 pixel = vec2(gl_GlobalInvocationID.xy); -- 2.30.2 From 41335edf227aadc7cc5a474a3359ed529416e4c2 Mon Sep 17 00:00:00 2001 From: Hoshinova Date: Mon, 10 Jul 2023 17:42:24 +0200 Subject: [PATCH 109/115] Fix #109254: Voronoi distance output is clamped at 8 The Voronoi distance output is clamped at 8, which is apparent for distance metrics like Minkowski with low exponents. This patch fixes that by setting the initial distance of the search loop to FLT_MAX instead of 8. And for the Smooth variant of F1, the "h" parameter is set to 1 for the first iteration using a signal value, effectively ignoring the initial distance and using the computed distance at the first iteration instead. Pull Request: https://projects.blender.org/blender/blender/pulls/109286 --- .../cycles/kernel/osl/shaders/node_voronoi.h | 89 ++++++++++-------- intern/cycles/kernel/osl/shaders/stdcycles.h | 3 + intern/cycles/kernel/svm/voronoi.h | 91 +++++++++++-------- source/blender/blenlib/intern/noise.cc | 91 +++++++++++-------- .../material/gpu_shader_material_voronoi.glsl | 89 ++++++++++-------- 5 files changed, 211 insertions(+), 152 deletions(-) diff --git a/intern/cycles/kernel/osl/shaders/node_voronoi.h b/intern/cycles/kernel/osl/shaders/node_voronoi.h index 14f09dc1a2f..dc8c242d504 100644 --- a/intern/cycles/kernel/osl/shaders/node_voronoi.h +++ b/intern/cycles/kernel/osl/shaders/node_voronoi.h @@ -156,7 +156,7 @@ VoronoiOutput voronoi_f1(VoronoiParams params, float coord) float cellPosition = floor(coord); float localPosition = coord - cellPosition; - float minDistance = 8.0; + float minDistance = FLT_MAX; float targetOffset = 0.0; float targetPosition = 0.0; for (int i = -1; i <= 1; i++) { @@ -183,16 +183,19 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, float coord) float cellPosition = floor(coord); float localPosition = coord - cellPosition; - float smoothDistance = 8.0; + float smoothDistance = 0.0; float smoothPosition = 0.0; vector3 smoothColor = vector3(0.0, 0.0, 0.0); + float h = -1.0; for (int i = -2; i <= 2; i++) { float cellOffset = i; float pointPosition = cellOffset + hash_float_to_float(cellPosition + cellOffset) * params.randomness; float distanceToPoint = voronoi_distance(pointPosition, localPosition); - float h = smoothstep( - 0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness); + h = h == -1.0 ? 1.0 : + smoothstep(0.0, + 1.0, + 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness); float correctionFactor = params.smoothness * h * (1.0 - h); smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor; correctionFactor /= 1.0 + 3.0 * params.smoothness; @@ -213,8 +216,8 @@ VoronoiOutput voronoi_f2(VoronoiParams params, float coord) float cellPosition = floor(coord); float localPosition = coord - cellPosition; - float distanceF1 = 8.0; - float distanceF2 = 8.0; + float distanceF1 = FLT_MAX; + float distanceF2 = FLT_MAX; float offsetF1 = 0.0; float positionF1 = 0.0; float offsetF2 = 0.0; @@ -267,7 +270,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, float coord) float closestPoint = 0.0; float closestPointOffset = 0.0; - float minDistance = 8.0; + float minDistance = FLT_MAX; for (int i = -1; i <= 1; i++) { float cellOffset = i; float pointPosition = cellOffset + @@ -280,7 +283,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, float coord) } } - minDistance = 8.0; + minDistance = FLT_MAX; float closestPointToClosestPoint = 0.0; for (int i = -1; i <= 1; i++) { if (i == 0) { @@ -311,7 +314,7 @@ VoronoiOutput voronoi_f1(VoronoiParams params, vector2 coord) vector2 cellPosition = floor(coord); vector2 localPosition = coord - cellPosition; - float minDistance = 8.0; + float minDistance = FLT_MAX; vector2 targetOffset = vector2(0.0, 0.0); vector2 targetPosition = vector2(0.0, 0.0); for (int j = -1; j <= 1; j++) { @@ -340,17 +343,20 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, vector2 coord) vector2 cellPosition = floor(coord); vector2 localPosition = coord - cellPosition; - float smoothDistance = 8.0; + float smoothDistance = 0.0; vector3 smoothColor = vector3(0.0, 0.0, 0.0); vector2 smoothPosition = vector2(0.0, 0.0); + float h = -1.0; for (int j = -2; j <= 2; j++) { for (int i = -2; i <= 2; i++) { vector2 cellOffset = vector2(i, j); vector2 pointPosition = cellOffset + hash_vector2_to_vector2(cellPosition + cellOffset) * params.randomness; float distanceToPoint = voronoi_distance(pointPosition, localPosition, params); - float h = smoothstep( - 0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness); + h = h == -1.0 ? + 1.0 : + smoothstep( + 0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness); float correctionFactor = params.smoothness * h * (1.0 - h); smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor; correctionFactor /= 1.0 + 3.0 * params.smoothness; @@ -372,8 +378,8 @@ VoronoiOutput voronoi_f2(VoronoiParams params, vector2 coord) vector2 cellPosition = floor(coord); vector2 localPosition = coord - cellPosition; - float distanceF1 = 8.0; - float distanceF2 = 8.0; + float distanceF1 = FLT_MAX; + float distanceF2 = FLT_MAX; vector2 offsetF1 = vector2(0.0, 0.0); vector2 positionF1 = vector2(0.0, 0.0); vector2 offsetF2 = vector2(0.0, 0.0); @@ -413,7 +419,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vector2 coord) vector2 localPosition = coord - cellPosition; vector2 vectorToClosest = vector2(0.0, 0.0); - float minDistance = 8.0; + float minDistance = FLT_MAX; for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { vector2 cellOffset = vector2(i, j); @@ -429,7 +435,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vector2 coord) } } - minDistance = 8.0; + minDistance = FLT_MAX; for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { vector2 cellOffset = vector2(i, j); @@ -456,7 +462,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vector2 coord) vector2 closestPoint = vector2(0.0, 0.0); vector2 closestPointOffset = vector2(0.0, 0.0); - float minDistance = 8.0; + float minDistance = FLT_MAX; for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { vector2 cellOffset = vector2(i, j); @@ -471,7 +477,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vector2 coord) } } - minDistance = 8.0; + minDistance = FLT_MAX; vector2 closestPointToClosestPoint = vector2(0.0, 0.0); for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { @@ -504,7 +510,7 @@ VoronoiOutput voronoi_f1(VoronoiParams params, vector3 coord) vector3 cellPosition = floor(coord); vector3 localPosition = coord - cellPosition; - float minDistance = 8.0; + float minDistance = FLT_MAX; vector3 targetOffset = vector3(0.0, 0.0, 0.0); vector3 targetPosition = vector3(0.0, 0.0, 0.0); for (int k = -1; k <= 1; k++) { @@ -535,9 +541,10 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, vector3 coord) vector3 cellPosition = floor(coord); vector3 localPosition = coord - cellPosition; - float smoothDistance = 8.0; + float smoothDistance = 0.0; vector3 smoothColor = vector3(0.0, 0.0, 0.0); vector3 smoothPosition = vector3(0.0, 0.0, 0.0); + float h = -1.0; for (int k = -2; k <= 2; k++) { for (int j = -2; j <= 2; j++) { for (int i = -2; i <= 2; i++) { @@ -545,8 +552,10 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, vector3 coord) vector3 pointPosition = cellOffset + hash_vector3_to_vector3(cellPosition + cellOffset) * params.randomness; float distanceToPoint = voronoi_distance(pointPosition, localPosition, params); - float h = smoothstep( - 0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness); + h = h == -1.0 ? + 1.0 : + smoothstep( + 0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness); float correctionFactor = params.smoothness * h * (1.0 - h); smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor; correctionFactor /= 1.0 + 3.0 * params.smoothness; @@ -569,8 +578,8 @@ VoronoiOutput voronoi_f2(VoronoiParams params, vector3 coord) vector3 cellPosition = floor(coord); vector3 localPosition = coord - cellPosition; - float distanceF1 = 8.0; - float distanceF2 = 8.0; + float distanceF1 = FLT_MAX; + float distanceF2 = FLT_MAX; vector3 offsetF1 = vector3(0.0, 0.0, 0.0); vector3 positionF1 = vector3(0.0, 0.0, 0.0); vector3 offsetF2 = vector3(0.0, 0.0, 0.0); @@ -612,7 +621,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vector3 coord) vector3 localPosition = coord - cellPosition; vector3 vectorToClosest = vector3(0.0, 0.0, 0.0); - float minDistance = 8.0; + float minDistance = FLT_MAX; for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { @@ -630,7 +639,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vector3 coord) } } - minDistance = 8.0; + minDistance = FLT_MAX; for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { @@ -659,7 +668,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vector3 coord) vector3 closestPoint = vector3(0.0, 0.0, 0.0); vector3 closestPointOffset = vector3(0.0, 0.0, 0.0); - float minDistance = 8.0; + float minDistance = FLT_MAX; for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { @@ -676,7 +685,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vector3 coord) } } - minDistance = 8.0; + minDistance = FLT_MAX; vector3 closestPointToClosestPoint = vector3(0.0, 0.0, 0.0); for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { @@ -711,7 +720,7 @@ VoronoiOutput voronoi_f1(VoronoiParams params, vector4 coord) vector4 cellPosition = floor(coord); vector4 localPosition = coord - cellPosition; - float minDistance = 8.0; + float minDistance = FLT_MAX; vector4 targetOffset = vector4(0.0, 0.0, 0.0, 0.0); vector4 targetPosition = vector4(0.0, 0.0, 0.0, 0.0); for (int u = -1; u <= 1; u++) { @@ -744,9 +753,10 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, vector4 coord) vector4 cellPosition = floor(coord); vector4 localPosition = coord - cellPosition; - float smoothDistance = 8.0; + float smoothDistance = 0.0; vector3 smoothColor = vector3(0.0, 0.0, 0.0); vector4 smoothPosition = vector4(0.0, 0.0, 0.0, 0.0); + float h = -1.0; for (int u = -2; u <= 2; u++) { for (int k = -2; k <= 2; k++) { for (int j = -2; j <= 2; j++) { @@ -755,8 +765,11 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, vector4 coord) vector4 pointPosition = cellOffset + hash_vector4_to_vector4(cellPosition + cellOffset) * params.randomness; float distanceToPoint = voronoi_distance(pointPosition, localPosition, params); - float h = smoothstep( - 0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness); + h = h == -1.0 ? + 1.0 : + smoothstep(0.0, + 1.0, + 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness); float correctionFactor = params.smoothness * h * (1.0 - h); smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor; correctionFactor /= 1.0 + 3.0 * params.smoothness; @@ -780,8 +793,8 @@ VoronoiOutput voronoi_f2(VoronoiParams params, vector4 coord) vector4 cellPosition = floor(coord); vector4 localPosition = coord - cellPosition; - float distanceF1 = 8.0; - float distanceF2 = 8.0; + float distanceF1 = FLT_MAX; + float distanceF2 = FLT_MAX; vector4 offsetF1 = vector4(0.0, 0.0, 0.0, 0.0); vector4 positionF1 = vector4(0.0, 0.0, 0.0, 0.0); vector4 offsetF2 = vector4(0.0, 0.0, 0.0, 0.0); @@ -825,7 +838,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vector4 coord) vector4 localPosition = coord - cellPosition; vector4 vectorToClosest = vector4(0.0, 0.0, 0.0, 0.0); - float minDistance = 8.0; + float minDistance = FLT_MAX; for (int u = -1; u <= 1; u++) { for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { @@ -845,7 +858,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vector4 coord) } } - minDistance = 8.0; + minDistance = FLT_MAX; for (int u = -1; u <= 1; u++) { for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { @@ -876,7 +889,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vector4 coord) vector4 closestPoint = vector4(0.0, 0.0, 0.0, 0.0); vector4 closestPointOffset = vector4(0.0, 0.0, 0.0, 0.0); - float minDistance = 8.0; + float minDistance = FLT_MAX; for (int u = -1; u <= 1; u++) { for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { @@ -895,7 +908,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vector4 coord) } } - minDistance = 8.0; + minDistance = FLT_MAX; vector4 closestPointToClosestPoint = vector4(0.0, 0.0, 0.0, 0.0); for (int u = -1; u <= 1; u++) { for (int k = -1; k <= 1; k++) { diff --git a/intern/cycles/kernel/osl/shaders/stdcycles.h b/intern/cycles/kernel/osl/shaders/stdcycles.h index b8f21b1fa30..430b22f6c1a 100644 --- a/intern/cycles/kernel/osl/shaders/stdcycles.h +++ b/intern/cycles/kernel/osl/shaders/stdcycles.h @@ -10,6 +10,9 @@ #include "stdosl.h" +// Constants +#define FLT_MAX 3.402823466e+38 // max value + // Declaration of built-in functions and closures, stdosl.h does not make // these available so we have to redefine them. #define BUILTIN [[int builtin = 1]] diff --git a/intern/cycles/kernel/svm/voronoi.h b/intern/cycles/kernel/svm/voronoi.h index cf973e8cc55..3fdb608995e 100644 --- a/intern/cycles/kernel/svm/voronoi.h +++ b/intern/cycles/kernel/svm/voronoi.h @@ -82,7 +82,7 @@ ccl_device VoronoiOutput voronoi_f1(ccl_private const VoronoiParams ¶ms, con float cellPosition = floorf(coord); float localPosition = coord - cellPosition; - float minDistance = 8.0f; + float minDistance = FLT_MAX; float targetOffset = 0.0f; float targetPosition = 0.0f; for (int i = -1; i <= 1; i++) { @@ -110,16 +110,19 @@ ccl_device VoronoiOutput voronoi_smooth_f1(ccl_private const VoronoiParams ¶ float cellPosition = floorf(coord); float localPosition = coord - cellPosition; - float smoothDistance = 8.0f; + float smoothDistance = 0.0f; float smoothPosition = 0.0f; float3 smoothColor = make_float3(0.0f, 0.0f, 0.0f); + float h = -1.0f; for (int i = -2; i <= 2; i++) { float cellOffset = i; float pointPosition = cellOffset + hash_float_to_float(cellPosition + cellOffset) * params.randomness; float distanceToPoint = voronoi_distance(pointPosition, localPosition); - float h = smoothstep( - 0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness); + h = h == -1.0f ? + 1.0f : + smoothstep( + 0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness); float correctionFactor = params.smoothness * h * (1.0f - h); smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor; correctionFactor /= 1.0f + 3.0f * params.smoothness; @@ -140,8 +143,8 @@ ccl_device VoronoiOutput voronoi_f2(ccl_private const VoronoiParams ¶ms, con float cellPosition = floorf(coord); float localPosition = coord - cellPosition; - float distanceF1 = 8.0f; - float distanceF2 = 8.0f; + float distanceF1 = FLT_MAX; + float distanceF2 = FLT_MAX; float offsetF1 = 0.0f; float positionF1 = 0.0f; float offsetF2 = 0.0f; @@ -196,7 +199,7 @@ ccl_device float voronoi_n_sphere_radius(ccl_private const VoronoiParams ¶ms float closestPoint = 0.0f; float closestPointOffset = 0.0f; - float minDistance = 8.0f; + float minDistance = FLT_MAX; for (int i = -1; i <= 1; i++) { float cellOffset = i; float pointPosition = cellOffset + @@ -209,7 +212,7 @@ ccl_device float voronoi_n_sphere_radius(ccl_private const VoronoiParams ¶ms } } - minDistance = 8.0f; + minDistance = FLT_MAX; float closestPointToClosestPoint = 0.0f; for (int i = -1; i <= 1; i++) { if (i == 0) { @@ -240,7 +243,7 @@ ccl_device VoronoiOutput voronoi_f1(ccl_private const VoronoiParams ¶ms, con float2 cellPosition = floor(coord); float2 localPosition = coord - cellPosition; - float minDistance = 8.0f; + float minDistance = FLT_MAX; float2 targetOffset = make_float2(0.0f, 0.0f); float2 targetPosition = make_float2(0.0f, 0.0f); for (int j = -1; j <= 1; j++) { @@ -270,17 +273,21 @@ ccl_device VoronoiOutput voronoi_smooth_f1(ccl_private const VoronoiParams ¶ float2 cellPosition = floor(coord); float2 localPosition = coord - cellPosition; - float smoothDistance = 8.0f; + float smoothDistance = 0.0f; float3 smoothColor = make_float3(0.0f, 0.0f, 0.0f); float2 smoothPosition = make_float2(0.0f, 0.0f); + float h = -1.0f; for (int j = -2; j <= 2; j++) { for (int i = -2; i <= 2; i++) { float2 cellOffset = make_float2(i, j); float2 pointPosition = cellOffset + hash_float2_to_float2(cellPosition + cellOffset) * params.randomness; float distanceToPoint = voronoi_distance(pointPosition, localPosition, params); - float h = smoothstep( - 0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness); + h = h == -1.0f ? + 1.0f : + smoothstep(0.0f, + 1.0f, + 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness); float correctionFactor = params.smoothness * h * (1.0f - h); smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor; correctionFactor /= 1.0f + 3.0f * params.smoothness; @@ -302,8 +309,8 @@ ccl_device VoronoiOutput voronoi_f2(ccl_private const VoronoiParams ¶ms, con float2 cellPosition = floor(coord); float2 localPosition = coord - cellPosition; - float distanceF1 = 8.0f; - float distanceF2 = 8.0f; + float distanceF1 = FLT_MAX; + float distanceF2 = FLT_MAX; float2 offsetF1 = make_float2(0.0f, 0.0f); float2 positionF1 = make_float2(0.0f, 0.0f); float2 offsetF2 = make_float2(0.0f, 0.0f); @@ -344,7 +351,7 @@ ccl_device float voronoi_distance_to_edge(ccl_private const VoronoiParams ¶m float2 localPosition = coord - cellPosition; float2 vectorToClosest = make_float2(0.0f, 0.0f); - float minDistance = 8.0f; + float minDistance = FLT_MAX; for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { float2 cellOffset = make_float2(i, j); @@ -359,7 +366,7 @@ ccl_device float voronoi_distance_to_edge(ccl_private const VoronoiParams ¶m } } - minDistance = 8.0f; + minDistance = FLT_MAX; for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { float2 cellOffset = make_float2(i, j); @@ -386,7 +393,7 @@ ccl_device float voronoi_n_sphere_radius(ccl_private const VoronoiParams ¶ms float2 closestPoint = make_float2(0.0f, 0.0f); float2 closestPointOffset = make_float2(0.0f, 0.0f); - float minDistance = 8.0f; + float minDistance = FLT_MAX; for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { float2 cellOffset = make_float2(i, j); @@ -401,7 +408,7 @@ ccl_device float voronoi_n_sphere_radius(ccl_private const VoronoiParams ¶ms } } - minDistance = 8.0f; + minDistance = FLT_MAX; float2 closestPointToClosestPoint = make_float2(0.0f, 0.0f); for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { @@ -434,7 +441,7 @@ ccl_device VoronoiOutput voronoi_f1(ccl_private const VoronoiParams ¶ms, con float3 cellPosition = floor(coord); float3 localPosition = coord - cellPosition; - float minDistance = 8.0f; + float minDistance = FLT_MAX; float3 targetOffset = make_float3(0.0f, 0.0f, 0.0f); float3 targetPosition = make_float3(0.0f, 0.0f, 0.0f); for (int k = -1; k <= 1; k++) { @@ -466,9 +473,10 @@ ccl_device VoronoiOutput voronoi_smooth_f1(ccl_private const VoronoiParams ¶ float3 cellPosition = floor(coord); float3 localPosition = coord - cellPosition; - float smoothDistance = 8.0f; + float smoothDistance = 0.0f; float3 smoothColor = make_float3(0.0f, 0.0f, 0.0f); float3 smoothPosition = make_float3(0.0f, 0.0f, 0.0f); + float h = -1.0f; for (int k = -2; k <= 2; k++) { for (int j = -2; j <= 2; j++) { for (int i = -2; i <= 2; i++) { @@ -476,8 +484,11 @@ ccl_device VoronoiOutput voronoi_smooth_f1(ccl_private const VoronoiParams ¶ float3 pointPosition = cellOffset + hash_float3_to_float3(cellPosition + cellOffset) * params.randomness; float distanceToPoint = voronoi_distance(pointPosition, localPosition, params); - float h = smoothstep( - 0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness); + h = h == -1.0f ? + 1.0f : + smoothstep(0.0f, + 1.0f, + 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness); float correctionFactor = params.smoothness * h * (1.0f - h); smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor; correctionFactor /= 1.0f + 3.0f * params.smoothness; @@ -500,8 +511,8 @@ ccl_device VoronoiOutput voronoi_f2(ccl_private const VoronoiParams ¶ms, con float3 cellPosition = floor(coord); float3 localPosition = coord - cellPosition; - float distanceF1 = 8.0f; - float distanceF2 = 8.0f; + float distanceF1 = FLT_MAX; + float distanceF2 = FLT_MAX; float3 offsetF1 = make_float3(0.0f, 0.0f, 0.0f); float3 positionF1 = make_float3(0.0f, 0.0f, 0.0f); float3 offsetF2 = make_float3(0.0f, 0.0f, 0.0f); @@ -544,7 +555,7 @@ ccl_device float voronoi_distance_to_edge(ccl_private const VoronoiParams ¶m float3 localPosition = coord - cellPosition; float3 vectorToClosest = make_float3(0.0f, 0.0f, 0.0f); - float minDistance = 8.0f; + float minDistance = FLT_MAX; for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { @@ -562,7 +573,7 @@ ccl_device float voronoi_distance_to_edge(ccl_private const VoronoiParams ¶m } } - minDistance = 8.0f; + minDistance = FLT_MAX; for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { @@ -592,7 +603,7 @@ ccl_device float voronoi_n_sphere_radius(ccl_private const VoronoiParams ¶ms float3 closestPoint = make_float3(0.0f, 0.0f, 0.0f); float3 closestPointOffset = make_float3(0.0f, 0.0f, 0.0f); - float minDistance = 8.0f; + float minDistance = FLT_MAX; for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { @@ -609,7 +620,7 @@ ccl_device float voronoi_n_sphere_radius(ccl_private const VoronoiParams ¶ms } } - minDistance = 8.0f; + minDistance = FLT_MAX; float3 closestPointToClosestPoint = make_float3(0.0f, 0.0f, 0.0f); for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { @@ -644,7 +655,7 @@ ccl_device VoronoiOutput voronoi_f1(ccl_private const VoronoiParams ¶ms, con float4 cellPosition = floor(coord); float4 localPosition = coord - cellPosition; - float minDistance = 8.0f; + float minDistance = FLT_MAX; float4 targetOffset = zero_float4(); float4 targetPosition = zero_float4(); for (int u = -1; u <= 1; u++) { @@ -679,9 +690,10 @@ ccl_device VoronoiOutput voronoi_smooth_f1(ccl_private const VoronoiParams ¶ float4 cellPosition = floor(coord); float4 localPosition = coord - cellPosition; - float smoothDistance = 8.0f; + float smoothDistance = 0.0f; float3 smoothColor = make_float3(0.0f, 0.0f, 0.0f); float4 smoothPosition = zero_float4(); + float h = -1.0f; for (int u = -2; u <= 2; u++) { for (int k = -2; k <= 2; k++) { ccl_loop_no_unroll for (int j = -2; j <= 2; j++) @@ -691,8 +703,11 @@ ccl_device VoronoiOutput voronoi_smooth_f1(ccl_private const VoronoiParams ¶ float4 pointPosition = cellOffset + hash_float4_to_float4(cellPosition + cellOffset) * params.randomness; float distanceToPoint = voronoi_distance(pointPosition, localPosition, params); - float h = smoothstep( - 0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness); + h = h == -1.0f ? + 1.0f : + smoothstep(0.0f, + 1.0f, + 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness); float correctionFactor = params.smoothness * h * (1.0f - h); smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor; correctionFactor /= 1.0f + 3.0f * params.smoothness; @@ -716,8 +731,8 @@ ccl_device VoronoiOutput voronoi_f2(ccl_private const VoronoiParams ¶ms, con float4 cellPosition = floor(coord); float4 localPosition = coord - cellPosition; - float distanceF1 = 8.0f; - float distanceF2 = 8.0f; + float distanceF1 = FLT_MAX; + float distanceF2 = FLT_MAX; float4 offsetF1 = zero_float4(); float4 positionF1 = zero_float4(); float4 offsetF2 = zero_float4(); @@ -763,7 +778,7 @@ ccl_device float voronoi_distance_to_edge(ccl_private const VoronoiParams ¶m float4 localPosition = coord - cellPosition; float4 vectorToClosest = zero_float4(); - float minDistance = 8.0f; + float minDistance = FLT_MAX; for (int u = -1; u <= 1; u++) { for (int k = -1; k <= 1; k++) { ccl_loop_no_unroll for (int j = -1; j <= 1; j++) @@ -784,7 +799,7 @@ ccl_device float voronoi_distance_to_edge(ccl_private const VoronoiParams ¶m } } - minDistance = 8.0f; + minDistance = FLT_MAX; for (int u = -1; u <= 1; u++) { for (int k = -1; k <= 1; k++) { ccl_loop_no_unroll for (int j = -1; j <= 1; j++) @@ -817,7 +832,7 @@ ccl_device float voronoi_n_sphere_radius(ccl_private const VoronoiParams ¶ms float4 closestPoint = zero_float4(); float4 closestPointOffset = zero_float4(); - float minDistance = 8.0f; + float minDistance = FLT_MAX; for (int u = -1; u <= 1; u++) { for (int k = -1; k <= 1; k++) { ccl_loop_no_unroll for (int j = -1; j <= 1; j++) @@ -837,7 +852,7 @@ ccl_device float voronoi_n_sphere_radius(ccl_private const VoronoiParams ¶ms } } - minDistance = 8.0f; + minDistance = FLT_MAX; float4 closestPointToClosestPoint = zero_float4(); for (int u = -1; u <= 1; u++) { for (int k = -1; k <= 1; k++) { diff --git a/source/blender/blenlib/intern/noise.cc b/source/blender/blenlib/intern/noise.cc index e88941dfd8f..4a791508356 100644 --- a/source/blender/blenlib/intern/noise.cc +++ b/source/blender/blenlib/intern/noise.cc @@ -1464,7 +1464,7 @@ VoronoiOutput voronoi_f1(const VoronoiParams ¶ms, const float coord) float cellPosition = floorf(coord); float localPosition = coord - cellPosition; - float minDistance = 8.0f; + float minDistance = FLT_MAX; float targetOffset = 0.0f; float targetPosition = 0.0f; for (int i = -1; i <= 1; i++) { @@ -1493,16 +1493,19 @@ VoronoiOutput voronoi_smooth_f1(const VoronoiParams ¶ms, float cellPosition = floorf(coord); float localPosition = coord - cellPosition; - float smoothDistance = 8.0f; + float smoothDistance = 0.0f; float smoothPosition = 0.0f; float3 smoothColor = {0.0f, 0.0f, 0.0f}; + float h = -1.0f; for (int i = -2; i <= 2; i++) { float cellOffset = i; float pointPosition = cellOffset + hash_float_to_float(cellPosition + cellOffset) * params.randomness; float distanceToPoint = voronoi_distance(pointPosition, localPosition); - float h = smoothstep( - 0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness); + h = h == -1.0f ? + 1.0f : + smoothstep( + 0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness); float correctionFactor = params.smoothness * h * (1.0f - h); smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor; correctionFactor /= 1.0f + 3.0f * params.smoothness; @@ -1526,8 +1529,8 @@ VoronoiOutput voronoi_f2(const VoronoiParams ¶ms, const float coord) float cellPosition = floorf(coord); float localPosition = coord - cellPosition; - float distanceF1 = 8.0f; - float distanceF2 = 8.0f; + float distanceF1 = FLT_MAX; + float distanceF2 = FLT_MAX; float offsetF1 = 0.0f; float positionF1 = 0.0f; float offsetF2 = 0.0f; @@ -1580,7 +1583,7 @@ float voronoi_n_sphere_radius(const VoronoiParams ¶ms, const float coord) float closestPoint = 0.0f; float closestPointOffset = 0.0f; - float minDistance = 8.0f; + float minDistance = FLT_MAX; for (int i = -1; i <= 1; i++) { float cellOffset = i; float pointPosition = cellOffset + @@ -1593,7 +1596,7 @@ float voronoi_n_sphere_radius(const VoronoiParams ¶ms, const float coord) } } - minDistance = 8.0f; + minDistance = FLT_MAX; float closestPointToClosestPoint = 0.0f; for (int i = -1; i <= 1; i++) { if (i == 0) { @@ -1624,7 +1627,7 @@ VoronoiOutput voronoi_f1(const VoronoiParams ¶ms, const float2 coord) float2 cellPosition = math::floor(coord); float2 localPosition = coord - cellPosition; - float minDistance = 8.0f; + float minDistance = FLT_MAX; float2 targetOffset = {0.0f, 0.0f}; float2 targetPosition = {0.0f, 0.0f}; for (int j = -1; j <= 1; j++) { @@ -1655,17 +1658,21 @@ VoronoiOutput voronoi_smooth_f1(const VoronoiParams ¶ms, float2 cellPosition = math::floor(coord); float2 localPosition = coord - cellPosition; - float smoothDistance = 8.0f; + float smoothDistance = 0.0f; float3 smoothColor = {0.0f, 0.0f, 0.0f}; float2 smoothPosition = {0.0f, 0.0f}; + float h = -1.0f; for (int j = -2; j <= 2; j++) { for (int i = -2; i <= 2; i++) { float2 cellOffset(i, j); float2 pointPosition = cellOffset + hash_float_to_float2(cellPosition + cellOffset) * params.randomness; float distanceToPoint = voronoi_distance(pointPosition, localPosition, params); - float h = smoothstep( - 0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness); + h = h == -1.0f ? + 1.0f : + smoothstep(0.0f, + 1.0f, + 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness); float correctionFactor = params.smoothness * h * (1.0f - h); smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor; correctionFactor /= 1.0f + 3.0f * params.smoothness; @@ -1690,8 +1697,8 @@ VoronoiOutput voronoi_f2(const VoronoiParams ¶ms, const float2 coord) float2 cellPosition = math::floor(coord); float2 localPosition = coord - cellPosition; - float distanceF1 = 8.0f; - float distanceF2 = 8.0f; + float distanceF1 = FLT_MAX; + float distanceF2 = FLT_MAX; float2 offsetF1 = {0.0f, 0.0f}; float2 positionF1 = {0.0f, 0.0f}; float2 offsetF2 = {0.0f, 0.0f}; @@ -1731,7 +1738,7 @@ float voronoi_distance_to_edge(const VoronoiParams ¶ms, const float2 coord) float2 localPosition = coord - cellPosition; float2 vectorToClosest = {0.0f, 0.0f}; - float minDistance = 8.0f; + float minDistance = FLT_MAX; for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { float2 cellOffset(i, j); @@ -1746,7 +1753,7 @@ float voronoi_distance_to_edge(const VoronoiParams ¶ms, const float2 coord) } } - minDistance = 8.0f; + minDistance = FLT_MAX; for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { float2 cellOffset(i, j); @@ -1772,7 +1779,7 @@ float voronoi_n_sphere_radius(const VoronoiParams ¶ms, const float2 coord) float2 closestPoint = {0.0f, 0.0f}; float2 closestPointOffset = {0.0f, 0.0f}; - float minDistance = 8.0f; + float minDistance = FLT_MAX; for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { float2 cellOffset(i, j); @@ -1787,7 +1794,7 @@ float voronoi_n_sphere_radius(const VoronoiParams ¶ms, const float2 coord) } } - minDistance = 8.0f; + minDistance = FLT_MAX; float2 closestPointToClosestPoint = {0.0f, 0.0f}; for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { @@ -1820,7 +1827,7 @@ VoronoiOutput voronoi_f1(const VoronoiParams ¶ms, const float3 coord) float3 cellPosition = math::floor(coord); float3 localPosition = coord - cellPosition; - float minDistance = 8.0f; + float minDistance = FLT_MAX; float3 targetOffset = {0.0f, 0.0f, 0.0f}; float3 targetPosition = {0.0f, 0.0f, 0.0f}; for (int k = -1; k <= 1; k++) { @@ -1853,9 +1860,10 @@ VoronoiOutput voronoi_smooth_f1(const VoronoiParams ¶ms, float3 cellPosition = math::floor(coord); float3 localPosition = coord - cellPosition; - float smoothDistance = 8.0f; + float smoothDistance = 0.0f; float3 smoothColor = {0.0f, 0.0f, 0.0f}; float3 smoothPosition = {0.0f, 0.0f, 0.0f}; + float h = -1.0f; for (int k = -2; k <= 2; k++) { for (int j = -2; j <= 2; j++) { for (int i = -2; i <= 2; i++) { @@ -1863,8 +1871,11 @@ VoronoiOutput voronoi_smooth_f1(const VoronoiParams ¶ms, float3 pointPosition = cellOffset + hash_float_to_float3(cellPosition + cellOffset) * params.randomness; float distanceToPoint = voronoi_distance(pointPosition, localPosition, params); - float h = smoothstep( - 0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness); + h = h == -1.0f ? + 1.0f : + smoothstep(0.0f, + 1.0f, + 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness); float correctionFactor = params.smoothness * h * (1.0f - h); smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor; correctionFactor /= 1.0f + 3.0f * params.smoothness; @@ -1890,8 +1901,8 @@ VoronoiOutput voronoi_f2(const VoronoiParams ¶ms, const float3 coord) float3 cellPosition = math::floor(coord); float3 localPosition = coord - cellPosition; - float distanceF1 = 8.0f; - float distanceF2 = 8.0f; + float distanceF1 = FLT_MAX; + float distanceF2 = FLT_MAX; float3 offsetF1 = {0.0f, 0.0f, 0.0f}; float3 positionF1 = {0.0f, 0.0f, 0.0f}; float3 offsetF2 = {0.0f, 0.0f, 0.0f}; @@ -1933,7 +1944,7 @@ float voronoi_distance_to_edge(const VoronoiParams ¶ms, const float3 coord) float3 localPosition = coord - cellPosition; float3 vectorToClosest = {0.0f, 0.0f, 0.0f}; - float minDistance = 8.0f; + float minDistance = FLT_MAX; for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { @@ -1951,7 +1962,7 @@ float voronoi_distance_to_edge(const VoronoiParams ¶ms, const float3 coord) } } - minDistance = 8.0f; + minDistance = FLT_MAX; for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { @@ -1980,7 +1991,7 @@ float voronoi_n_sphere_radius(const VoronoiParams ¶ms, const float3 coord) float3 closestPoint = {0.0f, 0.0f, 0.0f}; float3 closestPointOffset = {0.0f, 0.0f, 0.0f}; - float minDistance = 8.0f; + float minDistance = FLT_MAX; for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { @@ -1997,7 +2008,7 @@ float voronoi_n_sphere_radius(const VoronoiParams ¶ms, const float3 coord) } } - minDistance = 8.0f; + minDistance = FLT_MAX; float3 closestPointToClosestPoint = {0.0f, 0.0f, 0.0f}; for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { @@ -2032,7 +2043,7 @@ VoronoiOutput voronoi_f1(const VoronoiParams ¶ms, const float4 coord) float4 cellPosition = math::floor(coord); float4 localPosition = coord - cellPosition; - float minDistance = 8.0f; + float minDistance = FLT_MAX; float4 targetOffset = {0.0f, 0.0f, 0.0f, 0.0f}; float4 targetPosition = {0.0f, 0.0f, 0.0f, 0.0f}; for (int u = -1; u <= 1; u++) { @@ -2067,9 +2078,10 @@ VoronoiOutput voronoi_smooth_f1(const VoronoiParams ¶ms, float4 cellPosition = math::floor(coord); float4 localPosition = coord - cellPosition; - float smoothDistance = 8.0f; + float smoothDistance = 0.0f; float3 smoothColor = {0.0f, 0.0f, 0.0f}; float4 smoothPosition = {0.0f, 0.0f, 0.0f, 0.0f}; + float h = -1.0f; for (int u = -2; u <= 2; u++) { for (int k = -2; k <= 2; k++) { for (int j = -2; j <= 2; j++) { @@ -2078,8 +2090,11 @@ VoronoiOutput voronoi_smooth_f1(const VoronoiParams ¶ms, float4 pointPosition = cellOffset + hash_float_to_float4(cellPosition + cellOffset) * params.randomness; float distanceToPoint = voronoi_distance(pointPosition, localPosition, params); - float h = smoothstep( - 0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness); + h = h == -1.0f ? + 1.0f : + smoothstep(0.0f, + 1.0f, + 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness); float correctionFactor = params.smoothness * h * (1.0f - h); smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor; correctionFactor /= 1.0f + 3.0f * params.smoothness; @@ -2106,8 +2121,8 @@ VoronoiOutput voronoi_f2(const VoronoiParams ¶ms, const float4 coord) float4 cellPosition = math::floor(coord); float4 localPosition = coord - cellPosition; - float distanceF1 = 8.0f; - float distanceF2 = 8.0f; + float distanceF1 = FLT_MAX; + float distanceF2 = FLT_MAX; float4 offsetF1 = {0.0f, 0.0f, 0.0f, 0.0f}; float4 positionF1 = {0.0f, 0.0f, 0.0f, 0.0f}; float4 offsetF2 = {0.0f, 0.0f, 0.0f, 0.0f}; @@ -2151,7 +2166,7 @@ float voronoi_distance_to_edge(const VoronoiParams ¶ms, const float4 coord) float4 localPosition = coord - cellPosition; float4 vectorToClosest = {0.0f, 0.0f, 0.0f, 0.0f}; - float minDistance = 8.0f; + float minDistance = FLT_MAX; for (int u = -1; u <= 1; u++) { for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { @@ -2171,7 +2186,7 @@ float voronoi_distance_to_edge(const VoronoiParams ¶ms, const float4 coord) } } - minDistance = 8.0f; + minDistance = FLT_MAX; for (int u = -1; u <= 1; u++) { for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { @@ -2202,7 +2217,7 @@ float voronoi_n_sphere_radius(const VoronoiParams ¶ms, const float4 coord) float4 closestPoint = {0.0f, 0.0f, 0.0f, 0.0f}; float4 closestPointOffset = {0.0f, 0.0f, 0.0f, 0.0f}; - float minDistance = 8.0f; + float minDistance = FLT_MAX; for (int u = -1; u <= 1; u++) { for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { @@ -2221,7 +2236,7 @@ float voronoi_n_sphere_radius(const VoronoiParams ¶ms, const float4 coord) } } - minDistance = 8.0f; + minDistance = FLT_MAX; float4 closestPointToClosestPoint = {0.0f, 0.0f, 0.0f, 0.0f}; for (int u = -1; u <= 1; u++) { for (int k = -1; k <= 1; k++) { diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_voronoi.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_voronoi.glsl index 7df1887439b..69e1eb40c2f 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_voronoi.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_voronoi.glsl @@ -129,7 +129,7 @@ VoronoiOutput voronoi_f1(VoronoiParams params, float coord) float cellPosition = floor(coord); float localPosition = coord - cellPosition; - float minDistance = 8.0; + float minDistance = FLT_MAX; float targetOffset = 0.0; float targetPosition = 0.0; for (int i = -1; i <= 1; i++) { @@ -156,16 +156,19 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, float coord) float cellPosition = floor(coord); float localPosition = coord - cellPosition; - float smoothDistance = 8.0; + float smoothDistance = 0.0; float smoothPosition = 0.0; vec3 smoothColor = vec3(0.0); + float h = -1.0; for (int i = -2; i <= 2; i++) { float cellOffset = i; float pointPosition = cellOffset + hash_float_to_float(cellPosition + cellOffset) * params.randomness; float distanceToPoint = voronoi_distance(pointPosition, localPosition); - float h = smoothstep( - 0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness); + h = h == -1.0 ? 1.0 : + smoothstep(0.0, + 1.0, + 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness); float correctionFactor = params.smoothness * h * (1.0 - h); smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor; correctionFactor /= 1.0 + 3.0 * params.smoothness; @@ -186,8 +189,8 @@ VoronoiOutput voronoi_f2(VoronoiParams params, float coord) float cellPosition = floor(coord); float localPosition = coord - cellPosition; - float distanceF1 = 8.0; - float distanceF2 = 8.0; + float distanceF1 = FLT_MAX; + float distanceF2 = FLT_MAX; float offsetF1 = 0.0; float positionF1 = 0.0; float offsetF2 = 0.0; @@ -240,7 +243,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, float coord) float closestPoint = 0.0; float closestPointOffset = 0.0; - float minDistance = 8.0; + float minDistance = FLT_MAX; for (int i = -1; i <= 1; i++) { float cellOffset = i; float pointPosition = cellOffset + @@ -253,7 +256,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, float coord) } } - minDistance = 8.0; + minDistance = FLT_MAX; float closestPointToClosestPoint = 0.0; for (int i = -1; i <= 1; i++) { if (i == 0) { @@ -284,7 +287,7 @@ VoronoiOutput voronoi_f1(VoronoiParams params, vec2 coord) vec2 cellPosition = floor(coord); vec2 localPosition = coord - cellPosition; - float minDistance = 8.0; + float minDistance = FLT_MAX; vec2 targetOffset = vec2(0.0); vec2 targetPosition = vec2(0.0); for (int j = -1; j <= 1; j++) { @@ -313,17 +316,20 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, vec2 coord) vec2 cellPosition = floor(coord); vec2 localPosition = coord - cellPosition; - float smoothDistance = 8.0; + float smoothDistance = 0.0; vec3 smoothColor = vec3(0.0); vec2 smoothPosition = vec2(0.0); + float h = -1.0; for (int j = -2; j <= 2; j++) { for (int i = -2; i <= 2; i++) { vec2 cellOffset = vec2(i, j); vec2 pointPosition = cellOffset + hash_vec2_to_vec2(cellPosition + cellOffset) * params.randomness; float distanceToPoint = voronoi_distance(pointPosition, localPosition, params); - float h = smoothstep( - 0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness); + h = h == -1.0 ? + 1.0 : + smoothstep( + 0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness); float correctionFactor = params.smoothness * h * (1.0 - h); smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor; correctionFactor /= 1.0 + 3.0 * params.smoothness; @@ -345,8 +351,8 @@ VoronoiOutput voronoi_f2(VoronoiParams params, vec2 coord) vec2 cellPosition = floor(coord); vec2 localPosition = coord - cellPosition; - float distanceF1 = 8.0; - float distanceF2 = 8.0; + float distanceF1 = FLT_MAX; + float distanceF2 = FLT_MAX; vec2 offsetF1 = vec2(0.0); vec2 positionF1 = vec2(0.0); vec2 offsetF2 = vec2(0.0); @@ -386,7 +392,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vec2 coord) vec2 localPosition = coord - cellPosition; vec2 vectorToClosest = vec2(0.0); - float minDistance = 8.0; + float minDistance = FLT_MAX; for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { vec2 cellOffset = vec2(i, j); @@ -401,7 +407,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vec2 coord) } } - minDistance = 8.0; + minDistance = FLT_MAX; for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { vec2 cellOffset = vec2(i, j); @@ -427,7 +433,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vec2 coord) vec2 closestPoint = vec2(0.0); vec2 closestPointOffset = vec2(0.0); - float minDistance = 8.0; + float minDistance = FLT_MAX; for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { vec2 cellOffset = vec2(i, j); @@ -442,7 +448,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vec2 coord) } } - minDistance = 8.0; + minDistance = FLT_MAX; vec2 closestPointToClosestPoint = vec2(0.0); for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { @@ -475,7 +481,7 @@ VoronoiOutput voronoi_f1(VoronoiParams params, vec3 coord) vec3 cellPosition = floor(coord); vec3 localPosition = coord - cellPosition; - float minDistance = 8.0; + float minDistance = FLT_MAX; vec3 targetOffset = vec3(0.0); vec3 targetPosition = vec3(0.0); for (int k = -1; k <= 1; k++) { @@ -506,9 +512,10 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, vec3 coord) vec3 cellPosition = floor(coord); vec3 localPosition = coord - cellPosition; - float smoothDistance = 8.0; + float smoothDistance = 0.0; vec3 smoothColor = vec3(0.0); vec3 smoothPosition = vec3(0.0); + float h = -1.0; for (int k = -2; k <= 2; k++) { for (int j = -2; j <= 2; j++) { for (int i = -2; i <= 2; i++) { @@ -516,8 +523,10 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, vec3 coord) vec3 pointPosition = cellOffset + hash_vec3_to_vec3(cellPosition + cellOffset) * params.randomness; float distanceToPoint = voronoi_distance(pointPosition, localPosition, params); - float h = smoothstep( - 0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness); + h = h == -1.0 ? + 1.0 : + smoothstep( + 0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness); float correctionFactor = params.smoothness * h * (1.0 - h); smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor; correctionFactor /= 1.0 + 3.0 * params.smoothness; @@ -540,8 +549,8 @@ VoronoiOutput voronoi_f2(VoronoiParams params, vec3 coord) vec3 cellPosition = floor(coord); vec3 localPosition = coord - cellPosition; - float distanceF1 = 8.0; - float distanceF2 = 8.0; + float distanceF1 = FLT_MAX; + float distanceF2 = FLT_MAX; vec3 offsetF1 = vec3(0.0); vec3 positionF1 = vec3(0.0); vec3 offsetF2 = vec3(0.0); @@ -583,7 +592,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vec3 coord) vec3 localPosition = coord - cellPosition; vec3 vectorToClosest = vec3(0.0); - float minDistance = 8.0; + float minDistance = FLT_MAX; for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { @@ -600,7 +609,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vec3 coord) } } - minDistance = 8.0; + minDistance = FLT_MAX; for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { @@ -628,7 +637,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vec3 coord) vec3 closestPoint = vec3(0.0); vec3 closestPointOffset = vec3(0.0); - float minDistance = 8.0; + float minDistance = FLT_MAX; for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { for (int i = -1; i <= 1; i++) { @@ -645,7 +654,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vec3 coord) } } - minDistance = 8.0; + minDistance = FLT_MAX; vec3 closestPointToClosestPoint = vec3(0.0); for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { @@ -680,7 +689,7 @@ VoronoiOutput voronoi_f1(VoronoiParams params, vec4 coord) vec4 cellPosition = floor(coord); vec4 localPosition = coord - cellPosition; - float minDistance = 8.0; + float minDistance = FLT_MAX; vec4 targetOffset = vec4(0.0); vec4 targetPosition = vec4(0.0); for (int u = -1; u <= 1; u++) { @@ -713,9 +722,10 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, vec4 coord) vec4 cellPosition = floor(coord); vec4 localPosition = coord - cellPosition; - float smoothDistance = 8.0; + float smoothDistance = 0.0; vec3 smoothColor = vec3(0.0); vec4 smoothPosition = vec4(0.0); + float h = -1.0; for (int u = -2; u <= 2; u++) { for (int k = -2; k <= 2; k++) { for (int j = -2; j <= 2; j++) { @@ -724,8 +734,11 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, vec4 coord) vec4 pointPosition = cellOffset + hash_vec4_to_vec4(cellPosition + cellOffset) * params.randomness; float distanceToPoint = voronoi_distance(pointPosition, localPosition, params); - float h = smoothstep( - 0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness); + h = h == -1.0 ? + 1.0 : + smoothstep(0.0, + 1.0, + 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness); float correctionFactor = params.smoothness * h * (1.0 - h); smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor; correctionFactor /= 1.0 + 3.0 * params.smoothness; @@ -749,8 +762,8 @@ VoronoiOutput voronoi_f2(VoronoiParams params, vec4 coord) vec4 cellPosition = floor(coord); vec4 localPosition = coord - cellPosition; - float distanceF1 = 8.0; - float distanceF2 = 8.0; + float distanceF1 = FLT_MAX; + float distanceF2 = FLT_MAX; vec4 offsetF1 = vec4(0.0); vec4 positionF1 = vec4(0.0); vec4 offsetF2 = vec4(0.0); @@ -794,7 +807,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vec4 coord) vec4 localPosition = coord - cellPosition; vec4 vectorToClosest = vec4(0.0); - float minDistance = 8.0; + float minDistance = FLT_MAX; for (int u = -1; u <= 1; u++) { for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { @@ -813,7 +826,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vec4 coord) } } - minDistance = 8.0; + minDistance = FLT_MAX; for (int u = -1; u <= 1; u++) { for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { @@ -843,7 +856,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vec4 coord) vec4 closestPoint = vec4(0.0); vec4 closestPointOffset = vec4(0.0); - float minDistance = 8.0; + float minDistance = FLT_MAX; for (int u = -1; u <= 1; u++) { for (int k = -1; k <= 1; k++) { for (int j = -1; j <= 1; j++) { @@ -862,7 +875,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vec4 coord) } } - minDistance = 8.0; + minDistance = FLT_MAX; vec4 closestPointToClosestPoint = vec4(0.0); for (int u = -1; u <= 1; u++) { for (int k = -1; k <= 1; k++) { -- 2.30.2 From 3fc45d6151c5ca492016316baa18c0bed29ba337 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Mon, 10 Jul 2023 11:59:18 -0400 Subject: [PATCH 110/115] Cleanup: Use C++ types, references for custom normals Also remove unnecessary namespace specification. --- source/blender/blenkernel/BKE_mesh.hh | 5 +- .../blender/blenkernel/intern/mesh_mirror.cc | 4 +- .../blender/blenkernel/intern/mesh_normals.cc | 247 +++++++++--------- 3 files changed, 121 insertions(+), 135 deletions(-) diff --git a/source/blender/blenkernel/BKE_mesh.hh b/source/blender/blenkernel/BKE_mesh.hh index 96924441bd9..7253025379c 100644 --- a/source/blender/blenkernel/BKE_mesh.hh +++ b/source/blender/blenkernel/BKE_mesh.hh @@ -132,9 +132,8 @@ struct CornerNormalSpaceArray { bool create_corners_by_space = false; }; -void lnor_space_custom_normal_to_data(const CornerNormalSpace *lnor_space, - const float custom_lnor[3], - short r_clnor_data[2]); +short2 lnor_space_custom_normal_to_data(const CornerNormalSpace &lnor_space, + const float3 &custom_lnor); /** * Compute split normals, i.e. vertex normals associated with each poly (hence 'loop normals'). diff --git a/source/blender/blenkernel/intern/mesh_mirror.cc b/source/blender/blenkernel/intern/mesh_mirror.cc index 11a9ba45e41..1694c63767d 100644 --- a/source/blender/blenkernel/intern/mesh_mirror.cc +++ b/source/blender/blenkernel/intern/mesh_mirror.cc @@ -436,8 +436,8 @@ Mesh *BKE_mesh_mirror_apply_mirror_on_axis_for_modifier(MirrorModifierData *mmd, mul_m4_v3(mtx_nor, loop_normals[mirrorj]); const int space_index = lnors_spacearr.corner_space_indices[mirrorj]; - blender::bke::mesh::lnor_space_custom_normal_to_data( - &lnors_spacearr.spaces[space_index], loop_normals[mirrorj], clnors[mirrorj]); + clnors[mirrorj] = blender::bke::mesh::lnor_space_custom_normal_to_data( + lnors_spacearr.spaces[space_index], loop_normals[mirrorj]); } } } diff --git a/source/blender/blenkernel/intern/mesh_normals.cc b/source/blender/blenkernel/intern/mesh_normals.cc index 274823b2fbd..4e696b43607 100644 --- a/source/blender/blenkernel/intern/mesh_normals.cc +++ b/source/blender/blenkernel/intern/mesh_normals.cc @@ -168,12 +168,8 @@ float3 poly_normal_calc(const Span vert_positions, const Span poly_ return float3(0); } -} // namespace blender::bke::mesh - /** \} */ -namespace blender::bke::mesh { - /* -------------------------------------------------------------------- */ /** \name Mesh Normal Calculation (Polygons & Vertices) * @@ -453,11 +449,12 @@ MLoopNorSpace *BKE_lnor_space_create(MLoopNorSpaceArray *lnors_spacearr) #define LNOR_SPACE_TRIGO_THRESHOLD (1.0f - 1e-4f) namespace blender::bke::mesh { -static void lnor_space_define(CornerNormalSpace *lnor_space, + +static void lnor_space_define(CornerNormalSpace &lnor_space, const float lnor[3], float vec_ref[3], float vec_other[3], - const blender::Span edge_vectors) + const Span edge_vectors) { const float pi2 = float(M_PI) * 2.0f; float tvec[3], dtp; @@ -469,16 +466,16 @@ static void lnor_space_define(CornerNormalSpace *lnor_space, { /* If vec_ref or vec_other are too much aligned with lnor, we can't build lnor space, * tag it as invalid and abort. */ - lnor_space->ref_alpha = lnor_space->ref_beta = 0.0f; + lnor_space.ref_alpha = lnor_space.ref_beta = 0.0f; return; } - lnor_space->vec_lnor = lnor; + lnor_space.vec_lnor = lnor; /* Compute ref alpha, average angle of all available edge vectors to lnor. */ if (!edge_vectors.is_empty()) { float alpha = 0.0f; - for (const blender::float3 &vec : edge_vectors) { + for (const float3 &vec : edge_vectors) { alpha += saacosf(dot_v3v3(vec, lnor)); } /* This piece of code shall only be called for more than one loop. */ @@ -487,21 +484,21 @@ static void lnor_space_define(CornerNormalSpace *lnor_space, * a smooth vertex with only two edges and two faces (our Monkey's nose has that, e.g.). */ BLI_assert(edge_vectors.size() >= 2); - lnor_space->ref_alpha = alpha / float(edge_vectors.size()); + lnor_space.ref_alpha = alpha / float(edge_vectors.size()); } else { - lnor_space->ref_alpha = (saacosf(dot_v3v3(vec_ref, lnor)) + - saacosf(dot_v3v3(vec_other, lnor))) / - 2.0f; + lnor_space.ref_alpha = (saacosf(dot_v3v3(vec_ref, lnor)) + + saacosf(dot_v3v3(vec_other, lnor))) / + 2.0f; } /* Project vec_ref on lnor's ortho plane. */ mul_v3_v3fl(tvec, lnor, dtp_ref); sub_v3_v3(vec_ref, tvec); - normalize_v3_v3(lnor_space->vec_ref, vec_ref); + normalize_v3_v3(lnor_space.vec_ref, vec_ref); - cross_v3_v3v3(tvec, lnor, lnor_space->vec_ref); - normalize_v3_v3(lnor_space->vec_ortho, tvec); + cross_v3_v3v3(tvec, lnor, lnor_space.vec_ref); + normalize_v3_v3(lnor_space.vec_ortho, tvec); /* Project vec_other on lnor's ortho plane. */ mul_v3_v3fl(tvec, lnor, dtp_other); @@ -509,15 +506,16 @@ static void lnor_space_define(CornerNormalSpace *lnor_space, normalize_v3(vec_other); /* Beta is angle between ref_vec and other_vec, around lnor. */ - dtp = dot_v3v3(lnor_space->vec_ref, vec_other); + dtp = dot_v3v3(lnor_space.vec_ref, vec_other); if (LIKELY(dtp < LNOR_SPACE_TRIGO_THRESHOLD)) { const float beta = saacos(dtp); - lnor_space->ref_beta = (dot_v3v3(lnor_space->vec_ortho, vec_other) < 0.0f) ? pi2 - beta : beta; + lnor_space.ref_beta = (dot_v3v3(lnor_space.vec_ortho, vec_other) < 0.0f) ? pi2 - beta : beta; } else { - lnor_space->ref_beta = pi2; + lnor_space.ref_beta = pi2; } } + } // namespace blender::bke::mesh void BKE_lnor_space_define(MLoopNorSpace *lnor_space, @@ -528,7 +526,7 @@ void BKE_lnor_space_define(MLoopNorSpace *lnor_space, { using namespace blender::bke::mesh; CornerNormalSpace space{}; - lnor_space_define(&space, lnor, vec_ref, vec_other, edge_vectors); + lnor_space_define(space, lnor, vec_ref, vec_other, edge_vectors); copy_v3_v3(lnor_space->vec_lnor, space.vec_lnor); copy_v3_v3(lnor_space->vec_ref, space.vec_ref); copy_v3_v3(lnor_space->vec_ortho, space.vec_ortho); @@ -572,39 +570,41 @@ MINLINE short unit_float_to_short(const float val) } namespace blender::bke::mesh { -static void lnor_space_custom_data_to_normal(const CornerNormalSpace *lnor_space, - const short clnor_data[2], - float r_custom_lnor[3]) + +static float3 lnor_space_custom_data_to_normal(const CornerNormalSpace &lnor_space, + const short2 clnor_data) { /* NOP custom normal data or invalid lnor space, return. */ - if (clnor_data[0] == 0 || lnor_space->ref_alpha == 0.0f || lnor_space->ref_beta == 0.0f) { - copy_v3_v3(r_custom_lnor, lnor_space->vec_lnor); - return; + if (clnor_data[0] == 0 || lnor_space.ref_alpha == 0.0f || lnor_space.ref_beta == 0.0f) { + return lnor_space.vec_lnor; } - { - /* TODO: Check whether using #sincosf() gives any noticeable benefit - * (could not even get it working under linux though)! */ - const float pi2 = float(M_PI * 2.0); - const float alphafac = unit_short_to_float(clnor_data[0]); - const float alpha = (alphafac > 0.0f ? lnor_space->ref_alpha : pi2 - lnor_space->ref_alpha) * - alphafac; - const float betafac = unit_short_to_float(clnor_data[1]); + float3 r_custom_lnor; - mul_v3_v3fl(r_custom_lnor, lnor_space->vec_lnor, cosf(alpha)); + /* TODO: Check whether using #sincosf() gives any noticeable benefit + * (could not even get it working under linux though)! */ + const float pi2 = float(M_PI * 2.0); + const float alphafac = unit_short_to_float(clnor_data[0]); + const float alpha = (alphafac > 0.0f ? lnor_space.ref_alpha : pi2 - lnor_space.ref_alpha) * + alphafac; + const float betafac = unit_short_to_float(clnor_data[1]); - if (betafac == 0.0f) { - madd_v3_v3fl(r_custom_lnor, lnor_space->vec_ref, sinf(alpha)); - } - else { - const float sinalpha = sinf(alpha); - const float beta = (betafac > 0.0f ? lnor_space->ref_beta : pi2 - lnor_space->ref_beta) * - betafac; - madd_v3_v3fl(r_custom_lnor, lnor_space->vec_ref, sinalpha * cosf(beta)); - madd_v3_v3fl(r_custom_lnor, lnor_space->vec_ortho, sinalpha * sinf(beta)); - } + mul_v3_v3fl(r_custom_lnor, lnor_space.vec_lnor, cosf(alpha)); + + if (betafac == 0.0f) { + madd_v3_v3fl(r_custom_lnor, lnor_space.vec_ref, sinf(alpha)); } + else { + const float sinalpha = sinf(alpha); + const float beta = (betafac > 0.0f ? lnor_space.ref_beta : pi2 - lnor_space.ref_beta) * + betafac; + madd_v3_v3fl(r_custom_lnor, lnor_space.vec_ref, sinalpha * cosf(beta)); + madd_v3_v3fl(r_custom_lnor, lnor_space.vec_ortho, sinalpha * sinf(beta)); + } + + return r_custom_lnor; } + } // namespace blender::bke::mesh void BKE_lnor_space_custom_data_to_normal(const MLoopNorSpace *lnor_space, @@ -618,62 +618,63 @@ void BKE_lnor_space_custom_data_to_normal(const MLoopNorSpace *lnor_space, space.vec_ortho = lnor_space->vec_ortho; space.ref_alpha = lnor_space->ref_alpha; space.ref_beta = lnor_space->ref_beta; - lnor_space_custom_data_to_normal(&space, clnor_data, r_custom_lnor); + copy_v3_v3(r_custom_lnor, lnor_space_custom_data_to_normal(space, clnor_data)); } namespace blender::bke::mesh { -void lnor_space_custom_normal_to_data(const CornerNormalSpace *lnor_space, - const float custom_lnor[3], - short r_clnor_data[2]) + +short2 lnor_space_custom_normal_to_data(const CornerNormalSpace &lnor_space, + const float3 &custom_lnor) { - /* We use nullptr vector as NOP custom normal (can be simpler than giving auto-computed `lnor`). - */ - if (is_zero_v3(custom_lnor) || compare_v3v3(lnor_space->vec_lnor, custom_lnor, 1e-4f)) { - r_clnor_data[0] = r_clnor_data[1] = 0; - return; + /* We use zero vector as NOP custom normal (can be simpler than giving auto-computed `lnor`). */ + if (is_zero_v3(custom_lnor) || compare_v3v3(lnor_space.vec_lnor, custom_lnor, 1e-4f)) { + return short2(0); } - { - const float pi2 = float(M_PI * 2.0); - const float cos_alpha = dot_v3v3(lnor_space->vec_lnor, custom_lnor); - float vec[3], cos_beta; - float alpha; + short2 r_clnor_data; - alpha = saacosf(cos_alpha); - if (alpha > lnor_space->ref_alpha) { - /* Note we could stick to [0, pi] range here, - * but makes decoding more complex, not worth it. */ - r_clnor_data[0] = unit_float_to_short(-(pi2 - alpha) / (pi2 - lnor_space->ref_alpha)); + const float pi2 = float(M_PI * 2.0); + const float cos_alpha = dot_v3v3(lnor_space.vec_lnor, custom_lnor); + float vec[3], cos_beta; + float alpha; + + alpha = saacosf(cos_alpha); + if (alpha > lnor_space.ref_alpha) { + /* Note we could stick to [0, pi] range here, + * but makes decoding more complex, not worth it. */ + r_clnor_data[0] = unit_float_to_short(-(pi2 - alpha) / (pi2 - lnor_space.ref_alpha)); + } + else { + r_clnor_data[0] = unit_float_to_short(alpha / lnor_space.ref_alpha); + } + + /* Project custom lnor on (vec_ref, vec_ortho) plane. */ + mul_v3_v3fl(vec, lnor_space.vec_lnor, -cos_alpha); + add_v3_v3(vec, custom_lnor); + normalize_v3(vec); + + cos_beta = dot_v3v3(lnor_space.vec_ref, vec); + + if (cos_beta < LNOR_SPACE_TRIGO_THRESHOLD) { + float beta = saacosf(cos_beta); + if (dot_v3v3(lnor_space.vec_ortho, vec) < 0.0f) { + beta = pi2 - beta; + } + + if (beta > lnor_space.ref_beta) { + r_clnor_data[1] = unit_float_to_short(-(pi2 - beta) / (pi2 - lnor_space.ref_beta)); } else { - r_clnor_data[0] = unit_float_to_short(alpha / lnor_space->ref_alpha); - } - - /* Project custom lnor on (vec_ref, vec_ortho) plane. */ - mul_v3_v3fl(vec, lnor_space->vec_lnor, -cos_alpha); - add_v3_v3(vec, custom_lnor); - normalize_v3(vec); - - cos_beta = dot_v3v3(lnor_space->vec_ref, vec); - - if (cos_beta < LNOR_SPACE_TRIGO_THRESHOLD) { - float beta = saacosf(cos_beta); - if (dot_v3v3(lnor_space->vec_ortho, vec) < 0.0f) { - beta = pi2 - beta; - } - - if (beta > lnor_space->ref_beta) { - r_clnor_data[1] = unit_float_to_short(-(pi2 - beta) / (pi2 - lnor_space->ref_beta)); - } - else { - r_clnor_data[1] = unit_float_to_short(beta / lnor_space->ref_beta); - } - } - else { - r_clnor_data[1] = 0; + r_clnor_data[1] = unit_float_to_short(beta / lnor_space.ref_beta); } } + else { + r_clnor_data[1] = 0; + } + + return r_clnor_data; } + } // namespace blender::bke::mesh void BKE_lnor_space_custom_normal_to_data(const MLoopNorSpace *lnor_space, @@ -687,7 +688,7 @@ void BKE_lnor_space_custom_normal_to_data(const MLoopNorSpace *lnor_space, space.vec_ortho = lnor_space->vec_ortho; space.ref_alpha = lnor_space->ref_alpha; space.ref_beta = lnor_space->ref_beta; - lnor_space_custom_normal_to_data(&space, custom_lnor, r_clnor_data); + copy_v2_v2_short(r_clnor_data, lnor_space_custom_normal_to_data(space, custom_lnor)); } namespace blender::bke::mesh { @@ -899,13 +900,13 @@ static void lnor_space_for_single_fan(LoopSplitTaskDataCommon *common_data, sub_v3_v3v3(vec_prev, positions[vert_3], positions[vert_pivot]); normalize_v3(vec_prev); - CornerNormalSpace *lnor_space = &lnors_spacearr->spaces[space_index]; + CornerNormalSpace &lnor_space = lnors_spacearr->spaces[space_index]; lnor_space_define(lnor_space, loop_normals[ml_curr_index], vec_curr, vec_prev, {}); lnors_spacearr->corner_space_indices[ml_curr_index] = space_index; if (!clnors_data.is_empty()) { - lnor_space_custom_data_to_normal( - lnor_space, clnors_data[ml_curr_index], loop_normals[ml_curr_index]); + loop_normals[ml_curr_index] = lnor_space_custom_data_to_normal(lnor_space, + clnors_data[ml_curr_index]); } if (!lnors_spacearr->corners_by_space.is_empty()) { @@ -953,7 +954,7 @@ static void split_loop_nor_fan_do(LoopSplitTaskDataCommon *common_data, /* We validate clnors data on the fly - cheapest way to do! */ int2 clnors_avg(0); - short2 *clnor_ref = nullptr; + const short2 *clnor_ref = nullptr; int clnors_count = 0; bool clnors_invalid = false; @@ -998,26 +999,21 @@ static void split_loop_nor_fan_do(LoopSplitTaskDataCommon *common_data, // printf("\thandling edge %d / loop %d\n", corner_edges[mlfan_curr_index], mlfan_curr_index); - { - /* Code similar to accumulate_vertex_normals_poly_v3. */ - /* Calculate angle between the two poly edges incident on this vertex. */ - const float fac = saacos(dot_v3v3(vec_curr, vec_prev)); - /* Accumulate */ - lnor += poly_normals[mpfan_curr_index] * fac; + /* Code similar to accumulate_vertex_normals_poly_v3. */ + /* Calculate angle between the two poly edges incident on this vertex. */ + lnor += poly_normals[mpfan_curr_index] * saacos(math::dot(vec_curr, vec_prev)); - if (!clnors_data.is_empty()) { - /* Accumulate all clnors, if they are not all equal we have to fix that! */ - short2 *clnor = &clnors_data[mlfan_vert_index]; - if (clnors_count) { - clnors_invalid |= ((*clnor_ref)[0] != (*clnor)[0] || (*clnor_ref)[1] != (*clnor)[1]); - } - else { - clnor_ref = clnor; - } - clnors_avg[0] += (*clnor)[0]; - clnors_avg[1] += (*clnor)[1]; - clnors_count++; + if (!clnors_data.is_empty()) { + /* Accumulate all clnors, if they are not all equal we have to fix that! */ + const short2 &clnor = clnors_data[mlfan_vert_index]; + if (clnors_count) { + clnors_invalid |= *clnor_ref != clnor; } + else { + clnor_ref = &clnor; + } + clnors_avg += int2(clnor); + clnors_count++; } processed_corners.append(mlfan_vert_index); @@ -1064,7 +1060,7 @@ static void split_loop_nor_fan_do(LoopSplitTaskDataCommon *common_data, length = 1.0f; } - CornerNormalSpace *lnor_space = &lnors_spacearr->spaces[space_index]; + CornerNormalSpace &lnor_space = lnors_spacearr->spaces[space_index]; lnor_space_define(lnor_space, lnor, vec_org, vec_curr, *edge_vectors); lnors_spacearr->corner_space_indices.as_mutable_span().fill_indices( processed_corners.as_span(), space_index); @@ -1072,20 +1068,17 @@ static void split_loop_nor_fan_do(LoopSplitTaskDataCommon *common_data, if (!clnors_data.is_empty()) { if (clnors_invalid) { - clnors_avg[0] /= clnors_count; - clnors_avg[1] /= clnors_count; + clnors_avg /= clnors_count; /* Fix/update all clnors of this fan with computed average value. */ if (G.debug & G_DEBUG) { printf("Invalid clnors in this fan!\n"); } - clnors_data.fill_indices(processed_corners.as_span(), - short2(clnors_avg[0], clnors_avg[1])); - // print_v2("new clnors", clnors_avg); + clnors_data.fill_indices(processed_corners.as_span(), short2(clnors_avg)); } /* Extra bonus: since small-stack is local to this function, * no more need to empty it at all cost! */ - lnor_space_custom_data_to_normal(lnor_space, *clnor_ref, lnor); + lnor = lnor_space_custom_data_to_normal(lnor_space, *clnor_ref); } } @@ -1598,27 +1591,21 @@ static void mesh_normals_loop_custom_set(Span positions, * give rather huge differences in computed 2D factors). */ if (fan_corners.size() < 2) { const int nidx = use_vertices ? corner_verts[i] : i; - float *nor = r_custom_loop_normals[nidx]; - - const int space_index = lnors_spacearr.corner_space_indices[i]; - lnor_space_custom_normal_to_data(&lnors_spacearr.spaces[space_index], nor, r_clnors_data[i]); + r_clnors_data[i] = lnor_space_custom_normal_to_data(lnors_spacearr.spaces[space_index], + r_custom_loop_normals[nidx]); done_loops[i].reset(); } else { float3 avg_nor(0.0f); for (const int lidx : fan_corners) { const int nidx = use_vertices ? corner_verts[lidx] : lidx; - float *nor = r_custom_loop_normals[nidx]; - - add_v3_v3(avg_nor, nor); - + avg_nor += r_custom_loop_normals[nidx]; done_loops[lidx].reset(); } mul_v3_fl(avg_nor, 1.0f / float(fan_corners.size())); - short2 clnor_data_tmp; - lnor_space_custom_normal_to_data( - &lnors_spacearr.spaces[space_index], avg_nor, clnor_data_tmp); + short2 clnor_data_tmp = lnor_space_custom_normal_to_data(lnors_spacearr.spaces[space_index], + avg_nor); r_clnors_data.fill_indices(fan_corners, clnor_data_tmp); } -- 2.30.2 From 5c4694759bc74422b0d4f15cb1df38a37abcdcca Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Mon, 10 Jul 2023 12:04:08 -0400 Subject: [PATCH 111/115] Cleanup: Return corner normal space by value --- .../blender/blenkernel/intern/mesh_normals.cc | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/source/blender/blenkernel/intern/mesh_normals.cc b/source/blender/blenkernel/intern/mesh_normals.cc index 4e696b43607..4329792c5d4 100644 --- a/source/blender/blenkernel/intern/mesh_normals.cc +++ b/source/blender/blenkernel/intern/mesh_normals.cc @@ -450,12 +450,12 @@ MLoopNorSpace *BKE_lnor_space_create(MLoopNorSpaceArray *lnors_spacearr) namespace blender::bke::mesh { -static void lnor_space_define(CornerNormalSpace &lnor_space, - const float lnor[3], - float vec_ref[3], - float vec_other[3], - const Span edge_vectors) +static CornerNormalSpace lnor_space_define(const float lnor[3], + float vec_ref[3], + float vec_other[3], + const Span edge_vectors) { + CornerNormalSpace lnor_space{}; const float pi2 = float(M_PI) * 2.0f; float tvec[3], dtp; const float dtp_ref = dot_v3v3(vec_ref, lnor); @@ -467,7 +467,7 @@ static void lnor_space_define(CornerNormalSpace &lnor_space, /* If vec_ref or vec_other are too much aligned with lnor, we can't build lnor space, * tag it as invalid and abort. */ lnor_space.ref_alpha = lnor_space.ref_beta = 0.0f; - return; + return lnor_space; } lnor_space.vec_lnor = lnor; @@ -514,6 +514,8 @@ static void lnor_space_define(CornerNormalSpace &lnor_space, else { lnor_space.ref_beta = pi2; } + + return lnor_space; } } // namespace blender::bke::mesh @@ -525,8 +527,7 @@ void BKE_lnor_space_define(MLoopNorSpace *lnor_space, const blender::Span edge_vectors) { using namespace blender::bke::mesh; - CornerNormalSpace space{}; - lnor_space_define(space, lnor, vec_ref, vec_other, edge_vectors); + const CornerNormalSpace space = lnor_space_define(lnor, vec_ref, vec_other, edge_vectors); copy_v3_v3(lnor_space->vec_lnor, space.vec_lnor); copy_v3_v3(lnor_space->vec_ref, space.vec_ref); copy_v3_v3(lnor_space->vec_ortho, space.vec_ortho); @@ -901,7 +902,7 @@ static void lnor_space_for_single_fan(LoopSplitTaskDataCommon *common_data, normalize_v3(vec_prev); CornerNormalSpace &lnor_space = lnors_spacearr->spaces[space_index]; - lnor_space_define(lnor_space, loop_normals[ml_curr_index], vec_curr, vec_prev, {}); + lnor_space = lnor_space_define(loop_normals[ml_curr_index], vec_curr, vec_prev, {}); lnors_spacearr->corner_space_indices[ml_curr_index] = space_index; if (!clnors_data.is_empty()) { @@ -1061,7 +1062,7 @@ static void split_loop_nor_fan_do(LoopSplitTaskDataCommon *common_data, } CornerNormalSpace &lnor_space = lnors_spacearr->spaces[space_index]; - lnor_space_define(lnor_space, lnor, vec_org, vec_curr, *edge_vectors); + lnor_space = lnor_space_define(lnor, vec_org, vec_curr, *edge_vectors); lnors_spacearr->corner_space_indices.as_mutable_span().fill_indices( processed_corners.as_span(), space_index); edge_vectors->clear(); -- 2.30.2 From a8186e1542fd3e3ea59cd01792b372fef4ebfbed Mon Sep 17 00:00:00 2001 From: Iliya Katueshenock Date: Mon, 10 Jul 2023 18:12:41 +0200 Subject: [PATCH 112/115] Fix #109885: Check if BVH tree is null in correct place The `BKE_bvhtree_from_pointcloud_get` function have requirements for input point cloud argument and initialization of `BVHTreeFromPointCloud` can be skipped. Due to `BVHTreeFromPointCloud` is not initialized by default constructor, it can contains garbage data. To check if tree is initialized field of `BVHTreeFromPointCloud`, return argument shouldn't be ignored. `[[nodiscard]]` attributes is added. Pull Request: https://projects.blender.org/blender/blender/pulls/109892 --- source/blender/blenkernel/BKE_bvhutils.h | 8 +++++--- source/blender/blenkernel/intern/bvhutils.cc | 6 +++--- .../nodes/geometry/nodes/node_geo_proximity.cc | 4 ++-- .../nodes/geometry/nodes/node_geo_sample_nearest.cc | 11 ++++++++--- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/source/blender/blenkernel/BKE_bvhutils.h b/source/blender/blenkernel/BKE_bvhutils.h index 5c15a431851..7d00e5a8ce9 100644 --- a/source/blender/blenkernel/BKE_bvhutils.h +++ b/source/blender/blenkernel/BKE_bvhutils.h @@ -247,9 +247,11 @@ typedef struct BVHTreeFromPointCloud { const float (*coords)[3]; } BVHTreeFromPointCloud; -BVHTree *BKE_bvhtree_from_pointcloud_get(struct BVHTreeFromPointCloud *data, - const struct PointCloud *pointcloud, - int tree_type); +#ifdef __cplusplus +[[nodiscard]] BVHTree *BKE_bvhtree_from_pointcloud_get(BVHTreeFromPointCloud *data, + const PointCloud *pointcloud, + int tree_type); +#endif void free_bvhtree_from_pointcloud(struct BVHTreeFromPointCloud *data); diff --git a/source/blender/blenkernel/intern/bvhutils.cc b/source/blender/blenkernel/intern/bvhutils.cc index abbb3e92397..061c276dd50 100644 --- a/source/blender/blenkernel/intern/bvhutils.cc +++ b/source/blender/blenkernel/intern/bvhutils.cc @@ -1369,9 +1369,9 @@ void free_bvhtree_from_mesh(BVHTreeFromMesh *data) /** \name Point Cloud BVH Building * \{ */ -BVHTree *BKE_bvhtree_from_pointcloud_get(BVHTreeFromPointCloud *data, - const PointCloud *pointcloud, - const int tree_type) +[[nodiscard]] BVHTree *BKE_bvhtree_from_pointcloud_get(BVHTreeFromPointCloud *data, + const PointCloud *pointcloud, + const int tree_type) { int tot_point = pointcloud->totpoint; BVHTree *tree = bvhtree_new_common(0.0f, tree_type, 6, tot_point, tot_point); diff --git a/source/blender/nodes/geometry/nodes/node_geo_proximity.cc b/source/blender/nodes/geometry/nodes/node_geo_proximity.cc index 42084ba1864..cc82e8a15d5 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_proximity.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_proximity.cc @@ -95,8 +95,8 @@ static bool calculate_pointcloud_proximity(const VArray &positions, MutableSpan r_locations) { BVHTreeFromPointCloud bvh_data; - BKE_bvhtree_from_pointcloud_get(&bvh_data, &pointcloud, 2); - if (bvh_data.tree == nullptr) { + const BVHTree *tree = BKE_bvhtree_from_pointcloud_get(&bvh_data, &pointcloud, 2); + if (tree == nullptr) { return false; } diff --git a/source/blender/nodes/geometry/nodes/node_geo_sample_nearest.cc b/source/blender/nodes/geometry/nodes/node_geo_sample_nearest.cc index 1b63e37579c..bddc0a97215 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_sample_nearest.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_sample_nearest.cc @@ -72,14 +72,19 @@ static void node_init(bNodeTree * /*tree*/, bNode *node) static void get_closest_pointcloud_points(const PointCloud &pointcloud, const VArray &positions, const IndexMask &mask, - const MutableSpan r_indices, - const MutableSpan r_distances_sq) + MutableSpan r_indices, + MutableSpan r_distances_sq) { BLI_assert(positions.size() >= r_indices.size()); BLI_assert(pointcloud.totpoint > 0); BVHTreeFromPointCloud tree_data; - BKE_bvhtree_from_pointcloud_get(&tree_data, &pointcloud, 2); + const BVHTree *tree = BKE_bvhtree_from_pointcloud_get(&tree_data, &pointcloud, 2); + if (tree == nullptr) { + r_indices.fill(0); + r_distances_sq.fill(0.0f); + return; + } mask.foreach_index([&](const int i) { BVHTreeNearest nearest; -- 2.30.2 From fc58d92acbf5cc11f9e0634e99a3d4e03a3938d5 Mon Sep 17 00:00:00 2001 From: Iliya Katueshenock Date: Mon, 10 Jul 2023 18:22:01 +0200 Subject: [PATCH 113/115] Fix #99569: Socket type drawing of custom type in view template Socket type drawing of custom type in view template. Pull Request: https://projects.blender.org/blender/blender/pulls/109871 --- source/blender/editors/space_node/node_templates.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/blender/editors/space_node/node_templates.cc b/source/blender/editors/space_node/node_templates.cc index ffde75c345b..91091477b83 100644 --- a/source/blender/editors/space_node/node_templates.cc +++ b/source/blender/editors/space_node/node_templates.cc @@ -898,6 +898,9 @@ static void ui_node_draw_input( split_wrapper.decorate_column, &inputptr, "default_value", RNA_NO_INDEX); break; } + case SOCK_CUSTOM: + input.typeinfo->draw(&C, sub, &inputptr, &nodeptr, input.name); + break; default: add_dummy_decorator = true; } -- 2.30.2 From a7978142af4784964bdacfda6f03a4d8d7934bff Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Mon, 10 Jul 2023 14:36:40 -0400 Subject: [PATCH 114/115] Compiles --- source/blender/blenlib/BLI_color_mix.hh | 11 + .../editors/sculpt_paint/paint_vertex.cc | 196 ++++++++++-------- .../editors/sculpt_paint/sculpt_intern.hh | 3 +- 3 files changed, 118 insertions(+), 92 deletions(-) diff --git a/source/blender/blenlib/BLI_color_mix.hh b/source/blender/blenlib/BLI_color_mix.hh index f7c8897ffe7..652b5c6f0e1 100644 --- a/source/blender/blenlib/BLI_color_mix.hh +++ b/source/blender/blenlib/BLI_color_mix.hh @@ -87,6 +87,17 @@ struct FloatTraits { } }; +template struct TraitsType { + using type = void; +}; +template<> struct TraitsType { + using type = FloatTraits; +}; +template<> struct TraitsType { + using type = ByteTraits; +}; +template using Traits = typename TraitsType::type; + static float get_luminance(ColorPaint4f c) { return IMB_colormanagement_get_luminance(&c.r); diff --git a/source/blender/editors/sculpt_paint/paint_vertex.cc b/source/blender/editors/sculpt_paint/paint_vertex.cc index 6fd4b212d47..1c044ed2f33 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.cc +++ b/source/blender/editors/sculpt_paint/paint_vertex.cc @@ -2916,14 +2916,14 @@ static void do_vpaint_brush_blur_loops(bContext *C, Object *ob, Mesh *me, Span nodes, - GMutableSpan lcol) + GMutableSpan attribute) { SculptSession *ss = ob->sculpt; const Brush *brush = ob->sculpt->cache->brush; const Scene *scene = CTX_data_scene(C); - GMutableSpan previous_color = ss->cache->prev_colors_vpaint; + GMutableSpan g_previous_color = ss->cache->prev_colors_vpaint; const blender::VArray select_vert = *me->attributes().lookup_or_default( ".select_vert", ATTR_DOMAIN_POINT, false); @@ -2981,8 +2981,10 @@ static void do_vpaint_brush_blur_loops(bContext *C, to_static_color_type(vpd->type, [&](auto dummy) { using Color = decltype(dummy); - // using Traits = + using Traits = color::Traits; using Blend = typename Traits::BlendType; + MutableSpan previous_color = g_previous_color.typed(); + MutableSpan colors = attribute.typed(); /* Get the average poly color */ Color color_final(0, 0, 0, 0); @@ -2991,23 +2993,23 @@ static void do_vpaint_brush_blur_loops(bContext *C, for (const int p_index : gmap->vert_to_poly[v_index]) { if (use_face_sel && !select_poly[p_index]) { - continue; + return; } const blender::IndexRange poly = ss->polys[p_index]; total_hit_loops += poly.size(); for (const int corner : poly) { - Color *col = lcol + corner; + const Color &col = colors[corner]; /* Color is squared to compensate the `sqrt` color encoding. */ - blend[0] += (Blend)col->r * (Blend)col->r; - blend[1] += (Blend)col->g * (Blend)col->g; - blend[2] += (Blend)col->b * (Blend)col->b; - blend[3] += (Blend)col->a * (Blend)col->a; + blend[0] += (Blend)col.r * (Blend)col.r; + blend[1] += (Blend)col.g * (Blend)col.g; + blend[2] += (Blend)col.b * (Blend)col.b; + blend[3] += (Blend)col.a * (Blend)col.a; } } if (total_hit_loops == 0) { - continue; + return; } /* Use rgb^2 color averaging. */ @@ -3032,7 +3034,7 @@ static void do_vpaint_brush_blur_loops(bContext *C, if (!previous_color.is_empty()) { /* Get the previous loop color */ if (isZero(previous_color[l_index])) { - previous_color[l_index] = lcol[l_index]; + previous_color[l_index] = colors[l_index]; } color_orig = previous_color[l_index]; } @@ -3040,8 +3042,12 @@ static void do_vpaint_brush_blur_loops(bContext *C, brush_alpha_pressure * grid_alpha; /* Mix the new color with the original * based on the brush strength and the curve. */ - lcol[l_index] = vpaint_blend( - vp, lcol[l_index], color_orig, *col, final_alpha, Traits::range * brush_strength); + colors[l_index] = vpaint_blend(vp, + colors[l_index], + color_orig, + *col, + final_alpha, + Traits::range * brush_strength); } }); } @@ -3057,14 +3063,14 @@ static void do_vpaint_brush_blur_verts(bContext *C, Object *ob, Mesh *me, Span nodes, - GMutableSpan lcol) + GMutableSpan attribute) { SculptSession *ss = ob->sculpt; const Brush *brush = ob->sculpt->cache->brush; const Scene *scene = CTX_data_scene(C); - GMutableSpan previous_color = ss->cache->prev_colors_vpaint; + GMutableSpan g_previous_color = ss->cache->prev_colors_vpaint; const blender::VArray select_vert = *me->attributes().lookup_or_default( ".select_vert", ATTR_DOMAIN_POINT, false); @@ -3122,7 +3128,10 @@ static void do_vpaint_brush_blur_verts(bContext *C, /* Get the average poly color */ to_static_color_type(vpd->type, [&](auto dummy) { using Color = decltype(dummy); + using Traits = color::Traits; using Blend = typename Traits::BlendType; + MutableSpan previous_color = g_previous_color.typed(); + MutableSpan colors = attribute.typed(); Color color_final(0, 0, 0, 0); int total_hit_loops = 0; @@ -3135,49 +3144,44 @@ static void do_vpaint_brush_blur_verts(bContext *C, const blender::IndexRange poly = ss->polys[p_index]; total_hit_loops += poly.size(); for (const int vert : ss->corner_verts.slice(poly)) { - Color *col = lcol + vert; + const Color &col = colors[vert]; /* Color is squared to compensate the `sqrt` color encoding. */ - blend[0] += (Blend)col->r * (Blend)col->r; - blend[1] += (Blend)col->g * (Blend)col->g; - blend[2] += (Blend)col->b * (Blend)col->b; - blend[3] += (Blend)col->a * (Blend)col->a; + blend[0] += (Blend)col.r * (Blend)col.r; + blend[1] += (Blend)col.g * (Blend)col.g; + blend[2] += (Blend)col.b * (Blend)col.b; + blend[3] += (Blend)col.a * (Blend)col.a; } } if (total_hit_loops == 0) { - continue; + return; } /* Use rgb^2 color averaging. */ - Color *col = &color_final; - color_final.r = Traits::round(sqrtf(Traits::divide_round(blend[0], total_hit_loops))); color_final.g = Traits::round(sqrtf(Traits::divide_round(blend[1], total_hit_loops))); color_final.b = Traits::round(sqrtf(Traits::divide_round(blend[2], total_hit_loops))); color_final.a = Traits::round(sqrtf(Traits::divide_round(blend[3], total_hit_loops))); - /* For each poly owning this vert, - * paint each loop belonging to this vert. */ - for (const int p_index : gmap->vert_to_poly[v_index]) { - if (use_face_sel && !select_poly[p_index]) { - continue; - } - Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ + Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ - if (!previous_color.is_empty()) { - /* Get the previous loop color */ - if (isZero(previous_color[v_index])) { - previous_color[v_index] = lcol[v_index]; - } - color_orig = previous_color[v_index]; + if (!previous_color.is_empty()) { + /* Get the previous loop color */ + if (isZero(previous_color[v_index])) { + previous_color[v_index] = colors[v_index]; } - const float final_alpha = Traits::range * brush_fade * brush_strength * - brush_alpha_pressure * grid_alpha; - /* Mix the new color with the original - * based on the brush strength and the curve. */ - lcol[v_index] = vpaint_blend( - vp, lcol[v_index], color_orig, *col, final_alpha, Traits::range * brush_strength); + color_orig = previous_color[v_index]; } + const float final_alpha = Traits::range * brush_fade * brush_strength * + brush_alpha_pressure * grid_alpha; + /* Mix the new color with the original + * based on the brush strength and the curve. */ + colors[v_index] = vpaint_blend(vp, + colors[v_index], + color_orig, + color_final, + final_alpha, + Traits::range * brush_strength); }); } BKE_pbvh_vertex_iter_end; @@ -3192,7 +3196,7 @@ static void do_vpaint_brush_smear(bContext *C, Object *ob, Mesh *me, Span nodes, - GMutableSpan lcol) + GMutableSpan attribute) { SculptSession *ss = ob->sculpt; @@ -3206,9 +3210,9 @@ static void do_vpaint_brush_smear(bContext *C, const Brush *brush = ob->sculpt->cache->brush; const Scene *scene = CTX_data_scene(C); - GMutableSpan color_curr = vpd->smear.color_curr; - GMutableSpan color_prev_smear = vpd->smear.color_prev; - GMutableSpan color_prev = ss->cache->prev_colors_vpaint; + GMutableSpan g_color_curr = vpd->smear.color_curr; + GMutableSpan g_color_prev_smear = vpd->smear.color_prev; + GMutableSpan g_color_prev = ss->cache->prev_colors_vpaint; float brush_size_pressure, brush_alpha_value, brush_alpha_pressure; @@ -3278,6 +3282,12 @@ static void do_vpaint_brush_smear(bContext *C, * direction of the brush movement */ to_static_color_type(vpd->type, [&](auto dummy) { using Color = decltype(dummy); + using Traits = color::Traits; + MutableSpan color_curr = g_color_curr.typed(); + MutableSpan color_prev_smear = g_color_prev_smear.typed(); + MutableSpan color_prev = g_color_prev.typed(); + MutableSpan colors = attribute.typed(); + Color color_final(0, 0, 0, 0); for (const int j : gmap->vert_to_poly[v_index].index_range()) { @@ -3305,7 +3315,7 @@ static void do_vpaint_brush_smear(bContext *C, const float stroke_dot = dot_v3v3(other_dir, brush_dir); int elem_index; - if (domain == ATTR_DOMAIN_POINT) { + if (vpd->domain == ATTR_DOMAIN_POINT) { elem_index = v_other_index; } else { @@ -3321,7 +3331,7 @@ static void do_vpaint_brush_smear(bContext *C, } if (!do_color) { - continue; + return; } const float final_alpha = Traits::range * brush_fade * brush_strength * @@ -3348,23 +3358,23 @@ static void do_vpaint_brush_smear(bContext *C, /* Get the previous element color */ Color color_orig(0, 0, 0, 0); /* unused when array is nullptr */ - if (color_prev != nullptr) { + if (!color_prev.is_empty()) { /* Get the previous element color */ if (isZero(color_prev[elem_index])) { - color_prev[elem_index] = lcol[elem_index]; + color_prev[elem_index] = colors[elem_index]; } color_orig = color_prev[elem_index]; } /* Mix the new color with the original * based on the brush strength and the curve. */ - lcol[elem_index] = vpaint_blend(vp, - lcol[elem_index], - color_orig, - color_final, - final_alpha, - Traits::range * brush_strength); + colors[elem_index] = vpaint_blend(vp, + colors[elem_index], + color_orig, + color_final, + final_alpha, + Traits::range * brush_strength); - color_curr[elem_index] = lcol[elem_index]; + color_curr[elem_index] = colors[elem_index]; } }); } @@ -3377,7 +3387,7 @@ static void calculate_average_color(VPaintData *vpd, Object *ob, Mesh *me, const Brush *brush, - GMutableSpan lcol, + const GSpan attribute, Span nodes) { SculptSession *ss = ob->sculpt; @@ -3398,7 +3408,9 @@ static void calculate_average_color(VPaintData *vpd, to_static_color_type(vpd->type, [&](auto dummy) { using Color = decltype(dummy); + using Traits = color::Traits; using Blend = typename Traits::BlendType; + const Span colors = attribute.typed(); Array> accum(nodes.size()); blender::threading::parallel_for(nodes.index_range(), 1LL, [&](IndexRange range) { @@ -3436,12 +3448,11 @@ static void calculate_average_color(VPaintData *vpd, elem_index = v_index; } - Color *col = lcol + elem_index; - /* Color is squared to compensate the `sqrt` color encoding. */ - accum2.value[0] += col->r * col->r; - accum2.value[1] += col->g * col->g; - accum2.value[2] += col->b * col->b; + const Color &col = colors[elem_index]; + accum2.value[0] += col.r * col.r; + accum2.value[1] += col.g * col.g; + accum2.value[2] += col.b * col.b; } } BKE_pbvh_vertex_iter_end; @@ -3464,7 +3475,7 @@ static void calculate_average_color(VPaintData *vpd, blend.b = Traits::round(sqrtf(Traits::divide_round(accum_value[2], accum_len))); blend.a = Traits::range; - vpd->paintcol = blend; + vpd->paintcol = toFloat(blend); } }); } @@ -3494,7 +3505,7 @@ static void vpaint_do_draw(bContext *C, Object *ob, Mesh *me, Span nodes, - GMutableSpan lcol) + GMutableSpan attribute) { SculptSession *ss = ob->sculpt; const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh); @@ -3522,7 +3533,7 @@ static void vpaint_do_draw(bContext *C, const ColorPaint4f paintcol = vpd->paintcol; - GMutableSpan previous_color = ss->cache->prev_colors_vpaint; + GMutableSpan g_previous_color = ss->cache->prev_colors_vpaint; const blender::VArray select_vert = *me->attributes().lookup_or_default( ".select_vert", ATTR_DOMAIN_POINT, false); @@ -3563,13 +3574,16 @@ static void vpaint_do_draw(bContext *C, to_static_color_type(vpd->type, [&](auto dummy) { using Color = decltype(dummy); - Color color_final = paintcol; + using Traits = color::Traits; + MutableSpan colors = attribute.typed(); + MutableSpan previous_color = g_previous_color.typed(); + Color color_final = fromFloat(paintcol); /* If we're painting with a texture, sample the texture color and alpha. */ float tex_alpha = 1.0; if (vpd->is_texbrush) { /* NOTE: we may want to paint alpha as vertex color alpha. */ - tex_alpha = paint_and_tex_color_alpha( + tex_alpha = paint_and_tex_color_alpha( vp, vpd, vpd->vertexcosnos[v_index].co, &color_final); } @@ -3581,19 +3595,19 @@ static void vpaint_do_draw(bContext *C, if (!previous_color.is_empty()) { /* Get the previous loop color */ if (isZero(previous_color[v_index])) { - previous_color[v_index] = lcol[v_index]; + previous_color[v_index] = colors[v_index]; } color_orig = previous_color[v_index]; } const float final_alpha = Traits::frange * brush_fade * brush_strength * tex_alpha * brush_alpha_pressure * grid_alpha; - lcol[v_index] = vpaint_blend(vp, - lcol[v_index], - color_orig, - color_final, - final_alpha, - Traits::range * brush_strength); + colors[v_index] = vpaint_blend(vp, + colors[v_index], + color_orig, + color_final, + final_alpha, + Traits::range * brush_strength); } else { /* For each poly owning this vert, paint each loop belonging to this vert. */ @@ -3609,7 +3623,7 @@ static void vpaint_do_draw(bContext *C, if (!previous_color.is_empty()) { /* Get the previous loop color */ if (isZero(previous_color[l_index])) { - previous_color[l_index] = lcol[l_index]; + previous_color[l_index] = colors[l_index]; } color_orig = previous_color[l_index]; } @@ -3617,12 +3631,12 @@ static void vpaint_do_draw(bContext *C, brush_alpha_pressure * grid_alpha; /* Mix the new color with the original based on final_alpha. */ - lcol[l_index] = vpaint_blend(vp, - lcol[l_index], - color_orig, - color_final, - final_alpha, - Traits::range * brush_strength); + colors[l_index] = vpaint_blend(vp, + colors[l_index], + color_orig, + color_final, + final_alpha, + Traits::range * brush_strength); } } }); @@ -3639,13 +3653,13 @@ static void vpaint_do_blur(bContext *C, Object *ob, Mesh *me, Span nodes, - GMutableSpan lcol) + GMutableSpan attribute) { if (vpd->domain == ATTR_DOMAIN_POINT) { - do_vpaint_brush_blur_verts(C, sd, vp, vpd, ob, me, nodes, lcol); + do_vpaint_brush_blur_verts(C, sd, vp, vpd, ob, me, nodes, attribute); } else { - do_vpaint_brush_blur_loops(C, sd, vp, vpd, ob, me, nodes, lcol); + do_vpaint_brush_blur_loops(C, sd, vp, vpd, ob, me, nodes, attribute); } } @@ -3655,7 +3669,7 @@ static void vpaint_paint_leaves(bContext *C, VPaintData *vpd, Object *ob, Mesh *me, - GMutableSpan lcol, + GMutableSpan attribute, Span nodes) { for (PBVHNode *node : nodes) { @@ -3666,16 +3680,16 @@ static void vpaint_paint_leaves(bContext *C, switch ((eBrushVertexPaintTool)brush->vertexpaint_tool) { case VPAINT_TOOL_AVERAGE: - calculate_average_color(vpd, ob, me, brush, lcol, nodes); + calculate_average_color(vpd, ob, me, brush, attribute, nodes); break; case VPAINT_TOOL_DRAW: - vpaint_do_draw(C, sd, vp, vpd, ob, me, nodes, lcol); + vpaint_do_draw(C, sd, vp, vpd, ob, me, nodes, attribute); break; case VPAINT_TOOL_BLUR: - vpaint_do_blur(C, sd, vp, vpd, ob, me, nodes, lcol); + vpaint_do_blur(C, sd, vp, vpd, ob, me, nodes, attribute); break; case VPAINT_TOOL_SMEAR: - do_vpaint_brush_smear(C, sd, vp, vpd, ob, me, nodes, lcol); + do_vpaint_brush_smear(C, sd, vp, vpd, ob, me, nodes, attribute); break; default: break; @@ -3702,7 +3716,7 @@ static void vpaint_do_paint(bContext *C, bke::GSpanAttributeWriter attribute = me->attributes_for_write().lookup_for_write_span( me->active_color_attribute); - BLI_assert(attribute.domain == domain); + BLI_assert(attribute.domain == vpd->domain); /* Paint those leaves. */ vpaint_paint_leaves(C, sd, vp, vpd, ob, me, attribute.span, nodes); diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.hh b/source/blender/editors/sculpt_paint/sculpt_intern.hh index 2bb8f697712..6c626ef6371 100644 --- a/source/blender/editors/sculpt_paint/sculpt_intern.hh +++ b/source/blender/editors/sculpt_paint/sculpt_intern.hh @@ -21,6 +21,7 @@ #include "BLI_bitmap.h" #include "BLI_compiler_attrs.h" #include "BLI_compiler_compat.h" +#include "BLI_generic_array.hh" #include "BLI_gsqueue.h" #include "BLI_implicit_sharing.hh" #include "BLI_span.hh" @@ -555,7 +556,7 @@ struct StrokeCache { float mouse_event[2]; float (*prev_colors)[4]; - GArray<> prev_colors_vpaint; + blender::GArray<> prev_colors_vpaint; /* Multires Displacement Smear. */ float (*prev_displacement)[3]; -- 2.30.2 From fc0d92ceddfa57499a37b6fd1a9c7d204fcc4323 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Mon, 10 Jul 2023 16:11:35 -0400 Subject: [PATCH 115/115] Progress --- .../editors/sculpt_paint/paint_vertex.cc | 150 ++++++++++-------- source/blender/editors/sculpt_paint/sculpt.cc | 6 +- 2 files changed, 84 insertions(+), 72 deletions(-) diff --git a/source/blender/editors/sculpt_paint/paint_vertex.cc b/source/blender/editors/sculpt_paint/paint_vertex.cc index 1c044ed2f33..7a92dc8909d 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.cc +++ b/source/blender/editors/sculpt_paint/paint_vertex.cc @@ -1179,7 +1179,7 @@ static void vwpaint_init_stroke(Depsgraph *depsgraph, Object *ob) * vwpaint_update_cache_invariants and vwpaint_update_cache_variants. */ if (!ss->cache) { - ss->cache = (StrokeCache *)MEM_callocN(sizeof(StrokeCache), "stroke cache"); + ss->cache = MEM_new(__func__); } } @@ -1582,7 +1582,7 @@ static void vwpaint_update_cache_invariants( /* VW paint needs to allocate stroke cache before update is called. */ if (!ss->cache) { - cache = (StrokeCache *)MEM_callocN(sizeof(StrokeCache), "stroke cache"); + cache = MEM_new(__func__); ss->cache = cache; } else { @@ -2795,10 +2795,10 @@ static void to_static_color_type(const eCustomDataType type, const Func &func) { switch (type) { case CD_PROP_COLOR: - func(ColorPaint4f()); + func(ColorGeometry4f()); break; case CD_PROP_BYTE_COLOR: - func(ColorPaint4b()); + func(ColorGeometry4b()); break; default: BLI_assert_unreachable(); @@ -2923,6 +2923,25 @@ static void do_vpaint_brush_blur_loops(bContext *C, const Brush *brush = ob->sculpt->cache->brush; const Scene *scene = CTX_data_scene(C); + const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh); + const bool has_grids = (pbvh_type == PBVH_GRIDS); + + const SculptVertexPaintGeomMap *gmap = &ss->mode.vpaint.gmap; + const StrokeCache *cache = ss->cache; + float brush_size_pressure, brush_alpha_value, brush_alpha_pressure; + get_brush_alpha_data( + scene, ss, brush, &brush_size_pressure, &brush_alpha_value, &brush_alpha_pressure); + const bool use_normal = vwpaint_use_normal(vp); + const bool use_vert_sel = (me->editflag & (ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL)) != + 0; + const bool use_face_sel = (me->editflag & ME_EDIT_PAINT_FACE_SEL) != 0; + + SculptBrushTest test_init; + SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( + ss, &test_init, brush->falloff_shape); + const float *sculpt_normal_frontface = SCULPT_brush_frontface_normal_from_falloff_shape( + ss, brush->falloff_shape); + GMutableSpan g_previous_color = ss->cache->prev_colors_vpaint; const blender::VArray select_vert = *me->attributes().lookup_or_default( @@ -2931,26 +2950,8 @@ static void do_vpaint_brush_blur_loops(bContext *C, ".select_poly", ATTR_DOMAIN_FACE, false); blender::threading::parallel_for(nodes.index_range(), 1LL, [&](IndexRange range) { + SculptBrushTest test = test_init; for (int n : range) { - const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh); - const bool has_grids = (pbvh_type == PBVH_GRIDS); - - const SculptVertexPaintGeomMap *gmap = &ss->mode.vpaint.gmap; - const StrokeCache *cache = ss->cache; - float brush_size_pressure, brush_alpha_value, brush_alpha_pressure; - get_brush_alpha_data( - scene, ss, brush, &brush_size_pressure, &brush_alpha_value, &brush_alpha_pressure); - const bool use_normal = vwpaint_use_normal(vp); - const bool use_vert_sel = (me->editflag & - (ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL)) != 0; - const bool use_face_sel = (me->editflag & ME_EDIT_PAINT_FACE_SEL) != 0; - - SculptBrushTest test; - SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( - ss, &test, brush->falloff_shape); - const float *sculpt_normal_frontface = SCULPT_brush_frontface_normal_from_falloff_shape( - ss, brush->falloff_shape); - /* For each vertex */ PBVHVertexIter vd; BKE_pbvh_vertex_iter_begin (ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { @@ -2980,11 +2981,13 @@ static void do_vpaint_brush_blur_loops(bContext *C, const float brush_fade = BKE_brush_curve_strength(brush, sqrtf(test.dist), cache->radius); to_static_color_type(vpd->type, [&](auto dummy) { - using Color = decltype(dummy); + using T = decltype(dummy); + using Color = + std::conditional_t, ColorPaint4f, ColorPaint4b>; using Traits = color::Traits; using Blend = typename Traits::BlendType; - MutableSpan previous_color = g_previous_color.typed(); - MutableSpan colors = attribute.typed(); + MutableSpan previous_color = g_previous_color.typed().template cast(); + MutableSpan colors = attribute.typed().template cast(); /* Get the average poly color */ Color color_final(0, 0, 0, 0); @@ -3070,6 +3073,25 @@ static void do_vpaint_brush_blur_verts(bContext *C, const Brush *brush = ob->sculpt->cache->brush; const Scene *scene = CTX_data_scene(C); + const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh); + const bool has_grids = (pbvh_type == PBVH_GRIDS); + + const SculptVertexPaintGeomMap *gmap = &ss->mode.vpaint.gmap; + const StrokeCache *cache = ss->cache; + float brush_size_pressure, brush_alpha_value, brush_alpha_pressure; + get_brush_alpha_data( + scene, ss, brush, &brush_size_pressure, &brush_alpha_value, &brush_alpha_pressure); + const bool use_normal = vwpaint_use_normal(vp); + const bool use_vert_sel = (me->editflag & (ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL)) != + 0; + const bool use_face_sel = (me->editflag & ME_EDIT_PAINT_FACE_SEL) != 0; + + SculptBrushTest test_init; + SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( + ss, &test_init, brush->falloff_shape); + const float *sculpt_normal_frontface = SCULPT_brush_frontface_normal_from_falloff_shape( + ss, brush->falloff_shape); + GMutableSpan g_previous_color = ss->cache->prev_colors_vpaint; const blender::VArray select_vert = *me->attributes().lookup_or_default( @@ -3078,26 +3100,8 @@ static void do_vpaint_brush_blur_verts(bContext *C, ".select_poly", ATTR_DOMAIN_FACE, false); blender::threading::parallel_for(nodes.index_range(), 1LL, [&](IndexRange range) { + SculptBrushTest test = test_init; for (int n : range) { - const PBVHType pbvh_type = BKE_pbvh_type(ss->pbvh); - const bool has_grids = (pbvh_type == PBVH_GRIDS); - - const SculptVertexPaintGeomMap *gmap = &ss->mode.vpaint.gmap; - const StrokeCache *cache = ss->cache; - float brush_size_pressure, brush_alpha_value, brush_alpha_pressure; - get_brush_alpha_data( - scene, ss, brush, &brush_size_pressure, &brush_alpha_value, &brush_alpha_pressure); - const bool use_normal = vwpaint_use_normal(vp); - const bool use_vert_sel = (me->editflag & - (ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL)) != 0; - const bool use_face_sel = (me->editflag & ME_EDIT_PAINT_FACE_SEL) != 0; - - SculptBrushTest test; - SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( - ss, &test, brush->falloff_shape); - const float *sculpt_normal_frontface = SCULPT_brush_frontface_normal_from_falloff_shape( - ss, brush->falloff_shape); - /* For each vertex */ PBVHVertexIter vd; BKE_pbvh_vertex_iter_begin (ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { @@ -3127,11 +3131,13 @@ static void do_vpaint_brush_blur_verts(bContext *C, /* Get the average poly color */ to_static_color_type(vpd->type, [&](auto dummy) { - using Color = decltype(dummy); + using T = decltype(dummy); + using Color = + std::conditional_t, ColorPaint4f, ColorPaint4b>; using Traits = color::Traits; using Blend = typename Traits::BlendType; - MutableSpan previous_color = g_previous_color.typed(); - MutableSpan colors = attribute.typed(); + MutableSpan previous_color = g_previous_color.typed().template cast(); + MutableSpan colors = attribute.typed().template cast(); Color color_final(0, 0, 0, 0); int total_hit_loops = 0; @@ -3230,9 +3236,9 @@ static void do_vpaint_brush_smear(bContext *C, return; } - SculptBrushTest test; + SculptBrushTest test_init; SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( - ss, &test, brush->falloff_shape); + ss, &test_init, brush->falloff_shape); const float *sculpt_normal_frontface = SCULPT_brush_frontface_normal_from_falloff_shape( ss, brush->falloff_shape); @@ -3242,6 +3248,7 @@ static void do_vpaint_brush_smear(bContext *C, ".select_poly", ATTR_DOMAIN_FACE, false); blender::threading::parallel_for(nodes.index_range(), 1LL, [&](IndexRange range) { + SculptBrushTest test = test_init; for (int n : range) { /* For each vertex */ PBVHVertexIter vd; @@ -3281,12 +3288,15 @@ static void do_vpaint_brush_smear(bContext *C, /* Get the color of the loop in the opposite * direction of the brush movement */ to_static_color_type(vpd->type, [&](auto dummy) { - using Color = decltype(dummy); + using T = decltype(dummy); + using Color = + std::conditional_t, ColorPaint4f, ColorPaint4b>; using Traits = color::Traits; - MutableSpan color_curr = g_color_curr.typed(); - MutableSpan color_prev_smear = g_color_prev_smear.typed(); - MutableSpan color_prev = g_color_prev.typed(); - MutableSpan colors = attribute.typed(); + MutableSpan color_curr = g_color_curr.typed().template cast(); + MutableSpan color_prev_smear = + g_color_prev_smear.typed().template cast(); + MutableSpan color_prev = g_color_prev.typed().template cast(); + MutableSpan colors = attribute.typed().template cast(); Color color_final(0, 0, 0, 0); @@ -3399,21 +3409,24 @@ static void calculate_average_color(VPaintData *vpd, const bool use_vert_sel = (me->editflag & (ME_EDIT_PAINT_FACE_SEL | ME_EDIT_PAINT_VERT_SEL)) != 0; - SculptBrushTest test; + SculptBrushTest test_init; SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( - ss, &test, brush->falloff_shape); + ss, &test_init, brush->falloff_shape); const blender::VArray select_vert = *me->attributes().lookup_or_default( ".select_vert", ATTR_DOMAIN_POINT, false); to_static_color_type(vpd->type, [&](auto dummy) { - using Color = decltype(dummy); + using T = decltype(dummy); + using Color = + std::conditional_t, ColorPaint4f, ColorPaint4b>; using Traits = color::Traits; using Blend = typename Traits::BlendType; - const Span colors = attribute.typed(); + const Span colors = attribute.typed().template cast(); Array> accum(nodes.size()); blender::threading::parallel_for(nodes.index_range(), 1LL, [&](IndexRange range) { + SculptBrushTest test = test_init; for (int n : range) { VPaintAverageAccum &accum2 = accum[n]; accum2.len = 0; @@ -3525,14 +3538,12 @@ static void vpaint_do_draw(bContext *C, 0; const bool use_face_sel = (me->editflag & ME_EDIT_PAINT_FACE_SEL) != 0; - SculptBrushTest test; + SculptBrushTest test_init; SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape( - ss, &test, brush->falloff_shape); + ss, &test_init, brush->falloff_shape); const float *sculpt_normal_frontface = SCULPT_brush_frontface_normal_from_falloff_shape( ss, brush->falloff_shape); - const ColorPaint4f paintcol = vpd->paintcol; - GMutableSpan g_previous_color = ss->cache->prev_colors_vpaint; const blender::VArray select_vert = *me->attributes().lookup_or_default( @@ -3542,6 +3553,7 @@ static void vpaint_do_draw(bContext *C, blender::threading::parallel_for(nodes.index_range(), 1LL, [&](IndexRange range) { for (int n : range) { + SculptBrushTest test = test_init; /* For each vertex */ PBVHVertexIter vd; BKE_pbvh_vertex_iter_begin (ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { @@ -3573,11 +3585,13 @@ static void vpaint_do_draw(bContext *C, const float brush_fade = BKE_brush_curve_strength(brush, sqrtf(test.dist), cache->radius); to_static_color_type(vpd->type, [&](auto dummy) { - using Color = decltype(dummy); + using T = decltype(dummy); + using Color = + std::conditional_t, ColorPaint4f, ColorPaint4b>; using Traits = color::Traits; - MutableSpan colors = attribute.typed(); - MutableSpan previous_color = g_previous_color.typed(); - Color color_final = fromFloat(paintcol); + MutableSpan colors = attribute.typed().template cast(); + MutableSpan previous_color = g_previous_color.typed().template cast(); + Color color_final = fromFloat(vpd->paintcol); /* If we're painting with a texture, sample the texture color and alpha. */ float tex_alpha = 1.0; @@ -3849,7 +3863,7 @@ static void vpaint_stroke_done(const bContext *C, PaintStroke *stroke) SculptSession *ss = ob->sculpt; - if (ss->cache->alt_smooth) { + if (ss->cache && ss->cache->alt_smooth) { ToolSettings *ts = CTX_data_tool_settings(C); VPaint *vp = ts->vpaint; smooth_brush_toggle_off(C, &vp->paint, ss->cache); diff --git a/source/blender/editors/sculpt_paint/sculpt.cc b/source/blender/editors/sculpt_paint/sculpt.cc index 2d8b014bfbf..bedf01c85ff 100644 --- a/source/blender/editors/sculpt_paint/sculpt.cc +++ b/source/blender/editors/sculpt_paint/sculpt.cc @@ -4334,7 +4334,6 @@ void SCULPT_cache_free(StrokeCache *cache) MEM_SAFE_FREE(cache->detail_directions); MEM_SAFE_FREE(cache->prev_displacement); MEM_SAFE_FREE(cache->limit_surface_co); - cache->prev_colors_vpaint = {}; if (cache->pose_ik_chain) { SCULPT_pose_ik_chain_free(cache->pose_ik_chain); @@ -4350,7 +4349,7 @@ void SCULPT_cache_free(StrokeCache *cache) SCULPT_cloth_simulation_free(cache->cloth_sim); } - MEM_freeN(cache); + MEM_delete(cache); } /* Initialize mirror modifier clipping. */ @@ -4454,8 +4453,7 @@ static void smooth_brush_toggle_off(const bContext *C, Paint *paint, StrokeCache static void sculpt_update_cache_invariants( bContext *C, Sculpt *sd, SculptSession *ss, wmOperator *op, const float mval[2]) { - StrokeCache *cache = static_cast( - MEM_callocN(sizeof(StrokeCache), "stroke cache")); + StrokeCache *cache = MEM_new(__func__); ToolSettings *tool_settings = CTX_data_tool_settings(C); UnifiedPaintSettings *ups = &tool_settings->unified_paint_settings; Brush *brush = BKE_paint_brush(&sd->paint); -- 2.30.2