Curves: Implement Handles for selected points only
When editing a complex curve is very annoying to have all handles at a time. Also, this is a requirement for the current GSoC Edit Grease Pencil using curves. I have seen that this improvement can be used in any other area of blender, so I have decided to publish the option in the overlay panel.. Reviewed By: fclem, #user_interface, billreynish, Severin Differential Revision: https://developer.blender.org/D7754
This commit is contained in:
parent
495a98d623
commit
49f59092e7
Notes:
blender-bot
2023-02-14 10:18:56 +01:00
Referenced by commit65dcf812a5
, Fix T80182: Curve [Edit Mode] : Can't Deselect Control Point with Select Box Referenced by commitbf8b62e874
, Fix curve handle color ID display Referenced by issue #80182, Curve [Edit Mode] : Can't Deselect Control Point with Select Box Referenced by issue #79580, Control Mesh Only Partially Drawn After Filling a Surface From a Cage of Surface Curves
|
@ -6379,7 +6379,7 @@ class VIEW3D_PT_overlay_edit_curve(Panel):
|
|||
col.active = display_all
|
||||
|
||||
row = col.row()
|
||||
row.prop(overlay, "show_curve_handles", text="Handles")
|
||||
row.prop(overlay, "display_handle", text="Handles")
|
||||
|
||||
row = col.row()
|
||||
row.prop(overlay, "show_curve_normals", text="")
|
||||
|
|
|
@ -173,7 +173,8 @@ void BKE_nurbList_handles_recalculate(struct ListBase *editnurb,
|
|||
const char flag);
|
||||
|
||||
void BKE_nurbList_handles_autocalc(ListBase *editnurb, int flag);
|
||||
void BKE_nurbList_flag_set(ListBase *editnurb, short flag);
|
||||
void BKE_nurbList_flag_set(ListBase *editnurb, short flag, bool set);
|
||||
bool BKE_nurbList_flag_set_from_flag(ListBase *editnurb, short from_flag, short flag);
|
||||
|
||||
void BKE_nurb_free(struct Nurb *nu);
|
||||
struct Nurb *BKE_nurb_duplicate(const struct Nurb *nu);
|
||||
|
|
|
@ -4485,7 +4485,7 @@ void BKE_nurbList_handles_recalculate(ListBase *editnurb, const bool calc_length
|
|||
}
|
||||
}
|
||||
|
||||
void BKE_nurbList_flag_set(ListBase *editnurb, short flag)
|
||||
void BKE_nurbList_flag_set(ListBase *editnurb, short flag, bool set)
|
||||
{
|
||||
Nurb *nu;
|
||||
BezTriple *bezt;
|
||||
|
@ -4497,7 +4497,16 @@ void BKE_nurbList_flag_set(ListBase *editnurb, short flag)
|
|||
a = nu->pntsu;
|
||||
bezt = nu->bezt;
|
||||
while (a--) {
|
||||
bezt->f1 = bezt->f2 = bezt->f3 = flag;
|
||||
if (set) {
|
||||
bezt->f1 |= flag;
|
||||
bezt->f2 |= flag;
|
||||
bezt->f3 |= flag;
|
||||
}
|
||||
else {
|
||||
bezt->f1 &= ~flag;
|
||||
bezt->f2 &= ~flag;
|
||||
bezt->f3 &= ~flag;
|
||||
}
|
||||
bezt++;
|
||||
}
|
||||
}
|
||||
|
@ -4505,13 +4514,47 @@ void BKE_nurbList_flag_set(ListBase *editnurb, short flag)
|
|||
a = nu->pntsu * nu->pntsv;
|
||||
bp = nu->bp;
|
||||
while (a--) {
|
||||
bp->f1 = flag;
|
||||
SET_FLAG_FROM_TEST(bp->f1, set, flag);
|
||||
bp++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set \a flag for every point that already has \a from_flag set.
|
||||
*/
|
||||
bool BKE_nurbList_flag_set_from_flag(ListBase *editnurb, short from_flag, short flag)
|
||||
{
|
||||
bool changed = false;
|
||||
|
||||
for (Nurb *nu = editnurb->first; nu; nu = nu->next) {
|
||||
if (nu->type == CU_BEZIER) {
|
||||
for (int i = 0; i < nu->pntsu; i++) {
|
||||
BezTriple *bezt = &nu->bezt[i];
|
||||
int old_f1 = bezt->f1, old_f2 = bezt->f2, old_f3 = bezt->f3;
|
||||
|
||||
SET_FLAG_FROM_TEST(bezt->f1, bezt->f1 & from_flag, flag);
|
||||
SET_FLAG_FROM_TEST(bezt->f2, bezt->f2 & from_flag, flag);
|
||||
SET_FLAG_FROM_TEST(bezt->f3, bezt->f3 & from_flag, flag);
|
||||
|
||||
changed |= (old_f1 != bezt->f1) || (old_f2 != bezt->f2) || (old_f3 != bezt->f3);
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (int i = 0; i < nu->pntsu * nu->pntsv; i++) {
|
||||
BPoint *bp = &nu->bp[i];
|
||||
int old_f1 = bp->f1;
|
||||
|
||||
SET_FLAG_FROM_TEST(bp->f1, bp->f1 & from_flag, flag);
|
||||
changed |= (old_f1 != bp->f1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
void BKE_nurb_direction_switch(Nurb *nu)
|
||||
{
|
||||
BezTriple *bezt1, *bezt2;
|
||||
|
|
|
@ -3040,8 +3040,7 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
|
|||
v3d->overlay.edit_flag |= V3D_OVERLAY_EDIT_FACES | V3D_OVERLAY_EDIT_SEAMS |
|
||||
V3D_OVERLAY_EDIT_SHARP | V3D_OVERLAY_EDIT_FREESTYLE_EDGE |
|
||||
V3D_OVERLAY_EDIT_FREESTYLE_FACE | V3D_OVERLAY_EDIT_EDGES |
|
||||
V3D_OVERLAY_EDIT_CREASES | V3D_OVERLAY_EDIT_BWEIGHTS |
|
||||
V3D_OVERLAY_EDIT_CU_HANDLES | V3D_OVERLAY_EDIT_CU_NORMALS;
|
||||
V3D_OVERLAY_EDIT_CREASES | V3D_OVERLAY_EDIT_BWEIGHTS;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,7 +36,8 @@ void OVERLAY_edit_curve_cache_init(OVERLAY_Data *vedata)
|
|||
GPUShader *sh;
|
||||
DRWState state;
|
||||
|
||||
pd->edit_curve.show_handles = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) != 0;
|
||||
pd->edit_curve.show_handles = v3d->overlay.handle_display != CURVE_HANDLE_NONE;
|
||||
pd->edit_curve.handle_display = v3d->overlay.handle_display;
|
||||
pd->shdata.edit_curve_normal_length = v3d->overlay.normals_length;
|
||||
|
||||
/* Run Twice for in-front passes. */
|
||||
|
@ -62,11 +63,13 @@ void OVERLAY_edit_curve_cache_init(OVERLAY_Data *vedata)
|
|||
pd->edit_curve_handle_grp = grp = DRW_shgroup_create(sh, psl->edit_curve_handle_ps);
|
||||
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
|
||||
DRW_shgroup_uniform_bool_copy(grp, "showCurveHandles", pd->edit_curve.show_handles);
|
||||
DRW_shgroup_uniform_int_copy(grp, "curveHandleDisplay", pd->edit_curve.handle_display);
|
||||
DRW_shgroup_state_enable(grp, DRW_STATE_BLEND_ALPHA);
|
||||
|
||||
sh = OVERLAY_shader_edit_curve_point();
|
||||
pd->edit_curve_points_grp = grp = DRW_shgroup_create(sh, psl->edit_curve_handle_ps);
|
||||
DRW_shgroup_uniform_bool_copy(grp, "showCurveHandles", pd->edit_curve.show_handles);
|
||||
DRW_shgroup_uniform_int_copy(grp, "curveHandleDisplay", pd->edit_curve.handle_display);
|
||||
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -38,7 +38,8 @@ void OVERLAY_edit_text_cache_init(OVERLAY_Data *vedata)
|
|||
GPUShader *sh;
|
||||
DRWState state;
|
||||
|
||||
pd->edit_curve.show_handles = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) != 0;
|
||||
pd->edit_curve.show_handles = v3d->overlay.handle_display != CURVE_HANDLE_NONE;
|
||||
pd->edit_curve.handle_display = v3d->overlay.handle_display;
|
||||
pd->shdata.edit_curve_normal_length = v3d->overlay.normals_length;
|
||||
|
||||
/* Run Twice for in-front passes. */
|
||||
|
|
|
@ -297,6 +297,7 @@ typedef struct OVERLAY_PrivateData {
|
|||
} antialiasing;
|
||||
struct {
|
||||
bool show_handles;
|
||||
int handle_display;
|
||||
} edit_curve;
|
||||
struct {
|
||||
int ghost_ob;
|
||||
|
|
|
@ -4,10 +4,15 @@
|
|||
#define EVEN_U_BIT 1 << 4
|
||||
#define COLOR_SHIFT 5
|
||||
|
||||
/* Keep the same value in `handle_display` in `DNA_view3d_types.h` */
|
||||
#define CURVE_HANDLE_SELECTED 0
|
||||
#define CURVE_HANDLE_ALL 1
|
||||
|
||||
layout(lines) in;
|
||||
layout(triangle_strip, max_vertices = 10) out;
|
||||
|
||||
uniform bool showCurveHandles;
|
||||
uniform int curveHandleDisplay;
|
||||
|
||||
flat in int vertFlag[];
|
||||
|
||||
|
@ -46,6 +51,17 @@ void main()
|
|||
}
|
||||
|
||||
bool edge_selected = (((vertFlag[1] | vertFlag[0]) & VERT_SELECTED) != 0);
|
||||
bool handle_selected = (showCurveHandles &&
|
||||
(((vertFlag[1] | vertFlag[0]) & HANDLE_SELECTED) != 0));
|
||||
|
||||
/* If handle type is only selected and the edge is not selected, don't show. */
|
||||
if ((curveHandleDisplay != CURVE_HANDLE_ALL) && (!handle_selected)) {
|
||||
/* Nurbs must show the handles always. */
|
||||
bool is_u_segment = (((vertFlag[1] ^ vertFlag[0]) & EVEN_U_BIT) != 0);
|
||||
if (!is_u_segment) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
vec4 inner_color;
|
||||
if (color_id == 0) {
|
||||
|
|
|
@ -2,7 +2,11 @@
|
|||
/* Keep the same value of `BEZIER_HANDLE` in `draw_cache_imp_curve.c` */
|
||||
#define BEZIER_HANDLE 1 << 3
|
||||
|
||||
/* Keep the same value in `handle_display` in `DNA_view3d_types.h` */
|
||||
#define CURVE_HANDLE_SELECTED 0
|
||||
|
||||
uniform bool showCurveHandles;
|
||||
uniform int curveHandleDisplay;
|
||||
|
||||
in vec3 pos;
|
||||
in int data;
|
||||
|
@ -32,7 +36,12 @@ void main()
|
|||
world_clip_planes_calc_clip_distance(world_pos);
|
||||
#endif
|
||||
|
||||
if (!showCurveHandles && ((data & BEZIER_HANDLE) != 0)) {
|
||||
bool show_handle = showCurveHandles;
|
||||
if ((curveHandleDisplay == CURVE_HANDLE_SELECTED) && ((data & HANDLE_SELECTED) == 0)) {
|
||||
show_handle = false;
|
||||
}
|
||||
|
||||
if (!show_handle && ((data & BEZIER_HANDLE) != 0)) {
|
||||
/* We set the vertex at the camera origin to generate 0 fragments. */
|
||||
gl_Position = vec4(0.0, 0.0, -3e36, 0.0);
|
||||
}
|
||||
|
|
|
@ -208,6 +208,7 @@ enum {
|
|||
VFLAG_EDGE_SEAM = 1 << 4,
|
||||
VFLAG_EDGE_SHARP = 1 << 5,
|
||||
VFLAG_EDGE_FREESTYLE = 1 << 6,
|
||||
VFLAG_HANDLE_SELECTED = 1 << 7,
|
||||
/* Beware to not go over 1 << 7 (it's a byte flag)
|
||||
* (see gpu_shader_edit_mesh_overlay_geom.glsl) */
|
||||
};
|
||||
|
|
|
@ -685,14 +685,20 @@ static void curve_create_edit_curves_nor(CurveRenderData *rdata, GPUVertBuf *vbo
|
|||
BLI_assert(vbo_len_used == verts_len_capacity);
|
||||
}
|
||||
|
||||
static char beztriple_vflag_get(
|
||||
CurveRenderData *rdata, char flag, char col_id, int v_idx, int nu_id, bool handle_point)
|
||||
static char beztriple_vflag_get(CurveRenderData *rdata,
|
||||
char flag,
|
||||
char col_id,
|
||||
int v_idx,
|
||||
int nu_id,
|
||||
bool handle_point,
|
||||
const bool handle_selected)
|
||||
{
|
||||
char vflag = 0;
|
||||
SET_FLAG_FROM_TEST(vflag, (flag & SELECT), VFLAG_VERT_SELECTED);
|
||||
SET_FLAG_FROM_TEST(vflag, (v_idx == rdata->actvert && nu_id == rdata->actnu), VFLAG_VERT_ACTIVE);
|
||||
SET_FLAG_FROM_TEST(vflag, (nu_id == rdata->actnu), ACTIVE_NURB);
|
||||
SET_FLAG_FROM_TEST(vflag, handle_point, BEZIER_HANDLE);
|
||||
SET_FLAG_FROM_TEST(vflag, handle_selected, VFLAG_HANDLE_SELECTED);
|
||||
/* handle color id */
|
||||
vflag |= col_id << COLOR_SHIFT;
|
||||
return vflag;
|
||||
|
@ -754,11 +760,13 @@ static void curve_create_edit_data_and_handles(CurveRenderData *rdata,
|
|||
for (Nurb *nu = rdata->nurbs->first; nu; nu = nu->next, nu_id++) {
|
||||
const BezTriple *bezt = nu->bezt;
|
||||
const BPoint *bp = nu->bp;
|
||||
|
||||
if (bezt) {
|
||||
for (int a = 0; a < nu->pntsu; a++, bezt++) {
|
||||
if (bezt->hide == true) {
|
||||
continue;
|
||||
}
|
||||
const bool handle_selected = BEZT_ISSEL_ANY(bezt);
|
||||
|
||||
if (elbp_verts) {
|
||||
GPU_indexbuf_add_point_vert(elbp_verts, vbo_len_used + 0);
|
||||
|
@ -771,9 +779,9 @@ static void curve_create_edit_data_and_handles(CurveRenderData *rdata,
|
|||
}
|
||||
if (vbo_data) {
|
||||
const char vflag[3] = {
|
||||
beztriple_vflag_get(rdata, bezt->f1, bezt->h1, a, nu_id, true),
|
||||
beztriple_vflag_get(rdata, bezt->f2, bezt->h1, a, nu_id, false),
|
||||
beztriple_vflag_get(rdata, bezt->f3, bezt->h2, a, nu_id, true),
|
||||
beztriple_vflag_get(rdata, bezt->f1, bezt->h1, a, nu_id, true, handle_selected),
|
||||
beztriple_vflag_get(rdata, bezt->f2, bezt->h1, a, nu_id, false, handle_selected),
|
||||
beztriple_vflag_get(rdata, bezt->f3, bezt->h2, a, nu_id, true, handle_selected),
|
||||
};
|
||||
for (int j = 0; j < 3; j++) {
|
||||
GPU_vertbuf_attr_set(vbo_data, attr_id.data, vbo_len_used + j, &vflag[j]);
|
||||
|
|
|
@ -140,3 +140,4 @@ layout(std140) uniform globalsBlock
|
|||
#define EDGE_SEAM (1 << 4)
|
||||
#define EDGE_SHARP (1 << 5)
|
||||
#define EDGE_FREESTYLE (1 << 6)
|
||||
#define HANDLE_SELECTED (1 << 7)
|
||||
|
|
|
@ -4923,7 +4923,7 @@ bool ED_curve_editnurb_select_pick(
|
|||
}
|
||||
}
|
||||
else {
|
||||
BKE_nurbList_flag_set(editnurb, 0);
|
||||
BKE_nurbList_flag_set(editnurb, SELECT, false);
|
||||
|
||||
if (bezt) {
|
||||
|
||||
|
|
|
@ -138,7 +138,7 @@ Nurb *ED_curve_add_nurbs_primitive(
|
|||
copy_v3_v3(zvec, rv3d->viewinv[2]);
|
||||
}
|
||||
|
||||
BKE_nurbList_flag_set(editnurb, 0);
|
||||
BKE_nurbList_flag_set(editnurb, SELECT, false);
|
||||
|
||||
/* these types call this function to return a Nurb */
|
||||
if (stype != CU_PRIM_TUBE && stype != CU_PRIM_DONUT) {
|
||||
|
|
|
@ -44,8 +44,13 @@
|
|||
/** \name Cursor Picking API
|
||||
* \{ */
|
||||
|
||||
static void ED_curve_pick_vert__do_closest(
|
||||
void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, const float screen_co[2])
|
||||
static void ED_curve_pick_vert__do_closest(void *userData,
|
||||
Nurb *nu,
|
||||
BPoint *bp,
|
||||
BezTriple *bezt,
|
||||
int beztindex,
|
||||
bool handles_visible,
|
||||
const float screen_co[2])
|
||||
{
|
||||
struct {
|
||||
BPoint *bp;
|
||||
|
@ -64,6 +69,8 @@ static void ED_curve_pick_vert__do_closest(
|
|||
flag = bp->f1;
|
||||
}
|
||||
else {
|
||||
BLI_assert(handles_visible || beztindex == 1);
|
||||
|
||||
if (beztindex == 0) {
|
||||
flag = bezt->f1;
|
||||
}
|
||||
|
|
|
@ -590,8 +590,8 @@ static int de_select_all_exec(bContext *C, wmOperator *op)
|
|||
changed = ED_curve_deselect_all(cu->editnurb);
|
||||
break;
|
||||
case SEL_INVERT:
|
||||
changed = ED_curve_select_swap(
|
||||
cu->editnurb, (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) == 0);
|
||||
changed = ED_curve_select_swap(cu->editnurb,
|
||||
v3d->overlay.handle_display == CURVE_HANDLE_NONE);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -772,7 +772,7 @@ static int select_row_exec(bContext *C, wmOperator *UNUSED(op))
|
|||
|
||||
if (last == bp) {
|
||||
direction = 1 - direction;
|
||||
BKE_nurbList_flag_set(editnurb, 0);
|
||||
BKE_nurbList_flag_set(editnurb, SELECT, false);
|
||||
}
|
||||
last = bp;
|
||||
|
||||
|
@ -826,8 +826,10 @@ static int select_next_exec(bContext *C, wmOperator *UNUSED(op))
|
|||
|
||||
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
|
||||
Object *obedit = objects[ob_index];
|
||||
|
||||
ListBase *editnurb = object_editcurve_get(obedit);
|
||||
select_adjacent_cp(editnurb, 1, 0, SELECT);
|
||||
|
||||
DEG_id_tag_update(obedit->data, ID_RECALC_SELECT);
|
||||
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
|
||||
}
|
||||
|
@ -861,8 +863,10 @@ static int select_previous_exec(bContext *C, wmOperator *UNUSED(op))
|
|||
|
||||
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
|
||||
Object *obedit = objects[ob_index];
|
||||
|
||||
ListBase *editnurb = object_editcurve_get(obedit);
|
||||
select_adjacent_cp(editnurb, -1, 0, SELECT);
|
||||
|
||||
DEG_id_tag_update(obedit->data, ID_RECALC_SELECT);
|
||||
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
|
||||
}
|
||||
|
@ -1392,6 +1396,7 @@ static int select_nth_exec(bContext *C, wmOperator *op)
|
|||
|
||||
if (ed_curve_select_nth(obedit->data, &op_params) == true) {
|
||||
changed = true;
|
||||
|
||||
DEG_id_tag_update(obedit->data, ID_RECALC_SELECT);
|
||||
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
|
||||
}
|
||||
|
|
|
@ -246,6 +246,7 @@ void nurbs_foreachScreenVert(struct ViewContext *vc,
|
|||
struct BPoint *bp,
|
||||
struct BezTriple *bezt,
|
||||
int beztindex,
|
||||
bool handle_visible,
|
||||
const float screen_co[2]),
|
||||
void *userData,
|
||||
const eV3DProjTest clip_flag);
|
||||
|
|
|
@ -406,6 +406,7 @@ void nurbs_foreachScreenVert(ViewContext *vc,
|
|||
BPoint *bp,
|
||||
BezTriple *bezt,
|
||||
int beztindex,
|
||||
bool handles_visible,
|
||||
const float screen_co_b[2]),
|
||||
void *userData,
|
||||
const eV3DProjTest clip_flag)
|
||||
|
@ -414,6 +415,8 @@ void nurbs_foreachScreenVert(ViewContext *vc,
|
|||
Nurb *nu;
|
||||
int i;
|
||||
ListBase *nurbs = BKE_curve_editNurbs_get(cu);
|
||||
/* If no point in the triple is selected, the handles are invisible. */
|
||||
const bool only_selected = (vc->v3d->overlay.handle_display == CURVE_HANDLE_SELECTED);
|
||||
|
||||
ED_view3d_check_mats_rv3d(vc->rv3d);
|
||||
|
||||
|
@ -427,15 +430,17 @@ void nurbs_foreachScreenVert(ViewContext *vc,
|
|||
BezTriple *bezt = &nu->bezt[i];
|
||||
|
||||
if (bezt->hide == 0) {
|
||||
const bool handles_visible = (vc->v3d->overlay.handle_display != CURVE_HANDLE_NONE) &&
|
||||
(!only_selected || BEZT_ISSEL_ANY(bezt));
|
||||
float screen_co[2];
|
||||
|
||||
if ((vc->v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) == 0) {
|
||||
if (!handles_visible) {
|
||||
if (ED_view3d_project_float_object(vc->region,
|
||||
bezt->vec[1],
|
||||
screen_co,
|
||||
V3D_PROJ_RET_CLIP_BB | V3D_PROJ_RET_CLIP_WIN) ==
|
||||
V3D_PROJ_RET_OK) {
|
||||
func(userData, nu, NULL, bezt, 1, screen_co);
|
||||
func(userData, nu, NULL, bezt, 1, false, screen_co);
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@ -444,21 +449,21 @@ void nurbs_foreachScreenVert(ViewContext *vc,
|
|||
screen_co,
|
||||
V3D_PROJ_RET_CLIP_BB | V3D_PROJ_RET_CLIP_WIN) ==
|
||||
V3D_PROJ_RET_OK) {
|
||||
func(userData, nu, NULL, bezt, 0, screen_co);
|
||||
func(userData, nu, NULL, bezt, 0, true, screen_co);
|
||||
}
|
||||
if (ED_view3d_project_float_object(vc->region,
|
||||
bezt->vec[1],
|
||||
screen_co,
|
||||
V3D_PROJ_RET_CLIP_BB | V3D_PROJ_RET_CLIP_WIN) ==
|
||||
V3D_PROJ_RET_OK) {
|
||||
func(userData, nu, NULL, bezt, 1, screen_co);
|
||||
func(userData, nu, NULL, bezt, 1, true, screen_co);
|
||||
}
|
||||
if (ED_view3d_project_float_object(vc->region,
|
||||
bezt->vec[2],
|
||||
screen_co,
|
||||
V3D_PROJ_RET_CLIP_BB | V3D_PROJ_RET_CLIP_WIN) ==
|
||||
V3D_PROJ_RET_OK) {
|
||||
func(userData, nu, NULL, bezt, 2, screen_co);
|
||||
func(userData, nu, NULL, bezt, 2, true, screen_co);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -473,7 +478,7 @@ void nurbs_foreachScreenVert(ViewContext *vc,
|
|||
if (ED_view3d_project_float_object(
|
||||
vc->region, bp->vec, screen_co, V3D_PROJ_RET_CLIP_BB | V3D_PROJ_RET_CLIP_WIN) ==
|
||||
V3D_PROJ_RET_OK) {
|
||||
func(userData, nu, bp, NULL, -1, screen_co);
|
||||
func(userData, nu, bp, NULL, -1, false, screen_co);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -411,6 +411,7 @@ typedef struct LassoSelectUserData {
|
|||
const int (*mcoords)[2];
|
||||
int mcoords_len;
|
||||
eSelectOp sel_op;
|
||||
eBezTriple_Flag select_flag;
|
||||
|
||||
/* runtime */
|
||||
int pass;
|
||||
|
@ -434,6 +435,8 @@ static void view3d_userdata_lassoselect_init(LassoSelectUserData *r_data,
|
|||
r_data->mcoords = mcoords;
|
||||
r_data->mcoords_len = mcoords_len;
|
||||
r_data->sel_op = sel_op;
|
||||
/* SELECT by default, but can be changed if needed (only few cases use and respect this). */
|
||||
r_data->select_flag = SELECT;
|
||||
|
||||
/* runtime */
|
||||
r_data->pass = 0;
|
||||
|
@ -903,6 +906,7 @@ static void do_lasso_select_curve__doSelect(void *userData,
|
|||
BPoint *bp,
|
||||
BezTriple *bezt,
|
||||
int beztindex,
|
||||
bool handles_visible,
|
||||
const float screen_co[2])
|
||||
{
|
||||
LassoSelectUserData *data = userData;
|
||||
|
@ -913,17 +917,17 @@ static void do_lasso_select_curve__doSelect(void *userData,
|
|||
const bool is_select = bp->f1 & SELECT;
|
||||
const int sel_op_result = ED_select_op_action_deselected(data->sel_op, is_select, is_inside);
|
||||
if (sel_op_result != -1) {
|
||||
SET_FLAG_FROM_TEST(bp->f1, sel_op_result, SELECT);
|
||||
SET_FLAG_FROM_TEST(bp->f1, sel_op_result, data->select_flag);
|
||||
data->is_changed = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if ((data->vc->v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) == 0) {
|
||||
/* can only be (beztindex == 0) here since handles are hidden */
|
||||
if (!handles_visible) {
|
||||
/* can only be (beztindex == 1) here since handles are hidden */
|
||||
const bool is_select = bezt->f2 & SELECT;
|
||||
const int sel_op_result = ED_select_op_action_deselected(data->sel_op, is_select, is_inside);
|
||||
if (sel_op_result != -1) {
|
||||
SET_FLAG_FROM_TEST(bezt->f2, sel_op_result, SELECT);
|
||||
SET_FLAG_FROM_TEST(bezt->f2, sel_op_result, data->select_flag);
|
||||
}
|
||||
bezt->f1 = bezt->f3 = bezt->f2;
|
||||
data->is_changed = true;
|
||||
|
@ -933,7 +937,7 @@ static void do_lasso_select_curve__doSelect(void *userData,
|
|||
const bool is_select = *flag_p & SELECT;
|
||||
const int sel_op_result = ED_select_op_action_deselected(data->sel_op, is_select, is_inside);
|
||||
if (sel_op_result != -1) {
|
||||
SET_FLAG_FROM_TEST(*flag_p, sel_op_result, SELECT);
|
||||
SET_FLAG_FROM_TEST(*flag_p, sel_op_result, data->select_flag);
|
||||
data->is_changed = true;
|
||||
}
|
||||
}
|
||||
|
@ -945,6 +949,7 @@ static bool do_lasso_select_curve(ViewContext *vc,
|
|||
const int mcoords_len,
|
||||
const eSelectOp sel_op)
|
||||
{
|
||||
const bool deselect_all = (sel_op == SEL_OP_SET);
|
||||
LassoSelectUserData data;
|
||||
rcti rect;
|
||||
|
||||
|
@ -952,13 +957,23 @@ static bool do_lasso_select_curve(ViewContext *vc,
|
|||
|
||||
view3d_userdata_lassoselect_init(&data, vc, &rect, mcoords, mcoords_len, sel_op);
|
||||
|
||||
if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
|
||||
Curve *curve = (Curve *)vc->obedit->data;
|
||||
data.is_changed |= ED_curve_deselect_all(curve->editnurb);
|
||||
Curve *curve = (Curve *)vc->obedit->data;
|
||||
ListBase *nurbs = BKE_curve_editNurbs_get(curve);
|
||||
|
||||
/* For deselect all, items to be selected are tagged with temp flag. Clear that first. */
|
||||
if (deselect_all) {
|
||||
BKE_nurbList_flag_set(nurbs, BEZT_FLAG_TEMP_TAG, false);
|
||||
data.select_flag = BEZT_FLAG_TEMP_TAG;
|
||||
}
|
||||
|
||||
ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
|
||||
nurbs_foreachScreenVert(vc, do_lasso_select_curve__doSelect, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
|
||||
|
||||
/* Deselect items that were not added to selection (indicated by temp flag). */
|
||||
if (deselect_all) {
|
||||
BKE_nurbList_flag_set_from_flag(nurbs, BEZT_FLAG_TEMP_TAG, SELECT);
|
||||
}
|
||||
|
||||
if (data.is_changed) {
|
||||
BKE_curve_nurb_vert_active_validate(vc->obedit->data);
|
||||
}
|
||||
|
@ -2559,6 +2574,7 @@ typedef struct BoxSelectUserData {
|
|||
const rctf *rect_fl;
|
||||
rctf _rect_fl;
|
||||
eSelectOp sel_op;
|
||||
eBezTriple_Flag select_flag;
|
||||
|
||||
/* runtime */
|
||||
bool is_done;
|
||||
|
@ -2577,6 +2593,8 @@ static void view3d_userdata_boxselect_init(BoxSelectUserData *r_data,
|
|||
BLI_rctf_rcti_copy(&r_data->_rect_fl, rect);
|
||||
|
||||
r_data->sel_op = sel_op;
|
||||
/* SELECT by default, but can be changed if needed (only few cases use and respect this). */
|
||||
r_data->select_flag = SELECT;
|
||||
|
||||
/* runtime */
|
||||
r_data->is_done = false;
|
||||
|
@ -2707,6 +2725,7 @@ static void do_nurbs_box_select__doSelect(void *userData,
|
|||
BPoint *bp,
|
||||
BezTriple *bezt,
|
||||
int beztindex,
|
||||
bool handles_visible,
|
||||
const float screen_co[2])
|
||||
{
|
||||
BoxSelectUserData *data = userData;
|
||||
|
@ -2716,17 +2735,17 @@ static void do_nurbs_box_select__doSelect(void *userData,
|
|||
const bool is_select = bp->f1 & SELECT;
|
||||
const int sel_op_result = ED_select_op_action_deselected(data->sel_op, is_select, is_inside);
|
||||
if (sel_op_result != -1) {
|
||||
SET_FLAG_FROM_TEST(bp->f1, sel_op_result, SELECT);
|
||||
SET_FLAG_FROM_TEST(bp->f1, sel_op_result, data->select_flag);
|
||||
data->is_changed = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if ((data->vc->v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) == 0) {
|
||||
/* can only be (beztindex == 0) here since handles are hidden */
|
||||
if (!handles_visible) {
|
||||
/* can only be (beztindex == 1) here since handles are hidden */
|
||||
const bool is_select = bezt->f2 & SELECT;
|
||||
const int sel_op_result = ED_select_op_action_deselected(data->sel_op, is_select, is_inside);
|
||||
if (sel_op_result != -1) {
|
||||
SET_FLAG_FROM_TEST(bezt->f2, sel_op_result, SELECT);
|
||||
SET_FLAG_FROM_TEST(bezt->f2, sel_op_result, data->select_flag);
|
||||
data->is_changed = true;
|
||||
}
|
||||
bezt->f1 = bezt->f3 = bezt->f2;
|
||||
|
@ -2736,7 +2755,7 @@ static void do_nurbs_box_select__doSelect(void *userData,
|
|||
const bool is_select = *flag_p & SELECT;
|
||||
const int sel_op_result = ED_select_op_action_deselected(data->sel_op, is_select, is_inside);
|
||||
if (sel_op_result != -1) {
|
||||
SET_FLAG_FROM_TEST(*flag_p, sel_op_result, SELECT);
|
||||
SET_FLAG_FROM_TEST(*flag_p, sel_op_result, data->select_flag);
|
||||
data->is_changed = true;
|
||||
}
|
||||
}
|
||||
|
@ -2744,17 +2763,28 @@ static void do_nurbs_box_select__doSelect(void *userData,
|
|||
}
|
||||
static bool do_nurbs_box_select(ViewContext *vc, rcti *rect, const eSelectOp sel_op)
|
||||
{
|
||||
const bool deselect_all = (sel_op == SEL_OP_SET);
|
||||
BoxSelectUserData data;
|
||||
|
||||
view3d_userdata_boxselect_init(&data, vc, rect, sel_op);
|
||||
|
||||
if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
|
||||
Curve *curve = (Curve *)vc->obedit->data;
|
||||
data.is_changed |= ED_curve_deselect_all(curve->editnurb);
|
||||
Curve *curve = (Curve *)vc->obedit->data;
|
||||
ListBase *nurbs = BKE_curve_editNurbs_get(curve);
|
||||
|
||||
/* For deselect all, items to be selected are tagged with temp flag. Clear that first. */
|
||||
if (deselect_all) {
|
||||
BKE_nurbList_flag_set(nurbs, BEZT_FLAG_TEMP_TAG, false);
|
||||
data.select_flag = BEZT_FLAG_TEMP_TAG;
|
||||
}
|
||||
|
||||
ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
|
||||
nurbs_foreachScreenVert(vc, do_nurbs_box_select__doSelect, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
|
||||
|
||||
/* Deselect items that were not added to selection (indicated by temp flag). */
|
||||
if (deselect_all) {
|
||||
BKE_nurbList_flag_set_from_flag(nurbs, BEZT_FLAG_TEMP_TAG, SELECT);
|
||||
}
|
||||
|
||||
BKE_curve_nurb_vert_active_validate(vc->obedit->data);
|
||||
|
||||
return data.is_changed;
|
||||
|
@ -3393,6 +3423,7 @@ typedef struct CircleSelectUserData {
|
|||
float mval_fl[2];
|
||||
float radius;
|
||||
float radius_squared;
|
||||
eBezTriple_Flag select_flag;
|
||||
|
||||
/* runtime */
|
||||
bool is_changed;
|
||||
|
@ -3413,6 +3444,9 @@ static void view3d_userdata_circleselect_init(CircleSelectUserData *r_data,
|
|||
r_data->radius = rad;
|
||||
r_data->radius_squared = rad * rad;
|
||||
|
||||
/* SELECT by default, but can be changed if needed (only few cases use and respect this). */
|
||||
r_data->select_flag = SELECT;
|
||||
|
||||
/* runtime */
|
||||
r_data->is_changed = false;
|
||||
}
|
||||
|
@ -3650,29 +3684,24 @@ static void nurbscurve_circle_doSelect(void *userData,
|
|||
BPoint *bp,
|
||||
BezTriple *bezt,
|
||||
int beztindex,
|
||||
bool UNUSED(handles_visible),
|
||||
const float screen_co[2])
|
||||
{
|
||||
CircleSelectUserData *data = userData;
|
||||
|
||||
if (len_squared_v2v2(data->mval_fl, screen_co) <= data->radius_squared) {
|
||||
if (bp) {
|
||||
bp->f1 = data->select ? (bp->f1 | SELECT) : (bp->f1 & ~SELECT);
|
||||
SET_FLAG_FROM_TEST(bp->f1, data->select, data->select_flag);
|
||||
}
|
||||
else {
|
||||
if ((data->vc->v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) == 0) {
|
||||
/* can only be (beztindex == 0) here since handles are hidden */
|
||||
bezt->f1 = bezt->f2 = bezt->f3 = data->select ? (bezt->f2 | SELECT) : (bezt->f2 & ~SELECT);
|
||||
if (beztindex == 0) {
|
||||
SET_FLAG_FROM_TEST(bezt->f1, data->select, data->select_flag);
|
||||
}
|
||||
else if (beztindex == 1) {
|
||||
SET_FLAG_FROM_TEST(bezt->f2, data->select, data->select_flag);
|
||||
}
|
||||
else {
|
||||
if (beztindex == 0) {
|
||||
bezt->f1 = data->select ? (bezt->f1 | SELECT) : (bezt->f1 & ~SELECT);
|
||||
}
|
||||
else if (beztindex == 1) {
|
||||
bezt->f2 = data->select ? (bezt->f2 | SELECT) : (bezt->f2 & ~SELECT);
|
||||
}
|
||||
else {
|
||||
bezt->f3 = data->select ? (bezt->f3 | SELECT) : (bezt->f3 & ~SELECT);
|
||||
}
|
||||
SET_FLAG_FROM_TEST(bezt->f3, data->select, data->select_flag);
|
||||
}
|
||||
}
|
||||
data->is_changed = true;
|
||||
|
@ -3683,18 +3712,30 @@ static bool nurbscurve_circle_select(ViewContext *vc,
|
|||
const int mval[2],
|
||||
float rad)
|
||||
{
|
||||
const bool select = (sel_op != SEL_OP_SUB);
|
||||
const bool deselect_all = (sel_op == SEL_OP_SET);
|
||||
CircleSelectUserData data;
|
||||
bool changed = false;
|
||||
if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
|
||||
Curve *curve = vc->obedit->data;
|
||||
changed |= ED_curve_deselect_all(curve->editnurb);
|
||||
}
|
||||
const bool select = (sel_op != SEL_OP_SUB);
|
||||
|
||||
view3d_userdata_circleselect_init(&data, vc, select, mval, rad);
|
||||
|
||||
Curve *curve = (Curve *)vc->obedit->data;
|
||||
ListBase *nurbs = BKE_curve_editNurbs_get(curve);
|
||||
|
||||
/* For deselect all, items to be selected are tagged with temp flag. Clear that first. */
|
||||
if (deselect_all) {
|
||||
BKE_nurbList_flag_set(nurbs, BEZT_FLAG_TEMP_TAG, false);
|
||||
data.select_flag = BEZT_FLAG_TEMP_TAG;
|
||||
}
|
||||
|
||||
ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
|
||||
nurbs_foreachScreenVert(vc, nurbscurve_circle_doSelect, &data, V3D_PROJ_TEST_CLIP_DEFAULT);
|
||||
|
||||
/* Deselect items that were not added to selection (indicated by temp flag). */
|
||||
if (deselect_all) {
|
||||
BKE_nurbList_flag_set_from_flag(nurbs, BEZT_FLAG_TEMP_TAG, SELECT);
|
||||
}
|
||||
|
||||
BKE_curve_nurb_vert_active_validate(vc->obedit->data);
|
||||
|
||||
return changed || data.is_changed;
|
||||
|
|
|
@ -93,9 +93,8 @@ void createTransCurveVerts(TransInfo *t)
|
|||
int count = 0, countsel = 0;
|
||||
const bool is_prop_edit = (t->flag & T_PROP_EDIT) != 0;
|
||||
View3D *v3d = t->view;
|
||||
short hide_handles = (v3d != NULL) ?
|
||||
((v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) == 0) :
|
||||
false;
|
||||
short hide_handles = (v3d != NULL) ? (v3d->overlay.handle_display == CURVE_HANDLE_NONE) :
|
||||
false;
|
||||
|
||||
/* count total of vertices, check identical as in 2nd loop for making transdata! */
|
||||
ListBase *nurbs = BKE_curve_editNurbs_get(cu);
|
||||
|
@ -163,9 +162,8 @@ void createTransCurveVerts(TransInfo *t)
|
|||
int a;
|
||||
const bool is_prop_edit = (t->flag & T_PROP_EDIT) != 0;
|
||||
View3D *v3d = t->view;
|
||||
short hide_handles = (v3d != NULL) ?
|
||||
((v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) == 0) :
|
||||
false;
|
||||
short hide_handles = (v3d != NULL) ? (v3d->overlay.handle_display == CURVE_HANDLE_NONE) :
|
||||
false;
|
||||
|
||||
bool use_around_origins_for_handles_test = ((t->around == V3D_AROUND_LOCAL_ORIGINS) &&
|
||||
transform_mode_use_local_origins(t));
|
||||
|
|
|
@ -929,7 +929,7 @@ int ED_transform_calc_gizmo_stats(const bContext *C,
|
|||
* if handles are hidden then only check the center points.
|
||||
* If the center knot is selected then only use this as the center point.
|
||||
*/
|
||||
if ((v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) == 0) {
|
||||
if (v3d->overlay.handle_display == CURVE_HANDLE_NONE) {
|
||||
if (bezt->f2 & SELECT) {
|
||||
calc_tw_center_with_matrix(tbounds, bezt->vec[1], use_mat_local, mat_local);
|
||||
totsel++;
|
||||
|
|
|
@ -921,7 +921,7 @@ int getTransformOrientation_ex(const bContext *C,
|
|||
}
|
||||
}
|
||||
else {
|
||||
const bool use_handle = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) != 0;
|
||||
const bool use_handle = v3d->overlay.handle_display != CURVE_HANDLE_NONE;
|
||||
|
||||
for (nu = nurbs->first; nu; nu = nu->next) {
|
||||
/* only bezier has a normal */
|
||||
|
|
|
@ -496,11 +496,11 @@ typedef enum eBezTriple_KeyframeType {
|
|||
#define BEZT_ISSEL_ALL(bezt) \
|
||||
(((bezt)->f2 & SELECT) && ((bezt)->f1 & SELECT) && ((bezt)->f3 & SELECT))
|
||||
#define BEZT_ISSEL_ALL_HIDDENHANDLES(v3d, bezt) \
|
||||
((((v3d) != NULL) && ((v3d)->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) == 0) ? \
|
||||
((((v3d) != NULL) && ((v3d)->overlay.handle_display == CURVE_HANDLE_NONE)) ? \
|
||||
(bezt)->f2 & SELECT : \
|
||||
BEZT_ISSEL_ALL(bezt))
|
||||
#define BEZT_ISSEL_ANY_HIDDENHANDLES(v3d, bezt) \
|
||||
((((v3d) != NULL) && ((v3d)->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_HANDLES) == 0) ? \
|
||||
((((v3d) != NULL) && ((v3d)->overlay.handle_display == CURVE_HANDLE_NONE)) ? \
|
||||
(bezt)->f2 & SELECT : \
|
||||
BEZT_ISSEL_ANY(bezt))
|
||||
|
||||
|
|
|
@ -64,8 +64,8 @@
|
|||
.edit_flag = V3D_OVERLAY_EDIT_FACES | V3D_OVERLAY_EDIT_SEAMS | \
|
||||
V3D_OVERLAY_EDIT_SHARP | V3D_OVERLAY_EDIT_FREESTYLE_EDGE | \
|
||||
V3D_OVERLAY_EDIT_FREESTYLE_FACE | V3D_OVERLAY_EDIT_EDGES | \
|
||||
V3D_OVERLAY_EDIT_CREASES | V3D_OVERLAY_EDIT_BWEIGHTS | \
|
||||
V3D_OVERLAY_EDIT_CU_HANDLES, \
|
||||
V3D_OVERLAY_EDIT_CREASES | V3D_OVERLAY_EDIT_BWEIGHTS, \
|
||||
.handle_display = CURVE_HANDLE_SELECTED, \
|
||||
\
|
||||
.gpencil_paper_opacity = 0.5f, \
|
||||
.gpencil_grid_opacity = 0.9f, \
|
||||
|
|
|
@ -228,9 +228,20 @@ typedef struct View3DOverlay {
|
|||
|
||||
/** Factor for mixing vertex paint with original color */
|
||||
float gpencil_vertex_paint_opacity;
|
||||
char _pad4[4];
|
||||
/** Handles display type for curves. */
|
||||
int handle_display;
|
||||
} View3DOverlay;
|
||||
|
||||
/* View3DOverlay->handle_display */
|
||||
typedef enum eHandleDisplay {
|
||||
/* Display only selected points. */
|
||||
CURVE_HANDLE_SELECTED = 0,
|
||||
/* Display all handles. */
|
||||
CURVE_HANDLE_ALL = 1,
|
||||
/* No display handles. */
|
||||
CURVE_HANDLE_NONE = 2,
|
||||
} eHandleDisplay;
|
||||
|
||||
typedef struct View3D_Runtime {
|
||||
/** Nkey panel stores stuff here. */
|
||||
void *properties_storage;
|
||||
|
@ -522,7 +533,9 @@ enum {
|
|||
V3D_OVERLAY_EDIT_FACE_AREA = (1 << 18),
|
||||
V3D_OVERLAY_EDIT_INDICES = (1 << 19),
|
||||
|
||||
V3D_OVERLAY_EDIT_CU_HANDLES = (1 << 20),
|
||||
/* Deprecated. */
|
||||
/* V3D_OVERLAY_EDIT_CU_HANDLES = (1 << 20), */
|
||||
|
||||
V3D_OVERLAY_EDIT_CU_NORMALS = (1 << 21),
|
||||
};
|
||||
|
||||
|
|
|
@ -121,7 +121,7 @@ static const EnumPropertyItem rna_enum_layer_blend_modes_items[] = {
|
|||
{eGplBlendMode_Divide, "DIVIDE", 0, "Divide", ""},
|
||||
{0, NULL, 0, NULL, NULL}};
|
||||
|
||||
static EnumPropertyItem rna_enum_gpencil_caps_modes_items[] = {
|
||||
static const EnumPropertyItem rna_enum_gpencil_caps_modes_items[] = {
|
||||
{GP_STROKE_CAP_ROUND, "ROUND", 0, "Rounded", ""},
|
||||
{GP_STROKE_CAP_FLAT, "FLAT", 0, "Flat", ""},
|
||||
{0, NULL, 0, NULL, NULL},
|
||||
|
|
|
@ -483,6 +483,13 @@ const EnumPropertyItem rna_enum_file_sort_items[] = {
|
|||
{0, NULL, 0, NULL, NULL},
|
||||
};
|
||||
|
||||
static const EnumPropertyItem rna_enum_curve_display_handle_items[] = {
|
||||
{CURVE_HANDLE_NONE, "NONE", 0, "None", ""},
|
||||
{CURVE_HANDLE_SELECTED, "SELECTED", 0, "Selected", ""},
|
||||
{CURVE_HANDLE_ALL, "ALL", 0, "All", ""},
|
||||
{0, NULL, 0, NULL, NULL},
|
||||
};
|
||||
|
||||
#ifdef RNA_RUNTIME
|
||||
|
||||
# include "DNA_anim_types.h"
|
||||
|
@ -3817,9 +3824,11 @@ static void rna_def_space_view3d_overlay(BlenderRNA *brna)
|
|||
prop, "Indices", "Display the index numbers of selected vertices, edges, and faces");
|
||||
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
|
||||
|
||||
prop = RNA_def_property(srna, "show_curve_handles", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_CU_HANDLES);
|
||||
RNA_def_property_ui_text(prop, "Draw Handles", "Display Bezier handles in editmode");
|
||||
prop = RNA_def_property(srna, "display_handle", PROP_ENUM, PROP_NONE);
|
||||
RNA_def_property_enum_sdna(prop, NULL, "overlay.handle_display");
|
||||
RNA_def_property_enum_items(prop, rna_enum_curve_display_handle_items);
|
||||
RNA_def_property_ui_text(
|
||||
prop, "Display Handles", "Limit the display of curve handles in edit mode");
|
||||
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
|
||||
|
||||
prop = RNA_def_property(srna, "show_curve_normals", PROP_BOOLEAN, PROP_NONE);
|
||||
|
|
Loading…
Reference in New Issue