Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/curve/editcurve.c
| Show First 20 Lines • Show All 2,874 Lines • ▼ Show 20 Lines | void CURVE_OT_smooth_tilt(wmOperatorType *ot) | ||||
| /* flags */ | /* flags */ | ||||
| ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; | ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; | ||||
| } | } | ||||
| /********************** hide operator *********************/ | /********************** hide operator *********************/ | ||||
| static int hide_exec(bContext *C, wmOperator *op) | static int hide_exec(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| Object *obedit = CTX_data_edit_object(C); | const bool invert = RNA_boolean_get(op->ptr, "unselected"); | ||||
| ViewLayer *view_layer = CTX_data_view_layer(C); | |||||
| View3D *v3d = CTX_wm_view3d(C); | View3D *v3d = CTX_wm_view3d(C); | ||||
| uint objects_len = 0; | |||||
| Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len); | |||||
| bool changed_multi = false; | |||||
| for (uint ob_index = 0; ob_index < objects_len; ob_index++) { | |||||
| Object *obedit = objects[ob_index]; | |||||
| ListBase *editnurb = object_editcurve_get(obedit); | ListBase *editnurb = object_editcurve_get(obedit); | ||||
| Nurb *nu; | Nurb *nu; | ||||
| BPoint *bp; | BPoint *bp; | ||||
| BezTriple *bezt; | BezTriple *bezt; | ||||
| int a, sel; | int a, sel; | ||||
| const bool invert = RNA_boolean_get(op->ptr, "unselected"); | bool changed = false; | ||||
zazizizou: I don't think it's necessary to skip the loop if there are no selected control points, since we… | |||||
| for (nu = editnurb->first; nu; nu = nu->next) { | for (nu = editnurb->first; nu; nu = nu->next) { | ||||
| if (nu->type == CU_BEZIER) { | if (nu->type == CU_BEZIER) { | ||||
| bezt = nu->bezt; | bezt = nu->bezt; | ||||
| a = nu->pntsu; | a = nu->pntsu; | ||||
| sel = 0; | sel = 0; | ||||
| while (a--) { | while (a--) { | ||||
| if (invert == 0 && BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt)) { | if (invert == 0 && BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt)) { | ||||
| select_beztriple(bezt, DESELECT, SELECT, HIDDEN); | select_beztriple(bezt, DESELECT, SELECT, HIDDEN); | ||||
| bezt->hide = 1; | bezt->hide = 1; | ||||
| changed = true; | |||||
| } | } | ||||
| else if (invert && !BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt)) { | else if (invert && !BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt)) { | ||||
| select_beztriple(bezt, DESELECT, SELECT, HIDDEN); | select_beztriple(bezt, DESELECT, SELECT, HIDDEN); | ||||
| bezt->hide = 1; | bezt->hide = 1; | ||||
| changed = true; | |||||
| } | } | ||||
| if (bezt->hide) sel++; | if (bezt->hide) sel++; | ||||
| bezt++; | bezt++; | ||||
| } | } | ||||
| if (sel == nu->pntsu) nu->hide = 1; | if (sel == nu->pntsu) { | ||||
| nu->hide = 1; | |||||
| changed = true; | |||||
| } | |||||
| } | } | ||||
| else { | else { | ||||
| bp = nu->bp; | bp = nu->bp; | ||||
| a = nu->pntsu * nu->pntsv; | a = nu->pntsu * nu->pntsv; | ||||
| sel = 0; | sel = 0; | ||||
| while (a--) { | while (a--) { | ||||
| if (invert == 0 && (bp->f1 & SELECT)) { | if (invert == 0 && (bp->f1 & SELECT)) { | ||||
| select_bpoint(bp, DESELECT, SELECT, HIDDEN); | select_bpoint(bp, DESELECT, SELECT, HIDDEN); | ||||
| bp->hide = 1; | bp->hide = 1; | ||||
| changed = true; | |||||
| } | } | ||||
| else if (invert && (bp->f1 & SELECT) == 0) { | else if (invert && (bp->f1 & SELECT) == 0) { | ||||
| select_bpoint(bp, DESELECT, SELECT, HIDDEN); | select_bpoint(bp, DESELECT, SELECT, HIDDEN); | ||||
| bp->hide = 1; | bp->hide = 1; | ||||
| changed = true; | |||||
| } | } | ||||
| if (bp->hide) sel++; | if (bp->hide) sel++; | ||||
| bp++; | bp++; | ||||
| } | } | ||||
| if (sel == nu->pntsu * nu->pntsv) nu->hide = 1; | if (sel == nu->pntsu * nu->pntsv) { | ||||
| nu->hide = 1; | |||||
| changed = true; | |||||
| } | } | ||||
| } | } | ||||
| } | |||||
| if (changed) { | |||||
| changed_multi = true; | |||||
| DEG_id_tag_update(obedit->data, DEG_TAG_COPY_ON_WRITE | DEG_TAG_SELECT_UPDATE); | DEG_id_tag_update(obedit->data, DEG_TAG_COPY_ON_WRITE | DEG_TAG_SELECT_UPDATE); | ||||
| WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data); | WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data); | ||||
| BKE_curve_nurb_vert_active_validate(obedit->data); | BKE_curve_nurb_vert_active_validate(obedit->data); | ||||
| } | |||||
| } | |||||
| return OPERATOR_FINISHED; | return changed_multi ? OPERATOR_FINISHED: OPERATOR_CANCELLED; | ||||
| } | } | ||||
| void CURVE_OT_hide(wmOperatorType *ot) | void CURVE_OT_hide(wmOperatorType *ot) | ||||
| { | { | ||||
| /* identifiers */ | /* identifiers */ | ||||
| ot->name = "Hide Selected"; | ot->name = "Hide Selected"; | ||||
| ot->idname = "CURVE_OT_hide"; | ot->idname = "CURVE_OT_hide"; | ||||
| ot->description = "Hide (un)selected control points"; | ot->description = "Hide (un)selected control points"; | ||||
| ▲ Show 20 Lines • Show All 3,525 Lines • Show Last 20 Lines | |||||
I don't think it's necessary to skip the loop if there are no selected control points, since we iterate over all the points to check for selection anyway.