Commit: 19ff231ff5bbc62425a5c81b00bd3712bc34e01b
Author: Rohan Rathi
Date:   Tue Jun 13 11:34:03 2017 +0530
Branches: soc-2017-normal-tools
https://developer.blender.org/rB19ff231ff5bbc62425a5c81b00bd3712bc34e01b

Fixed issues with Point Normals.

Added header, fixed bugs and logic errors in point normals to target. Target 
location is now editable from UI.
Also renamed 'bmspacearr' to 'lnor_spacearr'

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

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

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

diff --git a/source/blender/bmesh/bmesh_class.h 
b/source/blender/bmesh/bmesh_class.h
index 58079678454..dcaceef8ac9 100644
--- a/source/blender/bmesh/bmesh_class.h
+++ b/source/blender/bmesh/bmesh_class.h
@@ -256,7 +256,7 @@ typedef struct BMesh {
 
        void *py_handle;
 
-       struct MLoopNorSpaceArray *bmspacearr;  /* Stores MLoopNorSpaceArray 
for this BMesh */
+       struct MLoopNorSpaceArray *lnor_spacearr;  /* Stores MLoopNorSpaceArray 
for this BMesh */
        char spacearr_dirty;
 } BMesh;
 
diff --git a/source/blender/bmesh/intern/bmesh_mesh.c 
b/source/blender/bmesh/intern/bmesh_mesh.c
index 7745438fceb..e1d110fb486 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -270,9 +270,9 @@ void BM_mesh_data_free(BMesh *bm)
 
        BLI_freelistN(&bm->selected);
 
-       if (bm->bmspacearr) {
-               BKE_lnor_spacearr_free(bm->bmspacearr);
-               MEM_freeN(bm->bmspacearr);
+       if (bm->lnor_spacearr) {
+               BKE_lnor_spacearr_free(bm->lnor_spacearr);
+               MEM_freeN(bm->lnor_spacearr);
        }
 
        BMO_error_clear(bm);
@@ -987,7 +987,7 @@ void BM_loops_calc_normal_vcos(
 
 void BM_lnorspacearr_store(BMesh *bm, float (*r_lnors)[3])
 {
-       BLI_assert(bm->bmspacearr != NULL);
+       BLI_assert(bm->lnor_spacearr != NULL);
 
        if (!CustomData_has_layer(&bm->ldata, CD_CUSTOMLOOPNORMAL)) {
                BM_data_layer_add(bm, &bm->ldata, CD_CUSTOMLOOPNORMAL);
@@ -995,7 +995,7 @@ void BM_lnorspacearr_store(BMesh *bm, float (*r_lnors)[3])
 
        int cd_loop_clnors_offset = CustomData_get_offset(&bm->ldata, 
CD_CUSTOMLOOPNORMAL);
 
-       BM_loops_calc_normal_vcos(bm, NULL, NULL, NULL, true, M_PI, r_lnors, 
bm->bmspacearr, NULL, cd_loop_clnors_offset, false);
+       BM_loops_calc_normal_vcos(bm, NULL, NULL, NULL, true, M_PI, r_lnors, 
bm->lnor_spacearr, NULL, cd_loop_clnors_offset, false);
        bm->spacearr_dirty &= ~(BM_SPACEARR_DIRTY | BM_SPACEARR_DIRTY_ALL);
 }
 
@@ -1038,7 +1038,7 @@ void BM_lnorspace_invalidate(BMesh *bm, bool inval_all)
 
 void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor)
 {
-       BLI_assert(bm->bmspacearr != NULL);
+       BLI_assert(bm->lnor_spacearr != NULL);
 
        if (!(bm->spacearr_dirty & (BM_SPACEARR_DIRTY | 
BM_SPACEARR_DIRTY_ALL))) {
                return;
@@ -1057,7 +1057,7 @@ void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor)
        }
 
        if (preserve_clnor) {
-               BLI_assert(bm->bmspacearr->lspacearr != NULL);
+               BLI_assert(bm->lnor_spacearr->lspacearr != NULL);
 
                BM_ITER_MESH(f, &fiter, bm, BM_FACES_OF_MESH) {
                        BM_ITER_ELEM(l, &liter, f, BM_LOOPS_OF_FACE) {
@@ -1066,12 +1066,12 @@ void BM_lnorspace_rebuild(BMesh *bm, bool 
preserve_clnor)
                                        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_data_to_normal(bm->bmspacearr->lspacearr[l_index], 
*clnor, oldnors[l_index]);
+                                       
BKE_lnor_space_custom_data_to_normal(bm->lnor_spacearr->lspacearr[l_index], 
*clnor, oldnors[l_index]);
                                }
                        }
                }
        }
-       BM_loops_calc_normal_vcos(bm, NULL, NULL, NULL, true, M_PI, r_lnors, 
bm->bmspacearr, NULL, cd_loop_clnors_offset, true);
+       BM_loops_calc_normal_vcos(bm, NULL, NULL, NULL, true, M_PI, r_lnors, 
bm->lnor_spacearr, NULL, cd_loop_clnors_offset, true);
        MEM_freeN(r_lnors);
 
        BM_ITER_MESH(f, &fiter, bm, BM_FACES_OF_MESH) {
@@ -1082,12 +1082,12 @@ void BM_lnorspace_rebuild(BMesh *bm, bool 
preserve_clnor)
 #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);
+                               
BKE_lnor_space_custom_normal_to_data(bm->lnor_spacearr->lspacearr[l_index], 
l->v->no, *clnor);
 #else
                                if (preserve_clnor) {
                                        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], 
oldnors[l_index], *clnor);
+                                       
BKE_lnor_space_custom_normal_to_data(bm->lnor_spacearr->lspacearr[l_index], 
oldnors[l_index], *clnor);
                                }
 #endif
                                BM_elem_flag_disable(l, BM_ELEM_LNORSPACE);
@@ -1102,10 +1102,10 @@ void BM_lnorspace_update(BMesh *bm)
 {
        float(*lnors)[3] = MEM_callocN(sizeof(*lnors) * bm->totloop, 
"__func__");
 
-       if (bm->bmspacearr == NULL) {
-               bm->bmspacearr = MEM_callocN(sizeof(*bm->bmspacearr), __func__);
+       if (bm->lnor_spacearr == NULL) {
+               bm->lnor_spacearr = MEM_callocN(sizeof(*bm->lnor_spacearr), 
__func__);
        }
-       if (bm->bmspacearr->lspacearr == NULL) {
+       if (bm->lnor_spacearr->lspacearr == NULL) {
                BM_lnorspacearr_store(bm, lnors);
        }
        else if(bm->spacearr_dirty & (BM_SPACEARR_DIRTY | 
BM_SPACEARR_DIRTY_ALL)){
@@ -1130,15 +1130,15 @@ int BM_total_loop_select(BMesh *bm)
 
 void InitTransDataNormal(BMesh *bm, TransDataLoopNormal *tld, BMVert *v, 
BMLoop *l, int offset)
 {
-       BLI_assert(bm->bmspacearr != NULL);
-       BLI_assert(bm->bmspacearr->lspacearr != NULL);
+       BLI_assert(bm->lnor_spacearr != NULL);
+       BLI_assert(bm->lnor_spacearr->lspacearr != NULL);
 
        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);
+       
BKE_lnor_space_custom_data_to_normal(bm->lnor_spacearr->lspacearr[l_index], 
clnors_data, custom_normal);
 
        tld->clnors_data = clnors_data;
        copy_v3_v3(tld->nloc, custom_normal);
diff --git a/source/blender/editors/mesh/editmesh_tools.c 
b/source/blender/editors/mesh/editmesh_tools.c
index e1aaa06c5b2..b16c27884f9 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -46,6 +46,7 @@
 #include "BLI_math.h"
 #include "BLI_rand.h"
 #include "BLI_sort_utils.h"
+#include "BLI_string.h"
 
 #include "BKE_material.h"
 #include "BKE_context.h"
@@ -5990,19 +5991,39 @@ static int init_point_normals(bContext *C, wmOperator 
*op, const wmEvent *event)
        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);
+       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);
 
-       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) {
+       if (*vert_sel != -1) {
+               totloopsel = RNA_int_get(op->ptr, "loop_selected");
+               TransDataLoopNormal *tld = ld->normal = 
MEM_mallocN(sizeof(*tld) * totloopsel, "__func__");
+
+               for (int i = 0; i < length; i++, vert_sel++) {
+                       v = BM_vert_at_index_find_or_table(bm, *vert_sel);
 
+                       BM_ITER_ELEM(l, &liter, v, BM_LOOPS_OF_VERT) {
                                InitTransDataNormal(bm, tld, v, l, 
cd_custom_normal_offset);
                                tld++;
                        }
                }
        }
+       else {
+               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;
@@ -6011,10 +6032,11 @@ static int init_point_normals(bContext *C, wmOperator 
*op, const wmEvent *event)
        return totloopsel;
 }
 
-static void apply_point_normals(bContext *C, wmOperator *op, float target[3], 
bool vert)
+static void apply_point_normals(bContext *C, wmOperator *op, const wmEvent 
*event, float target[3], bool vert)
 {
        Object *obedit = CTX_data_edit_object(C);
        BMesh *bm = BKE_editmesh_from_object(obedit)->bm;
+       BMLoop *l;
        BMIter liter;
        LoopNormalData *ld = op->customdata;
        TransDataLoopNormal *tld = ld->normal;
@@ -6025,7 +6047,6 @@ static void apply_point_normals(bContext *C, wmOperator 
*op, float target[3], bo
                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;
@@ -6039,7 +6060,6 @@ static void apply_point_normals(bContext *C, wmOperator 
*op, float target[3], bo
                        tld = ld->normal;
                }
        }
-
        for (int i = 0; i < ld->totloop; i++, tld++) {
                sub_v3_v3v3(tld->nloc, target, tld->loc);
                normalize_v3(tld->nloc);
@@ -6048,11 +6068,21 @@ static void apply_point_normals(bContext *C, wmOperator 
*op, float target[3], bo
                        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);
+                       
BKE_lnor_space_custom_normal_to_data(bm->lnor_spacearr->lspacearr[tld->loop_index],
 tld->nloc, tld->clnors_data);
                }
        }
 }
 
+static void point_normals_free(bContext *C, wmOperator *op)
+{
+       LoopNormalData *ld = op->customdata;
+       MEM_freeN(ld->normal);
+       MEM_freeN(ld);
+       op->customdata = NULL;
+
+       ED_area_headerprint(CTX_wm_area(C), NULL);
+}
+
 static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent 
*event)
 {
        View3D *v3d = CTX_wm_view3d(C);
@@ -6060,20 +6090,18 @@ static int edbm_point_normals_modal(bContext *C, 
wmOperator *op, const wmEvent *
        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");
+       bool handled = false;
+       PropertyRNA *prop = RNA_struct_find_property(op->ptr, "Target 
Location");
 
        if (ele_ref) {
                BMElem *ele_new = BM_mesh_active_elem_get(bm);
                if (ele_ref == ele_new) {
                        ele_ref = NULL;
+                       point_normals_free

@@ 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