Fix #110429: Scale radii in Instances on realization #110431

Open
Iliya Katushenock wants to merge 3 commits from mod_moder/blender:tmp_fix_inst_size_rad into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
1 changed files with 21 additions and 1 deletions

View File

@ -311,6 +311,18 @@ static void threaded_fill(const GPointer value, GMutableSpan dst)
});
}
static void apply_scale_radii(const float scale, MutableSpan<float> radii)
{
if (scale == 1.0f) {
return;
}
threading::parallel_for(radii.index_range(), 2048, [&](const IndexRange range) {
for (float &radius : radii.slice(range)) {
radius *= scale;
}
});
}
static void copy_generic_attributes_to_result(
const Span<std::optional<GVArraySpan>> src_attributes,
const AttributeFallbacksArray &attribute_fallbacks,
@ -749,7 +761,11 @@ static void execute_realize_pointcloud_task(
options, pointcloud_info.stored_ids, task.id, all_dst_ids.slice(point_slice));
}
if (!all_dst_radii.is_empty()) {
pointcloud_info.radii.materialize(all_dst_radii.slice(point_slice));
MutableSpan<float> point_radii = all_dst_radii.slice(point_slice);
pointcloud_info.radii.materialize(point_radii);
const float3 scale = math::to_scale(task.transform);
const float scale_mean = (scale.x + scale.y + scale.z) / 3.0f;
apply_scale_radii(scale_mean, point_radii);
}
copy_generic_attributes_to_result(
@ -1338,6 +1354,10 @@ static void execute_realize_curve_task(const RealizeInstancesOptions &options,
};
if (all_curves_info.create_radius_attribute) {
copy_point_span_with_default(curves_info.radius, all_radii, 1.0f);
const float3 scale = math::to_scale(task.transform);
const float scale_mean = (scale.x + scale.y + scale.z) / 3.0f;
apply_scale_radii(scale_mean, all_radii.slice(dst_point_range));
}
if (all_curves_info.create_nurbs_weight_attribute) {
copy_point_span_with_default(curves_info.nurbs_weight, all_nurbs_weights, 1.0f);