Fix T98101: Handle single point curves in delete brush
The 3D brush utility and the delete brush only considered segments, so they did not handle single points. Fix by adding special cases for single point curves. Differential Revision: https://developer.blender.org/D14944
This commit is contained in:
parent
8f3847aef3
commit
f4a01c8a8b
Notes:
blender-bot
2023-02-14 04:24:05 +01:00
Referenced by issue #98101, New Hair: cannot delete hair curves with the Delete Brush when curves have single control points
|
@ -95,6 +95,26 @@ static std::optional<float3> find_curves_brush_position(const CurvesGeometry &cu
|
|||
for (const int curve_i : curves_range) {
|
||||
const IndexRange points = curves.points_for_curve(curve_i);
|
||||
|
||||
if (points.size() == 1) {
|
||||
const float3 &pos_cu = positions[points.first()];
|
||||
|
||||
const float depth_sq_cu = math::distance_squared(ray_start_cu, pos_cu);
|
||||
if (depth_sq_cu > max_depth_sq_cu) {
|
||||
continue;
|
||||
}
|
||||
|
||||
float2 pos_re;
|
||||
ED_view3d_project_float_v2_m4(®ion, pos_cu, pos_re, projection.values);
|
||||
|
||||
BrushPositionCandidate candidate;
|
||||
candidate.position_cu = pos_cu;
|
||||
candidate.depth_sq_cu = depth_sq_cu;
|
||||
candidate.distance_sq_re = math::distance_squared(brush_pos_re, pos_re);
|
||||
|
||||
update_if_better(best_candidate, candidate);
|
||||
continue;
|
||||
}
|
||||
|
||||
for (const int segment_i : points.drop_back(1)) {
|
||||
const float3 &p1_cu = positions[segment_i];
|
||||
const float3 &p2_cu = positions[segment_i + 1];
|
||||
|
|
|
@ -163,6 +163,17 @@ struct DeleteOperationExecutor {
|
|||
threading::parallel_for(curves_->curves_range(), 512, [&](IndexRange curve_range) {
|
||||
for (const int curve_i : curve_range) {
|
||||
const IndexRange points = curves_->points_for_curve(curve_i);
|
||||
if (points.size() == 1) {
|
||||
const float3 pos_cu = brush_transform_inv * positions_cu[points.first()];
|
||||
float2 pos_re;
|
||||
ED_view3d_project_float_v2_m4(region_, pos_cu, pos_re, projection.values);
|
||||
|
||||
if (math::distance_squared(brush_pos_re_, pos_re) <= brush_radius_sq_re) {
|
||||
curves_to_delete[curve_i] = true;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
for (const int segment_i : points.drop_back(1)) {
|
||||
const float3 pos1_cu = brush_transform_inv * positions_cu[segment_i];
|
||||
const float3 pos2_cu = brush_transform_inv * positions_cu[segment_i + 1];
|
||||
|
@ -213,6 +224,16 @@ struct DeleteOperationExecutor {
|
|||
threading::parallel_for(curves_->curves_range(), 512, [&](IndexRange curve_range) {
|
||||
for (const int curve_i : curve_range) {
|
||||
const IndexRange points = curves_->points_for_curve(curve_i);
|
||||
|
||||
if (points.size() == 1) {
|
||||
const float3 &pos_cu = positions_cu[points.first()];
|
||||
const float distance_sq_cu = math::distance_squared(pos_cu, brush_cu);
|
||||
if (distance_sq_cu < brush_radius_sq_cu) {
|
||||
curves_to_delete[curve_i] = true;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
for (const int segment_i : points.drop_back(1)) {
|
||||
const float3 &pos1_cu = positions_cu[segment_i];
|
||||
const float3 &pos2_cu = positions_cu[segment_i + 1];
|
||||
|
|
Loading…
Reference in New Issue