Commit: a2ad1b4e88e155fa0b7457312373c49eeb13754d
Author: Rohan Rathi
Date:   Tue Jun 20 23:03:32 2017 +0530
Branches: soc-2017-normal-tools
https://developer.blender.org/rBa2ad1b4e88e155fa0b7457312373c49eeb13754d

Added invalidate for transform ops.

Can now keep clnors when transform ops are applied. As now invalidation for 
each function is harder to keep track of, Added a function which rebuilds all 
the lnor spaces in the mesh when BM_lnorspace_rebuild is called to detect if 
any unmarked spaces are rebuilt.

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

M       source/blender/bmesh/intern/bmesh_mesh.c
M       source/blender/bmesh/intern/bmesh_mesh.h
M       source/blender/editors/include/ED_transform.h
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/intern/bmesh_mesh.c 
b/source/blender/bmesh/intern/bmesh_mesh.c
index e1d110fb486..f6c5e1d7b17 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -1034,6 +1034,7 @@ void BM_lnorspace_invalidate(BMesh *bm, bool inval_all)
                        }
                }
        }
+       bm->spacearr_dirty |= BM_SPACEARR_DIRTY;
 }
 
 void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor)
@@ -1096,6 +1097,10 @@ void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor)
        }
        MEM_freeN(oldnors);
        bm->spacearr_dirty &= ~(BM_SPACEARR_DIRTY | BM_SPACEARR_DIRTY_ALL);
+
+#ifdef DEBUG
+       BM_lnorspace_err(bm);
+#endif
 }
 
 void BM_lnorspace_update(BMesh *bm)
@@ -1114,6 +1119,52 @@ void BM_lnorspace_update(BMesh *bm)
        MEM_freeN(lnors);
 }
 
+/* Auxillary function only used by rebuild to detect if any spaces were not 
marked in invalidate.
+   Reports error if any of the lnor spaces change after rebuilding, meaning 
that the all possible
+   lnor spaces to be rebuilt were not correctly marked */
+static void BM_lnorspace_err(BMesh *bm)
+{
+       bm->spacearr_dirty |= BM_SPACEARR_DIRTY_ALL;
+       bool clear = true;
+
+       MLoopNorSpaceArray *temp = MEM_callocN(sizeof(*temp), "__func__");
+       temp->lspacearr = NULL;
+
+       BKE_lnor_spacearr_init(temp, bm->totloop);
+
+       temp->lspacearr = MEM_callocN(sizeof(MLoopNorSpace *) * bm->totloop, 
"__func__");
+
+       for (int i = 0; i < bm->totloop; i++) {
+               temp->lspacearr[i] = BKE_lnor_space_create(temp);
+               memcpy(temp->lspacearr[i], bm->lnor_spacearr->lspacearr[i], 
sizeof(MLoopNorSpace));
+       }
+       
+       int cd_loop_clnors_offset = CustomData_get_offset(&bm->ldata, 
CD_CUSTOMLOOPNORMAL);
+       float(*lnors)[3] = MEM_callocN(sizeof(*lnors) * bm->totloop, 
"__func__");
+       BM_loops_calc_normal_vcos(bm, NULL, NULL, NULL, true, M_PI, lnors, 
bm->lnor_spacearr, NULL, cd_loop_clnors_offset, true);
+
+       for (int i = 0; i < bm->totloop; i++) {
+               int j = 0;
+               j += compare_ff(temp->lspacearr[i]->ref_alpha, 
bm->lnor_spacearr->lspacearr[i]->ref_alpha, 1.0f - 1e-4f);
+               j += compare_ff(temp->lspacearr[i]->ref_beta, 
bm->lnor_spacearr->lspacearr[i]->ref_beta, 1.0f - 1e-4f);
+               j += compare_v3v3(temp->lspacearr[i]->vec_lnor, 
bm->lnor_spacearr->lspacearr[i]->vec_lnor, 1.0f - 1e-4f);
+               j += compare_v3v3(temp->lspacearr[i]->vec_ortho, 
bm->lnor_spacearr->lspacearr[i]->vec_ortho, 1.0f - 1e-4f);
+               j += compare_v3v3(temp->lspacearr[i]->vec_ref, 
bm->lnor_spacearr->lspacearr[i]->vec_ref, 1.0f - 1e-4f);
+
+               if (j != 5) {
+                       clear = false;
+                       break;
+               }
+       }
+       BKE_lnor_spacearr_free(temp);
+       MEM_freeN(temp);
+       MEM_freeN(lnors);
+       BLI_assert(clear);
+
+       bm->spacearr_dirty &= ~BM_SPACEARR_DIRTY_ALL;
+
+}
+
 int BM_total_loop_select(BMesh *bm)
 {
        int r_sel = 0;
diff --git a/source/blender/bmesh/intern/bmesh_mesh.h 
b/source/blender/bmesh/intern/bmesh_mesh.h
index b74394276eb..499be9c0508 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.h
+++ b/source/blender/bmesh/intern/bmesh_mesh.h
@@ -56,6 +56,7 @@ 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);
+static void BM_lnorspace_err(BMesh *bm);
 
 /* Loop Generics */
 int BM_total_loop_select(BMesh *bm);
diff --git a/source/blender/editors/include/ED_transform.h 
b/source/blender/editors/include/ED_transform.h
index a575fe4bfaf..9db0d632d8f 100644
--- a/source/blender/editors/include/ED_transform.h
+++ b/source/blender/editors/include/ED_transform.h
@@ -150,6 +150,7 @@ int BIF_countTransformOrientation(const struct bContext *C);
 #define P_NO_DEFAULTS   (1 << 10)
 #define P_NO_TEXSPACE   (1 << 11)
 #define P_GPENCIL_EDIT  (1 << 12)
+#define P_CLNOR_INVALIDATE (1 << 13)
 
 void Transform_Properties(struct wmOperatorType *ot, int flags);
 
diff --git a/source/blender/editors/transform/transform.c 
b/source/blender/editors/transform/transform.c
index c694a5649df..4f8bcdcf47b 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -88,6 +88,7 @@
 #include "UI_resources.h"
 
 #include "RNA_access.h"
+#include "RNA_define.h"
 
 #include "BLF_api.h"
 #include "BLT_translation.h"
@@ -2392,6 +2393,35 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator 
*op, const wmEvent *eve
                t->flag |= T_AUTOVALUES;
        }
 
+       if ((prop = RNA_struct_find_property(op->ptr, "preserve_clnor"))) {
+               if (t->obedit && t->obedit->type == OB_MESH && (((Mesh 
*)(t->obedit->data))->flag & ME_AUTOSMOOTH)) {
+
+                       BMEditMesh *em = BKE_editmesh_from_object(t->obedit);
+                       RNA_def_property_clear_flag(prop, PROP_HIDDEN);
+                       bool all_select = false;
+
+                       if (ELEM(t->mode, TFM_TRANSLATION, TFM_ROTATION, 
TFM_RESIZE)) {
+                               if (em->bm->totvertsel == em->bm->totvert) {    
//Currently only used for 3 most frequent transform ops, can include more ops   
        
+                                       all_select = true;                      
                                //No need to invalidate if whole mesh is 
selected
+                               }
+                       }
+                       if (!all_select) {
+                               if (!em->bm->lnor_spacearr) {
+                                       BM_lnorspace_update(em->bm);
+                               }
+                               BM_lnorspace_invalidate(em->bm, false);
+
+                               if (t->flag & T_MODAL) {
+                                       RNA_boolean_set(op->ptr, 
"preserve_clnor", false);
+                               }
+                               const bool preserve_clnor = 
RNA_boolean_get(op->ptr, "preserve_clnor");
+                               if (preserve_clnor) {
+                                       t->flag |= T_CLNOR_REBUILD;
+                               }
+                       }
+               }
+       }
+
        t->context = NULL;
 
        return 1;
@@ -2452,6 +2482,10 @@ int transformEnd(bContext *C, TransInfo *t)
                        restoreTransObjects(t); // calls recalcData()
                }
                else {
+                       if (t->flag & T_CLNOR_REBUILD) {
+                               BMEditMesh *em = 
BKE_editmesh_from_object(t->obedit);
+                               BM_lnorspace_rebuild(em->bm, true);
+                       }
                        exit_code = OPERATOR_FINISHED;
                }
 
diff --git a/source/blender/editors/transform/transform.h 
b/source/blender/editors/transform/transform.h
index c5677182789..3d5d9ddfaa3 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -533,6 +533,8 @@ typedef struct TransInfo {
        /* alternative transformation. used to add offset to tracking markers */
 #define T_ALT_TRANSFORM                (1 << 24)
 
+#define T_CLNOR_REBUILD                (1 << 25)
+
 /* TransInfo->modifiers */
 #define        MOD_CONSTRAINT_SELECT   0x01
 #define        MOD_PRECISION                   0x02
diff --git a/source/blender/editors/transform/transform_ops.c 
b/source/blender/editors/transform/transform_ops.c
index bc10b59ee8f..ebf6bcdb15f 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -576,6 +576,11 @@ void Transform_Properties(struct wmOperatorType *ot, int 
flags)
                prop = RNA_def_boolean(ot->srna, "use_accurate", 0, "Accurate", 
"Use accurate transformation");
                RNA_def_property_flag(prop, PROP_HIDDEN);
        }
+
+       if (flags & P_CLNOR_INVALIDATE) {
+               prop = RNA_def_boolean(ot->srna, "preserve_clnor", 0, "Keep 
custom normal", "Keep custom normal during transform");
+               RNA_def_property_flag(prop, PROP_HIDDEN);
+       }
 }
 
 static void TRANSFORM_OT_translate(struct wmOperatorType *ot)
@@ -595,7 +600,7 @@ static void TRANSFORM_OT_translate(struct wmOperatorType 
*ot)
 
        RNA_def_float_vector_xyz(ot->srna, "value", 3, NULL, -FLT_MAX, FLT_MAX, 
"Vector", "", -FLT_MAX, FLT_MAX);
 
-       Transform_Properties(ot, P_CONSTRAINT | P_PROPORTIONAL | P_MIRROR | 
P_ALIGN_SNAP | P_OPTIONS | P_GPENCIL_EDIT);
+       Transform_Properties(ot, P_CONSTRAINT | P_PROPORTIONAL | P_MIRROR | 
P_ALIGN_SNAP | P_OPTIONS | P_GPENCIL_EDIT | P_CLNOR_INVALIDATE);
 }
 
 static void TRANSFORM_OT_resize(struct wmOperatorType *ot)
@@ -615,7 +620,7 @@ static void TRANSFORM_OT_resize(struct wmOperatorType *ot)
 
        RNA_def_float_vector(ot->srna, "value", 3, VecOne, -FLT_MAX, FLT_MAX, 
"Vector", "", -FLT_MAX, FLT_MAX);
 
-       Transform_Properties(ot, P_CONSTRAINT | P_PROPORTIONAL | P_MIRROR | 
P_GEO_SNAP | P_OPTIONS | P_GPENCIL_EDIT);
+       Transform_Properties(ot, P_CONSTRAINT | P_PROPORTIONAL | P_MIRROR | 
P_GEO_SNAP | P_OPTIONS | P_GPENCIL_EDIT | P_CLNOR_INVALIDATE);
 }
 
 static int skin_resize_poll(bContext *C)
@@ -666,7 +671,7 @@ static void TRANSFORM_OT_trackball(struct wmOperatorType 
*ot)
        /* Maybe we could use float_vector_xyz here too? */
        RNA_def_float_rotation(ot->srna, "value", 2, NULL, -FLT_MAX, FLT_MAX, 
"Angle", "", -FLT_MAX, FLT_MAX);
 
-       Transform_Properties(ot, P_PROPORTIONAL | P_MIRROR | P_SNAP | 
P_GPENCIL_EDIT);
+       Transform_Properties(ot, P_PROPORTIONAL | P_MIRROR | P_SNAP | 
P_GPENCIL_EDIT | P_CLNOR_INVALIDATE);
 }
 
 static void TRANSFORM_OT_rotate(struct wmOperatorType *ot)
@@ -686,7 +691,7 @@ static void TRANSFORM_OT_rotate(struct wmOperatorType *ot)
 
        RNA_def_float_rotation(ot->srna, "value", 0, NULL, -FLT_MAX, FLT_MAX, 
"Angle", "", -M_PI * 2, M_PI * 2);
 
-       Transform_Properties(ot, P_AXIS | P_CONSTRAINT | P_PROPORTIONAL | 
P_MIRROR | P_GEO_SNAP | P_GPENCIL_EDIT);
+       Transform_Properties(ot, P_AXIS | P_CONSTRAINT | P_PROPORTIONAL | 
P_MIRROR | P_GEO_SNAP | P_GPENCIL_EDIT | P_CLNOR_INVALIDATE);
 }
 
 static void TRANSFORM_OT_tilt(struct wmOperatorType *ot)
@@ -729,7 +734,7 @@ static void TRANSFORM_OT_bend(struct wmOperatorType *ot)
 
        RNA_def_float_rotation(ot->srna, "value", 1, NULL, -FLT_MAX, FLT_MAX, 
"Angle", "", -M_PI * 2, M_PI * 2);
 
-       Transform_Properties(ot, P_PROPORTIONAL | P_MIRROR | P_SNAP | 
P_GPENCIL_EDIT);
+       Transform_Properties(ot, P_PROPORTIONAL | P_MIRROR | P_SNAP | 
P_GPENCIL_EDIT | P_CLNOR_INVALIDATE);
 }
 
 static void TRANSFORM_OT_shear(struct wmOperatorType *ot)
@@ -749,7 +754,7 @@ static void TRANSFORM_OT_shear(struct wmOperatorType *ot)
 
        RNA_def_float(ot->srna, "value", 0, -FLT_MAX, FLT_MAX, "Offset", "", 
-FLT_MAX, FLT_MAX);
 
-       Transform_Properties(ot, P_PROPORTIONAL | P_MIRROR | P_SNAP | 
P_GPENCIL_EDIT);
+       Transform_Properties(ot, P_PROPORTIONAL | P_MIRROR | P_SNAP | 
P_GPENCIL_EDIT | P_CLNOR_INVALIDATE);
        // XXX Shear axis?
 }
 
@@ -770,7 +775,7 @@ static void TRANSFORM_OT_push_pull(struct wmOperatorType 
*ot)
 
        RNA_def_float(ot->srna, "value", 0, -FLT_MAX, FLT_MAX, "Distance", "", 
-FLT_MAX, FLT_MAX);
 
-       Transform_Properties(ot, P_PROPORTIONAL | P_MIRROR | P_SNAP);
+       Transform_Properties(ot, P_PROPORTIONAL | P_MIRROR | P_SNAP | 
P_CLNOR_INVALIDATE);
 }
 
 static void TRANSFORM_OT_shrink_fatten(struct wmOperatorType *ot)
@@ -792,7 +797,7 

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to