Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Goudey <h.goudey@me.com>2020-12-10 17:55:44 +0300
committerHans Goudey <h.goudey@me.com>2020-12-10 17:55:44 +0300
commit4bdb67d5c0d4d88646f617e2f8f3be766edfad9f (patch)
treef5a2d09d2c894dc83fe705ad8cf295183c0ca030
parent62953c2bf39252fc59d0365b9a33453e179b66c0 (diff)
parent348bd319d5a88f45410a22f8ce2f527d8da48ef0 (diff)
Merge branch 'master' into geometry-nodes-point-separate-node
-rw-r--r--intern/cycles/blender/blender_mesh.cpp2
-rw-r--r--intern/cycles/kernel/kernels/optix/kernel_optix.cu8
-rw-r--r--intern/cycles/render/mesh.cpp25
-rw-r--r--intern/cycles/render/mesh.h1
-rw-r--r--release/scripts/modules/bpy/utils/__init__.py2
-rw-r--r--release/scripts/startup/bl_ui/properties_paint_common.py5
-rw-r--r--release/scripts/startup/keyingsets_builtins.py2
-rw-r--r--release/scripts/startup/nodeitems_builtins.py1
-rw-r--r--source/blender/blenkernel/BKE_blender_version.h2
-rw-r--r--source/blender/blenkernel/BKE_modifier.h14
-rw-r--r--source/blender/blenkernel/BKE_node.h5
-rw-r--r--source/blender/blenkernel/intern/anim_data.c12
-rw-r--r--source/blender/blenkernel/intern/linestyle.c2
-rw-r--r--source/blender/blenkernel/intern/node.c3
-rw-r--r--source/blender/blenkernel/intern/object.c2
-rw-r--r--source/blender/blenkernel/intern/object_dupli.c15
-rw-r--r--source/blender/blenkernel/intern/pointcloud.cc4
-rw-r--r--source/blender/blenkernel/intern/tracking.c12
-rw-r--r--source/blender/blenlib/BLI_string.h5
-rw-r--r--source/blender/blenlib/intern/string.c167
-rw-r--r--source/blender/blenlib/tests/BLI_string_test.cc181
-rw-r--r--source/blender/blenloader/intern/versioning_290.c4
-rw-r--r--source/blender/blenloader/intern/versioning_userdef.c4
-rw-r--r--source/blender/draw/engines/overlay/shaders/edit_uv_verts_frag.glsl3
-rw-r--r--source/blender/draw/engines/overlay/shaders/edit_uv_verts_vert.glsl2
-rw-r--r--source/blender/editors/animation/anim_deps.c8
-rw-r--r--source/blender/editors/animation/anim_filter.c19
-rw-r--r--source/blender/editors/animation/anim_ipo_utils.c3
-rw-r--r--source/blender/editors/animation/keyframes_general.c13
-rw-r--r--source/blender/editors/animation/keyframing.c23
-rw-r--r--source/blender/editors/armature/pose_select.c4
-rw-r--r--source/blender/editors/interface/interface_ops.c16
-rw-r--r--source/blender/editors/sculpt_paint/sculpt.c55
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_intern.h32
-rw-r--r--source/blender/editors/space_file/filelist.c6
-rw-r--r--source/blender/editors/space_node/drawnode.c11
-rw-r--r--source/blender/editors/space_text/text_header.c98
-rw-r--r--source/blender/editors/transform/transform_convert_armature.c28
-rw-r--r--source/blender/gpu/intern/gpu_batch.cc2
-rw-r--r--source/blender/io/collada/BCAnimationCurve.cpp10
-rw-r--r--source/blender/io/collada/BCAnimationSampler.cpp1
-rw-r--r--source/blender/io/collada/collada_utils.cpp11
-rw-r--r--source/blender/io/collada/collada_utils.h2
-rw-r--r--source/blender/makesdna/DNA_brush_types.h10
-rw-r--r--source/blender/makesrna/intern/rna_access.c94
-rw-r--r--source/blender/makesrna/intern/rna_armature.c2
-rw-r--r--source/blender/makesrna/intern/rna_boid.c2
-rw-r--r--source/blender/makesrna/intern/rna_brush.c19
-rw-r--r--source/blender/makesrna/intern/rna_cloth.c4
-rw-r--r--source/blender/makesrna/intern/rna_constraint.c6
-rw-r--r--source/blender/makesrna/intern/rna_dynamicpaint.c8
-rw-r--r--source/blender/makesrna/intern/rna_fluid.c6
-rw-r--r--source/blender/makesrna/intern/rna_gpencil.c6
-rw-r--r--source/blender/makesrna/intern/rna_gpencil_modifier.c2
-rw-r--r--source/blender/makesrna/intern/rna_key.c4
-rw-r--r--source/blender/makesrna/intern/rna_layer.c2
-rw-r--r--source/blender/makesrna/intern/rna_linestyle.c8
-rw-r--r--source/blender/makesrna/intern/rna_mask.c2
-rw-r--r--source/blender/makesrna/intern/rna_mesh.c30
-rw-r--r--source/blender/makesrna/intern/rna_modifier.c2
-rw-r--r--source/blender/makesrna/intern/rna_nla.c4
-rw-r--r--source/blender/makesrna/intern/rna_nodetree.c37
-rw-r--r--source/blender/makesrna/intern/rna_object_force.c18
-rw-r--r--source/blender/makesrna/intern/rna_particle.c4
-rw-r--r--source/blender/makesrna/intern/rna_pose.c2
-rw-r--r--source/blender/makesrna/intern/rna_rna.c2
-rw-r--r--source/blender/makesrna/intern/rna_sequencer.c14
-rw-r--r--source/blender/makesrna/intern/rna_shader_fx.c2
-rw-r--r--source/blender/makesrna/intern/rna_texture.c11
-rw-r--r--source/blender/modifiers/intern/MOD_armature.c2
-rw-r--r--source/blender/modifiers/intern/MOD_array.c2
-rw-r--r--source/blender/modifiers/intern/MOD_bevel.c2
-rw-r--r--source/blender/modifiers/intern/MOD_boolean.c2
-rw-r--r--source/blender/modifiers/intern/MOD_build.c2
-rw-r--r--source/blender/modifiers/intern/MOD_cast.c2
-rw-r--r--source/blender/modifiers/intern/MOD_cloth.c2
-rw-r--r--source/blender/modifiers/intern/MOD_collision.c2
-rw-r--r--source/blender/modifiers/intern/MOD_correctivesmooth.c2
-rw-r--r--source/blender/modifiers/intern/MOD_curve.c2
-rw-r--r--source/blender/modifiers/intern/MOD_datatransfer.c2
-rw-r--r--source/blender/modifiers/intern/MOD_decimate.c2
-rw-r--r--source/blender/modifiers/intern/MOD_displace.c2
-rw-r--r--source/blender/modifiers/intern/MOD_dynamicpaint.c2
-rw-r--r--source/blender/modifiers/intern/MOD_edgesplit.c2
-rw-r--r--source/blender/modifiers/intern/MOD_explode.c2
-rw-r--r--source/blender/modifiers/intern/MOD_fluid.c2
-rw-r--r--source/blender/modifiers/intern/MOD_hook.c2
-rw-r--r--source/blender/modifiers/intern/MOD_laplaciandeform.c2
-rw-r--r--source/blender/modifiers/intern/MOD_laplaciansmooth.c2
-rw-r--r--source/blender/modifiers/intern/MOD_lattice.c2
-rw-r--r--source/blender/modifiers/intern/MOD_mask.cc2
-rw-r--r--source/blender/modifiers/intern/MOD_mesh_to_volume.cc2
-rw-r--r--source/blender/modifiers/intern/MOD_meshcache.c2
-rw-r--r--source/blender/modifiers/intern/MOD_meshdeform.c2
-rw-r--r--source/blender/modifiers/intern/MOD_meshsequencecache.c2
-rw-r--r--source/blender/modifiers/intern/MOD_mirror.c2
-rw-r--r--source/blender/modifiers/intern/MOD_multires.c2
-rw-r--r--source/blender/modifiers/intern/MOD_nodes.cc8
-rw-r--r--source/blender/modifiers/intern/MOD_none.c2
-rw-r--r--source/blender/modifiers/intern/MOD_normal_edit.c2
-rw-r--r--source/blender/modifiers/intern/MOD_ocean.c2
-rw-r--r--source/blender/modifiers/intern/MOD_particleinstance.c2
-rw-r--r--source/blender/modifiers/intern/MOD_particlesystem.c2
-rw-r--r--source/blender/modifiers/intern/MOD_remesh.c2
-rw-r--r--source/blender/modifiers/intern/MOD_screw.c2
-rw-r--r--source/blender/modifiers/intern/MOD_shapekey.c2
-rw-r--r--source/blender/modifiers/intern/MOD_shrinkwrap.c2
-rw-r--r--source/blender/modifiers/intern/MOD_simpledeform.c2
-rw-r--r--source/blender/modifiers/intern/MOD_skin.c2
-rw-r--r--source/blender/modifiers/intern/MOD_smooth.c2
-rw-r--r--source/blender/modifiers/intern/MOD_softbody.c2
-rw-r--r--source/blender/modifiers/intern/MOD_solidify.c2
-rw-r--r--source/blender/modifiers/intern/MOD_subsurf.c2
-rw-r--r--source/blender/modifiers/intern/MOD_surface.c2
-rw-r--r--source/blender/modifiers/intern/MOD_surfacedeform.c2
-rw-r--r--source/blender/modifiers/intern/MOD_triangulate.c2
-rw-r--r--source/blender/modifiers/intern/MOD_uvproject.c2
-rw-r--r--source/blender/modifiers/intern/MOD_uvwarp.c2
-rw-r--r--source/blender/modifiers/intern/MOD_volume_displace.cc2
-rw-r--r--source/blender/modifiers/intern/MOD_volume_to_mesh.cc2
-rw-r--r--source/blender/modifiers/intern/MOD_warp.c2
-rw-r--r--source/blender/modifiers/intern/MOD_wave.c2
-rw-r--r--source/blender/modifiers/intern/MOD_weighted_normal.c2
-rw-r--r--source/blender/modifiers/intern/MOD_weightvgedit.c2
-rw-r--r--source/blender/modifiers/intern/MOD_weightvgmix.c2
-rw-r--r--source/blender/modifiers/intern/MOD_weightvgproximity.c2
-rw-r--r--source/blender/modifiers/intern/MOD_weld.c2
-rw-r--r--source/blender/modifiers/intern/MOD_wireframe.c2
-rw-r--r--source/blender/nodes/CMakeLists.txt1
-rw-r--r--source/blender/nodes/NOD_geometry.h1
-rw-r--r--source/blender/nodes/NOD_static_types.h1
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc130
-rw-r--r--source/blender/python/intern/bpy.c63
-rw-r--r--source/blender/sequencer/intern/sequencer.c2
-rw-r--r--tests/python/bl_blendfile_io.py4
-rw-r--r--tests/python/bl_blendfile_liblink.py1
136 files changed, 882 insertions, 571 deletions
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index e85b4ee1fc6..3420025f472 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -1064,6 +1064,8 @@ void BlenderSync::sync_mesh(BL::Depsgraph b_depsgraph, BL::Object b_ob, Mesh *me
/* update original sockets */
+ mesh->clear_non_sockets();
+
for (const SocketType &socket : new_mesh.type->inputs) {
/* Those sockets are updated in sync_object, so do not modify them. */
if (socket.name == "use_motion_blur" || socket.name == "motion_steps" ||
diff --git a/intern/cycles/kernel/kernels/optix/kernel_optix.cu b/intern/cycles/kernel/kernels/optix/kernel_optix.cu
index fd9065098dd..8ccd2555091 100644
--- a/intern/cycles/kernel/kernels/optix/kernel_optix.cu
+++ b/intern/cycles/kernel/kernels/optix/kernel_optix.cu
@@ -118,12 +118,18 @@ extern "C" __global__ void __anyhit__kernel_optix_local_hit()
return optixIgnoreIntersection();
}
+ const uint max_hits = optixGetPayload_5();
+ if (max_hits == 0) {
+ // Special case for when no hit information is requested, just report that something was hit
+ optixSetPayload_5(true);
+ return optixTerminateRay();
+ }
+
int hit = 0;
uint *const lcg_state = get_payload_ptr_0<uint>();
LocalIntersection *const local_isect = get_payload_ptr_2<LocalIntersection>();
if (lcg_state) {
- const uint max_hits = optixGetPayload_5();
for (int i = min(max_hits, local_isect->num_hits) - 1; i >= 0; --i) {
if (optixGetRayTmax() == local_isect->hits[i].t) {
return optixIgnoreIntersection();
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 11c8e240afd..43e664a686f 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -277,6 +277,20 @@ void Mesh::reserve_subd_creases(size_t num_creases)
subd_creases_weight.reserve(num_creases);
}
+void Mesh::clear_non_sockets()
+{
+ Geometry::clear(true);
+
+ num_subd_verts = 0;
+ num_subd_faces = 0;
+
+ vert_to_stitching_key_map.clear();
+ vert_stitching_map.clear();
+
+ delete patch_table;
+ patch_table = NULL;
+}
+
void Mesh::clear(bool preserve_shaders, bool preserve_voxel_data)
{
Geometry::clear(preserve_shaders);
@@ -297,22 +311,15 @@ void Mesh::clear(bool preserve_shaders, bool preserve_voxel_data)
subd_ptex_offset.clear();
subd_face_corners.clear();
- num_subd_verts = 0;
- num_subd_faces = 0;
-
subd_creases_edge.clear();
subd_creases_weight.clear();
subd_attributes.clear();
attributes.clear(preserve_voxel_data);
- vert_to_stitching_key_map.clear();
- vert_stitching_map.clear();
-
subdivision_type = SubdivisionType::SUBDIVISION_NONE;
- delete patch_table;
- patch_table = NULL;
+ clear_non_sockets();
}
void Mesh::clear(bool preserve_shaders)
@@ -662,7 +669,7 @@ void Mesh::add_undisplaced()
float3 *data = attr->data_float3();
/* copy verts */
- size_t size = attr->buffer_size(this, attrs.prim);
+ size_t size = attr->buffer_size(this, ATTR_PRIM_GEOMETRY);
/* Center points for ngons aren't stored in Mesh::verts but are included in size since they will
* be calculated later, we subtract them from size here so we don't have an overflow while
diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h
index 6630dcd8a35..e2746e560da 100644
--- a/intern/cycles/render/mesh.h
+++ b/intern/cycles/render/mesh.h
@@ -205,6 +205,7 @@ class Mesh : public Geometry {
void resize_subd_faces(int numfaces, int num_ngons, int numcorners);
void reserve_subd_faces(int numfaces, int num_ngons, int numcorners);
void reserve_subd_creases(size_t num_creases);
+ void clear_non_sockets();
void clear(bool preserve_shaders = false) override;
void add_vertex(float3 P);
void add_vertex_slow(float3 P);
diff --git a/release/scripts/modules/bpy/utils/__init__.py b/release/scripts/modules/bpy/utils/__init__.py
index 3ff259e0e3e..897010e80cf 100644
--- a/release/scripts/modules/bpy/utils/__init__.py
+++ b/release/scripts/modules/bpy/utils/__init__.py
@@ -26,6 +26,7 @@ not associated with blenders internal data.
__all__ = (
"blend_paths",
"escape_identifier",
+ "unescape_identifier",
"keyconfig_init",
"keyconfig_set",
"load_scripts",
@@ -60,6 +61,7 @@ from _bpy import (
_utils_units as units,
blend_paths,
escape_identifier,
+ unescape_identifier,
register_class,
resource_path,
script_paths as _bpy_script_paths,
diff --git a/release/scripts/startup/bl_ui/properties_paint_common.py b/release/scripts/startup/bl_ui/properties_paint_common.py
index 3075d76d6fa..1ae1826b609 100644
--- a/release/scripts/startup/bl_ui/properties_paint_common.py
+++ b/release/scripts/startup/bl_ui/properties_paint_common.py
@@ -643,6 +643,11 @@ def brush_settings(layout, context, brush, popover=False):
layout.prop(brush, "elastic_deform_volume_preservation", slider=True)
layout.separator()
+ elif sculpt_tool == 'SNAKE_HOOK':
+ layout.separator()
+ layout.prop(brush, "snake_hook_deform_type")
+ layout.separator()
+
elif sculpt_tool == 'POSE':
layout.separator()
layout.prop(brush, "deform_target")
diff --git a/release/scripts/startup/keyingsets_builtins.py b/release/scripts/startup/keyingsets_builtins.py
index 6dffeac35ce..012febc7cc7 100644
--- a/release/scripts/startup/keyingsets_builtins.py
+++ b/release/scripts/startup/keyingsets_builtins.py
@@ -520,7 +520,7 @@ class BUILTIN_KSI_WholeCharacter(KeyingSetInfo):
# for now, just add all of 'em
prop_rna = type(bone).bl_rna.properties.get(prop, None)
if prop_rna is None:
- prop_path = '["%s"]' % prop
+ prop_path = '["%s"]' % bpy.utils.escape_identifier(prop)
try:
rna_property = bone.path_resolve(prop_path, False)
except ValueError as ex:
diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index e624b4e5d1b..85f0f035a9c 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -484,6 +484,7 @@ geometry_node_categories = [
NodeItem("GeometryNodeRandomAttribute"),
NodeItem("GeometryNodeAttributeMath"),
NodeItem("GeometryNodeAttributeCompare"),
+ NodeItem("GeometryNodeAttributeFill"),
]),
GeometryNodeCategory("GEO_COLOR", "Color", items=[
NodeItem("ShaderNodeValToRGB"),
diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h
index 2ec9e0048a6..afb6112b954 100644
--- a/source/blender/blenkernel/BKE_blender_version.h
+++ b/source/blender/blenkernel/BKE_blender_version.h
@@ -39,7 +39,7 @@ extern "C" {
/* Blender file format version. */
#define BLENDER_FILE_VERSION BLENDER_VERSION
-#define BLENDER_FILE_SUBVERSION 5
+#define BLENDER_FILE_SUBVERSION 6
/* 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/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index 73e33124b43..38b449cd92d 100644
--- a/source/blender/blenkernel/BKE_modifier.h
+++ b/source/blender/blenkernel/BKE_modifier.h
@@ -244,12 +244,20 @@ typedef struct ModifierTypeInfo {
struct Mesh *(*modifyMesh)(struct ModifierData *md,
const struct ModifierEvalContext *ctx,
struct Mesh *mesh);
+
struct Hair *(*modifyHair)(struct ModifierData *md,
const struct ModifierEvalContext *ctx,
struct Hair *hair);
- void (*modifyPointCloud)(struct ModifierData *md,
- const struct ModifierEvalContext *ctx,
- struct GeometrySet *geometry_set);
+
+ /**
+ * The modifier has to change the geometry set in-place. The geometry set can contain zero or
+ * more geometry components. This callback can be used by modifiers that don't work on any
+ * specific type of geometry (e.g. mesh).
+ */
+ void (*modifyGeometrySet)(struct ModifierData *md,
+ const struct ModifierEvalContext *ctx,
+ struct GeometrySet *geometry_set);
+
struct Volume *(*modifyVolume)(struct ModifierData *md,
const struct ModifierEvalContext *ctx,
struct Volume *volume);
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 9f15b7f5d62..84ceed49674 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1350,8 +1350,9 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
#define GEO_NODE_RANDOM_ATTRIBUTE 1008
#define GEO_NODE_ATTRIBUTE_MATH 1009
#define GEO_NODE_JOIN_GEOMETRY 1010
-#define GEO_NODE_POINT_SEPARATE 1011
-#define GEO_NODE_ATTRIBUTE_COMPARE 1012
+#define GEO_NODE_ATTRIBUTE_FILL 1011
+#define GEO_NODE_POINT_SEPARATE 1012
+#define GEO_NODE_ATTRIBUTE_COMPARE 1013
/** \} */
diff --git a/source/blender/blenkernel/intern/anim_data.c b/source/blender/blenkernel/intern/anim_data.c
index a85509b11db..13abfa92032 100644
--- a/source/blender/blenkernel/intern/anim_data.c
+++ b/source/blender/blenkernel/intern/anim_data.c
@@ -989,8 +989,8 @@ char *BKE_animsys_fix_rna_path_rename(ID *owner_id,
char *name_old_esc = BLI_array_alloca(name_old_esc, (name_old_len * 2) + 1);
char *name_new_esc = BLI_array_alloca(name_new_esc, (name_new_len * 2) + 1);
- BLI_strescape(name_old_esc, oldName, (name_old_len * 2) + 1);
- BLI_strescape(name_new_esc, newName, (name_new_len * 2) + 1);
+ BLI_str_escape(name_old_esc, oldName, (name_old_len * 2) + 1);
+ BLI_str_escape(name_new_esc, newName, (name_new_len * 2) + 1);
oldN = BLI_sprintfN("[\"%s\"]", name_old_esc);
newN = BLI_sprintfN("[\"%s\"]", name_new_esc);
}
@@ -1048,8 +1048,8 @@ void BKE_action_fix_paths_rename(ID *owner_id,
char *name_old_esc = BLI_array_alloca(name_old_esc, (name_old_len * 2) + 1);
char *name_new_esc = BLI_array_alloca(name_new_esc, (name_new_len * 2) + 1);
- BLI_strescape(name_old_esc, oldName, (name_old_len * 2) + 1);
- BLI_strescape(name_new_esc, newName, (name_new_len * 2) + 1);
+ BLI_str_escape(name_old_esc, oldName, (name_old_len * 2) + 1);
+ BLI_str_escape(name_new_esc, newName, (name_new_len * 2) + 1);
oldN = BLI_sprintfN("[\"%s\"]", name_old_esc);
newN = BLI_sprintfN("[\"%s\"]", name_new_esc);
}
@@ -1096,8 +1096,8 @@ void BKE_animdata_fix_paths_rename(ID *owner_id,
char *name_old_esc = BLI_array_alloca(name_old_esc, (name_old_len * 2) + 1);
char *name_new_esc = BLI_array_alloca(name_new_esc, (name_new_len * 2) + 1);
- BLI_strescape(name_old_esc, oldName, (name_old_len * 2) + 1);
- BLI_strescape(name_new_esc, newName, (name_new_len * 2) + 1);
+ BLI_str_escape(name_old_esc, oldName, (name_old_len * 2) + 1);
+ BLI_str_escape(name_new_esc, newName, (name_new_len * 2) + 1);
oldN = BLI_sprintfN("[\"%s\"]", name_old_esc);
newN = BLI_sprintfN("[\"%s\"]", name_new_esc);
}
diff --git a/source/blender/blenkernel/intern/linestyle.c b/source/blender/blenkernel/intern/linestyle.c
index 69e6535a59f..8542959d4b0 100644
--- a/source/blender/blenkernel/intern/linestyle.c
+++ b/source/blender/blenkernel/intern/linestyle.c
@@ -2017,7 +2017,7 @@ char *BKE_linestyle_path_to_color_ramp(FreestyleLineStyle *linestyle, ColorBand
if (found) {
char name_esc[sizeof(m->name) * 2];
- BLI_strescape(name_esc, m->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, m->name, sizeof(name_esc));
return BLI_sprintfN("color_modifiers[\"%s\"].color_ramp", name_esc);
}
}
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 54c68019e81..402b22dcb2e 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -2708,7 +2708,7 @@ void nodeRemoveNode(Main *bmain, bNodeTree *ntree, bNode *node, bool do_id_user)
char propname_esc[MAX_IDPROP_NAME * 2];
char prefix[MAX_IDPROP_NAME * 2];
- BLI_strescape(propname_esc, node->name, sizeof(propname_esc));
+ BLI_str_escape(propname_esc, node->name, sizeof(propname_esc));
BLI_snprintf(prefix, sizeof(prefix), "nodes[\"%s\"]", propname_esc);
if (BKE_animdata_fix_paths_remove((ID *)ntree, prefix)) {
@@ -4682,6 +4682,7 @@ static void registerGeometryNodes(void)
{
register_node_type_geo_group();
+ register_node_type_geo_attribute_fill();
register_node_type_geo_triangulate();
register_node_type_geo_edge_split();
register_node_type_geo_transform();
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index d747da2213e..88a604a7b62 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -1325,7 +1325,7 @@ bool BKE_object_support_modifier_type_check(const Object *ob, int modifier_type)
return (mti->modifyHair != NULL) || (mti->flags & eModifierTypeFlag_AcceptsVertexCosOnly);
}
if (ob->type == OB_POINTCLOUD) {
- return (mti->modifyPointCloud != NULL);
+ return (mti->modifyGeometrySet != NULL);
}
if (ob->type == OB_VOLUME) {
return (mti->modifyVolume != NULL);
diff --git a/source/blender/blenkernel/intern/object_dupli.c b/source/blender/blenkernel/intern/object_dupli.c
index 9a8c560f116..d5434710e23 100644
--- a/source/blender/blenkernel/intern/object_dupli.c
+++ b/source/blender/blenkernel/intern/object_dupli.c
@@ -829,13 +829,18 @@ static void make_duplis_instances_component(const DupliContext *ctx)
size_to_mat4(scale_matrix, scales[i]);
float rotation_matrix[4][4];
eul_to_mat4(rotation_matrix, rotations[i]);
- float matrix[4][4];
- mul_m4_m4m4(matrix, rotation_matrix, scale_matrix);
- copy_v3_v3(matrix[3], positions[i]);
- mul_m4_m4_pre(matrix, ctx->object->obmat);
+ float instance_offset_matrix[4][4];
+ mul_m4_m4m4(instance_offset_matrix, rotation_matrix, scale_matrix);
+ copy_v3_v3(instance_offset_matrix[3], positions[i]);
+ float matrix[4][4];
+ mul_m4_m4m4(matrix, ctx->object->obmat, instance_offset_matrix);
make_dupli(ctx, object, matrix, i);
- make_recursive_duplis(ctx, object, matrix, i);
+
+ float space_matrix[4][4];
+ mul_m4_m4m4(space_matrix, instance_offset_matrix, object->imat);
+ mul_m4_m4_pre(space_matrix, ctx->object->obmat);
+ make_recursive_duplis(ctx, object, space_matrix, i);
}
}
diff --git a/source/blender/blenkernel/intern/pointcloud.cc b/source/blender/blenkernel/intern/pointcloud.cc
index 5f6685817b9..b4a9ad73048 100644
--- a/source/blender/blenkernel/intern/pointcloud.cc
+++ b/source/blender/blenkernel/intern/pointcloud.cc
@@ -365,8 +365,8 @@ static void pointcloud_evaluate_modifiers(struct Depsgraph *depsgraph,
continue;
}
- if (mti->modifyPointCloud) {
- mti->modifyPointCloud(md, &mectx, &geometry_set);
+ if (mti->modifyGeometrySet) {
+ mti->modifyGeometrySet(md, &mectx, &geometry_set);
}
}
}
diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c
index e083f7ceec0..e5f9d59270e 100644
--- a/source/blender/blenkernel/intern/tracking.c
+++ b/source/blender/blenkernel/intern/tracking.c
@@ -3138,13 +3138,13 @@ void BKE_tracking_get_rna_path_for_track(const struct MovieTracking *tracking,
{
MovieTrackingObject *object = BKE_tracking_find_object_for_track(tracking, track);
char track_name_esc[MAX_NAME * 2];
- BLI_strescape(track_name_esc, track->name, sizeof(track_name_esc));
+ BLI_str_escape(track_name_esc, track->name, sizeof(track_name_esc));
if (object == NULL) {
BLI_snprintf(rna_path, rna_path_len, "tracking.tracks[\"%s\"]", track_name_esc);
}
else {
char object_name_esc[MAX_NAME * 2];
- BLI_strescape(object_name_esc, object->name, sizeof(object_name_esc));
+ BLI_str_escape(object_name_esc, object->name, sizeof(object_name_esc));
BLI_snprintf(rna_path,
rna_path_len,
"tracking.objects[\"%s\"].tracks[\"%s\"]",
@@ -3164,7 +3164,7 @@ void BKE_tracking_get_rna_path_prefix_for_track(const struct MovieTracking *trac
}
else {
char object_name_esc[MAX_NAME * 2];
- BLI_strescape(object_name_esc, object->name, sizeof(object_name_esc));
+ BLI_str_escape(object_name_esc, object->name, sizeof(object_name_esc));
BLI_snprintf(rna_path, rna_path_len, "tracking.objects[\"%s\"]", object_name_esc);
}
}
@@ -3176,13 +3176,13 @@ void BKE_tracking_get_rna_path_for_plane_track(const struct MovieTracking *track
{
MovieTrackingObject *object = BKE_tracking_find_object_for_plane_track(tracking, plane_track);
char track_name_esc[MAX_NAME * 2];
- BLI_strescape(track_name_esc, plane_track->name, sizeof(track_name_esc));
+ BLI_str_escape(track_name_esc, plane_track->name, sizeof(track_name_esc));
if (object == NULL) {
BLI_snprintf(rna_path, rna_path_len, "tracking.plane_tracks[\"%s\"]", track_name_esc);
}
else {
char object_name_esc[MAX_NAME * 2];
- BLI_strescape(object_name_esc, object->name, sizeof(object_name_esc));
+ BLI_str_escape(object_name_esc, object->name, sizeof(object_name_esc));
BLI_snprintf(rna_path,
rna_path_len,
"tracking.objects[\"%s\"].plane_tracks[\"%s\"]",
@@ -3203,7 +3203,7 @@ void BKE_tracking_get_rna_path_prefix_for_plane_track(
}
else {
char object_name_esc[MAX_NAME * 2];
- BLI_strescape(object_name_esc, object->name, sizeof(object_name_esc));
+ BLI_str_escape(object_name_esc, object->name, sizeof(object_name_esc));
BLI_snprintf(rna_path, rna_path_len, "tracking.objects[\"%s\"].plane_tracks", object_name_esc);
}
}
diff --git a/source/blender/blenlib/BLI_string.h b/source/blender/blenlib/BLI_string.h
index 2d745e63764..096e7818013 100644
--- a/source/blender/blenlib/BLI_string.h
+++ b/source/blender/blenlib/BLI_string.h
@@ -85,8 +85,11 @@ size_t BLI_vsnprintf_rlen(char *__restrict buffer,
char *BLI_sprintfN(const char *__restrict format, ...) ATTR_WARN_UNUSED_RESULT
ATTR_NONNULL(1) ATTR_MALLOC ATTR_PRINTF_FORMAT(1, 2);
-size_t BLI_strescape(char *__restrict dst, const char *__restrict src, const size_t maxncpy)
+size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, const size_t dst_maxncpy)
ATTR_NONNULL();
+size_t BLI_str_unescape(char *__restrict dst, const char *__restrict src, const size_t src_maxncpy)
+ ATTR_NONNULL();
+const char *BLI_str_escape_find_quote(const char *str) ATTR_NONNULL();
size_t BLI_str_format_int_grouped(char dst[16], int num) ATTR_NONNULL();
size_t BLI_str_format_uint64_grouped(char dst[16], uint64_t num) ATTR_NONNULL();
diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c
index 02d12d2df9b..b0d87838d06 100644
--- a/source/blender/blenlib/intern/string.c
+++ b/source/blender/blenlib/intern/string.c
@@ -317,92 +317,135 @@ char *BLI_sprintfN(const char *__restrict format, ...)
return n;
}
-/* match pythons string escaping, assume double quotes - (")
- * TODO: should be used to create RNA animation paths.
- * TODO: support more fancy string escaping. current code is primitive
- * this basically is an ascii version of PyUnicode_EncodeUnicodeEscape()
- * which is a useful reference. */
-size_t BLI_strescape(char *__restrict dst, const char *__restrict src, const size_t maxncpy)
+/**
+ * This roughly matches C and Python's string escaping with double quotes - `"`.
+ *
+ * Since every character may need escaping,
+ * it's common to create a buffer twice as large as the input.
+ *
+ * \param dst: The destination string, at least \a dst_maxncpy, typically `(strlen(src) * 2) + 1`.
+ * \param src: The un-escaped source string.
+ * \param dst_maxncpy: The maximum number of bytes allowable to copy.
+ *
+ * \note This is used for creating animation paths in blend files.
+ */
+size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, const size_t dst_maxncpy)
{
- size_t len = 0;
- BLI_assert(maxncpy != 0);
+ BLI_assert(dst_maxncpy != 0);
- while (len < maxncpy) {
- switch (*src) {
- case '\0':
- goto escape_finish;
- case '\\':
- case '"':
- ATTR_FALLTHROUGH;
-
- /* less common but should also be support */
- case '\t':
- case '\n':
- case '\r':
- if (len + 1 < maxncpy) {
- *dst++ = '\\';
- len++;
- }
- else {
- /* not enough space to escape */
- break;
- }
- ATTR_FALLTHROUGH;
- default:
- *dst = *src;
+ size_t len = 0;
+ for (; (len < dst_maxncpy) && (*src != '\0'); dst++, src++, len++) {
+ char c = *src;
+ if (ELEM(c, '\\', '"') || /* Use as-is. */
+ ((c == '\t') && ((void)(c = 't'), true)) || /* Tab. */
+ ((c == '\n') && ((void)(c = 'n'), true)) || /* Newline. */
+ ((c == '\r') && ((void)(c = 'r'), true)) || /* Carriage return. */
+ ((c == '\a') && ((void)(c = 'a'), true)) || /* Bell. */
+ ((c == '\b') && ((void)(c = 'b'), true)) || /* Backspace. */
+ ((c == '\f') && ((void)(c = 'f'), true))) /* Form-feed. */
+ {
+ if (UNLIKELY(len + 1 >= dst_maxncpy)) {
+ /* Not enough space to escape. */
break;
+ }
+ *dst++ = '\\';
+ len++;
}
- dst++;
- src++;
- len++;
+ *dst = c;
}
-
-escape_finish:
-
*dst = '\0';
return len;
}
/**
- * Makes a copy of the text within the "" that appear after some text 'blahblah'
- * i.e. for string 'pose["apples"]' with prefix 'pose[', it should grab "apples"
+ * This roughly matches C and Python's string escaping with double quotes - `"`.
+ *
+ * The destination will never be larger than the source, it will either be the same
+ * or up to half when all characters are escaped.
+ *
+ * \param dst: The destination string, at least the size of `strlen(src) + 1`.
+ * \param src: The escaped source string.
+ * \param dst_maxncpy: The maximum number of bytes allowable to copy.
*
- * - str: is the entire string to chop
- * - prefix: is the part of the string to leave out
+ * \note This is used for for parsing animation paths in blend files.
+ */
+size_t BLI_str_unescape(char *__restrict dst, const char *__restrict src, const size_t src_maxncpy)
+{
+ size_t len = 0;
+ for (size_t i = 0; i < src_maxncpy && (*src != '\0'); i++, src++) {
+ char c = *src;
+ if (c == '\\') {
+ char c_next = *(src + 1);
+ if (((c_next == '"') && ((void)(c = '"'), true)) || /* Quote. */
+ ((c_next == '\\') && ((void)(c = '\\'), true)) || /* Backslash. */
+ ((c_next == 't') && ((void)(c = '\t'), true)) || /* Tab. */
+ ((c_next == 'n') && ((void)(c = '\n'), true)) || /* Newline. */
+ ((c_next == 'r') && ((void)(c = '\r'), true)) || /* Carriage return. */
+ ((c_next == 'a') && ((void)(c = '\a'), true)) || /* Bell. */
+ ((c_next == 'b') && ((void)(c = '\b'), true)) || /* Backspace. */
+ ((c_next == 'f') && ((void)(c = '\f'), true))) /* Form-feed. */
+ {
+ i++;
+ src++;
+ }
+ }
+
+ dst[len++] = c;
+ }
+ dst[len] = 0;
+ return len;
+}
+
+/**
+ * Find the first un-escaped quote in the string (to find the end of the string).
+ */
+const char *BLI_str_escape_find_quote(const char *str)
+{
+ bool escape = false;
+ while (*str && (*str != '"' || escape)) {
+ /* A pair of back-slashes represents a single back-slash,
+ * only use a single back-slash for escaping. */
+ escape = (escape == false) && (*str == '\\');
+ str++;
+ }
+ return (*str == '"') ? str : NULL;
+}
+
+/**
+ * Makes a copy of the text within the "" that appear after some text `blahblah`.
+ * i.e. for string `pose["apples"]` with prefix `pose[`, it will return `apples`.
*
- * Assume that the strings returned must be freed afterwards, and that the inputs will contain
- * data we want...
+ * \param str: is the entire string to chop.
+ * \param prefix: is the part of the string to step over.
*
- * \return the offset and a length so as to avoid doing an allocation.
+ * Assume that the strings returned must be freed afterwards,
+ * and that the inputs will contain data we want.
*/
char *BLI_str_quoted_substrN(const char *__restrict str, const char *__restrict prefix)
{
- const char *startMatch, *endMatch;
+ const char *start_match, *end_match;
- /* get the starting point (i.e. where prefix starts, and add prefixLen+1
+ /* get the starting point (i.e. where prefix starts, and add prefix_len+1
* to it to get be after the first " */
- startMatch = strstr(str, prefix);
- if (startMatch) {
- const size_t prefixLen = strlen(prefix);
- startMatch += prefixLen + 1;
+ start_match = strstr(str, prefix);
+ if (start_match) {
+ const size_t prefix_len = strlen(prefix);
+ start_match += prefix_len + 1;
/* get the end point (i.e. where the next occurrence of " is after the starting point) */
-
- endMatch = startMatch;
- while ((endMatch = strchr(endMatch, '"'))) {
- if (LIKELY(*(endMatch - 1) != '\\')) {
- break;
+ end_match = BLI_str_escape_find_quote(start_match);
+ if (end_match) {
+ const size_t unescaped_len = (size_t)(end_match - start_match);
+ char *result = MEM_mallocN(sizeof(char) * (unescaped_len + 1), __func__);
+ const size_t escaped_len = BLI_str_unescape(result, start_match, unescaped_len);
+ if (escaped_len != unescaped_len) {
+ result = MEM_reallocN(result, sizeof(char) * (escaped_len + 1));
}
- endMatch++;
- }
-
- if (endMatch) {
- /* return the slice indicated */
- return BLI_strdupn(startMatch, (size_t)(endMatch - startMatch));
+ return result;
}
}
- return BLI_strdupn("", 0);
+ return NULL;
}
/**
diff --git a/source/blender/blenlib/tests/BLI_string_test.cc b/source/blender/blenlib/tests/BLI_string_test.cc
index 58135adbcca..88cecaa5fee 100644
--- a/source/blender/blenlib/tests/BLI_string_test.cc
+++ b/source/blender/blenlib/tests/BLI_string_test.cc
@@ -27,14 +27,14 @@ TEST(string, StrPartition)
{
const char delim[] = {'-', '.', '_', '~', '\\', '\0'};
const char *sep, *suf;
- size_t pre_ln;
+ size_t pre_len;
{
const char *str = "mat.e-r_ial";
/* "mat.e-r_ial" -> "mat", '.', "e-r_ial", 3 */
- pre_ln = BLI_str_partition(str, delim, &sep, &suf);
- EXPECT_EQ(pre_ln, 3);
+ pre_len = BLI_str_partition(str, delim, &sep, &suf);
+ EXPECT_EQ(pre_len, 3);
EXPECT_EQ(&str[3], sep);
EXPECT_STREQ("e-r_ial", suf);
}
@@ -44,8 +44,8 @@ TEST(string, StrPartition)
const char *str = ".mate-rial--";
/* ".mate-rial--" -> "", '.', "mate-rial--", 0 */
- pre_ln = BLI_str_partition(str, delim, &sep, &suf);
- EXPECT_EQ(pre_ln, 0);
+ pre_len = BLI_str_partition(str, delim, &sep, &suf);
+ EXPECT_EQ(pre_len, 0);
EXPECT_EQ(&str[0], sep);
EXPECT_STREQ("mate-rial--", suf);
}
@@ -54,8 +54,8 @@ TEST(string, StrPartition)
const char *str = ".__.--_";
/* ".__.--_" -> "", '.', "__.--_", 0 */
- pre_ln = BLI_str_partition(str, delim, &sep, &suf);
- EXPECT_EQ(pre_ln, 0);
+ pre_len = BLI_str_partition(str, delim, &sep, &suf);
+ EXPECT_EQ(pre_len, 0);
EXPECT_EQ(&str[0], sep);
EXPECT_STREQ("__.--_", suf);
}
@@ -64,8 +64,8 @@ TEST(string, StrPartition)
const char *str = "";
/* "" -> "", NULL, NULL, 0 */
- pre_ln = BLI_str_partition(str, delim, &sep, &suf);
- EXPECT_EQ(pre_ln, 0);
+ pre_len = BLI_str_partition(str, delim, &sep, &suf);
+ EXPECT_EQ(pre_len, 0);
EXPECT_EQ(sep, (void *)nullptr);
EXPECT_EQ(suf, (void *)nullptr);
}
@@ -74,8 +74,8 @@ TEST(string, StrPartition)
const char *str = "material";
/* "material" -> "material", NULL, NULL, 8 */
- pre_ln = BLI_str_partition(str, delim, &sep, &suf);
- EXPECT_EQ(pre_ln, 8);
+ pre_len = BLI_str_partition(str, delim, &sep, &suf);
+ EXPECT_EQ(pre_len, 8);
EXPECT_EQ(sep, (void *)nullptr);
EXPECT_EQ(suf, (void *)nullptr);
}
@@ -86,14 +86,14 @@ TEST(string, StrRPartition)
{
const char delim[] = {'-', '.', '_', '~', '\\', '\0'};
const char *sep, *suf;
- size_t pre_ln;
+ size_t pre_len;
{
const char *str = "mat.e-r_ial";
/* "mat.e-r_ial" -> "mat.e-r", '_', "ial", 7 */
- pre_ln = BLI_str_rpartition(str, delim, &sep, &suf);
- EXPECT_EQ(pre_ln, 7);
+ pre_len = BLI_str_rpartition(str, delim, &sep, &suf);
+ EXPECT_EQ(pre_len, 7);
EXPECT_EQ(&str[7], sep);
EXPECT_STREQ("ial", suf);
}
@@ -103,8 +103,8 @@ TEST(string, StrRPartition)
const char *str = ".mate-rial--";
/* ".mate-rial--" -> ".mate-rial-", '-', "", 11 */
- pre_ln = BLI_str_rpartition(str, delim, &sep, &suf);
- EXPECT_EQ(pre_ln, 11);
+ pre_len = BLI_str_rpartition(str, delim, &sep, &suf);
+ EXPECT_EQ(pre_len, 11);
EXPECT_EQ(&str[11], sep);
EXPECT_STREQ("", suf);
}
@@ -113,8 +113,8 @@ TEST(string, StrRPartition)
const char *str = ".__.--_";
/* ".__.--_" -> ".__.--", '_', "", 6 */
- pre_ln = BLI_str_rpartition(str, delim, &sep, &suf);
- EXPECT_EQ(pre_ln, 6);
+ pre_len = BLI_str_rpartition(str, delim, &sep, &suf);
+ EXPECT_EQ(pre_len, 6);
EXPECT_EQ(&str[6], sep);
EXPECT_STREQ("", suf);
}
@@ -123,8 +123,8 @@ TEST(string, StrRPartition)
const char *str = "";
/* "" -> "", NULL, NULL, 0 */
- pre_ln = BLI_str_rpartition(str, delim, &sep, &suf);
- EXPECT_EQ(pre_ln, 0);
+ pre_len = BLI_str_rpartition(str, delim, &sep, &suf);
+ EXPECT_EQ(pre_len, 0);
EXPECT_EQ(sep, (void *)nullptr);
EXPECT_EQ(suf, (void *)nullptr);
}
@@ -133,8 +133,8 @@ TEST(string, StrRPartition)
const char *str = "material";
/* "material" -> "material", NULL, NULL, 8 */
- pre_ln = BLI_str_rpartition(str, delim, &sep, &suf);
- EXPECT_EQ(pre_ln, 8);
+ pre_len = BLI_str_rpartition(str, delim, &sep, &suf);
+ EXPECT_EQ(pre_len, 8);
EXPECT_EQ(sep, (void *)nullptr);
EXPECT_EQ(suf, (void *)nullptr);
}
@@ -145,7 +145,7 @@ TEST(string, StrPartitionEx)
{
const char delim[] = {'-', '.', '_', '~', '\\', '\0'};
const char *sep, *suf;
- size_t pre_ln;
+ size_t pre_len;
/* Only considering 'from_right' cases here. */
@@ -153,8 +153,8 @@ TEST(string, StrPartitionEx)
const char *str = "mat.e-r_ia.l";
/* "mat.e-r_ia.l" over "mat.e-r" -> "mat.e", '.', "r_ia.l", 3 */
- pre_ln = BLI_str_partition_ex(str, str + 6, delim, &sep, &suf, true);
- EXPECT_EQ(pre_ln, 5);
+ pre_len = BLI_str_partition_ex(str, str + 6, delim, &sep, &suf, true);
+ EXPECT_EQ(pre_len, 5);
EXPECT_EQ(&str[5], sep);
EXPECT_STREQ("r_ia.l", suf);
}
@@ -164,8 +164,8 @@ TEST(string, StrPartitionEx)
const char *str = "mate.rial";
/* "mate.rial" over "mate" -> "mate.rial", NULL, NULL, 4 */
- pre_ln = BLI_str_partition_ex(str, str + 4, delim, &sep, &suf, true);
- EXPECT_EQ(pre_ln, 4);
+ pre_len = BLI_str_partition_ex(str, str + 4, delim, &sep, &suf, true);
+ EXPECT_EQ(pre_len, 4);
EXPECT_EQ(sep, (void *)nullptr);
EXPECT_EQ(suf, (void *)nullptr);
}
@@ -176,14 +176,14 @@ TEST(string, StrPartitionUtf8)
{
const unsigned int delim[] = {'-', '.', '_', 0x00F1 /* n tilde */, 0x262F /* ying-yang */, '\0'};
const char *sep, *suf;
- size_t pre_ln;
+ size_t pre_len;
{
const char *str = "ma\xc3\xb1te-r\xe2\x98\xafial";
/* "ma\xc3\xb1te-r\xe2\x98\xafial" -> "ma", '\xc3\xb1', "te-r\xe2\x98\xafial", 2 */
- pre_ln = BLI_str_partition_utf8(str, delim, &sep, &suf);
- EXPECT_EQ(pre_ln, 2);
+ pre_len = BLI_str_partition_utf8(str, delim, &sep, &suf);
+ EXPECT_EQ(pre_len, 2);
EXPECT_EQ(&str[2], sep);
EXPECT_STREQ("te-r\xe2\x98\xafial", suf);
}
@@ -193,8 +193,8 @@ TEST(string, StrPartitionUtf8)
const char *str = "\xe2\x98\xafmate-rial-\xc3\xb1";
/* "\xe2\x98\xafmate-rial-\xc3\xb1" -> "", '\xe2\x98\xaf', "mate-rial-\xc3\xb1", 0 */
- pre_ln = BLI_str_partition_utf8(str, delim, &sep, &suf);
- EXPECT_EQ(pre_ln, 0);
+ pre_len = BLI_str_partition_utf8(str, delim, &sep, &suf);
+ EXPECT_EQ(pre_len, 0);
EXPECT_EQ(&str[0], sep);
EXPECT_STREQ("mate-rial-\xc3\xb1", suf);
}
@@ -203,8 +203,8 @@ TEST(string, StrPartitionUtf8)
const char *str = "\xe2\x98\xaf.\xc3\xb1_.--\xc3\xb1";
/* "\xe2\x98\xaf.\xc3\xb1_.--\xc3\xb1" -> "", '\xe2\x98\xaf', ".\xc3\xb1_.--\xc3\xb1", 0 */
- pre_ln = BLI_str_partition_utf8(str, delim, &sep, &suf);
- EXPECT_EQ(pre_ln, 0);
+ pre_len = BLI_str_partition_utf8(str, delim, &sep, &suf);
+ EXPECT_EQ(pre_len, 0);
EXPECT_EQ(&str[0], sep);
EXPECT_STREQ(".\xc3\xb1_.--\xc3\xb1", suf);
}
@@ -213,8 +213,8 @@ TEST(string, StrPartitionUtf8)
const char *str = "";
/* "" -> "", NULL, NULL, 0 */
- pre_ln = BLI_str_partition_utf8(str, delim, &sep, &suf);
- EXPECT_EQ(pre_ln, 0);
+ pre_len = BLI_str_partition_utf8(str, delim, &sep, &suf);
+ EXPECT_EQ(pre_len, 0);
EXPECT_EQ(sep, (void *)nullptr);
EXPECT_EQ(suf, (void *)nullptr);
}
@@ -223,8 +223,8 @@ TEST(string, StrPartitionUtf8)
const char *str = "material";
/* "material" -> "material", NULL, NULL, 8 */
- pre_ln = BLI_str_partition_utf8(str, delim, &sep, &suf);
- EXPECT_EQ(pre_ln, 8);
+ pre_len = BLI_str_partition_utf8(str, delim, &sep, &suf);
+ EXPECT_EQ(pre_len, 8);
EXPECT_EQ(sep, (void *)nullptr);
EXPECT_EQ(suf, (void *)nullptr);
}
@@ -235,14 +235,14 @@ TEST(string, StrRPartitionUtf8)
{
const unsigned int delim[] = {'-', '.', '_', 0x00F1 /* n tilde */, 0x262F /* ying-yang */, '\0'};
const char *sep, *suf;
- size_t pre_ln;
+ size_t pre_len;
{
const char *str = "ma\xc3\xb1te-r\xe2\x98\xafial";
/* "ma\xc3\xb1te-r\xe2\x98\xafial" -> "mat\xc3\xb1te-r", '\xe2\x98\xaf', "ial", 8 */
- pre_ln = BLI_str_rpartition_utf8(str, delim, &sep, &suf);
- EXPECT_EQ(pre_ln, 8);
+ pre_len = BLI_str_rpartition_utf8(str, delim, &sep, &suf);
+ EXPECT_EQ(pre_len, 8);
EXPECT_EQ(&str[8], sep);
EXPECT_STREQ("ial", suf);
}
@@ -252,8 +252,8 @@ TEST(string, StrRPartitionUtf8)
const char *str = "\xe2\x98\xafmate-rial-\xc3\xb1";
/* "\xe2\x98\xafmate-rial-\xc3\xb1" -> "\xe2\x98\xafmate-rial-", '\xc3\xb1', "", 13 */
- pre_ln = BLI_str_rpartition_utf8(str, delim, &sep, &suf);
- EXPECT_EQ(pre_ln, 13);
+ pre_len = BLI_str_rpartition_utf8(str, delim, &sep, &suf);
+ EXPECT_EQ(pre_len, 13);
EXPECT_EQ(&str[13], sep);
EXPECT_STREQ("", suf);
}
@@ -262,8 +262,8 @@ TEST(string, StrRPartitionUtf8)
const char *str = "\xe2\x98\xaf.\xc3\xb1_.--\xc3\xb1";
/* "\xe2\x98\xaf.\xc3\xb1_.--\xc3\xb1" -> "\xe2\x98\xaf.\xc3\xb1_.--", '\xc3\xb1', "", 10 */
- pre_ln = BLI_str_rpartition_utf8(str, delim, &sep, &suf);
- EXPECT_EQ(pre_ln, 10);
+ pre_len = BLI_str_rpartition_utf8(str, delim, &sep, &suf);
+ EXPECT_EQ(pre_len, 10);
EXPECT_EQ(&str[10], sep);
EXPECT_STREQ("", suf);
}
@@ -272,8 +272,8 @@ TEST(string, StrRPartitionUtf8)
const char *str = "";
/* "" -> "", NULL, NULL, 0 */
- pre_ln = BLI_str_rpartition_utf8(str, delim, &sep, &suf);
- EXPECT_EQ(pre_ln, 0);
+ pre_len = BLI_str_rpartition_utf8(str, delim, &sep, &suf);
+ EXPECT_EQ(pre_len, 0);
EXPECT_EQ(sep, (void *)nullptr);
EXPECT_EQ(suf, (void *)nullptr);
}
@@ -282,8 +282,8 @@ TEST(string, StrRPartitionUtf8)
const char *str = "material";
/* "material" -> "material", NULL, NULL, 8 */
- pre_ln = BLI_str_rpartition_utf8(str, delim, &sep, &suf);
- EXPECT_EQ(pre_ln, 8);
+ pre_len = BLI_str_rpartition_utf8(str, delim, &sep, &suf);
+ EXPECT_EQ(pre_len, 8);
EXPECT_EQ(sep, (void *)nullptr);
EXPECT_EQ(suf, (void *)nullptr);
}
@@ -294,7 +294,7 @@ TEST(string, StrPartitionExUtf8)
{
const unsigned int delim[] = {'-', '.', '_', 0x00F1 /* n tilde */, 0x262F /* ying-yang */, '\0'};
const char *sep, *suf;
- size_t pre_ln;
+ size_t pre_len;
/* Only considering 'from_right' cases here. */
@@ -303,8 +303,8 @@ TEST(string, StrPartitionExUtf8)
/* "ma\xc3\xb1te-r\xe2\x98\xafial" over
* "ma\xc3\xb1te" -> "ma", '\xc3\xb1', "te-r\xe2\x98\xafial", 2 */
- pre_ln = BLI_str_partition_ex_utf8(str, str + 6, delim, &sep, &suf, true);
- EXPECT_EQ(pre_ln, 2);
+ pre_len = BLI_str_partition_ex_utf8(str, str + 6, delim, &sep, &suf, true);
+ EXPECT_EQ(pre_len, 2);
EXPECT_EQ(&str[2], sep);
EXPECT_STREQ("te-r\xe2\x98\xafial", suf);
}
@@ -314,8 +314,8 @@ TEST(string, StrPartitionExUtf8)
const char *str = "mate\xe2\x98\xafrial";
/* "mate\xe2\x98\xafrial" over "mate" -> "mate\xe2\x98\xafrial", NULL, NULL, 4 */
- pre_ln = BLI_str_partition_ex_utf8(str, str + 4, delim, &sep, &suf, true);
- EXPECT_EQ(pre_ln, 4);
+ pre_len = BLI_str_partition_ex_utf8(str, str + 4, delim, &sep, &suf, true);
+ EXPECT_EQ(pre_len, 4);
EXPECT_EQ(sep, (void *)nullptr);
EXPECT_EQ(suf, (void *)nullptr);
}
@@ -802,3 +802,76 @@ TEST_F(StringCasecmpNatural, TextAndNumbers)
testReturnsLessThanZeroForAll(negative);
testReturnsMoreThanZeroForAll(positive);
}
+
+/* BLI_str_escape, BLI_str_unescape */
+
+class StringEscape : public testing::Test {
+ protected:
+ StringEscape()
+ {
+ }
+
+ using CompareWordsArray = vector<std::array<const char *, 2>>;
+
+ void testEscapeWords(const CompareWordsArray &items)
+ {
+ size_t dst_test_len;
+ char dst_test[64];
+ for (const auto &item : items) {
+ /* Escape the string. */
+ dst_test_len = BLI_str_escape(dst_test, item[0], SIZE_MAX);
+ EXPECT_STREQ(dst_test, item[1]);
+ EXPECT_EQ(dst_test_len, strlen(dst_test));
+ /* Escape back. */
+ dst_test_len = BLI_str_unescape(dst_test, item[1], strlen(item[1]));
+ EXPECT_STREQ(dst_test, item[0]);
+ EXPECT_EQ(dst_test_len, strlen(dst_test));
+ }
+ }
+};
+
+TEST_F(StringEscape, Simple)
+{
+ const CompareWordsArray equal{
+ {"", ""},
+ {"/", "/"},
+ {"'", "'"},
+ {"?", "?"},
+ };
+
+ const CompareWordsArray escaped{
+ {"\\", "\\\\"},
+ {"A\\", "A\\\\"},
+ {"\\A", "\\\\A"},
+ {"A\\B", "A\\\\B"},
+ {"?", "?"},
+ {"\"\\", "\\\"\\\\"},
+ {"\\\"", "\\\\\\\""},
+ {"\"\\\"", "\\\"\\\\\\\""},
+
+ {"\"\"\"", "\\\"\\\"\\\""},
+ {"\\\\\\", "\\\\\\\\\\\\"},
+ };
+
+ testEscapeWords(equal);
+ testEscapeWords(escaped);
+}
+
+TEST_F(StringEscape, Control)
+{
+ const CompareWordsArray escaped{
+ {"\n", "\\n"},
+ {"\r", "\\r"},
+ {"\t", "\\t"},
+ {"\a", "\\a"},
+ {"\b", "\\b"},
+ {"\f", "\\f"},
+ {"A\n", "A\\n"},
+ {"\nA", "\\nA"},
+ {"\n\r\t\a\b\f", "\\n\\r\\t\\a\\b\\f"},
+ {"\n_\r_\t_\a_\b_\f", "\\n_\\r_\\t_\\a_\\b_\\f"},
+ {"\n\\\r\\\t\\\a\\\b\\\f", "\\n\\\\\\r\\\\\\t\\\\\\a\\\\\\b\\\\\\f"},
+ };
+
+ testEscapeWords(escaped);
+}
diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c
index 956cf1aee8a..a98e7c46f10 100644
--- a/source/blender/blenloader/intern/versioning_290.c
+++ b/source/blender/blenloader/intern/versioning_290.c
@@ -181,7 +181,7 @@ static void seq_convert_transform_crop(const Scene *scene,
/* Convert offset animation, but only if crop is not used. */
if ((seq->flag & use_transform_flag) != 0 && (seq->flag & use_crop_flag) == 0) {
char name_esc[(sizeof(seq->name) - 2) * 2], *path;
- BLI_strescape(name_esc, seq->name + 2, sizeof(name_esc));
+ BLI_str_escape(name_esc, seq->name + 2, sizeof(name_esc));
path = BLI_sprintfN("sequence_editor.sequences_all[\"%s\"].transform.offset_x", name_esc);
seq_convert_transform_animation(scene, path, image_size_x);
@@ -408,7 +408,7 @@ void do_versions_after_linking_290(Main *bmain, ReportList *UNUSED(reports))
const size_t node_name_escaped_max_length = (node_name_length * 2);
char *node_name_escaped = MEM_mallocN(node_name_escaped_max_length + 1,
"escaped name");
- BLI_strescape(node_name_escaped, node->name, node_name_escaped_max_length);
+ BLI_str_escape(node_name_escaped, node->name, node_name_escaped_max_length);
char *rna_path_prefix = BLI_sprintfN("nodes[\"%s\"].inputs", node_name_escaped);
BKE_animdata_fix_paths_rename_all_ex(
diff --git a/source/blender/blenloader/intern/versioning_userdef.c b/source/blender/blenloader/intern/versioning_userdef.c
index 1d85109774c..7bc11317bb4 100644
--- a/source/blender/blenloader/intern/versioning_userdef.c
+++ b/source/blender/blenloader/intern/versioning_userdef.c
@@ -255,6 +255,10 @@ static void do_versions_theme(const UserDef *userdef, bTheme *btheme)
FROM_DEFAULT_V4_UCHAR(space_node.nodeclass_attribute);
}
+ if (!USER_VERSION_ATLEAST(292, 6)) {
+ FROM_DEFAULT_V4_UCHAR(space_node.nodeclass_shader);
+ }
+
/**
* Versioning code until next subversion bump goes here.
*
diff --git a/source/blender/draw/engines/overlay/shaders/edit_uv_verts_frag.glsl b/source/blender/draw/engines/overlay/shaders/edit_uv_verts_frag.glsl
index 1d936e4e072..ea2715a3c32 100644
--- a/source/blender/draw/engines/overlay/shaders/edit_uv_verts_frag.glsl
+++ b/source/blender/draw/engines/overlay/shaders/edit_uv_verts_frag.glsl
@@ -1,6 +1,5 @@
-uniform vec4 outlineColor;
-
+in vec4 outlineColor;
in vec4 radii;
in vec4 fillColor;
out vec4 fragColor;
diff --git a/source/blender/draw/engines/overlay/shaders/edit_uv_verts_vert.glsl b/source/blender/draw/engines/overlay/shaders/edit_uv_verts_vert.glsl
index 9e9df82a77d..cb70a3b433c 100644
--- a/source/blender/draw/engines/overlay/shaders/edit_uv_verts_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/edit_uv_verts_vert.glsl
@@ -26,7 +26,7 @@ void main()
/* Move selected vertices to the top
* Vertices are between 0.0 and 0.2, Edges between 0.2 and 0.4
* actual pixels are at 0.75, 1.0 is used for the background. */
- float depth = is_selected ? 0.05 : 0.15;
+ float depth = is_selected ? (is_pinned ? 0.05 : 0.10) : 0.15;
gl_Position = vec4(point_world_to_ndc(world_pos).xy, depth, 1.0);
gl_PointSize = pointSize;
diff --git a/source/blender/editors/animation/anim_deps.c b/source/blender/editors/animation/anim_deps.c
index e552a321bca..32ce78e405e 100644
--- a/source/blender/editors/animation/anim_deps.c
+++ b/source/blender/editors/animation/anim_deps.c
@@ -216,11 +216,13 @@ static void animchan_sync_fcurve_scene(bAnimListElem *ale)
/* get strip name, and check if this strip is selected */
char *seq_name = BLI_str_quoted_substrN(fcu->rna_path, "sequences_all[");
- Sequence *seq = BKE_sequence_get_by_name(ed->seqbasep, seq_name, false);
- if (seq_name) {
- MEM_freeN(seq_name);
+ if (seq_name == NULL) {
+ return;
}
+ Sequence *seq = BKE_sequence_get_by_name(ed->seqbasep, seq_name, false);
+ MEM_freeN(seq_name);
+
if (seq == NULL) {
return;
}
diff --git a/source/blender/editors/animation/anim_filter.c b/source/blender/editors/animation/anim_filter.c
index 2e65fff69f1..f4a487140ff 100644
--- a/source/blender/editors/animation/anim_filter.c
+++ b/source/blender/editors/animation/anim_filter.c
@@ -1063,13 +1063,12 @@ static bool skip_fcurve_selected_data(bDopeSheet *ads, FCurve *fcu, ID *owner_id
/* only consider if F-Curve involves pose.bones */
if ((fcu->rna_path) && strstr(fcu->rna_path, "pose.bones")) {
- bPoseChannel *pchan;
- char *bone_name;
/* get bone-name, and check if this bone is selected */
- bone_name = BLI_str_quoted_substrN(fcu->rna_path, "pose.bones[");
- pchan = BKE_pose_channel_find_name(ob->pose, bone_name);
+ bPoseChannel *pchan = NULL;
+ char *bone_name = BLI_str_quoted_substrN(fcu->rna_path, "pose.bones[");
if (bone_name) {
+ pchan = BKE_pose_channel_find_name(ob->pose, bone_name);
MEM_freeN(bone_name);
}
@@ -1106,13 +1105,12 @@ static bool skip_fcurve_selected_data(bDopeSheet *ads, FCurve *fcu, ID *owner_id
if ((fcu->rna_path) && strstr(fcu->rna_path, "sequences_all")) {
Editing *ed = BKE_sequencer_editing_get(scene, false);
Sequence *seq = NULL;
- char *seq_name;
if (ed) {
/* get strip name, and check if this strip is selected */
- seq_name = BLI_str_quoted_substrN(fcu->rna_path, "sequences_all[");
- seq = BKE_sequence_get_by_name(ed->seqbasep, seq_name, false);
+ char *seq_name = BLI_str_quoted_substrN(fcu->rna_path, "sequences_all[");
if (seq_name) {
+ seq = BKE_sequence_get_by_name(ed->seqbasep, seq_name, false);
MEM_freeN(seq_name);
}
}
@@ -1130,13 +1128,12 @@ static bool skip_fcurve_selected_data(bDopeSheet *ads, FCurve *fcu, ID *owner_id
/* check for selected nodes */
if ((fcu->rna_path) && strstr(fcu->rna_path, "nodes")) {
- bNode *node;
- char *node_name;
+ bNode *node = NULL;
/* get strip name, and check if this strip is selected */
- node_name = BLI_str_quoted_substrN(fcu->rna_path, "nodes[");
- node = nodeFindNodebyName(ntree, node_name);
+ char *node_name = BLI_str_quoted_substrN(fcu->rna_path, "nodes[");
if (node_name) {
+ node = nodeFindNodebyName(ntree, node_name);
MEM_freeN(node_name);
}
diff --git a/source/blender/editors/animation/anim_ipo_utils.c b/source/blender/editors/animation/anim_ipo_utils.c
index 72103d68b05..5992545bdbe 100644
--- a/source/blender/editors/animation/anim_ipo_utils.c
+++ b/source/blender/editors/animation/anim_ipo_utils.c
@@ -112,7 +112,8 @@ int getname_anim_fcurve(char *name, ID *id, FCurve *fcu)
char *constName = BLI_str_quoted_substrN(fcu->rna_path, "constraints[");
/* assemble the string to display in the UI... */
- structname = BLI_sprintfN("%s : %s", pchanName, constName);
+ structname = BLI_sprintfN(
+ "%s : %s", pchanName ? pchanName : "", constName ? constName : "");
free_structname = 1;
/* free the temp names */
diff --git a/source/blender/editors/animation/keyframes_general.c b/source/blender/editors/animation/keyframes_general.c
index 08b02020f76..6ed9803dbd3 100644
--- a/source/blender/editors/animation/keyframes_general.c
+++ b/source/blender/editors/animation/keyframes_general.c
@@ -767,16 +767,15 @@ short copy_animedit_keys(bAnimContext *ac, ListBase *anim_data)
* Storing the relevant information here helps avoiding crashes if we undo-repaste. */
if ((aci->id_type == ID_OB) && (((Object *)aci->id)->type == OB_ARMATURE) && aci->rna_path) {
Object *ob = (Object *)aci->id;
- bPoseChannel *pchan;
- char *bone_name;
- bone_name = BLI_str_quoted_substrN(aci->rna_path, "pose.bones[");
- pchan = BKE_pose_channel_find_name(ob->pose, bone_name);
- if (pchan) {
- aci->is_bone = true;
- }
+ char *bone_name = BLI_str_quoted_substrN(aci->rna_path, "pose.bones[");
if (bone_name) {
+ bPoseChannel *pchan = BKE_pose_channel_find_name(ob->pose, bone_name);
MEM_freeN(bone_name);
+
+ if (pchan) {
+ aci->is_bone = true;
+ }
}
}
diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c
index 09c33c48170..e8146ca960a 100644
--- a/source/blender/editors/animation/keyframing.c
+++ b/source/blender/editors/animation/keyframing.c
@@ -2236,20 +2236,18 @@ static int clear_anim_v3d_exec(bContext *C, wmOperator *UNUSED(op))
/* in pose mode, only delete the F-Curve if it belongs to a selected bone */
if (ob->mode & OB_MODE_POSE) {
if ((fcu->rna_path) && strstr(fcu->rna_path, "pose.bones[")) {
- bPoseChannel *pchan;
- char *bone_name;
/* get bone-name, and check if this bone is selected */
- bone_name = BLI_str_quoted_substrN(fcu->rna_path, "pose.bones[");
- pchan = BKE_pose_channel_find_name(ob->pose, bone_name);
+ char *bone_name = BLI_str_quoted_substrN(fcu->rna_path, "pose.bones[");
if (bone_name) {
+ bPoseChannel *pchan = BKE_pose_channel_find_name(ob->pose, bone_name);
MEM_freeN(bone_name);
- }
- /* delete if bone is selected*/
- if ((pchan) && (pchan->bone)) {
- if (pchan->bone->flag & BONE_SELECTED) {
- can_delete = true;
+ /* delete if bone is selected*/
+ if ((pchan) && (pchan->bone)) {
+ if (pchan->bone->flag & BONE_SELECTED) {
+ can_delete = true;
+ }
}
}
}
@@ -2342,13 +2340,12 @@ static int delete_key_v3d_exec(bContext *C, wmOperator *op)
* In object mode, we're dealing with the entire object.
*/
if ((ob->mode & OB_MODE_POSE) && strstr(fcu->rna_path, "pose.bones[\"")) {
- bPoseChannel *pchan;
- char *bone_name;
+ bPoseChannel *pchan = NULL;
/* get bone-name, and check if this bone is selected */
- bone_name = BLI_str_quoted_substrN(fcu->rna_path, "pose.bones[");
- pchan = BKE_pose_channel_find_name(ob->pose, bone_name);
+ char *bone_name = BLI_str_quoted_substrN(fcu->rna_path, "pose.bones[");
if (bone_name) {
+ pchan = BKE_pose_channel_find_name(ob->pose, bone_name);
MEM_freeN(bone_name);
}
diff --git a/source/blender/editors/armature/pose_select.c b/source/blender/editors/armature/pose_select.c
index 731d0d10e0b..6a03207b3b0 100644
--- a/source/blender/editors/armature/pose_select.c
+++ b/source/blender/editors/armature/pose_select.c
@@ -1090,6 +1090,7 @@ static bool pose_select_same_keyingset(bContext *C, ReportList *reports, bool ex
if (boneName) {
bPoseChannel *pchan = BKE_pose_channel_find_name(pose, boneName);
+ MEM_freeN(boneName);
if (pchan) {
/* select if bone is visible and can be affected */
@@ -1098,9 +1099,6 @@ static bool pose_select_same_keyingset(bContext *C, ReportList *reports, bool ex
changed = true;
}
}
-
- /* free temp memory */
- MEM_freeN(boneName);
}
}
}
diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c
index 0d1e2802242..e5aa0665a16 100644
--- a/source/blender/editors/interface/interface_ops.c
+++ b/source/blender/editors/interface/interface_ops.c
@@ -1223,7 +1223,7 @@ typedef struct uiEditSourceStore {
typedef struct uiEditSourceButStore {
char py_dbg_fn[FILE_MAX];
- int py_dbg_ln;
+ int py_dbg_line_number;
} uiEditSourceButStore;
/* should only ever be set while the edit source operator is running */
@@ -1276,21 +1276,21 @@ void UI_editsource_active_but_test(uiBut *but)
struct uiEditSourceButStore *but_store = MEM_callocN(sizeof(uiEditSourceButStore), __func__);
const char *fn;
- int lineno = -1;
+ int line_number = -1;
# if 0
printf("comparing buttons: '%s' == '%s'\n", but->drawstr, ui_editsource_info->but_orig.drawstr);
# endif
- PyC_FileAndNum_Safe(&fn, &lineno);
+ PyC_FileAndNum_Safe(&fn, &line_number);
- if (lineno != -1) {
+ if (line_number != -1) {
BLI_strncpy(but_store->py_dbg_fn, fn, sizeof(but_store->py_dbg_fn));
- but_store->py_dbg_ln = lineno;
+ but_store->py_dbg_line_number = line_number;
}
else {
but_store->py_dbg_fn[0] = '\0';
- but_store->py_dbg_ln = -1;
+ but_store->py_dbg_line_number = -1;
}
BLI_ghash_insert(ui_editsource_info->hash, but, but_store);
@@ -1375,8 +1375,8 @@ static int editsource_exec(bContext *C, wmOperator *op)
}
if (but_store) {
- if (but_store->py_dbg_ln != -1) {
- ret = editsource_text_edit(C, op, but_store->py_dbg_fn, but_store->py_dbg_ln);
+ if (but_store->py_dbg_line_number != -1) {
+ ret = editsource_text_edit(C, op, but_store->py_dbg_fn, but_store->py_dbg_line_number);
}
else {
BKE_report(
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index b9427677745..fd7ec1da497 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -4232,6 +4232,8 @@ static void do_snake_hook_brush_task_cb_ex(void *__restrict userdata,
(len_v3(grab_delta) / ss->cache->radius)) :
0.0f;
+ const bool do_elastic = brush->snake_hook_deform_type == BRUSH_SNAKE_HOOK_DEFORM_ELASTIC;
+
proxy = BKE_pbvh_node_add_proxy(ss->pbvh, data->nodes[n])->co;
SculptBrushTest test;
@@ -4239,18 +4241,28 @@ static void do_snake_hook_brush_task_cb_ex(void *__restrict userdata,
ss, &test, data->brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(tls);
+ KelvinletParams params;
+ BKE_kelvinlet_init_params(&params, ss->cache->radius, bstrength, 1.0f, 0.4f);
+
BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE)
{
- if (sculpt_brush_test_sq_fn(&test, vd.co)) {
- const float fade = bstrength * SCULPT_brush_strength_factor(ss,
- brush,
- vd.co,
- sqrtf(test.dist),
- vd.no,
- vd.fno,
- vd.mask ? *vd.mask : 0.0f,
- vd.index,
- thread_id);
+ if (do_elastic || sculpt_brush_test_sq_fn(&test, vd.co)) {
+
+ float fade;
+ if (do_elastic) {
+ fade = 1.0f;
+ }
+ else {
+ fade = bstrength * SCULPT_brush_strength_factor(ss,
+ brush,
+ vd.co,
+ sqrtf(test.dist),
+ vd.no,
+ vd.fno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.index,
+ thread_id);
+ }
mul_v3_v3fl(proxy[vd.i], grab_delta, fade);
@@ -4289,6 +4301,17 @@ static void do_snake_hook_brush_task_cb_ex(void *__restrict userdata,
add_v3_v3(proxy[vd.i], delta_rotate);
}
+ if (do_elastic) {
+ float disp[3];
+ BKE_kelvinlet_grab_triscale(disp, &params, vd.co, ss->cache->location, proxy[vd.i]);
+ mul_v3_fl(disp, bstrength * 20.0f);
+ if (vd.mask) {
+ mul_v3_fl(disp, 1.0f - *vd.mask);
+ }
+ mul_v3_fl(disp, SCULPT_automasking_factor_get(ss->cache->automasking, ss, vd.index));
+ copy_v3_v3(proxy[vd.i], disp);
+ }
+
if (vd.mvert) {
vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
}
@@ -5714,16 +5737,8 @@ static void do_brush_action(Sculpt *sd, Object *ob, Brush *brush, UnifiedPaintSe
/* Build a list of all nodes that are potentially within the brush's area of influence */
- /* These brushes need to update all nodes as they are not constrained by the brush radius */
- /* Elastic deform needs all nodes to avoid artifacts as the effect of the brush is not
- * constrained by the radius. */
- /* Pose needs all nodes because it applies all symmetry iterations at the same time and the IK
- * chain can grow to any area of the model. */
- /* This can be optimized by filtering the nodes after calculating the chain. */
- if (ELEM(brush->sculpt_tool,
- SCULPT_TOOL_ELASTIC_DEFORM,
- SCULPT_TOOL_POSE,
- SCULPT_TOOL_BOUNDARY)) {
+ if (SCULPT_tool_needs_all_pbvh_nodes(brush)) {
+ /* These brushes need to update all nodes as they are not constrained by the brush radius */
BKE_pbvh_search_gather(ss->pbvh, NULL, NULL, &nodes, &totnode);
}
else if (brush->sculpt_tool == SCULPT_TOOL_CLOTH) {
diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h
index 99ee22328ea..3b48207f461 100644
--- a/source/blender/editors/sculpt_paint/sculpt_intern.h
+++ b/source/blender/editors/sculpt_paint/sculpt_intern.h
@@ -434,6 +434,38 @@ BLI_INLINE bool SCULPT_is_cloth_deform_brush(const Brush *brush)
brush->deform_target == BRUSH_DEFORM_TARGET_CLOTH_SIM);
}
+BLI_INLINE bool SCULPT_tool_needs_all_pbvh_nodes(const Brush *brush)
+{
+ if (brush->sculpt_tool == SCULPT_TOOL_ELASTIC_DEFORM) {
+ /* Elastic deformations in any brush need all nodes to avoid artifacts as the effect
+ * of the Kelvinlet is not constrained by the radius. */
+ return true;
+ }
+
+ if (brush->sculpt_tool == SCULPT_TOOL_POSE) {
+ /* Pose needs all nodes because it applies all symmetry iterations at the same time
+ * and the IK chain can grow to any area of the model. */
+ /* TODO: This can be optimized by filtering the nodes after calculating the chain. */
+ return true;
+ }
+
+ if (brush->sculpt_tool == SCULPT_TOOL_BOUNDARY) {
+ /* Boundary needs all nodes because it is not possible to know where the boundary
+ * deformation is going to be propagated before calculating it. */
+ /* TODO: after calculating the boudnary info in the first iteration, it should be
+ * possible to get the nodes that have vertices included in any boundary deformation
+ * and cache them. */
+ return true;
+ }
+
+ if (brush->sculpt_tool == SCULPT_TOOL_SNAKE_HOOK &&
+ brush->snake_hook_deform_type == BRUSH_SNAKE_HOOK_DEFORM_ELASTIC) {
+ /* Snake hook in elastic deform type has same requirements as the elastic deform tool. */
+ return true;
+ }
+ return false;
+}
+
/* Pose Brush. */
void SCULPT_do_pose_brush(struct Sculpt *sd,
struct Object *ob,
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index 1271feda1e7..e87142a7096 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -630,7 +630,7 @@ void filelist_setsorting(struct FileList *filelist, const short sort, bool inver
/* ********** Filter helpers ********** */
/* True if filename is meant to be hidden, eg. starting with period. */
-static bool is_hidden_dot_filename(const char *filename, FileListInternEntry *file)
+static bool is_hidden_dot_filename(const char *filename, const FileListInternEntry *file)
{
if (filename[0] == '.' && !ELEM(filename[1], '.', '\0')) {
return true; /* ignore .file */
@@ -671,8 +671,8 @@ static bool is_hidden_dot_filename(const char *filename, FileListInternEntry *fi
/* True if should be hidden, based on current filtering. */
static bool is_filtered_hidden(const char *filename,
- FileListFilter *filter,
- FileListInternEntry *file)
+ const FileListFilter *filter,
+ const FileListInternEntry *file)
{
if ((filename[0] == '.') && (filename[1] == '\0')) {
return true; /* Ignore . */
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index 2f84bc668e6..606583922f8 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -3191,6 +3191,14 @@ static void node_geometry_buts_attribute_math(uiLayout *layout,
uiItemR(layout, ptr, "input_type_b", DEFAULT_FLAGS, IFACE_("Type B"), ICON_NONE);
}
+static void node_geometry_buts_attribute_fill(uiLayout *layout,
+ bContext *UNUSED(C),
+ PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "data_type", DEFAULT_FLAGS, "", ICON_NONE);
+ // uiItemR(layout, ptr, "domain", DEFAULT_FLAGS, "", ICON_NONE);
+}
+
static void node_geometry_set_butfunc(bNodeType *ntype)
{
switch (ntype->type) {
@@ -3212,6 +3220,9 @@ static void node_geometry_set_butfunc(bNodeType *ntype)
case GEO_NODE_ATTRIBUTE_COMPARE:
ntype->draw_buttons = node_geometry_buts_attribute_compare;
break;
+ case GEO_NODE_ATTRIBUTE_FILL:
+ ntype->draw_buttons = node_geometry_buts_attribute_fill;
+ break;
}
}
diff --git a/source/blender/editors/space_text/text_header.c b/source/blender/editors/space_text/text_header.c
index c583634f440..84b7a6f6831 100644
--- a/source/blender/editors/space_text/text_header.c
+++ b/source/blender/editors/space_text/text_header.c
@@ -108,101 +108,3 @@ void TEXT_OT_start_find(wmOperatorType *ot)
ot->exec = text_text_search_exec;
ot->poll = text_properties_poll;
}
-
-/******************** XXX popup menus *******************/
-
-#if 0
-{
- /* RMB */
-
- uiPopupMenu *pup;
-
- if (text) {
- pup = UI_popup_menu_begin(C, IFACE_("Text"), ICON_NONE);
- if (txt_has_sel(text)) {
- uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_cut");
- uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_copy");
- }
- uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_paste");
- uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_new");
- uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_open");
- uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_save");
- uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_save_as");
- uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_run_script");
- UI_popup_menu_end(C, pup);
- }
- else {
- pup = UI_popup_menu_begin(C, IFACE_("File"), ICON_NONE);
- uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_new");
- uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_open");
- UI_popup_menu_end(C, pup);
- }
-}
-
-{
- /* Alt+Shift+E */
-
- uiPopupMenu *pup;
-
- pup = UI_popup_menu_begin(C, IFACE_("Edit"), ICON_NONE);
- uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_cut");
- uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_copy");
- uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_paste");
- UI_popup_menu_end(C, pup);
-}
-
-{
- /* Alt+Shift+F */
-
- uiPopupMenu *pup;
-
- if (text) {
- pup = UI_popup_menu_begin(C, IFACE_("Text"), ICON_NONE);
- uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_new");
- uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_open");
- uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_save");
- uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_save_as");
- uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_run_script");
- UI_popup_menu_end(C, pup);
- }
- else {
- pup = UI_popup_menu_begin(C, IFACE_("File"), ICON_NONE);
- uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_new");
- uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_open");
- UI_popup_menu_end(C, pup);
- }
-}
-
-{
- /* Alt+Shift+V */
-
- uiPopupMenu *pup;
-
- pup = UI_popup_menu_begin(C, IFACE_("Text"), ICON_NONE);
- uiItemEnumO(layout,
- "TEXT_OT_move",
- CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Top of File"),
- 0,
- "type",
- FILE_TOP);
- uiItemEnumO(layout,
- "TEXT_OT_move",
- CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Bottom of File"),
- 0,
- "type",
- FILE_BOTTOM);
- uiItemEnumO(layout,
- "TEXT_OT_move",
- CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Page Up"),
- 0,
- "type",
- PREV_PAGE);
- uiItemEnumO(layout,
- "TEXT_OT_move",
- CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Page Down"),
- 0,
- "type",
- NEXT_PAGE);
- UI_popup_menu_end(C, pup);
-}
-#endif
diff --git a/source/blender/editors/transform/transform_convert_armature.c b/source/blender/editors/transform/transform_convert_armature.c
index a7301161570..e9b2273b343 100644
--- a/source/blender/editors/transform/transform_convert_armature.c
+++ b/source/blender/editors/transform/transform_convert_armature.c
@@ -164,21 +164,21 @@ static void autokeyframe_pose(
/* only if bone name matches too...
* NOTE: this will do constraints too, but those are ok to do here too?
*/
- if (pchanName && STREQ(pchanName, pchan->name)) {
- insert_keyframe(bmain,
- reports,
- id,
- act,
- ((fcu->grp) ? (fcu->grp->name) : (NULL)),
- fcu->rna_path,
- fcu->array_index,
- &anim_eval_context,
- ts->keyframe_type,
- &nla_cache,
- flag);
- }
-
if (pchanName) {
+ if (STREQ(pchanName, pchan->name)) {
+ insert_keyframe(bmain,
+ reports,
+ id,
+ act,
+ ((fcu->grp) ? (fcu->grp->name) : (NULL)),
+ fcu->rna_path,
+ fcu->array_index,
+ &anim_eval_context,
+ ts->keyframe_type,
+ &nla_cache,
+ flag);
+ }
+
MEM_freeN(pchanName);
}
}
diff --git a/source/blender/gpu/intern/gpu_batch.cc b/source/blender/gpu/intern/gpu_batch.cc
index 08b2e3c0f00..9dc24c59e22 100644
--- a/source/blender/gpu/intern/gpu_batch.cc
+++ b/source/blender/gpu/intern/gpu_batch.cc
@@ -81,7 +81,7 @@ void GPU_batch_init_ex(GPUBatch *batch,
for (int v = 1; v < GPU_BATCH_VBO_MAX_LEN; v++) {
batch->verts[v] = nullptr;
}
- for (auto & v : batch->inst) {
+ for (auto &v : batch->inst) {
v = nullptr;
}
batch->elem = elem;
diff --git a/source/blender/io/collada/BCAnimationCurve.cpp b/source/blender/io/collada/BCAnimationCurve.cpp
index 33eaf3376cd..5065accf554 100644
--- a/source/blender/io/collada/BCAnimationCurve.cpp
+++ b/source/blender/io/collada/BCAnimationCurve.cpp
@@ -173,8 +173,14 @@ std::string BCAnimationCurve::get_animation_name(Object *ob) const
name = "";
}
else {
- const char *boneName = BLI_str_quoted_substrN(fcurve->rna_path, "pose.bones[");
- name = (boneName) ? id_name(ob) + "_" + std::string(boneName) : "";
+ char *boneName = BLI_str_quoted_substrN(fcurve->rna_path, "pose.bones[");
+ if (boneName) {
+ name = id_name(ob) + "_" + std::string(boneName);
+ MEM_freeN(boneName);
+ }
+ else {
+ name = "";
+ }
}
} break;
diff --git a/source/blender/io/collada/BCAnimationSampler.cpp b/source/blender/io/collada/BCAnimationSampler.cpp
index abc770ceef5..a6ee0b8bee6 100644
--- a/source/blender/io/collada/BCAnimationSampler.cpp
+++ b/source/blender/io/collada/BCAnimationSampler.cpp
@@ -448,6 +448,7 @@ void BCAnimationSampler::initialize_curves(BCAnimationCurveMap &curves, Object *
char *boneName = BLI_str_quoted_substrN(fcu->rna_path, "pose.bones[");
if (boneName) {
object_type = BC_ANIMATION_TYPE_BONE;
+ MEM_freeN(boneName);
}
}
diff --git a/source/blender/io/collada/collada_utils.cpp b/source/blender/io/collada/collada_utils.cpp
index 25c10c717e2..ad1cc1035fb 100644
--- a/source/blender/io/collada/collada_utils.cpp
+++ b/source/blender/io/collada/collada_utils.cpp
@@ -1176,17 +1176,6 @@ static std::string bc_get_uvlayer_name(Mesh *me, int layer)
return "";
}
-std::string bc_find_bonename_in_path(std::string path, std::string probe)
-{
- std::string result;
- char *boneName = BLI_str_quoted_substrN(path.c_str(), probe.c_str());
- if (boneName) {
- result = std::string(boneName);
- MEM_freeN(boneName);
- }
- return result;
-}
-
static bNodeTree *prepare_material_nodetree(Material *ma)
{
if (ma->nodetree == nullptr) {
diff --git a/source/blender/io/collada/collada_utils.h b/source/blender/io/collada/collada_utils.h
index fa65d398954..d0a5d37d6d2 100644
--- a/source/blender/io/collada/collada_utils.h
+++ b/source/blender/io/collada/collada_utils.h
@@ -146,8 +146,6 @@ extern void bc_bubble_sort_by_Object_name(LinkNode *export_set);
extern bool bc_is_root_bone(Bone *aBone, bool deform_bones_only);
extern int bc_get_active_UVLayer(Object *ob);
-std::string bc_find_bonename_in_path(std::string path, std::string probe);
-
inline std::string bc_string_after(const std::string &s, const std::string probe)
{
size_t i = s.rfind(probe);
diff --git a/source/blender/makesdna/DNA_brush_types.h b/source/blender/makesdna/DNA_brush_types.h
index 50aac69da19..7bd3c7d0117 100644
--- a/source/blender/makesdna/DNA_brush_types.h
+++ b/source/blender/makesdna/DNA_brush_types.h
@@ -402,6 +402,11 @@ typedef enum eBrushBoundaryFalloffType {
BRUSH_BOUNDARY_FALLOFF_LOOP_INVERT = 3,
} eBrushBoundaryFalloffType;
+typedef enum eBrushSnakeHookDeformType {
+ BRUSH_SNAKE_HOOK_DEFORM_FALLOFF = 0,
+ BRUSH_SNAKE_HOOK_DEFORM_ELASTIC = 1,
+} eBrushSnakeHookDeformType;
+
/* Gpencilsettings.Vertex_mode */
typedef enum eGp_Vertex_Mode {
/* Affect to Stroke only. */
@@ -573,7 +578,7 @@ typedef struct Brush {
char gpencil_sculpt_tool;
/** Active grease pencil weight tool. */
char gpencil_weight_tool;
- char _pad1[2];
+ char _pad1[6];
float autosmooth_factor;
@@ -607,6 +612,9 @@ typedef struct Brush {
int elastic_deform_type;
float elastic_deform_volume_preservation;
+ /* snake hook */
+ int snake_hook_deform_type;
+
/* pose */
int pose_deform_type;
float pose_offset;
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index 1aac9c0c0c2..6586cfc7969 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -31,6 +31,7 @@
#include "DNA_scene_types.h"
#include "DNA_windowmanager_types.h"
+#include "BLI_alloca.h"
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
#include "BLI_ghash.h"
@@ -4957,14 +4958,10 @@ PointerRNA rna_array_lookup_int(
static char *rna_path_token(const char **path, char *fixedbuf, int fixedlen, int bracket)
{
const char *p;
- char *buf;
- char quote = '\0';
- int i, j, len, escape;
-
- len = 0;
+ int len = 0;
if (bracket) {
- /* get data between [], check escaping ] with \] */
+ /* get data between [], check escaping quotes and back-slashes with #BLI_str_unescape. */
if (**path == '[') {
(*path)++;
}
@@ -4974,35 +4971,24 @@ static char *rna_path_token(const char **path, char *fixedbuf, int fixedlen, int
p = *path;
- /* 2 kinds of lookups now, quoted or unquoted */
- quote = *p;
-
- if (quote != '"') { /* " - this comment is hack for Aligorith's text editor's sanity */
- quote = 0;
- }
-
- if (quote == 0) {
+ /* 2 kinds of look-ups now, quoted or unquoted. */
+ if (*p != '"') {
while (*p && (*p != ']')) {
len++;
p++;
}
}
else {
- escape = 0;
- /* skip the first quote */
- len++;
- p++;
- while (*p && (*p != quote || escape)) {
- /* A pair of back-slashes represents a single back-slash,
- * only use a single back-slash for escaping. */
- escape = (escape == 0) && (*p == '\\');
- len++;
- p++;
+ const char *p_end = BLI_str_escape_find_quote(p + 1);
+ if (p_end == NULL) {
+ /* No Matching quote. */
+ return NULL;
}
+ /* Skip the last quoted char to get the `]`. */
+ p_end += 1;
- /* skip the last quoted char to get the ']' */
- len++;
- p++;
+ len += (p_end - p);
+ p = p_end;
}
if (*p != ']') {
@@ -5024,31 +5010,13 @@ static char *rna_path_token(const char **path, char *fixedbuf, int fixedlen, int
return NULL;
}
- /* try to use fixed buffer if possible */
- if (len + 1 < fixedlen) {
- buf = fixedbuf;
- }
- else {
- buf = MEM_mallocN(sizeof(char) * (len + 1), "rna_path_token");
- }
+ /* Try to use fixed buffer if possible. */
+ char *buf = (len + 1 < fixedlen) ? fixedbuf : MEM_mallocN(sizeof(char) * (len + 1), __func__);
/* copy string, taking into account escaped ] */
if (bracket) {
- for (p = *path, i = 0, j = 0; i < len; i++, p++) {
- if (*p == '\\') {
- if (*(p + 1) == '\\') {
- /* Un-escape pairs of back-slashes into a single back-slash. */
- p++;
- i += 1;
- }
- else if (*(p + 1) == quote) {
- continue;
- }
- }
- buf[j++] = *p;
- }
-
- buf[j] = 0;
+ BLI_str_unescape(buf, *path, len);
+ p = (*path) + len;
}
else {
memcpy(buf, *path, sizeof(char) * len);
@@ -5560,8 +5528,7 @@ char *RNA_path_append(
const char *path, PointerRNA *UNUSED(ptr), PropertyRNA *prop, int intkey, const char *strkey)
{
DynStr *dynstr;
- const char *s;
- char appendstr[128], *result;
+ char *result;
dynstr = BLI_dynstr_new();
@@ -5580,22 +5547,15 @@ char *RNA_path_append(
BLI_dynstr_append(dynstr, "[");
if (strkey) {
+ const int strkey_esc_max_size = (strlen(strkey) * 2) + 1;
+ char *strkey_esc = BLI_array_alloca(strkey_esc, strkey_esc_max_size);
+ BLI_str_escape(strkey_esc, strkey, strkey_esc_max_size);
BLI_dynstr_append(dynstr, "\"");
- for (s = strkey; *s; s++) {
- if (*s == '[') {
- appendstr[0] = '\\';
- appendstr[1] = *s;
- appendstr[2] = 0;
- }
- else {
- appendstr[0] = *s;
- appendstr[1] = 0;
- }
- BLI_dynstr_append(dynstr, appendstr);
- }
+ BLI_dynstr_append(dynstr, strkey_esc);
BLI_dynstr_append(dynstr, "\"");
}
else {
+ char appendstr[128];
BLI_snprintf(appendstr, sizeof(appendstr), "%d", intkey);
BLI_dynstr_append(dynstr, appendstr);
}
@@ -6016,7 +5976,7 @@ char *RNA_path_from_ID_to_property_index(PointerRNA *ptr,
}
else {
char propname_esc[MAX_IDPROP_NAME * 2];
- BLI_strescape(propname_esc, propname, sizeof(propname_esc));
+ BLI_str_escape(propname_esc, propname, sizeof(propname_esc));
path = BLI_sprintfN("%s[\"%s\"]%s", ptrpath, propname_esc, index_str);
}
MEM_freeN(ptrpath);
@@ -6027,7 +5987,7 @@ char *RNA_path_from_ID_to_property_index(PointerRNA *ptr,
}
else {
char propname_esc[MAX_IDPROP_NAME * 2];
- BLI_strescape(propname_esc, propname, sizeof(propname_esc));
+ BLI_str_escape(propname_esc, propname, sizeof(propname_esc));
path = BLI_sprintfN("[\"%s\"]%s", propname_esc, index_str);
}
}
@@ -6113,7 +6073,7 @@ char *RNA_path_full_ID_py(Main *bmain, ID *id)
char id_esc[(sizeof(id->name) - 2) * 2];
- BLI_strescape(id_esc, id->name + 2, sizeof(id_esc));
+ BLI_str_escape(id_esc, id->name + 2, sizeof(id_esc));
return BLI_sprintfN("bpy.data.%s[\"%s\"]%s%s",
BKE_idtype_idcode_to_name_plural(GS(id->name)),
@@ -7067,7 +7027,7 @@ char *RNA_property_as_string(
buf = MEM_mallocN(sizeof(char) * (length + 1), "RNA_property_as_string");
buf_esc = MEM_mallocN(sizeof(char) * (length * 2 + 1), "RNA_property_as_string esc");
RNA_property_string_get(ptr, prop, buf);
- BLI_strescape(buf_esc, buf, length * 2 + 1);
+ BLI_str_escape(buf_esc, buf, length * 2 + 1);
MEM_freeN(buf);
BLI_dynstr_appendf(dynstr, "\"%s\"", buf_esc);
MEM_freeN(buf_esc);
diff --git a/source/blender/makesrna/intern/rna_armature.c b/source/blender/makesrna/intern/rna_armature.c
index d586f222203..1628c978c30 100644
--- a/source/blender/makesrna/intern/rna_armature.c
+++ b/source/blender/makesrna/intern/rna_armature.c
@@ -245,7 +245,7 @@ static char *rna_Bone_path(PointerRNA *ptr)
Bone *bone = (Bone *)ptr->data;
char name_esc[sizeof(bone->name) * 2];
- BLI_strescape(name_esc, bone->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, bone->name, sizeof(name_esc));
/* special exception for trying to get the path where ID-block is Object
* - this will be assumed to be from a Pose Bone...
diff --git a/source/blender/makesrna/intern/rna_boid.c b/source/blender/makesrna/intern/rna_boid.c
index 33d69f6f912..3e3452af713 100644
--- a/source/blender/makesrna/intern/rna_boid.c
+++ b/source/blender/makesrna/intern/rna_boid.c
@@ -183,7 +183,7 @@ static char *rna_BoidRule_path(PointerRNA *ptr)
BoidRule *rule = (BoidRule *)ptr->data;
char name_esc[sizeof(rule->name) * 2];
- BLI_strescape(name_esc, rule->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, rule->name, sizeof(name_esc));
return BLI_sprintfN("rules[\"%s\"]", name_esc); /* XXX not unique */
}
diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c
index cf36c1a3742..b5ce7976fd8 100644
--- a/source/blender/makesrna/intern/rna_brush.c
+++ b/source/blender/makesrna/intern/rna_brush.c
@@ -2072,6 +2072,20 @@ static void rna_def_brush(BlenderRNA *brna)
{0, NULL, 0, NULL, NULL},
};
+ static const EnumPropertyItem brush_snake_hook_deform_type_items[] = {
+ {BRUSH_SNAKE_HOOK_DEFORM_FALLOFF,
+ "FALLOFF",
+ 0,
+ "Radius Falloff",
+ "Applies the brush falloff in the tip of the brush"},
+ {BRUSH_SNAKE_HOOK_DEFORM_ELASTIC,
+ "ELASTIC",
+ 0,
+ "Elastic",
+ "Modifies the entire mesh using elastic deform"},
+ {0, NULL, 0, NULL, NULL},
+ };
+
static const EnumPropertyItem brush_cloth_deform_type_items[] = {
{BRUSH_CLOTH_DEFORM_DRAG, "DRAG", 0, "Drag", ""},
{BRUSH_CLOTH_DEFORM_PUSH, "PUSH", 0, "Push", ""},
@@ -2309,6 +2323,11 @@ static void rna_def_brush(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Deformation", "Deformation type that is used in the brush");
RNA_def_property_update(prop, 0, "rna_Brush_update");
+ prop = RNA_def_property(srna, "snake_hook_deform_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, brush_snake_hook_deform_type_items);
+ RNA_def_property_ui_text(prop, "Deformation", "Deformation type that is used in the brush");
+ RNA_def_property_update(prop, 0, "rna_Brush_update");
+
prop = RNA_def_property(srna, "cloth_deform_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, brush_cloth_deform_type_items);
RNA_def_property_ui_text(prop, "Deformation", "Deformation type that is used in the brush");
diff --git a/source/blender/makesrna/intern/rna_cloth.c b/source/blender/makesrna/intern/rna_cloth.c
index 27318494428..b0e0b577629 100644
--- a/source/blender/makesrna/intern/rna_cloth.c
+++ b/source/blender/makesrna/intern/rna_cloth.c
@@ -439,7 +439,7 @@ static char *rna_ClothSettings_path(PointerRNA *ptr)
if (md) {
char name_esc[sizeof(md->name) * 2];
- BLI_strescape(name_esc, md->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, md->name, sizeof(name_esc));
return BLI_sprintfN("modifiers[\"%s\"].settings", name_esc);
}
else {
@@ -454,7 +454,7 @@ static char *rna_ClothCollisionSettings_path(PointerRNA *ptr)
if (md) {
char name_esc[sizeof(md->name) * 2];
- BLI_strescape(name_esc, md->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, md->name, sizeof(name_esc));
return BLI_sprintfN("modifiers[\"%s\"].collision_settings", name_esc);
}
else {
diff --git a/source/blender/makesrna/intern/rna_constraint.c b/source/blender/makesrna/intern/rna_constraint.c
index 170de68a038..0b3dc2a3504 100644
--- a/source/blender/makesrna/intern/rna_constraint.c
+++ b/source/blender/makesrna/intern/rna_constraint.c
@@ -433,13 +433,13 @@ static char *rna_Constraint_do_compute_path(Object *ob, bConstraint *con)
if (pchan) {
char name_esc_pchan[sizeof(pchan->name) * 2];
char name_esc_const[sizeof(con->name) * 2];
- BLI_strescape(name_esc_pchan, pchan->name, sizeof(name_esc_pchan));
- BLI_strescape(name_esc_const, con->name, sizeof(name_esc_const));
+ BLI_str_escape(name_esc_pchan, pchan->name, sizeof(name_esc_pchan));
+ BLI_str_escape(name_esc_const, con->name, sizeof(name_esc_const));
return BLI_sprintfN("pose.bones[\"%s\"].constraints[\"%s\"]", name_esc_pchan, name_esc_const);
}
else {
char name_esc_const[sizeof(con->name) * 2];
- BLI_strescape(name_esc_const, con->name, sizeof(name_esc_const));
+ BLI_str_escape(name_esc_const, con->name, sizeof(name_esc_const));
return BLI_sprintfN("constraints[\"%s\"]", name_esc_const);
}
}
diff --git a/source/blender/makesrna/intern/rna_dynamicpaint.c b/source/blender/makesrna/intern/rna_dynamicpaint.c
index f86cfb674d1..7c4762aa3a3 100644
--- a/source/blender/makesrna/intern/rna_dynamicpaint.c
+++ b/source/blender/makesrna/intern/rna_dynamicpaint.c
@@ -57,7 +57,7 @@ static char *rna_DynamicPaintCanvasSettings_path(PointerRNA *ptr)
ModifierData *md = (ModifierData *)settings->pmd;
char name_esc[sizeof(md->name) * 2];
- BLI_strescape(name_esc, md->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, md->name, sizeof(name_esc));
return BLI_sprintfN("modifiers[\"%s\"].canvas_settings", name_esc);
}
@@ -67,7 +67,7 @@ static char *rna_DynamicPaintBrushSettings_path(PointerRNA *ptr)
ModifierData *md = (ModifierData *)settings->pmd;
char name_esc[sizeof(md->name) * 2];
- BLI_strescape(name_esc, md->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, md->name, sizeof(name_esc));
return BLI_sprintfN("modifiers[\"%s\"].brush_settings", name_esc);
}
@@ -78,8 +78,8 @@ static char *rna_DynamicPaintSurface_path(PointerRNA *ptr)
char name_esc[sizeof(md->name) * 2];
char name_esc_surface[sizeof(surface->name) * 2];
- BLI_strescape(name_esc, md->name, sizeof(name_esc));
- BLI_strescape(name_esc_surface, surface->name, sizeof(name_esc_surface));
+ BLI_str_escape(name_esc, md->name, sizeof(name_esc));
+ BLI_str_escape(name_esc_surface, surface->name, sizeof(name_esc_surface));
return BLI_sprintfN(
"modifiers[\"%s\"].canvas_settings.canvas_surfaces[\"%s\"]", name_esc, name_esc_surface);
}
diff --git a/source/blender/makesrna/intern/rna_fluid.c b/source/blender/makesrna/intern/rna_fluid.c
index 02ae71e3b3d..90f5434bea0 100644
--- a/source/blender/makesrna/intern/rna_fluid.c
+++ b/source/blender/makesrna/intern/rna_fluid.c
@@ -872,7 +872,7 @@ static char *rna_FluidDomainSettings_path(PointerRNA *ptr)
ModifierData *md = (ModifierData *)settings->fmd;
char name_esc[sizeof(md->name) * 2];
- BLI_strescape(name_esc, md->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, md->name, sizeof(name_esc));
return BLI_sprintfN("modifiers[\"%s\"].domain_settings", name_esc);
}
@@ -882,7 +882,7 @@ static char *rna_FluidFlowSettings_path(PointerRNA *ptr)
ModifierData *md = (ModifierData *)settings->fmd;
char name_esc[sizeof(md->name) * 2];
- BLI_strescape(name_esc, md->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, md->name, sizeof(name_esc));
return BLI_sprintfN("modifiers[\"%s\"].flow_settings", name_esc);
}
@@ -892,7 +892,7 @@ static char *rna_FluidEffectorSettings_path(PointerRNA *ptr)
ModifierData *md = (ModifierData *)settings->fmd;
char name_esc[sizeof(md->name) * 2];
- BLI_strescape(name_esc, md->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, md->name, sizeof(name_esc));
return BLI_sprintfN("modifiers[\"%s\"].effector_settings", name_esc);
}
diff --git a/source/blender/makesrna/intern/rna_gpencil.c b/source/blender/makesrna/intern/rna_gpencil.c
index 603bd51b2d9..7be9d14b1d1 100644
--- a/source/blender/makesrna/intern/rna_gpencil.c
+++ b/source/blender/makesrna/intern/rna_gpencil.c
@@ -308,7 +308,7 @@ static char *rna_GPencilLayer_path(PointerRNA *ptr)
bGPDlayer *gpl = (bGPDlayer *)ptr->data;
char name_esc[sizeof(gpl->info) * 2];
- BLI_strescape(name_esc, gpl->info, sizeof(name_esc));
+ BLI_str_escape(name_esc, gpl->info, sizeof(name_esc));
return BLI_sprintfN("layers[\"%s\"]", name_esc);
}
@@ -406,8 +406,8 @@ static char *rna_GPencilLayerMask_path(PointerRNA *ptr)
char name_layer[sizeof(gpl->info) * 2];
char name_mask[sizeof(mask->name) * 2];
- BLI_strescape(name_layer, gpl->info, sizeof(name_layer));
- BLI_strescape(name_mask, mask->name, sizeof(name_mask));
+ BLI_str_escape(name_layer, gpl->info, sizeof(name_layer));
+ BLI_str_escape(name_mask, mask->name, sizeof(name_mask));
return BLI_sprintfN("layers[\"%s\"].mask_layers[\"%s\"]", name_layer, name_mask);
}
diff --git a/source/blender/makesrna/intern/rna_gpencil_modifier.c b/source/blender/makesrna/intern/rna_gpencil_modifier.c
index e30ee2e9ee7..5f131de6a40 100644
--- a/source/blender/makesrna/intern/rna_gpencil_modifier.c
+++ b/source/blender/makesrna/intern/rna_gpencil_modifier.c
@@ -276,7 +276,7 @@ static char *rna_GpencilModifier_path(PointerRNA *ptr)
GpencilModifierData *gmd = ptr->data;
char name_esc[sizeof(gmd->name) * 2];
- BLI_strescape(name_esc, gmd->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, gmd->name, sizeof(name_esc));
return BLI_sprintfN("grease_pencil_modifiers[\"%s\"]", name_esc);
}
diff --git a/source/blender/makesrna/intern/rna_key.c b/source/blender/makesrna/intern/rna_key.c
index e0005766c48..3b9fc970072 100644
--- a/source/blender/makesrna/intern/rna_key.c
+++ b/source/blender/makesrna/intern/rna_key.c
@@ -676,7 +676,7 @@ static char *rna_ShapeKey_path(PointerRNA *ptr)
ID *id = ptr->owner_id;
char name_esc[sizeof(kb->name) * 2];
- BLI_strescape(name_esc, kb->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, kb->name, sizeof(name_esc));
if ((id) && (GS(id->name) != ID_KE)) {
return BLI_sprintfN("shape_keys.key_blocks[\"%s\"]", name_esc);
@@ -774,7 +774,7 @@ static char *rna_ShapeKeyPoint_path(PointerRNA *ptr)
index = rna_ShapeKey_curve_find_index(key, index);
}
- BLI_strescape(name_esc_kb, kb->name, sizeof(name_esc_kb));
+ BLI_str_escape(name_esc_kb, kb->name, sizeof(name_esc_kb));
if (GS(id->name) == ID_KE) {
return BLI_sprintfN("key_blocks[\"%s\"].data[%d]", name_esc_kb, index);
diff --git a/source/blender/makesrna/intern/rna_layer.c b/source/blender/makesrna/intern/rna_layer.c
index abc4136bae8..afe69c37eef 100644
--- a/source/blender/makesrna/intern/rna_layer.c
+++ b/source/blender/makesrna/intern/rna_layer.c
@@ -115,7 +115,7 @@ static char *rna_ViewLayer_path(PointerRNA *ptr)
ViewLayer *srl = (ViewLayer *)ptr->data;
char name_esc[sizeof(srl->name) * 2];
- BLI_strescape(name_esc, srl->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, srl->name, sizeof(name_esc));
return BLI_sprintfN("view_layers[\"%s\"]", name_esc);
}
diff --git a/source/blender/makesrna/intern/rna_linestyle.c b/source/blender/makesrna/intern/rna_linestyle.c
index 03442748854..ca97f2c9a55 100644
--- a/source/blender/makesrna/intern/rna_linestyle.c
+++ b/source/blender/makesrna/intern/rna_linestyle.c
@@ -257,7 +257,7 @@ static char *rna_LineStyle_color_modifier_path(PointerRNA *ptr)
{
LineStyleModifier *m = (LineStyleModifier *)ptr->data;
char name_esc[sizeof(m->name) * 2];
- BLI_strescape(name_esc, m->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, m->name, sizeof(name_esc));
return BLI_sprintfN("color_modifiers[\"%s\"]", name_esc);
}
@@ -265,7 +265,7 @@ static char *rna_LineStyle_alpha_modifier_path(PointerRNA *ptr)
{
LineStyleModifier *m = (LineStyleModifier *)ptr->data;
char name_esc[sizeof(m->name) * 2];
- BLI_strescape(name_esc, m->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, m->name, sizeof(name_esc));
return BLI_sprintfN("alpha_modifiers[\"%s\"]", name_esc);
}
@@ -273,7 +273,7 @@ static char *rna_LineStyle_thickness_modifier_path(PointerRNA *ptr)
{
LineStyleModifier *m = (LineStyleModifier *)ptr->data;
char name_esc[sizeof(m->name) * 2];
- BLI_strescape(name_esc, m->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, m->name, sizeof(name_esc));
return BLI_sprintfN("thickness_modifiers[\"%s\"]", name_esc);
}
@@ -281,7 +281,7 @@ static char *rna_LineStyle_geometry_modifier_path(PointerRNA *ptr)
{
LineStyleModifier *m = (LineStyleModifier *)ptr->data;
char name_esc[sizeof(m->name) * 2];
- BLI_strescape(name_esc, m->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, m->name, sizeof(name_esc));
return BLI_sprintfN("geometry_modifiers[\"%s\"]", name_esc);
}
diff --git a/source/blender/makesrna/intern/rna_mask.c b/source/blender/makesrna/intern/rna_mask.c
index cfbaf0cccf5..db3e5195c79 100644
--- a/source/blender/makesrna/intern/rna_mask.c
+++ b/source/blender/makesrna/intern/rna_mask.c
@@ -182,7 +182,7 @@ static char *rna_MaskLayer_path(PointerRNA *ptr)
{
MaskLayer *masklay = (MaskLayer *)ptr->data;
char name_esc[sizeof(masklay->name) * 2];
- BLI_strescape(name_esc, masklay->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, masklay->name, sizeof(name_esc));
return BLI_sprintfN("layers[\"%s\"]", name_esc);
}
diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c
index 4afb17fe0b9..2bbfee2dcef 100644
--- a/source/blender/makesrna/intern/rna_mesh.c
+++ b/source/blender/makesrna/intern/rna_mesh.c
@@ -670,7 +670,7 @@ static char *rna_MeshUVLoopLayer_path(PointerRNA *ptr)
{
CustomDataLayer *cdl = ptr->data;
char name_esc[sizeof(cdl->name) * 2];
- BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, cdl->name, sizeof(name_esc));
return BLI_sprintfN("uv_layers[\"%s\"]", name_esc);
}
@@ -913,7 +913,7 @@ static char *rna_MeshSkinVertexLayer_path(PointerRNA *ptr)
{
CustomDataLayer *cdl = ptr->data;
char name_esc[sizeof(cdl->name) * 2];
- BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, cdl->name, sizeof(name_esc));
return BLI_sprintfN("skin_vertices[\"%s\"]", name_esc);
}
@@ -945,7 +945,7 @@ static char *rna_MeshPaintMaskLayer_path(PointerRNA *ptr)
{
CustomDataLayer *cdl = ptr->data;
char name_esc[sizeof(cdl->name) * 2];
- BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, cdl->name, sizeof(name_esc));
return BLI_sprintfN("vertex_paint_masks[\"%s\"]", name_esc);
}
@@ -979,7 +979,7 @@ static char *rna_MeshFaceMapLayer_path(PointerRNA *ptr)
{
CustomDataLayer *cdl = ptr->data;
char name_esc[sizeof(cdl->name) * 2];
- BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, cdl->name, sizeof(name_esc));
return BLI_sprintfN("face_maps[\"%s\"]", name_esc);
}
@@ -1189,7 +1189,7 @@ static char *rna_VertCustomData_data_path(PointerRNA *ptr, const char *collectio
b = ((char *)ptr->data - ((char *)cdl->data)) / CustomData_sizeof(type);
if (b >= 0 && b < totvert) {
char name_esc[sizeof(cdl->name) * 2];
- BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, cdl->name, sizeof(name_esc));
return BLI_sprintfN("%s[\"%s\"].data[%d]", collection, name_esc, b);
}
}
@@ -1210,7 +1210,7 @@ static char *rna_PolyCustomData_data_path(PointerRNA *ptr, const char *collectio
b = ((char *)ptr->data - ((char *)cdl->data)) / CustomData_sizeof(type);
if (b >= 0 && b < totpoly) {
char name_esc[sizeof(cdl->name) * 2];
- BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, cdl->name, sizeof(name_esc));
return BLI_sprintfN("%s[\"%s\"].data[%d]", collection, name_esc, b);
}
}
@@ -1231,7 +1231,7 @@ static char *rna_LoopCustomData_data_path(PointerRNA *ptr, const char *collectio
b = ((char *)ptr->data - ((char *)cdl->data)) / CustomData_sizeof(type);
if (b >= 0 && b < totloop) {
char name_esc[sizeof(cdl->name) * 2];
- BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, cdl->name, sizeof(name_esc));
return BLI_sprintfN("%s[\"%s\"].data[%d]", collection, name_esc, b);
}
}
@@ -1249,7 +1249,7 @@ static char *rna_MeshLoopColorLayer_path(PointerRNA *ptr)
{
CustomDataLayer *cdl = ptr->data;
char name_esc[sizeof(cdl->name) * 2];
- BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, cdl->name, sizeof(name_esc));
return BLI_sprintfN("vertex_colors[\"%s\"]", name_esc);
}
@@ -1262,7 +1262,7 @@ static char *rna_MeshVertColorLayer_path(PointerRNA *ptr)
{
CustomDataLayer *cdl = ptr->data;
char name_esc[sizeof(cdl->name) * 2];
- BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, cdl->name, sizeof(name_esc));
return BLI_sprintfN("sculpt_vertex_colors[\"%s\"]", name_esc);
}
@@ -1276,14 +1276,14 @@ static char *rna_MeshVertexFloatPropertyLayer_path(PointerRNA *ptr)
{
CustomDataLayer *cdl = ptr->data;
char name_esc[sizeof(cdl->name) * 2];
- BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, cdl->name, sizeof(name_esc));
return BLI_sprintfN("vertex_float_layers[\"%s\"]", name_esc);
}
static char *rna_MeshPolygonFloatPropertyLayer_path(PointerRNA *ptr)
{
CustomDataLayer *cdl = ptr->data;
char name_esc[sizeof(cdl->name) * 2];
- BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, cdl->name, sizeof(name_esc));
return BLI_sprintfN("polygon_float_layers[\"%s\"]", name_esc);
}
@@ -1327,14 +1327,14 @@ static char *rna_MeshVertexIntPropertyLayer_path(PointerRNA *ptr)
{
CustomDataLayer *cdl = ptr->data;
char name_esc[sizeof(cdl->name) * 2];
- BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, cdl->name, sizeof(name_esc));
return BLI_sprintfN("vertex_int_layers[\"%s\"]", name_esc);
}
static char *rna_MeshPolygonIntPropertyLayer_path(PointerRNA *ptr)
{
CustomDataLayer *cdl = ptr->data;
char name_esc[sizeof(cdl->name) * 2];
- BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, cdl->name, sizeof(name_esc));
return BLI_sprintfN("polygon_int_layers[\"%s\"]", name_esc);
}
@@ -1378,14 +1378,14 @@ static char *rna_MeshVertexStringPropertyLayer_path(PointerRNA *ptr)
{
CustomDataLayer *cdl = ptr->data;
char name_esc[sizeof(cdl->name) * 2];
- BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, cdl->name, sizeof(name_esc));
return BLI_sprintfN("vertex_string_layers[\"%s\"]", name_esc);
}
static char *rna_MeshPolygonStringPropertyLayer_path(PointerRNA *ptr)
{
CustomDataLayer *cdl = ptr->data;
char name_esc[sizeof(cdl->name) * 2];
- BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, cdl->name, sizeof(name_esc));
return BLI_sprintfN("polygon_string_layers[\"%s\"]", name_esc);
}
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 99304d29e00..d91b6ea19f7 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -660,7 +660,7 @@ static char *rna_Modifier_path(PointerRNA *ptr)
ModifierData *md = ptr->data;
char name_esc[sizeof(md->name) * 2];
- BLI_strescape(name_esc, md->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, md->name, sizeof(name_esc));
return BLI_sprintfN("modifiers[\"%s\"]", name_esc);
}
diff --git a/source/blender/makesrna/intern/rna_nla.c b/source/blender/makesrna/intern/rna_nla.c
index b7c51eac6ef..f8a342e7f7e 100644
--- a/source/blender/makesrna/intern/rna_nla.c
+++ b/source/blender/makesrna/intern/rna_nla.c
@@ -88,8 +88,8 @@ static char *rna_NlaStrip_path(PointerRNA *ptr)
char name_esc_nlt[sizeof(nlt->name) * 2];
char name_esc_strip[sizeof(strip->name) * 2];
- BLI_strescape(name_esc_nlt, nlt->name, sizeof(name_esc_nlt));
- BLI_strescape(name_esc_strip, strip->name, sizeof(name_esc_strip));
+ BLI_str_escape(name_esc_nlt, nlt->name, sizeof(name_esc_nlt));
+ BLI_str_escape(name_esc_strip, strip->name, sizeof(name_esc_strip));
return BLI_sprintfN(
"animation_data.nla_tracks[\"%s\"].strips[\"%s\"]", name_esc_nlt, name_esc_strip);
}
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 9cf11f1197d..fb7b458cfa4 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -1465,7 +1465,7 @@ static char *rna_Node_path(PointerRNA *ptr)
bNode *node = (bNode *)ptr->data;
char name_esc[sizeof(node->name) * 2];
- BLI_strescape(name_esc, node->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, node->name, sizeof(name_esc));
return BLI_sprintfN("nodes[\"%s\"]", name_esc);
}
@@ -1492,7 +1492,7 @@ char *rna_Node_ImageUser_path(PointerRNA *ptr)
continue;
}
- BLI_strescape(name_esc, node->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, node->name, sizeof(name_esc));
return BLI_sprintfN("nodes[\"%s\"].image_user", name_esc);
}
@@ -1887,6 +1887,30 @@ static const EnumPropertyItem *rna_GeometryNodeAttributeRandom_domain_itemf(
return itemf_function_check(rna_enum_attribute_domain_items, attribute_random_domain_supported);
}
+static bool attribute_fill_type_supported(const EnumPropertyItem *item)
+{
+ return ELEM(item->value, CD_PROP_FLOAT, CD_PROP_FLOAT3, CD_PROP_COLOR);
+}
+static const EnumPropertyItem *rna_GeometryNodeAttributeFill_type_itemf(bContext *UNUSED(C),
+ PointerRNA *UNUSED(ptr),
+ PropertyRNA *UNUSED(prop),
+ bool *r_free)
+{
+ *r_free = true;
+ return itemf_function_check(rna_enum_attribute_type_items, attribute_fill_type_supported);
+}
+
+static bool attribute_fill_domain_supported(const EnumPropertyItem *item)
+{
+ return item->value == ATTR_DOMAIN_POINT;
+}
+static const EnumPropertyItem *rna_GeometryNodeAttributeFill_domain_itemf(
+ bContext *UNUSED(C), PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), bool *r_free)
+{
+ *r_free = true;
+ return itemf_function_check(rna_enum_attribute_domain_items, attribute_fill_domain_supported);
+}
+
static bool attribute_math_operation_supported(const EnumPropertyItem *item)
{
return ELEM(item->value,
@@ -2471,7 +2495,7 @@ static char *rna_NodeSocket_path(PointerRNA *ptr)
return NULL;
}
- BLI_strescape(name_esc, node->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, node->name, sizeof(name_esc));
if (sock->in_out == SOCK_IN) {
return BLI_sprintfN("nodes[\"%s\"].inputs[%d]", name_esc, socketindex);
@@ -8351,6 +8375,13 @@ static void def_geo_random_attribute(StructRNA *srna)
"rna_GeometryNodeAttributeRandom_domain_itemf");
}
+static void def_geo_attribute_fill(StructRNA *srna)
+{
+ def_geo_attribute_create_common(srna,
+ "rna_GeometryNodeAttributeFill_type_itemf",
+ "rna_GeometryNodeAttributeFill_domain_itemf");
+}
+
static void def_geo_attribute_math(StructRNA *srna)
{
PropertyRNA *prop;
diff --git a/source/blender/makesrna/intern/rna_object_force.c b/source/blender/makesrna/intern/rna_object_force.c
index 39783f9e31f..db4f3754b25 100644
--- a/source/blender/makesrna/intern/rna_object_force.c
+++ b/source/blender/makesrna/intern/rna_object_force.c
@@ -154,7 +154,7 @@ static char *rna_PointCache_path(PointerRNA *ptr)
}
char name_esc[sizeof(md->name) * 2];
- BLI_strescape(name_esc, md->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, md->name, sizeof(name_esc));
switch (md->type) {
case eModifierType_ParticleSystem: {
@@ -171,7 +171,7 @@ static char *rna_PointCache_path(PointerRNA *ptr)
for (; surface; surface = surface->next) {
if (surface->pointcache == cache) {
char name_surface_esc[sizeof(surface->name) * 2];
- BLI_strescape(name_surface_esc, surface->name, sizeof(name_surface_esc));
+ BLI_str_escape(name_surface_esc, surface->name, sizeof(name_surface_esc));
return BLI_sprintfN(
"modifiers[\"%s\"].canvas_settings.canvas_surfaces[\"%s\"].point_cache",
name_esc,
@@ -436,7 +436,7 @@ static char *rna_CollisionSettings_path(PointerRNA *UNUSED(ptr))
if (md) {
char name_esc[sizeof(md->name) * 2];
- BLI_strescape(name_esc, md->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, md->name, sizeof(name_esc));
return BLI_sprintfN("modifiers[\"%s\"].settings", name_esc);
}
else {
@@ -608,7 +608,7 @@ static char *rna_SoftBodySettings_path(PointerRNA *ptr)
ModifierData *md = (ModifierData *)BKE_modifiers_findby_type(ob, eModifierType_Softbody);
char name_esc[sizeof(md->name) * 2];
- BLI_strescape(name_esc, md->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, md->name, sizeof(name_esc));
return BLI_sprintfN("modifiers[\"%s\"].settings", name_esc);
}
@@ -797,7 +797,7 @@ static char *rna_EffectorWeight_path(PointerRNA *ptr)
/* no pointer from modifier data to actual softbody storage, would be good to add */
if (ob->soft->effector_weights == ew) {
char name_esc[sizeof(md->name) * 2];
- BLI_strescape(name_esc, md->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, md->name, sizeof(name_esc));
return BLI_sprintfN("modifiers[\"%s\"].settings.effector_weights", name_esc);
}
}
@@ -808,7 +808,7 @@ static char *rna_EffectorWeight_path(PointerRNA *ptr)
ClothModifierData *cmd = (ClothModifierData *)md;
if (cmd->sim_parms->effector_weights == ew) {
char name_esc[sizeof(md->name) * 2];
- BLI_strescape(name_esc, md->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, md->name, sizeof(name_esc));
return BLI_sprintfN("modifiers[\"%s\"].settings.effector_weights", name_esc);
}
}
@@ -820,7 +820,7 @@ static char *rna_EffectorWeight_path(PointerRNA *ptr)
if (fmd->type == MOD_FLUID_TYPE_DOMAIN && fmd->domain &&
fmd->domain->effector_weights == ew) {
char name_esc[sizeof(md->name) * 2];
- BLI_strescape(name_esc, md->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, md->name, sizeof(name_esc));
return BLI_sprintfN("modifiers[\"%s\"].domain_settings.effector_weights", name_esc);
}
}
@@ -838,8 +838,8 @@ static char *rna_EffectorWeight_path(PointerRNA *ptr)
char name_esc[sizeof(md->name) * 2];
char name_esc_surface[sizeof(surface->name) * 2];
- BLI_strescape(name_esc, md->name, sizeof(name_esc));
- BLI_strescape(name_esc_surface, surface->name, sizeof(name_esc_surface));
+ BLI_str_escape(name_esc, md->name, sizeof(name_esc));
+ BLI_str_escape(name_esc_surface, surface->name, sizeof(name_esc_surface));
return BLI_sprintfN(
"modifiers[\"%s\"].canvas_settings.canvas_surfaces[\"%s\"]"
".effector_weights",
diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c
index 5987f52328d..e04ef105071 100644
--- a/source/blender/makesrna/intern/rna_particle.c
+++ b/source/blender/makesrna/intern/rna_particle.c
@@ -1490,7 +1490,7 @@ static char *rna_ParticleSystem_path(PointerRNA *ptr)
ParticleSystem *psys = (ParticleSystem *)ptr->data;
char name_esc[sizeof(psys->name) * 2];
- BLI_strescape(name_esc, psys->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, psys->name, sizeof(name_esc));
return BLI_sprintfN("particle_systems[\"%s\"]", name_esc);
}
@@ -2484,7 +2484,7 @@ static void rna_def_particle_settings(BlenderRNA *brna)
NULL,
"ParticleSettingsTextureSlot",
"ParticleSettingsTextureSlots",
- "rna_Particle_reset",
+ "rna_Particle_reset_dependency",
NULL);
/* Fluid particle type can't be checked from the type value in RNA
diff --git a/source/blender/makesrna/intern/rna_pose.c b/source/blender/makesrna/intern/rna_pose.c
index bc9aabbefe6..5f74e8cfc78 100644
--- a/source/blender/makesrna/intern/rna_pose.c
+++ b/source/blender/makesrna/intern/rna_pose.c
@@ -132,7 +132,7 @@ static char *rna_PoseBone_path(PointerRNA *ptr)
bPoseChannel *pchan = ptr->data;
char name_esc[sizeof(pchan->name) * 2];
- BLI_strescape(name_esc, pchan->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, pchan->name, sizeof(name_esc));
return BLI_sprintfN("pose.bones[\"%s\"]", name_esc);
}
diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c
index b8f6eba4d5a..98ae7591062 100644
--- a/source/blender/makesrna/intern/rna_rna.c
+++ b/source/blender/makesrna/intern/rna_rna.c
@@ -1360,7 +1360,7 @@ static int rna_property_override_diff_propptr(Main *bmain,
BLI_assert(STREQ(rna_itemname_a, rna_itemname_b));
char esc_item_name[RNA_PATH_BUFFSIZE];
- const size_t esc_item_name_len = BLI_strescape(
+ const size_t esc_item_name_len = BLI_str_escape(
esc_item_name, rna_itemname_a, RNA_PATH_BUFFSIZE);
extended_rna_path_len = rna_path_len + 2 + esc_item_name_len + 2;
if (extended_rna_path_len >= RNA_PATH_BUFFSIZE) {
diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c
index 4313b468deb..9e7fbf2f9a9 100644
--- a/source/blender/makesrna/intern/rna_sequencer.c
+++ b/source/blender/makesrna/intern/rna_sequencer.c
@@ -506,7 +506,7 @@ static char *rna_SequenceTransform_path(PointerRNA *ptr)
if (seq && seq->name + 2) {
char name_esc[(sizeof(seq->name) - 2) * 2];
- BLI_strescape(name_esc, seq->name + 2, sizeof(name_esc));
+ BLI_str_escape(name_esc, seq->name + 2, sizeof(name_esc));
return BLI_sprintfN("sequence_editor.sequences_all[\"%s\"].transform", name_esc);
}
else {
@@ -558,7 +558,7 @@ static char *rna_SequenceCrop_path(PointerRNA *ptr)
if (seq && seq->name + 2) {
char name_esc[(sizeof(seq->name) - 2) * 2];
- BLI_strescape(name_esc, seq->name + 2, sizeof(name_esc));
+ BLI_str_escape(name_esc, seq->name + 2, sizeof(name_esc));
return BLI_sprintfN("sequence_editor.sequences_all[\"%s\"].crop", name_esc);
}
else {
@@ -704,7 +704,7 @@ static char *rna_Sequence_path(PointerRNA *ptr)
if (seq->name + 2) {
char name_esc[(sizeof(seq->name) - 2) * 2];
- BLI_strescape(name_esc, seq->name + 2, sizeof(name_esc));
+ BLI_str_escape(name_esc, seq->name + 2, sizeof(name_esc));
return BLI_sprintfN("sequence_editor.sequences_all[\"%s\"]", name_esc);
}
else {
@@ -1023,7 +1023,7 @@ static char *rna_SequenceColorBalance_path(PointerRNA *ptr)
if (seq && seq->name + 2) {
char name_esc[(sizeof(seq->name) - 2) * 2];
- BLI_strescape(name_esc, seq->name + 2, sizeof(name_esc));
+ BLI_str_escape(name_esc, seq->name + 2, sizeof(name_esc));
if (!smd) {
/* path to old filter color balance */
@@ -1033,7 +1033,7 @@ static char *rna_SequenceColorBalance_path(PointerRNA *ptr)
/* path to modifier */
char name_esc_smd[sizeof(smd->name) * 2];
- BLI_strescape(name_esc_smd, smd->name, sizeof(name_esc_smd));
+ BLI_str_escape(name_esc_smd, smd->name, sizeof(name_esc_smd));
return BLI_sprintfN("sequence_editor.sequences_all[\"%s\"].modifiers[\"%s\"].color_balance",
name_esc,
name_esc_smd);
@@ -1168,8 +1168,8 @@ static char *rna_SequenceModifier_path(PointerRNA *ptr)
char name_esc[(sizeof(seq->name) - 2) * 2];
char name_esc_smd[sizeof(smd->name) * 2];
- BLI_strescape(name_esc, seq->name + 2, sizeof(name_esc));
- BLI_strescape(name_esc_smd, smd->name, sizeof(name_esc_smd));
+ BLI_str_escape(name_esc, seq->name + 2, sizeof(name_esc));
+ BLI_str_escape(name_esc_smd, smd->name, sizeof(name_esc_smd));
return BLI_sprintfN(
"sequence_editor.sequences_all[\"%s\"].modifiers[\"%s\"]", name_esc, name_esc_smd);
}
diff --git a/source/blender/makesrna/intern/rna_shader_fx.c b/source/blender/makesrna/intern/rna_shader_fx.c
index 7b039b91188..451cc56eba7 100644
--- a/source/blender/makesrna/intern/rna_shader_fx.c
+++ b/source/blender/makesrna/intern/rna_shader_fx.c
@@ -161,7 +161,7 @@ static char *rna_ShaderFx_path(PointerRNA *ptr)
ShaderFxData *gmd = ptr->data;
char name_esc[sizeof(gmd->name) * 2];
- BLI_strescape(name_esc, gmd->name, sizeof(name_esc));
+ BLI_str_escape(name_esc, gmd->name, sizeof(name_esc));
return BLI_sprintfN("shader_effects[\"%s\"]", name_esc);
}
diff --git a/source/blender/makesrna/intern/rna_texture.c b/source/blender/makesrna/intern/rna_texture.c
index fb6d40b3a55..cf8abf26c0a 100644
--- a/source/blender/makesrna/intern/rna_texture.c
+++ b/source/blender/makesrna/intern/rna_texture.c
@@ -148,6 +148,7 @@ static const EnumPropertyItem blend_type_items[] = {
# include "BKE_texture.h"
# include "DEG_depsgraph.h"
+# include "DEG_depsgraph_build.h"
# include "ED_node.h"
# include "ED_render.h"
@@ -233,6 +234,12 @@ static void rna_Texture_type_set(PointerRNA *ptr, int value)
BKE_texture_type_set(tex, value);
}
+void rna_TextureSlotTexture_update(bContext *C, PointerRNA *ptr)
+{
+ DEG_relations_tag_update(CTX_data_main(C));
+ rna_TextureSlot_update(C, ptr);
+}
+
void rna_TextureSlot_update(bContext *C, PointerRNA *ptr)
{
ID *id = ptr->owner_id;
@@ -317,7 +324,7 @@ char *rna_TextureSlot_path(PointerRNA *ptr)
if (mtex->tex) {
char name_esc[(sizeof(mtex->tex->id.name) - 2) * 2];
- BLI_strescape(name_esc, mtex->tex->id.name + 2, sizeof(name_esc));
+ BLI_str_escape(name_esc, mtex->tex->id.name + 2, sizeof(name_esc));
return BLI_sprintfN("texture_slots[\"%s\"]", name_esc);
}
else {
@@ -623,7 +630,7 @@ static void rna_def_mtex(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE | PROP_CONTEXT_UPDATE);
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
RNA_def_property_ui_text(prop, "Texture", "Texture data-block used by this texture slot");
- RNA_def_property_update(prop, NC_MATERIAL | ND_SHADING_LINKS, "rna_TextureSlot_update");
+ RNA_def_property_update(prop, NC_MATERIAL | ND_SHADING_LINKS, "rna_TextureSlotTexture_update");
prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_property_string_funcs(
diff --git a/source/blender/modifiers/intern/MOD_armature.c b/source/blender/modifiers/intern/MOD_armature.c
index 38fb19e3233..6769f14f88f 100644
--- a/source/blender/modifiers/intern/MOD_armature.c
+++ b/source/blender/modifiers/intern/MOD_armature.c
@@ -295,7 +295,7 @@ ModifierTypeInfo modifierType_Armature = {
/* deformMatricesEM */ deformMatricesEM,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c
index da1754b8ebd..412d6b87d82 100644
--- a/source/blender/modifiers/intern/MOD_array.c
+++ b/source/blender/modifiers/intern/MOD_array.c
@@ -1018,7 +1018,7 @@ ModifierTypeInfo modifierType_Array = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_bevel.c b/source/blender/modifiers/intern/MOD_bevel.c
index 04ddac338e5..a94411d897e 100644
--- a/source/blender/modifiers/intern/MOD_bevel.c
+++ b/source/blender/modifiers/intern/MOD_bevel.c
@@ -447,7 +447,7 @@ ModifierTypeInfo modifierType_Bevel = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c
index 0513d3af13a..e290fd9dab7 100644
--- a/source/blender/modifiers/intern/MOD_boolean.c
+++ b/source/blender/modifiers/intern/MOD_boolean.c
@@ -819,7 +819,7 @@ ModifierTypeInfo modifierType_Boolean = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_build.c b/source/blender/modifiers/intern/MOD_build.c
index 96ed0a5d069..0b1c661baed 100644
--- a/source/blender/modifiers/intern/MOD_build.c
+++ b/source/blender/modifiers/intern/MOD_build.c
@@ -346,7 +346,7 @@ ModifierTypeInfo modifierType_Build = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_cast.c b/source/blender/modifiers/intern/MOD_cast.c
index 06bd9ada0fb..f905a38ae12 100644
--- a/source/blender/modifiers/intern/MOD_cast.c
+++ b/source/blender/modifiers/intern/MOD_cast.c
@@ -590,7 +590,7 @@ ModifierTypeInfo modifierType_Cast = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_cloth.c b/source/blender/modifiers/intern/MOD_cloth.c
index 8f876213cd6..4e15149083b 100644
--- a/source/blender/modifiers/intern/MOD_cloth.c
+++ b/source/blender/modifiers/intern/MOD_cloth.c
@@ -309,7 +309,7 @@ ModifierTypeInfo modifierType_Cloth = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_collision.c b/source/blender/modifiers/intern/MOD_collision.c
index faba08f9613..7db0706c706 100644
--- a/source/blender/modifiers/intern/MOD_collision.c
+++ b/source/blender/modifiers/intern/MOD_collision.c
@@ -309,7 +309,7 @@ ModifierTypeInfo modifierType_Collision = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_correctivesmooth.c b/source/blender/modifiers/intern/MOD_correctivesmooth.c
index 5884ec0aa17..15c4e8af6ce 100644
--- a/source/blender/modifiers/intern/MOD_correctivesmooth.c
+++ b/source/blender/modifiers/intern/MOD_correctivesmooth.c
@@ -851,7 +851,7 @@ ModifierTypeInfo modifierType_CorrectiveSmooth = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_curve.c b/source/blender/modifiers/intern/MOD_curve.c
index bed53cb0f51..d5d53edfd54 100644
--- a/source/blender/modifiers/intern/MOD_curve.c
+++ b/source/blender/modifiers/intern/MOD_curve.c
@@ -235,7 +235,7 @@ ModifierTypeInfo modifierType_Curve = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_datatransfer.c b/source/blender/modifiers/intern/MOD_datatransfer.c
index d4c941d144d..8b299a82f95 100644
--- a/source/blender/modifiers/intern/MOD_datatransfer.c
+++ b/source/blender/modifiers/intern/MOD_datatransfer.c
@@ -494,7 +494,7 @@ ModifierTypeInfo modifierType_DataTransfer = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_decimate.c b/source/blender/modifiers/intern/MOD_decimate.c
index 10ed4f8d80b..b28b8fd39fc 100644
--- a/source/blender/modifiers/intern/MOD_decimate.c
+++ b/source/blender/modifiers/intern/MOD_decimate.c
@@ -299,7 +299,7 @@ ModifierTypeInfo modifierType_Decimate = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_displace.c b/source/blender/modifiers/intern/MOD_displace.c
index d432559fcfa..abe78943508 100644
--- a/source/blender/modifiers/intern/MOD_displace.c
+++ b/source/blender/modifiers/intern/MOD_displace.c
@@ -506,7 +506,7 @@ ModifierTypeInfo modifierType_Displace = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_dynamicpaint.c b/source/blender/modifiers/intern/MOD_dynamicpaint.c
index b69179f464d..7f57183ff13 100644
--- a/source/blender/modifiers/intern/MOD_dynamicpaint.c
+++ b/source/blender/modifiers/intern/MOD_dynamicpaint.c
@@ -220,7 +220,7 @@ ModifierTypeInfo modifierType_DynamicPaint = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_edgesplit.c b/source/blender/modifiers/intern/MOD_edgesplit.c
index 30c38623f68..e02befd7efa 100644
--- a/source/blender/modifiers/intern/MOD_edgesplit.c
+++ b/source/blender/modifiers/intern/MOD_edgesplit.c
@@ -186,7 +186,7 @@ ModifierTypeInfo modifierType_EdgeSplit = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_explode.c b/source/blender/modifiers/intern/MOD_explode.c
index d5e065ad321..c12019a325e 100644
--- a/source/blender/modifiers/intern/MOD_explode.c
+++ b/source/blender/modifiers/intern/MOD_explode.c
@@ -1254,7 +1254,7 @@ ModifierTypeInfo modifierType_Explode = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_fluid.c b/source/blender/modifiers/intern/MOD_fluid.c
index 6dc4fe79f88..8a8d6f2305f 100644
--- a/source/blender/modifiers/intern/MOD_fluid.c
+++ b/source/blender/modifiers/intern/MOD_fluid.c
@@ -238,7 +238,7 @@ ModifierTypeInfo modifierType_Fluid = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_hook.c b/source/blender/modifiers/intern/MOD_hook.c
index e0c362171f2..2fa05a319d5 100644
--- a/source/blender/modifiers/intern/MOD_hook.c
+++ b/source/blender/modifiers/intern/MOD_hook.c
@@ -573,7 +573,7 @@ ModifierTypeInfo modifierType_Hook = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_laplaciandeform.c b/source/blender/modifiers/intern/MOD_laplaciandeform.c
index a484b4d8147..bda0f9ba5a4 100644
--- a/source/blender/modifiers/intern/MOD_laplaciandeform.c
+++ b/source/blender/modifiers/intern/MOD_laplaciandeform.c
@@ -888,7 +888,7 @@ ModifierTypeInfo modifierType_LaplacianDeform = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_laplaciansmooth.c b/source/blender/modifiers/intern/MOD_laplaciansmooth.c
index d51f95bd18d..fc527304e76 100644
--- a/source/blender/modifiers/intern/MOD_laplaciansmooth.c
+++ b/source/blender/modifiers/intern/MOD_laplaciansmooth.c
@@ -634,7 +634,7 @@ ModifierTypeInfo modifierType_LaplacianSmooth = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ init_data,
diff --git a/source/blender/modifiers/intern/MOD_lattice.c b/source/blender/modifiers/intern/MOD_lattice.c
index 5aadc171394..e3c42e39dda 100644
--- a/source/blender/modifiers/intern/MOD_lattice.c
+++ b/source/blender/modifiers/intern/MOD_lattice.c
@@ -192,7 +192,7 @@ ModifierTypeInfo modifierType_Lattice = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_mask.cc b/source/blender/modifiers/intern/MOD_mask.cc
index 92ee5a84df9..191d39d9fce 100644
--- a/source/blender/modifiers/intern/MOD_mask.cc
+++ b/source/blender/modifiers/intern/MOD_mask.cc
@@ -462,7 +462,7 @@ ModifierTypeInfo modifierType_Mask = {
/* deformMatricesEM */ nullptr,
/* modifyMesh */ modifyMesh,
/* modifyHair */ nullptr,
- /* modifyPointCloud */ nullptr,
+ /* modifyGeometrySet */ nullptr,
/* modifyVolume */ nullptr,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_mesh_to_volume.cc b/source/blender/modifiers/intern/MOD_mesh_to_volume.cc
index e137a59e10f..cc007651733 100644
--- a/source/blender/modifiers/intern/MOD_mesh_to_volume.cc
+++ b/source/blender/modifiers/intern/MOD_mesh_to_volume.cc
@@ -295,7 +295,7 @@ ModifierTypeInfo modifierType_MeshToVolume = {
/* deformMatricesEM */ nullptr,
/* modifyMesh */ nullptr,
/* modifyHair */ nullptr,
- /* modifyPointCloud */ nullptr,
+ /* modifyGeometrySet */ nullptr,
/* modifyVolume */ modifyVolume,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_meshcache.c b/source/blender/modifiers/intern/MOD_meshcache.c
index b808d738fe8..6d2e0f242d7 100644
--- a/source/blender/modifiers/intern/MOD_meshcache.c
+++ b/source/blender/modifiers/intern/MOD_meshcache.c
@@ -388,7 +388,7 @@ ModifierTypeInfo modifierType_MeshCache = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c
index 0e530312238..4bd306e7679 100644
--- a/source/blender/modifiers/intern/MOD_meshdeform.c
+++ b/source/blender/modifiers/intern/MOD_meshdeform.c
@@ -646,7 +646,7 @@ ModifierTypeInfo modifierType_MeshDeform = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_meshsequencecache.c b/source/blender/modifiers/intern/MOD_meshsequencecache.c
index 73106b2e816..2c01857adb1 100644
--- a/source/blender/modifiers/intern/MOD_meshsequencecache.c
+++ b/source/blender/modifiers/intern/MOD_meshsequencecache.c
@@ -270,7 +270,7 @@ ModifierTypeInfo modifierType_MeshSequenceCache = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_mirror.c b/source/blender/modifiers/intern/MOD_mirror.c
index 9346f601981..7f34c6581ad 100644
--- a/source/blender/modifiers/intern/MOD_mirror.c
+++ b/source/blender/modifiers/intern/MOD_mirror.c
@@ -234,7 +234,7 @@ ModifierTypeInfo modifierType_Mirror = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_multires.c b/source/blender/modifiers/intern/MOD_multires.c
index 9f99e036601..1182c8db093 100644
--- a/source/blender/modifiers/intern/MOD_multires.c
+++ b/source/blender/modifiers/intern/MOD_multires.c
@@ -519,7 +519,7 @@ ModifierTypeInfo modifierType_Multires = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index 80c69398d15..35cb1dc7410 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -934,9 +934,9 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
return new_mesh;
}
-static void modifyPointCloud(ModifierData *md,
- const ModifierEvalContext *ctx,
- GeometrySet *geometry_set)
+static void modifyGeometrySet(ModifierData *md,
+ const ModifierEvalContext *ctx,
+ GeometrySet *geometry_set)
{
modifyGeometry(md, ctx, *geometry_set);
}
@@ -1063,7 +1063,7 @@ ModifierTypeInfo modifierType_Nodes = {
/* deformMatricesEM */ nullptr,
/* modifyMesh */ modifyMesh,
/* modifyHair */ nullptr,
- /* modifyPointCloud */ modifyPointCloud,
+ /* modifyGeometrySet */ modifyGeometrySet,
/* modifyVolume */ nullptr,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_none.c b/source/blender/modifiers/intern/MOD_none.c
index 02307622d06..4daa527577b 100644
--- a/source/blender/modifiers/intern/MOD_none.c
+++ b/source/blender/modifiers/intern/MOD_none.c
@@ -59,7 +59,7 @@ ModifierTypeInfo modifierType_None = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ NULL,
diff --git a/source/blender/modifiers/intern/MOD_normal_edit.c b/source/blender/modifiers/intern/MOD_normal_edit.c
index 0ec564d2e2d..ec10b18665e 100644
--- a/source/blender/modifiers/intern/MOD_normal_edit.c
+++ b/source/blender/modifiers/intern/MOD_normal_edit.c
@@ -804,7 +804,7 @@ ModifierTypeInfo modifierType_NormalEdit = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_ocean.c b/source/blender/modifiers/intern/MOD_ocean.c
index 5aef497c0c4..9c940745920 100644
--- a/source/blender/modifiers/intern/MOD_ocean.c
+++ b/source/blender/modifiers/intern/MOD_ocean.c
@@ -736,7 +736,7 @@ ModifierTypeInfo modifierType_Ocean = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_particleinstance.c b/source/blender/modifiers/intern/MOD_particleinstance.c
index f660874a5ea..e7f1fa9943e 100644
--- a/source/blender/modifiers/intern/MOD_particleinstance.c
+++ b/source/blender/modifiers/intern/MOD_particleinstance.c
@@ -678,7 +678,7 @@ ModifierTypeInfo modifierType_ParticleInstance = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_particlesystem.c b/source/blender/modifiers/intern/MOD_particlesystem.c
index 86480a17083..e49f16b994c 100644
--- a/source/blender/modifiers/intern/MOD_particlesystem.c
+++ b/source/blender/modifiers/intern/MOD_particlesystem.c
@@ -331,7 +331,7 @@ ModifierTypeInfo modifierType_ParticleSystem = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_remesh.c b/source/blender/modifiers/intern/MOD_remesh.c
index f8fc4ad658e..175435fcd44 100644
--- a/source/blender/modifiers/intern/MOD_remesh.c
+++ b/source/blender/modifiers/intern/MOD_remesh.c
@@ -300,7 +300,7 @@ ModifierTypeInfo modifierType_Remesh = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_screw.c b/source/blender/modifiers/intern/MOD_screw.c
index 6521a0859e5..94d5c402abe 100644
--- a/source/blender/modifiers/intern/MOD_screw.c
+++ b/source/blender/modifiers/intern/MOD_screw.c
@@ -1259,7 +1259,7 @@ ModifierTypeInfo modifierType_Screw = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_shapekey.c b/source/blender/modifiers/intern/MOD_shapekey.c
index bb267386dfb..5d2e19eb2d2 100644
--- a/source/blender/modifiers/intern/MOD_shapekey.c
+++ b/source/blender/modifiers/intern/MOD_shapekey.c
@@ -139,7 +139,7 @@ ModifierTypeInfo modifierType_ShapeKey = {
/* deformMatricesEM */ deformMatricesEM,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ NULL,
diff --git a/source/blender/modifiers/intern/MOD_shrinkwrap.c b/source/blender/modifiers/intern/MOD_shrinkwrap.c
index dddabb12f61..93626309727 100644
--- a/source/blender/modifiers/intern/MOD_shrinkwrap.c
+++ b/source/blender/modifiers/intern/MOD_shrinkwrap.c
@@ -292,7 +292,7 @@ ModifierTypeInfo modifierType_Shrinkwrap = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_simpledeform.c b/source/blender/modifiers/intern/MOD_simpledeform.c
index ec89176f97e..e41e70864dc 100644
--- a/source/blender/modifiers/intern/MOD_simpledeform.c
+++ b/source/blender/modifiers/intern/MOD_simpledeform.c
@@ -552,7 +552,7 @@ ModifierTypeInfo modifierType_SimpleDeform = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_skin.c b/source/blender/modifiers/intern/MOD_skin.c
index 6936f5a53f8..5e412185cea 100644
--- a/source/blender/modifiers/intern/MOD_skin.c
+++ b/source/blender/modifiers/intern/MOD_skin.c
@@ -2043,7 +2043,7 @@ ModifierTypeInfo modifierType_Skin = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_smooth.c b/source/blender/modifiers/intern/MOD_smooth.c
index e73a59f1ae8..e76a2baf6b6 100644
--- a/source/blender/modifiers/intern/MOD_smooth.c
+++ b/source/blender/modifiers/intern/MOD_smooth.c
@@ -286,7 +286,7 @@ ModifierTypeInfo modifierType_Smooth = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_softbody.c b/source/blender/modifiers/intern/MOD_softbody.c
index 4bdb3ba60b1..9a657c44fca 100644
--- a/source/blender/modifiers/intern/MOD_softbody.c
+++ b/source/blender/modifiers/intern/MOD_softbody.c
@@ -119,7 +119,7 @@ ModifierTypeInfo modifierType_Softbody = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ NULL,
diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c
index 8886d3718c9..e501dc3210f 100644
--- a/source/blender/modifiers/intern/MOD_solidify.c
+++ b/source/blender/modifiers/intern/MOD_solidify.c
@@ -274,7 +274,7 @@ ModifierTypeInfo modifierType_Solidify = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_subsurf.c b/source/blender/modifiers/intern/MOD_subsurf.c
index 1aa015682dd..d089894a6e9 100644
--- a/source/blender/modifiers/intern/MOD_subsurf.c
+++ b/source/blender/modifiers/intern/MOD_subsurf.c
@@ -507,7 +507,7 @@ ModifierTypeInfo modifierType_Subsurf = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_surface.c b/source/blender/modifiers/intern/MOD_surface.c
index 72f19efe3a4..7416a4baf38 100644
--- a/source/blender/modifiers/intern/MOD_surface.c
+++ b/source/blender/modifiers/intern/MOD_surface.c
@@ -240,7 +240,7 @@ ModifierTypeInfo modifierType_Surface = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.c b/source/blender/modifiers/intern/MOD_surfacedeform.c
index 5407397e3bf..e00c5ba7f04 100644
--- a/source/blender/modifiers/intern/MOD_surfacedeform.c
+++ b/source/blender/modifiers/intern/MOD_surfacedeform.c
@@ -1546,7 +1546,7 @@ ModifierTypeInfo modifierType_SurfaceDeform = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_triangulate.c b/source/blender/modifiers/intern/MOD_triangulate.c
index 1930a38b825..04d24ac0883 100644
--- a/source/blender/modifiers/intern/MOD_triangulate.c
+++ b/source/blender/modifiers/intern/MOD_triangulate.c
@@ -177,7 +177,7 @@ ModifierTypeInfo modifierType_Triangulate = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_uvproject.c b/source/blender/modifiers/intern/MOD_uvproject.c
index bfbc27abb88..8122f4617c1 100644
--- a/source/blender/modifiers/intern/MOD_uvproject.c
+++ b/source/blender/modifiers/intern/MOD_uvproject.c
@@ -370,7 +370,7 @@ ModifierTypeInfo modifierType_UVProject = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_uvwarp.c b/source/blender/modifiers/intern/MOD_uvwarp.c
index b326494815e..77b79167c2f 100644
--- a/source/blender/modifiers/intern/MOD_uvwarp.c
+++ b/source/blender/modifiers/intern/MOD_uvwarp.c
@@ -341,7 +341,7 @@ ModifierTypeInfo modifierType_UVWarp = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_volume_displace.cc b/source/blender/modifiers/intern/MOD_volume_displace.cc
index 90e570f55fb..745e089b8ff 100644
--- a/source/blender/modifiers/intern/MOD_volume_displace.cc
+++ b/source/blender/modifiers/intern/MOD_volume_displace.cc
@@ -328,7 +328,7 @@ ModifierTypeInfo modifierType_VolumeDisplace = {
/* deformMatricesEM */ nullptr,
/* modifyMesh */ nullptr,
/* modifyHair */ nullptr,
- /* modifyPointCloud */ nullptr,
+ /* modifyGeometrySet */ nullptr,
/* modifyVolume */ modifyVolume,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_volume_to_mesh.cc b/source/blender/modifiers/intern/MOD_volume_to_mesh.cc
index ec53914f115..941bc8409f7 100644
--- a/source/blender/modifiers/intern/MOD_volume_to_mesh.cc
+++ b/source/blender/modifiers/intern/MOD_volume_to_mesh.cc
@@ -335,7 +335,7 @@ ModifierTypeInfo modifierType_VolumeToMesh = {
/* deformMatricesEM */ nullptr,
/* modifyMesh */ modifyMesh,
/* modifyHair */ nullptr,
- /* modifyPointCloud */ nullptr,
+ /* modifyGeometrySet */ nullptr,
/* modifyVolume */ nullptr,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_warp.c b/source/blender/modifiers/intern/MOD_warp.c
index 53e41484606..9d3d5b0658c 100644
--- a/source/blender/modifiers/intern/MOD_warp.c
+++ b/source/blender/modifiers/intern/MOD_warp.c
@@ -538,7 +538,7 @@ ModifierTypeInfo modifierType_Warp = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_wave.c b/source/blender/modifiers/intern/MOD_wave.c
index 45f06a7778c..863656b85a5 100644
--- a/source/blender/modifiers/intern/MOD_wave.c
+++ b/source/blender/modifiers/intern/MOD_wave.c
@@ -491,7 +491,7 @@ ModifierTypeInfo modifierType_Wave = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ NULL,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_weighted_normal.c b/source/blender/modifiers/intern/MOD_weighted_normal.c
index bd15d909834..40265e37db9 100644
--- a/source/blender/modifiers/intern/MOD_weighted_normal.c
+++ b/source/blender/modifiers/intern/MOD_weighted_normal.c
@@ -763,7 +763,7 @@ ModifierTypeInfo modifierType_WeightedNormal = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c
index df554f6bc4e..915adccc745 100644
--- a/source/blender/modifiers/intern/MOD_weightvgedit.c
+++ b/source/blender/modifiers/intern/MOD_weightvgedit.c
@@ -427,7 +427,7 @@ ModifierTypeInfo modifierType_WeightVGEdit = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c
index 9be36fe6846..52cee7ce7e5 100644
--- a/source/blender/modifiers/intern/MOD_weightvgmix.c
+++ b/source/blender/modifiers/intern/MOD_weightvgmix.c
@@ -513,7 +513,7 @@ ModifierTypeInfo modifierType_WeightVGMix = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c
index 7232ffd3d9d..aac29cabf0f 100644
--- a/source/blender/modifiers/intern/MOD_weightvgproximity.c
+++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c
@@ -767,7 +767,7 @@ ModifierTypeInfo modifierType_WeightVGProximity = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_weld.c b/source/blender/modifiers/intern/MOD_weld.c
index e34dcf48c19..fd1254fc948 100644
--- a/source/blender/modifiers/intern/MOD_weld.c
+++ b/source/blender/modifiers/intern/MOD_weld.c
@@ -2052,7 +2052,7 @@ ModifierTypeInfo modifierType_Weld = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/modifiers/intern/MOD_wireframe.c b/source/blender/modifiers/intern/MOD_wireframe.c
index 206c514826c..3d8e74d2cf5 100644
--- a/source/blender/modifiers/intern/MOD_wireframe.c
+++ b/source/blender/modifiers/intern/MOD_wireframe.c
@@ -195,7 +195,7 @@ ModifierTypeInfo modifierType_Wireframe = {
/* deformMatricesEM */ NULL,
/* modifyMesh */ modifyMesh,
/* modifyHair */ NULL,
- /* modifyPointCloud */ NULL,
+ /* modifyGeometrySet */ NULL,
/* modifyVolume */ NULL,
/* initData */ initData,
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index af34e1ec786..3b2987d8fa8 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -139,6 +139,7 @@ set(SRC
function/node_function_util.cc
geometry/nodes/node_geo_attribute_compare.cc
+ geometry/nodes/node_geo_attribute_fill.cc
geometry/nodes/node_geo_attribute_math.cc
geometry/nodes/node_geo_common.cc
geometry/nodes/node_geo_boolean.cc
diff --git a/source/blender/nodes/NOD_geometry.h b/source/blender/nodes/NOD_geometry.h
index 98721137cee..12042446295 100644
--- a/source/blender/nodes/NOD_geometry.h
+++ b/source/blender/nodes/NOD_geometry.h
@@ -26,6 +26,7 @@ void register_node_tree_type_geo(void);
void register_node_type_geo_group(void);
+void register_node_type_geo_attribute_fill(void);
void register_node_type_geo_boolean(void);
void register_node_type_geo_edge_split(void);
void register_node_type_geo_transform(void);
diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h
index 982fe2bf05a..90a5ddc54dc 100644
--- a/source/blender/nodes/NOD_static_types.h
+++ b/source/blender/nodes/NOD_static_types.h
@@ -277,6 +277,7 @@ DefNode(GeometryNode, GEO_NODE_OBJECT_INFO, 0, "OBJECT_INFO", ObjectInfo, "Objec
DefNode(GeometryNode, GEO_NODE_RANDOM_ATTRIBUTE, def_geo_random_attribute, "RANDOM_ATTRIBUTE", RandomAttribute, "Random Attribute", "")
DefNode(GeometryNode, GEO_NODE_ATTRIBUTE_MATH, def_geo_attribute_math, "ATTRIBUTE_MATH", AttributeMath, "Attribute Math", "")
DefNode(GeometryNode, GEO_NODE_JOIN_GEOMETRY, 0, "JOIN_GEOMETRY", JoinGeometry, "Join Geometry", "")
+DefNode(GeometryNode, GEO_NODE_ATTRIBUTE_FILL, def_geo_attribute_fill, "ATTRIBUTE_FILL", AttributeFill, "Attribute Fill", "")
DefNode(GeometryNode, GEO_NODE_POINT_SEPARATE, 0, "POINT_SEPARATE", PointSeparate, "Point Separate", "")
DefNode(GeometryNode, GEO_NODE_ATTRIBUTE_COMPARE, def_geo_attribute_attribute_compare, "ATTRIBUTE_COMPARE", AttributeCompare, "Attribute Compare", "")
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc
new file mode 100644
index 00000000000..d3c7e86b708
--- /dev/null
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc
@@ -0,0 +1,130 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "node_geometry_util.hh"
+
+#include "BLI_rand.hh"
+
+#include "DNA_mesh_types.h"
+#include "DNA_pointcloud_types.h"
+
+static bNodeSocketTemplate geo_node_attribute_fill_in[] = {
+ {SOCK_GEOMETRY, N_("Geometry")},
+ {SOCK_STRING, N_("Attribute")},
+ {SOCK_VECTOR, N_("Value"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX},
+ {SOCK_FLOAT, N_("Value"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX},
+ {SOCK_RGBA, N_("Value"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX},
+ {-1, ""},
+};
+
+static bNodeSocketTemplate geo_node_attribute_fill_out[] = {
+ {SOCK_GEOMETRY, N_("Geometry")},
+ {-1, ""},
+};
+
+static void geo_node_attribute_fill_init(bNodeTree *UNUSED(tree), bNode *node)
+{
+ node->custom1 = CD_PROP_FLOAT;
+}
+
+static void geo_node_attribute_fill_update(bNodeTree *UNUSED(ntree), bNode *node)
+{
+ bNodeSocket *socket_value_vector = (bNodeSocket *)BLI_findlink(&node->inputs, 2);
+ bNodeSocket *socket_value_float = socket_value_vector->next;
+ bNodeSocket *socket_value_color4f = socket_value_float->next;
+
+ const CustomDataType data_type = static_cast<CustomDataType>(node->custom1);
+
+ nodeSetSocketAvailability(socket_value_vector, data_type == CD_PROP_FLOAT3);
+ nodeSetSocketAvailability(socket_value_float, data_type == CD_PROP_FLOAT);
+ nodeSetSocketAvailability(socket_value_color4f, data_type == CD_PROP_COLOR);
+}
+
+namespace blender::nodes {
+
+static void fill_attribute(GeometryComponent &component, const GeoNodeExecParams &params)
+{
+ const bNode &node = params.node();
+ const CustomDataType data_type = static_cast<CustomDataType>(node.custom1);
+ const AttributeDomain domain = static_cast<AttributeDomain>(node.custom2);
+ const std::string attribute_name = params.get_input<std::string>("Attribute");
+ if (attribute_name.empty()) {
+ return;
+ }
+
+ WriteAttributePtr attribute = component.attribute_try_ensure_for_write(
+ attribute_name, domain, data_type);
+ if (!attribute) {
+ return;
+ }
+
+ switch (data_type) {
+ case CD_PROP_FLOAT: {
+ FloatWriteAttribute float_attribute = std::move(attribute);
+ const float value = params.get_input<float>("Value_001");
+ MutableSpan<float> attribute_span = float_attribute.get_span();
+ attribute_span.fill(value);
+ float_attribute.apply_span();
+ break;
+ }
+ case CD_PROP_FLOAT3: {
+ Float3WriteAttribute float3_attribute = std::move(attribute);
+ const float3 value = params.get_input<float3>("Value");
+ MutableSpan<float3> attribute_span = float3_attribute.get_span();
+ attribute_span.fill(value);
+ float3_attribute.apply_span();
+ break;
+ }
+ case CD_PROP_COLOR: {
+ Color4fWriteAttribute color4f_attribute = std::move(attribute);
+ const Color4f value = params.get_input<Color4f>("Value_002");
+ MutableSpan<Color4f> attribute_span = color4f_attribute.get_span();
+ attribute_span.fill(value);
+ color4f_attribute.apply_span();
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+static void geo_node_attribute_fill_exec(GeoNodeExecParams params)
+{
+ GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
+
+ if (geometry_set.has<MeshComponent>()) {
+ fill_attribute(geometry_set.get_component_for_write<MeshComponent>(), params);
+ }
+ if (geometry_set.has<PointCloudComponent>()) {
+ fill_attribute(geometry_set.get_component_for_write<PointCloudComponent>(), params);
+ }
+
+ params.set_output("Geometry", geometry_set);
+}
+
+} // namespace blender::nodes
+
+void register_node_type_geo_attribute_fill()
+{
+ static bNodeType ntype;
+
+ geo_node_type_base(&ntype, GEO_NODE_ATTRIBUTE_FILL, "Attribute Fill", NODE_CLASS_ATTRIBUTE, 0);
+ node_type_socket_templates(&ntype, geo_node_attribute_fill_in, geo_node_attribute_fill_out);
+ node_type_init(&ntype, geo_node_attribute_fill_init);
+ node_type_update(&ntype, geo_node_attribute_fill_update);
+ ntype.geometry_node_execute = blender::nodes::geo_node_attribute_fill_exec;
+ nodeRegisterType(&ntype);
+}
diff --git a/source/blender/python/intern/bpy.c b/source/blender/python/intern/bpy.c
index 804a28d0ebc..6462f8320d7 100644
--- a/source/blender/python/intern/bpy.c
+++ b/source/blender/python/intern/bpy.c
@@ -260,25 +260,19 @@ PyDoc_STRVAR(bpy_escape_identifier_doc,
" :rtype: string\n");
static PyObject *bpy_escape_identifier(PyObject *UNUSED(self), PyObject *value)
{
- const char *value_str;
Py_ssize_t value_str_len;
-
- char *value_escape_str;
- Py_ssize_t value_escape_str_len;
- PyObject *value_escape;
- size_t size;
-
- value_str = _PyUnicode_AsStringAndSize(value, &value_str_len);
+ const char *value_str = _PyUnicode_AsStringAndSize(value, &value_str_len);
if (value_str == NULL) {
PyErr_SetString(PyExc_TypeError, "expected a string");
return NULL;
}
- size = (value_str_len * 2) + 1;
- value_escape_str = PyMem_MALLOC(size);
- value_escape_str_len = BLI_strescape(value_escape_str, value_str, size);
+ const size_t size = (value_str_len * 2) + 1;
+ char *value_escape_str = PyMem_MALLOC(size);
+ const Py_ssize_t value_escape_str_len = BLI_str_escape(value_escape_str, value_str, size);
+ PyObject *value_escape;
if (value_escape_str_len == value_str_len) {
Py_INCREF(value);
value_escape = value;
@@ -292,6 +286,44 @@ static PyObject *bpy_escape_identifier(PyObject *UNUSED(self), PyObject *value)
return value_escape;
}
+PyDoc_STRVAR(bpy_unescape_identifier_doc,
+ ".. function:: unescape_identifier(string)\n"
+ "\n"
+ " Simple string un-escape function used for animation paths.\n"
+ " This performs the reverse of `escape_identifier`.\n"
+ "\n"
+ " :arg string: text\n"
+ " :type string: string\n"
+ " :return: The un-escaped string.\n"
+ " :rtype: string\n");
+static PyObject *bpy_unescape_identifier(PyObject *UNUSED(self), PyObject *value)
+{
+ Py_ssize_t value_str_len;
+ const char *value_str = _PyUnicode_AsStringAndSize(value, &value_str_len);
+
+ if (value_str == NULL) {
+ PyErr_SetString(PyExc_TypeError, "expected a string");
+ return NULL;
+ }
+
+ const size_t size = value_str_len + 1;
+ char *value_unescape_str = PyMem_MALLOC(size);
+ const Py_ssize_t value_unescape_str_len = BLI_str_unescape(value_unescape_str, value_str, size);
+
+ PyObject *value_unescape;
+ if (value_unescape_str_len == value_str_len) {
+ Py_INCREF(value);
+ value_unescape = value;
+ }
+ else {
+ value_unescape = PyUnicode_FromStringAndSize(value_unescape_str, value_unescape_str_len);
+ }
+
+ PyMem_FREE(value_unescape_str);
+
+ return value_unescape;
+}
+
static PyMethodDef meth_bpy_script_paths = {
"script_paths",
(PyCFunction)bpy_script_paths,
@@ -328,6 +360,12 @@ static PyMethodDef meth_bpy_escape_identifier = {
METH_O,
bpy_escape_identifier_doc,
};
+static PyMethodDef meth_bpy_unescape_identifier = {
+ "unescape_identifier",
+ (PyCFunction)bpy_unescape_identifier,
+ METH_O,
+ bpy_unescape_identifier_doc,
+};
static PyObject *bpy_import_test(const char *modname)
{
@@ -429,6 +467,9 @@ void BPy_init_modules(struct bContext *C)
PyModule_AddObject(mod,
meth_bpy_escape_identifier.ml_name,
(PyObject *)PyCFunction_New(&meth_bpy_escape_identifier, NULL));
+ PyModule_AddObject(mod,
+ meth_bpy_unescape_identifier.ml_name,
+ (PyObject *)PyCFunction_New(&meth_bpy_unescape_identifier, NULL));
/* register funcs (bpy_rna.c) */
PyModule_AddObject(mod,
diff --git a/source/blender/sequencer/intern/sequencer.c b/source/blender/sequencer/intern/sequencer.c
index 0ebf8f3c8e7..c998886626c 100644
--- a/source/blender/sequencer/intern/sequencer.c
+++ b/source/blender/sequencer/intern/sequencer.c
@@ -505,7 +505,7 @@ static size_t sequencer_rna_path_prefix(char str[SEQ_RNAPATH_MAXSTR], const char
{
char name_esc[SEQ_NAME_MAXSTR * 2];
- BLI_strescape(name_esc, name, sizeof(name_esc));
+ BLI_str_escape(name_esc, name, sizeof(name_esc));
return BLI_snprintf_rlen(
str, SEQ_RNAPATH_MAXSTR, "sequence_editor.sequences_all[\"%s\"]", name_esc);
}
diff --git a/tests/python/bl_blendfile_io.py b/tests/python/bl_blendfile_io.py
index 49814ea5902..2c27b60f34e 100644
--- a/tests/python/bl_blendfile_io.py
+++ b/tests/python/bl_blendfile_io.py
@@ -20,7 +20,9 @@ class TestBlendFileSaveLoadBasic(TestHelper):
output_dir = self.args.output_dir
self.ensure_path(output_dir)
- output_path = os.path.join(output_dir, "blendfile.blend")
+
+ # Take care to keep the name unique so multiple test jobs can run at once.
+ output_path = os.path.join(output_dir, "blendfile_io.blend")
orig_data = self.blender_data_to_tuple(bpy.data, "orig_data 1")
diff --git a/tests/python/bl_blendfile_liblink.py b/tests/python/bl_blendfile_liblink.py
index b48deb7bd7b..fc618314216 100644
--- a/tests/python/bl_blendfile_liblink.py
+++ b/tests/python/bl_blendfile_liblink.py
@@ -21,6 +21,7 @@ class TestBlendLibLinkSaveLoadBasic(TestHelper):
output_dir = self.args.output_dir
self.ensure_path(output_dir)
+ # Take care to keep the name unique so multiple test jobs can run at once.
output_path = os.path.join(output_dir, "blendlib.blend")
bpy.ops.wm.save_as_mainfile(filepath=output_path, check_existing=False, compress=False)