Commit: bf892c10fc353aee82cf423de4bebbac5ac7dbd6
Author: RohanRathi
Date:   Tue Jun 6 11:00:47 2017 +0530
Branches: soc-2017-normal-tools
https://developer.blender.org/rBbf892c10fc353aee82cf423de4bebbac5ac7dbd6

Added ability to rotate custom normal

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

M       source/blender/bmesh/intern/bmesh_mesh.c
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_generics.c
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 b09d86de959..5cbd8fd7472 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -990,6 +990,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->spacearr_dirty &= ~(BM_SPACEARR_DIRTY | BM_SPACEARR_DIRTY_ALL);
 }
 
 /* will change later */
@@ -1027,12 +1028,6 @@ void BM_lnorspace_invalidate(BMesh *bm, bool inval_all)
                        }
                }
        }
-
-#ifdef _DEBUG
-       float(*r_lnors)[3] = MEM_mallocN(sizeof(*r_lnors) * bm->totloop, 
"__func__");
-       BM_lnorspacearr_store(bm, r_lnors);
-       BM_lnorspace_rebuild(bm, false);
-#endif
 }
 
 void BM_lnorspace_rebuild(BMesh *bm, bool preserve_clnor)
diff --git a/source/blender/editors/include/ED_transform.h 
b/source/blender/editors/include/ED_transform.h
index ebd2a3dcb7a..a575fe4bfaf 100644
--- a/source/blender/editors/include/ED_transform.h
+++ b/source/blender/editors/include/ED_transform.h
@@ -88,6 +88,7 @@ enum TfmMode {
        TFM_VERT_SLIDE,
        TFM_SEQ_SLIDE,
        TFM_BONE_ENVELOPE_DIST,
+       TFM_NORMAL_ROTATION
 };
 
 /* TRANSFORM CONTEXTS */
diff --git a/source/blender/editors/transform/transform.c 
b/source/blender/editors/transform/transform.c
index d786c755529..63c734354a7 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -41,6 +41,7 @@
 #include "DNA_armature_types.h"
 #include "DNA_constraint_types.h"
 #include "DNA_mask_types.h"
+#include "DNA_mesh_types.h"
 #include "DNA_movieclip_types.h"
 #include "DNA_scene_types.h"  /* PET modes */
 
@@ -106,6 +107,9 @@ static void postInputRotation(TransInfo *t, float 
values[3]);
 static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], 
const short around);
 static void initSnapSpatial(TransInfo *t, float r_snap[3]);
 
+static void StoreCustomlnorValue(TransInfo *t, BMesh *bm);
+static void InitTransDataNormal(TransInfo *t, BMesh *bm, TransDataLoopNormal 
*tob, BMLoop *l, int offset);
+
 
 /* Transform Callbacks */
 static void initBend(TransInfo *t);
@@ -131,6 +135,9 @@ static void applyToSphere(TransInfo *t, const int mval[2]);
 static void initRotation(TransInfo *t);
 static void applyRotation(TransInfo *t, const int mval[2]);
 
+static void initNormalRotation(TransInfo *t);
+static void applyNormalRotation(TransInfo *t, const int mval[2]);
+
 static void initShrinkFatten(TransInfo *t);
 static void applyShrinkFatten(TransInfo *t, const int mval[2]);
 
@@ -1464,6 +1471,17 @@ int transformEvent(TransInfo *t, const wmEvent *event)
                                        t->redraw |= TREDRAW_HARD;
                                        handled = true;
                                }
+                       case NKEY:
+                               if (ELEM(t->mode, TFM_ROTATION)) {
+                                       if (t->obedit && t->obedit->type == 
OB_MESH) {
+                                               restoreTransObjects(t);
+                                               resetTransModal(t);
+                                               resetTransRestrictions(t);
+                                               initNormalRotation(t);
+                                               t->redraw = TREDRAW_HARD;
+                                               handled = true;
+                                       }
+                               }
                                break;
                        default:
                                break;
@@ -2314,6 +2332,9 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator 
*op, const wmEvent *eve
                case TFM_SEQ_SLIDE:
                        initSeqSlide(t);
                        break;
+               case TFM_NORMAL_ROTATION:
+                       initNormalRotation(t);
+                       break;
        }
 
        if (t->state == TRANS_CANCEL) {
@@ -3729,6 +3750,29 @@ static void initRotation(TransInfo *t)
        copy_v3_v3(t->axis_orig, t->axis);
 }
 
+/* Used by Transform Rotation and Transform Normal Rotation */
+static void headerRotation(TransInfo *t, char str[UI_MAX_DRAW_STR], float 
final)
+{
+       size_t ofs = 0;
+
+       if (hasNumInput(&t->num)) {
+               char c[NUM_STR_REP_LEN];
+
+               outputNumInput(&(t->num), c, &t->scene->unit);
+
+               ofs += BLI_snprintf(str + ofs, UI_MAX_DRAW_STR - ofs, 
IFACE_("Rot: %s %s %s"), &c[0], t->con.text, t->proptext);
+       }
+       else {
+               ofs += BLI_snprintf(str + ofs, UI_MAX_DRAW_STR - ofs, 
IFACE_("Rot: %.2f%s %s"),
+                       RAD2DEGF(final), t->con.text, t->proptext);
+       }
+       float x = RAD2DEGF(final);
+
+       if (t->flag & T_PROP_EDIT_ALL) {
+               ofs += BLI_snprintf(str + ofs, UI_MAX_DRAW_STR - ofs, IFACE_(" 
Proportional size: %.2f"), t->prop_size);
+       }
+}
+
 /**
  * Applies values of rotation to `td->loc` and `td->ext->quat`
  * based on a rotation matrix (mat) and a pivot (center).
@@ -3994,7 +4038,6 @@ static void applyRotationValue(TransInfo *t, float angle, 
float axis[3])
 static void applyRotation(TransInfo *t, const int UNUSED(mval[2]))
 {
        char str[UI_MAX_DRAW_STR];
-       size_t ofs = 0;
 
        float final;
 
@@ -4017,21 +4060,7 @@ static void applyRotation(TransInfo *t, const int 
UNUSED(mval[2]))
 
        t->values[0] = final;
 
-       if (hasNumInput(&t->num)) {
-               char c[NUM_STR_REP_LEN];
-               
-               outputNumInput(&(t->num), c, &t->scene->unit);
-               
-               ofs += BLI_snprintf(str + ofs, sizeof(str) - ofs, IFACE_("Rot: 
%s %s %s"), &c[0], t->con.text, t->proptext);
-       }
-       else {
-               ofs += BLI_snprintf(str + ofs, sizeof(str) - ofs, IFACE_("Rot: 
%.2f%s %s"),
-                                   RAD2DEGF(final), t->con.text, t->proptext);
-       }
-       
-       if (t->flag & T_PROP_EDIT_ALL) {
-               ofs += BLI_snprintf(str + ofs, sizeof(str) - ofs, IFACE_(" 
Proportional size: %.2f"), t->prop_size);
-       }
+       headerRotation(t, str, final);
 
        applyRotationValue(t, final, t->axis);
        
@@ -4039,6 +4068,7 @@ static void applyRotation(TransInfo *t, const int 
UNUSED(mval[2]))
        
        ED_area_headerprint(t->sa, str);
 }
+
 /** \} */
 
 
@@ -4155,6 +4185,180 @@ static void applyTrackball(TransInfo *t, const int 
UNUSED(mval[2]))
 
        ED_area_headerprint(t->sa, str);
 }
+
+/** \} */
+
+
+/* -------------------------------------------------------------------- */
+/* Transform (Normal Rotation) */
+
+/** \name Transform Normal Rotation
+* \{ */
+
+static void InitTransDataNormal(TransInfo *t, BMesh *bm, TransDataLoopNormal 
*tld, 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->loc, custom_normal);
+       copy_v3_v3(tld->iloc, custom_normal);
+}
+
+static void StoreCustomlnorValue(TransInfo *t, BMesh *bm)
+{
+       TransDataLoopNormal *tob;
+       BMVert *v;
+       BMLoop *l;
+       BMIter viter, liter;
+       float mtx[3][3], smtx[3][3];
+       int totloopsel = 0;
+
+       LoopNormalData *ld = MEM_mallocN(sizeof(LoopNormalData), "__func__");
+
+       copy_m3_m4(mtx, t->obedit->obmat);
+       pseudoinverse_m3_m3(smtx, mtx, PSEUDOINVERSE_EPSILON);
+
+       BM_ITER_MESH(v, &viter, bm, BM_VERTS_OF_MESH) {
+               if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
+                       totloopsel += BM_vert_face_count(v);
+               }
+       }
+
+       tob = ld->normal = MEM_mallocN(sizeof(TransData) * totloopsel, 
"__func__");
+       int cd_custom_normal_offset = CustomData_get_offset(&bm->ldata, 
CD_CUSTOMLOOPNORMAL);
+
+       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(t, bm, tob, l, 
cd_custom_normal_offset);
+                               copy_m3_m3(tob->smtx, smtx);
+                               copy_m3_m3(tob->mtx, mtx);
+                               tob++;
+                       }
+               }
+       }
+
+       ld->totloop = totloopsel;
+       ld->offset = cd_custom_normal_offset;
+       t->custom.mode.data = ld;
+       t->custom.mode.free_cb = freeCustomNormalArray;
+}
+
+void freeCustomNormalArray(TransInfo *t, TransCustomData *custom_data)
+{
+       LoopNormalData *ld = custom_data->data;
+
+       if (t->state == TRANS_CANCEL) {
+               TransDataLoopNormal *tld = ld->normal;
+               BMEditMesh *em = BKE_editmesh_from_object(t->obedit);
+               BMesh *bm = em->bm;
+
+               for (int i = 0; i < ld->totloop; i++, tld++){           /* 
Restore custom loop normal on cancel */
+                       
BKE_lnor_space_custom_normal_to_data(bm->bmspacearr.lspacearr[tld->loop_index], 
tld->iloc, tld->clnors_data);
+               }
+       }
+
+       MEM_freeN(ld->normal);
+       MEM_freeN(ld);
+
+       t->custom.mode.data = NULL;
+       t->custom.mode.free_cb = NULL;
+}
+
+static void initNormalRotation(TransInfo *t)
+{
+       t->mode = TFM_NORMAL_ROTATION;
+       t->transform = applyNormalRotation;
+
+       setInputPostFct(&t->mouse, postInputRotation);
+       initMouseInputMode(t, &t->mouse, INPUT_ANGLE);
+
+       t->num.unit_sys = t->scene->unit.system;
+       t->num.unit_use_radians = (t->scene->unit.system_rotation == 
USER_UNIT_ROT_RADIANS);
+       t->num.unit_type[0] = B_UNIT_ROTATION;
+
+       BMEditMesh *em = BKE_editmesh_from_object(t->obedit);
+       Mesh *me = t->obedit->data;
+       BMesh *bm = em->bm;
+       float(*lnors)[3];
+
+       if (bm->bmspacearr.lspacearr == NULL) {
+               if (CustomData_has_layer(&me->ldata, CD_NORMAL)) {
+                       lnors = CustomData_get_layer(&me->ldata, CD_NORMAL);
+               }
+               else {
+                       lnors = CustomData_add_layer(&me->ldata, CD_NORMAL, 
CD_DEFAULT, NULL, me->totloop);
+               }
+               BM_lnorspacearr_store(bm, lnors);
+       }
+       if (bm->spacearr_dirty & (BM_SPACEARR_DIRTY | BM_SPACEARR_DIRTY_ALL)) {
+               BM_lnorspace_rebuild(bm, false);
+       }
+       StoreCustomlnorValue(t, bm);
+
+       copy_v3_v3(t->axis_orig, t->axis);
+}
+
+/* Works by getting custom normal from clnor_data, transform, then store */
+static void applyNormalRotation(TransInfo *t, const int mval[2])
+{
+       BMEditMesh *em = BKE_editmesh_from_object(t->obedit);
+       BMesh *bm = em->bm;
+       char str[UI_MAX_DRAW_STR];
+
+       if ((t->con.mode & CON_APPLY) && t->con.applyRot) {
+               t->con.applyRot(t, NULL, t->axis, NULL);
+       }
+       else {
+               /* reset axis if constraint is not set */
+               copy_v3_v3(t->axis, t->axis_orig);
+       }
+
+       LoopNormalData *ld = t->custom.mode.data;
+       TransDataLoopNormal *tld = ld->normal;
+
+       float axis[3];
+       float mat[3][3];
+       float angle = t->values[0];
+       copy_v3_v3(axis, t->axis);
+
+       applyNumInput(&t->num, &angle);
+
+       headerRotation(t, str, angle);
+
+       axis_angle_normalized_to_mat3(mat, axis, angle);
+
+       for (int i = 0; i < ld->totloop; i++, tld++) {
+
+               float center[3];
+               float vec[3], totmat[3][3], smat[3][3];
+               zero_v3(center);
+
+               mul_m3_m3m3(totmat, mat, tld->mtx);
+               mul_m3_m3m3(smat, tld->smtx, totmat);
+
+               sub_v3_v3v3(vec, tld->iloc, center);
+               mul_m3_v3(smat, vec);
+
+               add_v3_v3v3(tld->loc, vec, center);
+
+               sub_v3_v3v3(vec, tld->loc, tld->iloc);
+               add_v3_v3v3(tld

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