Commit: 9673aa8c151b463e05922b192bcd403c2c7c319e
Author: Rohan Rathi
Date:   Sun Jun 11 23:21:42 2017 +0530
Branches: soc-2017-normal-tools
https://developer.blender.org/rB9673aa8c151b463e05922b192bcd403c2c7c319e

Added point normals to target.
Moved common loop functions and made changes to structure

===================================================================

M       source/blender/bmesh/bmesh_class.h
M       source/blender/bmesh/intern/bmesh_mesh.c
M       source/blender/bmesh/intern/bmesh_mesh.h
M       source/blender/editors/mesh/editmesh_tools.c
M       source/blender/editors/mesh/mesh_intern.h
M       source/blender/editors/mesh/mesh_ops.c
M       source/blender/editors/transform/transform.c
M       source/blender/editors/transform/transform.h
M       source/blender/editors/transform/transform_ops.c

===================================================================

diff --git a/source/blender/bmesh/bmesh_class.h 
b/source/blender/bmesh/bmesh_class.h
index cc6a96a59cd..a35bc2b3141 100644
--- a/source/blender/bmesh/bmesh_class.h
+++ b/source/blender/bmesh/bmesh_class.h
@@ -268,6 +268,24 @@ enum {
        BM_FACE = 8
 };
 
+typedef struct TransDataLoopNormal {
+       int loop_index;
+       float mtx[3][3];
+       float smtx[3][3];
+       float niloc[3];
+       float nloc[3];
+       float *loc;
+       short *clnors_data;
+} TransDataLoopNormal;
+
+typedef struct LoopNormalData {
+       TransDataLoopNormal *normal;
+
+       int offset;
+       int totloop;
+       void *funcdata;
+} LoopNormalData;
+
 #define BM_ALL (BM_VERT | BM_EDGE | BM_LOOP | BM_FACE)
 #define BM_ALL_NOLOOP (BM_VERT | BM_EDGE | BM_FACE)
 
diff --git a/source/blender/bmesh/intern/bmesh_mesh.c 
b/source/blender/bmesh/intern/bmesh_mesh.c
index 5cbd8fd7472..d6d61404b0e 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -647,7 +647,6 @@ static void bm_mesh_loops_calc_normals(
                do {
                        if (rebuild && !BM_elem_flag_test(l_curr, 
BM_ELEM_LNORSPACE) && !(bm->spacearr_dirty & BM_SPACEARR_DIRTY_ALL))
                                continue;
-
                        /* A smooth edge, we have to check for cyclic smooth 
fan case.
                         * If we find a new, never-processed cyclic smooth fan, 
we can do it now using that loop/edge as
                         * 'entry point', otherwise we can skip it. */
@@ -1070,7 +1069,7 @@ void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor)
 
                        if (BM_elem_flag_test(l, BM_ELEM_LNORSPACE)) {
 
-#ifdef _DEBUG
+#if 0
                                short(*clnor)[2] = BM_ELEM_CD_GET_VOID_P(l, 
cd_loop_clnors_offset);
                                int l_index = BM_elem_index_get(l);
                                
BKE_lnor_space_custom_normal_to_data(bm->bmspacearr.lspacearr[l_index], 
l->v->no, *clnor);
@@ -1089,6 +1088,54 @@ void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor)
        bm->spacearr_dirty &= ~(BM_SPACEARR_DIRTY | BM_SPACEARR_DIRTY_ALL);
 }
 
+void BM_lnorspace_update(BMesh *bm)
+{
+       float(*lnors)[3] = MEM_callocN(sizeof(*lnors) * bm->totloop, 
"__func__");
+
+       if (bm->bmspacearr.lspacearr == NULL) {
+               BM_lnorspacearr_store(bm, lnors);
+       }
+       else if(bm->spacearr_dirty & (BM_SPACEARR_DIRTY | 
BM_SPACEARR_DIRTY_ALL)){
+               BM_lnorspace_rebuild(bm, false);
+       }
+       MEM_freeN(lnors);
+}
+
+int BM_total_loop_select(BMesh *bm)
+{
+       int r_sel = 0;
+       BMVert *v;
+       BMIter viter;
+
+       BM_ITER_MESH(v, &viter, bm, BM_VERTS_OF_MESH) {
+               if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
+                       r_sel += BM_vert_face_count(v);
+               }
+       }
+       return r_sel;
+}
+
+void InitTransDataNormal(BMesh *bm, TransDataLoopNormal *tld, BMVert *v, 
BMLoop *l, int offset)
+{
+       int l_index = BM_elem_index_get(l);
+       tld->loop_index = l_index;
+       short *clnors_data = BM_ELEM_CD_GET_VOID_P(l, offset);
+
+       float custom_normal[3];
+       BKE_lnor_space_custom_data_to_normal(bm->bmspacearr.lspacearr[l_index], 
clnors_data, custom_normal);
+
+       tld->clnors_data = clnors_data;
+       copy_v3_v3(tld->nloc, custom_normal);
+       copy_v3_v3(tld->niloc, custom_normal);
+
+       if (v) {
+               tld->loc = v->co;
+       }
+       else {
+               tld->loc = NULL;
+       }
+}
+
 static void UNUSED_FUNCTION(bm_mdisps_space_set)(Object *ob, BMesh *bm, int 
from, int to)
 {
        /* switch multires data out of tangent space */
diff --git a/source/blender/bmesh/intern/bmesh_mesh.h 
b/source/blender/bmesh/intern/bmesh_mesh.h
index bf1a24d9ce4..b74394276eb 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.h
+++ b/source/blender/bmesh/intern/bmesh_mesh.h
@@ -55,6 +55,11 @@ void BM_loops_calc_normal_vcos(
 void BM_lnorspacearr_store(BMesh *bm, float (*r_lnors)[3]);
 void BM_lnorspace_invalidate(BMesh *bm, bool inval_all);
 void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor);
+void BM_lnorspace_update(BMesh *bm);
+
+/* Loop Generics */
+int BM_total_loop_select(BMesh *bm);
+void InitTransDataNormal(BMesh *bm, TransDataLoopNormal *tld, BMVert *v, 
BMLoop *l, int offset);
 
 void bmesh_edit_begin(BMesh *bm, const BMOpTypeFlag type_flag);
 void bmesh_edit_end(BMesh *bm, const BMOpTypeFlag type_flag);
diff --git a/source/blender/editors/mesh/editmesh_tools.c 
b/source/blender/editors/mesh/editmesh_tools.c
index 1f90b60a1f5..01fceb7c715 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -5976,4 +5976,261 @@ void MESH_OT_mark_freestyle_face(wmOperatorType *ot)
        RNA_def_property_flag(prop, PROP_SKIP_SAVE);
 }
 
+static int init_point_normals(bContext *C, wmOperator *op, const wmEvent 
*event)
+{
+       Object *obedit = CTX_data_edit_object(C);
+       BMesh *bm = BKE_editmesh_from_object(obedit)->bm;
+       BMVert *v;
+       BMLoop *l;
+       BMIter viter, liter;
+
+       BM_lnorspace_update(bm);
+       LoopNormalData *ld = MEM_mallocN(sizeof(LoopNormalData), "__func__");
+       int cd_custom_normal_offset = CustomData_get_offset(&bm->ldata, 
CD_CUSTOMLOOPNORMAL);
+       int totloopsel = 0;
+
+       totloopsel = BM_total_loop_select(bm);
+       TransDataLoopNormal *tld = ld->normal = MEM_mallocN(sizeof(*tld) * 
totloopsel, "__func__");
+       BM_mesh_elem_index_ensure(bm, BM_LOOP);
+
+       BM_ITER_MESH(v, &viter, bm, BM_VERTS_OF_MESH) {
+               if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
+                       BM_ITER_ELEM(l, &liter, v, BM_LOOPS_OF_VERT) {
+
+                               InitTransDataNormal(bm, tld, v, l, 
cd_custom_normal_offset);
+                               tld++;
+                       }
+               }
+       }
+
+       ld->totloop = totloopsel;
+       ld->offset = cd_custom_normal_offset;
+       op->customdata = ld;
+
+       return totloopsel;
+}
+
+static void apply_point_normals(bContext *C, wmOperator *op, float target[3], 
bool vert)
+{
+       Object *obedit = CTX_data_edit_object(C);
+       BMesh *bm = BKE_editmesh_from_object(obedit)->bm;
+       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) {
+               BMElem *ele;
+               ele = BM_mesh_active_elem_get(bm);
+               if (ele->head.htype == BM_VERT) {
+                       BMLoop *l;
+                       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++) {
+                                       if (tld->loop_index == loop_index) {
+                                               tld->loop_index = -1;
+                                               break;
+                                       }
+                               }
+                       }
+                       tld = ld->normal;
+               }
+       }
+
+       for (int i = 0; i < ld->totloop; i++, tld++) {
+               sub_v3_v3v3(tld->nloc, target, tld->loc);
+               normalize_v3(tld->nloc);
+
+               if (point_away) {
+                       negate_v3(tld->nloc);
+               }
+               if (tld->loop_index != -1) {
+                       
BKE_lnor_space_custom_normal_to_data(bm->bmspacearr.lspacearr[tld->loop_index], 
tld->nloc, tld->clnors_data);
+               }
+       }
+}
+
+static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent 
*event)
+{
+       View3D *v3d = CTX_wm_view3d(C);
+       Scene *scene = CTX_data_scene(C);
+       Object *obedit = CTX_data_edit_object(C);
+       BMEditMesh *em = BKE_editmesh_from_object(obedit);
+       BMesh *bm = em->bm;
+       BMVert *v;
+       LoopNormalData *ld = op->customdata;
+       TransDataLoopNormal *tld = ld->normal;
+       float target[3];
+       static BMElem *ele_ref = NULL;
+       int i = 0;
+
+       bool point_away = RNA_boolean_get(op->ptr, "point_away"), handled = 
false;
+       PropertyRNA *prop = RNA_struct_find_property(op->ptr, "target");
+
+       if (ele_ref) {
+               BMElem *ele_new = BM_mesh_active_elem_get(bm);
+               if (ele_ref == ele_new) {
+                       ele_ref = 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;
+       }
+
+       if (event->val == KM_PRESS) {
+               if (event->type == RIGHTMOUSE) {
+                       ele_ref = BM_mesh_active_elem_get(bm);
+               }
+               else if (event->type == LKEY) {
+                       BMIter viter;
+
+                       switch (v3d->around) {
+                       case V3D_AROUND_CENTER_BOUNDS:
+                               /* calculateCenterBound */
+                       {
+                               float min[3], max[3];
+                               BM_ITER_MESH(v, &viter, bm, BM_VERTS_OF_MESH) {
+                                       if (BM_elem_flag_test(v, 
BM_ELEM_SELECT)) {
+                                               if (i) {
+                                                       minmax_v3v3_v3(min, 
max, v->co);
+                                               }
+                                               else {
+                                                       copy_v3_v3(min, v->co);
+                                                       copy_v3_v3(max, v->co);
+                                               }
+                                               i++;
+                                       }
+                               }
+                               mid_v3_v3v3(target, min, max);
+                               RNA_property_float_set_array(op->ptr, prop, 
target);
+                       }
+                       break;
+
+                       case V3D_AROUND_CENTER_MEAN:
+                               if (ld->totloop) {
+                                       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);
+                                                       i++;
+                                               }
+                                       }
+                                       mul_v3_fl(target, 1.0f / i);
+                               }
+                               else {
+                                       return OPERATOR_CANCELLED;
+                               }
+                               RNA_property_float_set_array(op->ptr, prop, 
target);
+                               break;
+
+                       case V3D_AROUND_CURSOR:
+                               copy_v3_v3(target, 
ED_view3d_cursor3d_get(scene, v3d));
+                               RNA_property_float_set_array(op->ptr, prop, 
target);
+                               break;
+
+                       case V3D_AROUND_ACTIVE:
+                               if 
(!ED_object_editmode_calc_active_center(obedit, false, target)) {
+                                       return OPERATOR_CANCELLED;
+                               }
+                               RNA_boolean_set(op->ptr, "check_vert", true);
+                               RNA_property_float_set_array(op->ptr, prop, 
target);
+                               break;
+
+                       default:
+                               BKE_report(op->reports, RPT_ERROR, "Does not 
support Indivisual Origin as pivot");
+                               return OPERATOR_CANCELLED;
+                       }
+                       handled = true;
+               }
+               else if (ISKEYBOARD(event->type) && event->type != RIGHTALTKEY) 
{
+                       return OPERATOR_CANCELLED;
+               }
+       }
+
+       if (handled) {
+               bool check_vert = RNA_boolean_get(op->ptr, "check_vert");
+               apply_point_normals(C, op, target, check_vert);
+               EDBM_update_generic(em, true, false);   /* Recheck bools */
+               return OPERATOR_FINISHED;
+       }
+       return OPERATOR_PASS_THROUGH;
+}
+
+static int edbm_point_normals_invoke(bContext *C, wmOperator *op, const 
wmEvent *event)
+{
+       Object *obedit = CTX_data_edit_object(C);
+       if ((((Mesh *)(obedit->data))->flag & ME_AUTOSMOOTH) == 0) {
+               BKE_report(op->reports, RPT_ERROR, "Auto Smooth is turned off");
+               return OPERATOR_CANCELLED;
+       }
+
+       if (!init_point_normals(C, op, event)) {
+               return OPERATOR_CANCELLED;
+       }
+
+       WM_event_add_modal_handler(C, op);
+
+       return OPERATOR_RUNNING_MODAL;
+}
+
+static int edbm_point_normals_exec(bContext *C, wmOperator *op)
+{
+       Object *obedit = CTX_data_edit_object(C);
+       BMEditMesh *em = BKE_editmesh_from_object(obedit);
+       BMesh *bm = em->bm;
+       PropertyRNA *prop;
+
+       if (!init_point_normals(C, op, NULL)) {
+               return OPERATOR_CANCELLED;
+       }
+
+       LoopNormalData *ld = op->customdata;
+       T

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to