[Bf-blender-cvs] [66199cf5409] soc-2017-normal-tools: Added normals to follow mouse location.
Rohan Rathi
noreply at git.blender.org
Mon Jun 19 07:31:09 CEST 2017
Commit: 66199cf5409cbc275974ffc92e1981c227758bfb
Author: Rohan Rathi
Date: Mon Jun 19 11:00:48 2017 +0530
Branches: soc-2017-normal-tools
https://developer.blender.org/rB66199cf5409cbc275974ffc92e1981c227758bfb
Added normals to follow mouse location.
Now M key can be used after ALT - L to have clnors point to mouse location.
===================================================================
M source/blender/editors/mesh/editmesh_tools.c
===================================================================
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index 9d2fd2fa77b..848cd16b8f3 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -5978,6 +5978,7 @@ void MESH_OT_mark_freestyle_face(wmOperatorType *ot)
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
+/* Initialize loop normal data */
static int init_point_normals(bContext *C, wmOperator *op, const wmEvent *event)
{
Object *obedit = CTX_data_edit_object(C);
@@ -5993,10 +5994,13 @@ static int init_point_normals(bContext *C, wmOperator *op, const wmEvent *event)
PropertyRNA *prop = RNA_struct_find_property(op->ptr, "selected");
int length = RNA_property_array_length(op->ptr, prop);
+
int *vert_sel = MEM_mallocN(sizeof(*vert_sel) * length, "__func__");
- RNA_int_get_array(op->ptr, "selected", vert_sel);
+ RNA_int_get_array(op->ptr, "selected", vert_sel); /* Get loop indices of previous selected vertices */
+
+ /* This if statement is required as if we RMB on mesh then prev selected loop data is lost */
- if (*vert_sel != -1) {
+ if (*vert_sel != -1) { /* Means function is called by exec() */
totloopsel = RNA_int_get(op->ptr, "loop_selected");
TransDataLoopNormal *tld = ld->normal = MEM_mallocN(sizeof(*tld) * totloopsel, "__func__");
int *vert_cur = vert_sel;
@@ -6005,13 +6009,13 @@ static int init_point_normals(bContext *C, wmOperator *op, const wmEvent *event)
v = BM_vert_at_index_find_or_table(bm, *vert_cur);
BM_ITER_ELEM(l, &liter, v, BM_LOOPS_OF_VERT) {
- InitTransDataNormal(bm, tld, v, l, cd_custom_normal_offset);
+ InitTransDataNormal(bm, tld, v, l, cd_custom_normal_offset); /* Init those loop normals used in previous call */
tld++;
}
}
}
else {
- totloopsel = BM_total_loop_select(bm);
+ totloopsel = BM_total_loop_select(bm); /* Invoke operation */
TransDataLoopNormal *tld = ld->normal = MEM_mallocN(sizeof(*tld) * totloopsel, "__func__");
BM_mesh_elem_index_ensure(bm, BM_LOOP);
@@ -6025,10 +6029,12 @@ static int init_point_normals(bContext *C, wmOperator *op, const wmEvent *event)
}
}
}
+
MEM_freeN(vert_sel);
ld->totloop = totloopsel;
ld->offset = cd_custom_normal_offset;
+ ld->funcdata = NULL;
op->customdata = ld;
return totloopsel;
@@ -6042,17 +6048,19 @@ static void apply_point_normals(bContext *C, wmOperator *op, const wmEvent *even
BMIter liter;
LoopNormalData *ld = op->customdata;
TransDataLoopNormal *tld = ld->normal;
- bool point_away = RNA_boolean_get(op->ptr, "point_away");
- int i = 0;
- if (vert) {
+ const bool point_away = RNA_boolean_get(op->ptr, "point_away");
+
+ if (vert) { /* if active vert is pivot, keep its normal same */
BMElem *ele;
ele = BM_mesh_active_elem_get(bm);
+
if (ele->head.htype == BM_VERT) {
BM_ITER_ELEM(l, &liter, ((BMVert *)ele), BM_LOOPS_OF_VERT) {
int loop_index = BM_elem_index_get(l);
tld = ld->normal;
- for (i = 0; i < ld->totloop; i++, tld++) {
+
+ for (int i = 0; i < ld->totloop; i++, tld++) {
if (tld->loop_index == loop_index) {
tld->loop_index = -1;
break;
@@ -6075,9 +6083,12 @@ static void apply_point_normals(bContext *C, wmOperator *op, const wmEvent *even
}
}
-static void point_normals_free(bContext *C, wmOperator *op)
+static void point_normals_free(bContext *C, wmOperator *op, const bool align)
{
LoopNormalData *ld = op->customdata;
+ if (align) {
+ MEM_freeN(ld->normal->loc);
+ }
MEM_freeN(ld->normal);
MEM_freeN(ld);
op->customdata = NULL;
@@ -6085,6 +6096,60 @@ static void point_normals_free(bContext *C, wmOperator *op)
ED_area_headerprint(CTX_wm_area(C), NULL);
}
+static int point_normals_mouse(bContext *C, wmOperator *op, const wmEvent *event)
+{
+ View3D *v3d = CTX_wm_view3d(C);
+ Object *obedit = CTX_data_edit_object(C);
+ ARegion *ar = CTX_wm_region(C);
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ BMesh *bm = em->bm;
+ BMVert *v;
+ BMIter viter;
+ int i = 0;
+
+ float target[3], center[3];
+
+ RNA_float_get_array(op->ptr, "target_location", target);
+
+ zero_v3(center);
+ BM_ITER_MESH(v, &viter, bm, BM_VERTS_OF_MESH) {
+ if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
+ add_v3_v3(center, v->co);
+ i++;
+ }
+ }
+ mul_v3_fl(center, 1.0f / (float)i);
+
+ ED_view3d_win_to_3d_int(v3d, ar, center, event->mval, target);
+
+ PropertyRNA *prop = RNA_struct_find_property(op->ptr, "align");
+ RNA_def_property_clear_flag(prop, PROP_HIDDEN);
+
+ const bool check_vert = RNA_boolean_get(op->ptr, "check_vert"),
+ align = RNA_boolean_get(op->ptr, "align");
+
+ apply_point_normals(C, op, event, target, check_vert);
+ EDBM_update_generic(em, true, false);
+
+ if (event->type == LEFTMOUSE) {
+ RNA_float_set_array(op->ptr, "target_location", target);
+ point_normals_free(C, op, align);
+ return OPERATOR_FINISHED;
+ }
+
+ else if ((ISKEYBOARD(event->type) || event->type == RIGHTMOUSE) && event->type != MKEY) {
+ LoopNormalData *ld = op->customdata;
+ TransDataLoopNormal *tld = ld->normal;
+
+ for (i = 0; i < ld->totloop; i++, tld++) { /* Reset custom normal data */
+ BKE_lnor_space_custom_normal_to_data(bm->lnor_spacearr->lspacearr[tld->loop_index], tld->niloc, tld->clnors_data);
+ }
+ point_normals_free(C, op, align);
+ return OPERATOR_CANCELLED;
+ }
+ return OPERATOR_PASS_THROUGH;
+}
+
static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *event)
{
View3D *v3d = CTX_wm_view3d(C);
@@ -6098,17 +6163,27 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
bool handled = false;
PropertyRNA *prop = RNA_struct_find_property(op->ptr, "target_location");
+ LoopNormalData *ld = op->customdata;
+
+ if (ld->funcdata) { /* executes point_normals_mouse */
+ int(*apply)(bContext *, wmOperator *, const wmEvent *);
+ apply = ld->funcdata;
+ return apply(C, op, event);
+ }
if (ele_ref) {
BMElem *ele_new = BM_mesh_active_elem_get(bm);
if (ele_ref == ele_new) {
ele_ref = NULL;
- point_normals_free(C, op);
+ point_normals_free(C, op, false);
+ ED_area_headerprint(CTX_wm_area(C), NULL);
+
return OPERATOR_CANCELLED;
}
RNA_boolean_set(op->ptr, "check_vert", true);
ED_object_editmode_calc_active_center(obedit, false, target);
RNA_property_float_set_array(op->ptr, prop, target);
+
handled = true;
ele_ref = NULL;
}
@@ -6121,11 +6196,12 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
ED_view3d_cursor3d_update(C, event->mval);
copy_v3_v3(target, ED_view3d_cursor3d_get(scene, v3d));
RNA_property_float_set_array(op->ptr, prop, target);
+
handled = true;
}
if (event->type == RIGHTMOUSE) {
ele_ref = BM_mesh_active_elem_get(bm);
- int *vert_sel = MEM_mallocN(sizeof(*vert_sel) * bm->totvertsel, "__func_"), index;
+ int *vert_sel = MEM_mallocN(sizeof(*vert_sel) * bm->totvertsel, "__func__"), index;
BM_ITER_MESH_INDEX(v, &viter, bm, BM_VERTS_OF_MESH, index) {
if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
@@ -6133,7 +6209,7 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
i++;
}
}
- RNA_int_set_array(op->ptr, "selected", vert_sel);
+ RNA_int_set_array(op->ptr, "selected", vert_sel); //Store selected verts, will be lost as selected elem changes
MEM_freeN(vert_sel);
}
else if (event->type == LKEY) {
@@ -6163,6 +6239,7 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
case V3D_AROUND_CENTER_MEAN:
if (RNA_int_get(op->ptr, "loop_selected")) {
zero_v3(target);
+
BM_ITER_MESH(v, &viter, bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
add_v3_v3(target, v->co);
@@ -6172,7 +6249,7 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
mul_v3_fl(target, 1.0f / (float)i);
}
else {
- point_normals_free(C, op);
+ point_normals_free(C, op, false);
return OPERATOR_CANCELLED; /* Mechanism to free mem with every cancel, other than ot->cancel() */
}
RNA_property_float_set_array(op->ptr, prop, target);
@@ -6194,29 +6271,69 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
default:
BKE_report(op->reports, RPT_ERROR, "Does not support Indivisual Origin as pivot");
- point_normals_free(C, op);
+ point_normals_free(C, op, false);
return OPERATOR_CANCELLED;
}
handled = true;
}
+ else if (event->type == MKEY) {
+ ld->funcdata = point_normals_mouse;
+
+ const bool align = RNA_boolean_get(op->ptr, "align");
+
+ if (align) { /* Set TransData loc to center loc if align true */
+ float *center = MEM_mallocN(sizeof(*center) * 3, "__func__");
+ TransDataLoopNormal *t = ld->normal;
+ int i = 0;
+
+ zero_v3(center);
+ BM_ITER_MESH(v, &viter, bm, BM_VERTS_OF_MESH) {
+ if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
+ add_v3_v3(center, v->co);
+ i++;
+ }
+ }
+ mul_v3_fl(center, 1.0f / (float)i);
+
+ for (i = 0; i < ld->totloop; i++, t++) {
+ t->loc = center;
+ }
+ }
+
+ char header[UI_MAX_DRAW_STR];
+ BLI_snprintf(header, sizeof(header), IFACE_("Left Click to Confirm. Right click to Cancel."));
+
+ ED_area_headerprint(CTX_wm_area(C), header);
+ }
else if (event->type == OKEY) {
copy_v3_v3(target, obedit->loc);
RNA_property_float_set_array(op->ptr, prop, target);
handled = true;
}
else if (ISKEYBOARD(event->type) && event->type != RIGHTALTKEY) {
- point_normals_free(C, op);
+ prop = RNA_struct_find_property(op->ptr, "align");
+ RNA_property_boolean_set(op->ptr, prop, false);
+ RNA_def_property_flag(prop, PROP_HIDDEN);
+
+ point_normals_free(C, op, false);
return OPERATOR_CANCELLED;
}
}
+
+ if (handled || event->type == RIGHTMOUSE) {
+ prop = RNA_struct_find_property(op->ptr, "align");
+ RNA_property_boolean_set(op->ptr, prop, false);
+ RNA_def_property_flag(prop, PROP_HIDDEN);
+ }
if (handled) {
bool check_vert = RNA_boolean_get(op->ptr, "check_vert");
apply_point_normals(C, op, event, target, check_vert);
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list