Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/curve/editcurve.c
| Context not available. | |||||
| static int curve_delete_exec(bContext *C, wmOperator *op) | static int curve_delete_exec(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| Object *obedit = CTX_data_edit_object(C); | |||||
| Curve *cu = (Curve *)obedit->data; | |||||
| eCurveElem_Types type = RNA_enum_get(op->ptr, "type"); | eCurveElem_Types type = RNA_enum_get(op->ptr, "type"); | ||||
| int retval = OPERATOR_CANCELLED; | int retval = OPERATOR_CANCELLED; | ||||
| if (type == CURVE_VERTEX) retval = curve_delete_vertices(obedit); | ViewLayer *view_layer = CTX_data_view_layer(C); | ||||
| else if (type == CURVE_SEGMENT) retval = curve_delete_segments(obedit, false); | uint objects_len = 0; | ||||
| else BLI_assert(0); | Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len); | ||||
| for (uint ob_index = 0; ob_index < objects_len; ob_index++) | |||||
| { | |||||
| Object *obedit = objects[ob_index]; | |||||
| Curve *cu = (Curve *)obedit->data; | |||||
| if (retval == OPERATOR_FINISHED) { | if (type == CURVE_VERTEX) retval = curve_delete_vertices(obedit); | ||||
| cu->actnu = cu->actvert = CU_ACT_NONE; | else if (type == CURVE_SEGMENT) retval = curve_delete_segments(obedit, false); | ||||
| else BLI_assert(0); | |||||
| if (ED_curve_updateAnimPaths(obedit->data)) WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit); | if (retval == OPERATOR_FINISHED) { | ||||
| cu->actnu = cu->actvert = CU_ACT_NONE; | |||||
| WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data); | if (ED_curve_updateAnimPaths(obedit->data)) WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit); | ||||
| DEG_id_tag_update(obedit->data, 0); | |||||
| return retval; | WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data); | ||||
| DEG_id_tag_update(obedit->data, 0); | |||||
| } | |||||
| } | } | ||||
| MEM_freeN(objects); | |||||
| return retval; | return OPERATOR_FINISHED; | ||||
| } | } | ||||
| static const EnumPropertyItem curve_delete_type_items[] = { | static const EnumPropertyItem curve_delete_type_items[] = { | ||||
| Context not available. | |||||
| static int curve_dissolve_exec(bContext *C, wmOperator *UNUSED(op)) | static int curve_dissolve_exec(bContext *C, wmOperator *UNUSED(op)) | ||||
| { | { | ||||
| Object *obedit = CTX_data_edit_object(C); | ViewLayer *view_layer = CTX_data_view_layer(C); | ||||
| Curve *cu = (Curve *)obedit->data; | uint objects_len = 0; | ||||
| Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len); | |||||
| for (uint ob_index = 0; ob_index < objects_len; ob_index++) | |||||
| { | { | ||||
| ListBase *editnurb = object_editcurve_get(obedit); | Object *obedit = objects[ob_index]; | ||||
| Nurb *nu; | Curve *cu = (Curve *)obedit->data; | ||||
| { | |||||
| ListBase *editnurb = object_editcurve_get(obedit); | |||||
| Nurb *nu; | |||||
| for (nu = editnurb->first; nu; nu = nu->next) { | |||||
| if ((nu->type == CU_BEZIER) && (nu->pntsu > 2)) { | |||||
| unsigned int span_step[2] = {nu->pntsu, nu->pntsu}; | |||||
| unsigned int span_len; | |||||
| while (BLI_array_iter_span( | |||||
| nu->bezt, nu->pntsu, | |||||
| (nu->flagu & CU_NURB_CYCLIC) != 0, false, | |||||
| test_bezt_is_sel_any, cu, | |||||
| span_step, &span_len)) | |||||
| { | |||||
| BezTriple *bezt_prev = &nu->bezt[mod_i(span_step[0] - 1, nu->pntsu)]; | |||||
| BezTriple *bezt_next = &nu->bezt[mod_i(span_step[1] + 1, nu->pntsu)]; | |||||
| int i_span_edge_len = span_len + 1; | |||||
| const unsigned int dims = 3; | |||||
| const unsigned int points_len = ((cu->resolu - 1) * i_span_edge_len) + 1; | |||||
| float *points = MEM_mallocN(points_len * dims * sizeof(float), __func__); | |||||
| float *points_stride = points; | |||||
| const int points_stride_len = (cu->resolu - 1); | |||||
| for (int segment = 0; segment < i_span_edge_len; segment++) { | |||||
| BezTriple *bezt_a = &nu->bezt[mod_i((span_step[0] + segment) - 1, nu->pntsu)]; | |||||
| BezTriple *bezt_b = &nu->bezt[mod_i((span_step[0] + segment), nu->pntsu)]; | |||||
| for (int axis = 0; axis < dims; axis++) { | |||||
| BKE_curve_forward_diff_bezier( | |||||
| bezt_a->vec[1][axis], bezt_a->vec[2][axis], | |||||
| bezt_b->vec[0][axis], bezt_b->vec[1][axis], | |||||
| points_stride + axis, points_stride_len, dims * sizeof(float)); | |||||
| } | |||||
| for (nu = editnurb->first; nu; nu = nu->next) { | points_stride += dims * points_stride_len; | ||||
| if ((nu->type == CU_BEZIER) && (nu->pntsu > 2)) { | |||||
| unsigned int span_step[2] = {nu->pntsu, nu->pntsu}; | |||||
| unsigned int span_len; | |||||
| while (BLI_array_iter_span( | |||||
| nu->bezt, nu->pntsu, | |||||
| (nu->flagu & CU_NURB_CYCLIC) != 0, false, | |||||
| test_bezt_is_sel_any, cu, | |||||
| span_step, &span_len)) | |||||
| { | |||||
| BezTriple *bezt_prev = &nu->bezt[mod_i(span_step[0] - 1, nu->pntsu)]; | |||||
| BezTriple *bezt_next = &nu->bezt[mod_i(span_step[1] + 1, nu->pntsu)]; | |||||
| int i_span_edge_len = span_len + 1; | |||||
| const unsigned int dims = 3; | |||||
| const unsigned int points_len = ((cu->resolu - 1) * i_span_edge_len) + 1; | |||||
| float *points = MEM_mallocN(points_len * dims * sizeof(float), __func__); | |||||
| float *points_stride = points; | |||||
| const int points_stride_len = (cu->resolu - 1); | |||||
| for (int segment = 0; segment < i_span_edge_len; segment++) { | |||||
| BezTriple *bezt_a = &nu->bezt[mod_i((span_step[0] + segment) - 1, nu->pntsu)]; | |||||
| BezTriple *bezt_b = &nu->bezt[mod_i((span_step[0] + segment), nu->pntsu)]; | |||||
| for (int axis = 0; axis < dims; axis++) { | |||||
| BKE_curve_forward_diff_bezier( | |||||
| bezt_a->vec[1][axis], bezt_a->vec[2][axis], | |||||
| bezt_b->vec[0][axis], bezt_b->vec[1][axis], | |||||
| points_stride + axis, points_stride_len, dims * sizeof(float)); | |||||
| } | } | ||||
| points_stride += dims * points_stride_len; | BLI_assert(points_stride + dims == points + (points_len * dims)); | ||||
| } | |||||
| BLI_assert(points_stride + dims == points + (points_len * dims)); | float tan_l[3], tan_r[3], error_sq_dummy; | ||||
| unsigned int error_index_dummy; | |||||
| float tan_l[3], tan_r[3], error_sq_dummy; | sub_v3_v3v3(tan_l, bezt_prev->vec[1], bezt_prev->vec[2]); | ||||
| unsigned int error_index_dummy; | normalize_v3(tan_l); | ||||
| sub_v3_v3v3(tan_r, bezt_next->vec[0], bezt_next->vec[1]); | |||||
| normalize_v3(tan_r); | |||||
| sub_v3_v3v3(tan_l, bezt_prev->vec[1], bezt_prev->vec[2]); | curve_fit_cubic_to_points_single_fl( | ||||
| normalize_v3(tan_l); | points, points_len, NULL, dims, FLT_EPSILON, | ||||
| sub_v3_v3v3(tan_r, bezt_next->vec[0], bezt_next->vec[1]); | tan_l, tan_r, | ||||
| normalize_v3(tan_r); | bezt_prev->vec[2], bezt_next->vec[0], | ||||
| &error_sq_dummy, &error_index_dummy); | |||||
| curve_fit_cubic_to_points_single_fl( | if (!ELEM(bezt_prev->h2, HD_FREE, HD_ALIGN)) { | ||||
| points, points_len, NULL, dims, FLT_EPSILON, | bezt_prev->h2 = (bezt_prev->h2 == HD_VECT) ? HD_FREE : HD_ALIGN; | ||||
| tan_l, tan_r, | } | ||||
| bezt_prev->vec[2], bezt_next->vec[0], | if (!ELEM(bezt_next->h1, HD_FREE, HD_ALIGN)) { | ||||
| &error_sq_dummy, &error_index_dummy); | bezt_next->h1 = (bezt_next->h1 == HD_VECT) ? HD_FREE : HD_ALIGN; | ||||
| } | |||||
| if (!ELEM(bezt_prev->h2, HD_FREE, HD_ALIGN)) { | MEM_freeN(points); | ||||
| bezt_prev->h2 = (bezt_prev->h2 == HD_VECT) ? HD_FREE : HD_ALIGN; | |||||
| } | } | ||||
| if (!ELEM(bezt_next->h1, HD_FREE, HD_ALIGN)) { | |||||
| bezt_next->h1 = (bezt_next->h1 == HD_VECT) ? HD_FREE : HD_ALIGN; | |||||
| } | |||||
| MEM_freeN(points); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | |||||
| ed_curve_delete_selected(obedit); | ed_curve_delete_selected(obedit); | ||||
| { | { | ||||
| cu->actnu = cu->actvert = CU_ACT_NONE; | cu->actnu = cu->actvert = CU_ACT_NONE; | ||||
| if (ED_curve_updateAnimPaths(obedit->data)) WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit); | if (ED_curve_updateAnimPaths(obedit->data)) WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, obedit); | ||||
| WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data); | WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data); | ||||
| DEG_id_tag_update(obedit->data, 0); | DEG_id_tag_update(obedit->data, 0); | ||||
| } | |||||
| } | } | ||||
| MEM_freeN(objects); | |||||
| return OPERATOR_FINISHED; | return OPERATOR_FINISHED; | ||||
| } | } | ||||
| Context not available. | |||||