Merge branch 'master' into blender2.8
[blender.git] / source / blender / editors / transform / transform_conversions.c
index 0b17f70..6271f80 100644 (file)
@@ -699,7 +699,6 @@ int count_set_pose_transflags(int *out_mode, short around, Object *ob)
        bPoseChannel *pchan;
        Bone *bone;
        int mode = *out_mode;
-       int hastranslation = 0;
        int total = 0;
 
        for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
@@ -727,7 +726,7 @@ int count_set_pose_transflags(int *out_mode, short around, Object *ob)
                }
        }
        /* now count, and check if we have autoIK or have to switch from translate to rotate */
-       hastranslation = 0;
+       bool has_translation = false, has_rotation = false;
 
        for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
                bone = pchan->bone;
@@ -738,20 +737,29 @@ int count_set_pose_transflags(int *out_mode, short around, Object *ob)
                                if (has_targetless_ik(pchan) == NULL) {
                                        if (pchan->parent && (pchan->bone->flag & BONE_CONNECTED)) {
                                                if (pchan->bone->flag & BONE_HINGE_CHILD_TRANSFORM)
-                                                       hastranslation = 1;
+                                                       has_translation = true;
                                        }
-                                       else if ((pchan->protectflag & OB_LOCK_LOC) != OB_LOCK_LOC)
-                                               hastranslation = 1;
+                                       else {
+                                               if ((pchan->protectflag & OB_LOCK_LOC) != OB_LOCK_LOC)
+                                                       has_translation = true;
+                                       }
+                                       if ((pchan->protectflag & OB_LOCK_ROT) != OB_LOCK_ROT)
+                                               has_rotation = true;
                                }
                                else
-                                       hastranslation = 1;
+                                       has_translation = true;
                        }
                }
        }
 
        /* if there are no translatable bones, do rotation */
-       if (mode == TFM_TRANSLATION && !hastranslation) {
-               *out_mode = TFM_ROTATION;
+       if (mode == TFM_TRANSLATION && !has_translation) {
+               if (has_rotation) {
+                       *out_mode = TFM_ROTATION;
+               }
+               else {
+                       *out_mode = TFM_RESIZE;
+               }
        }
 
        return total;
@@ -3114,7 +3122,7 @@ static void posttrans_gpd_clean(bGPdata *gpd)
                        for (gpf = gpl->frames.first; gpf; gpf = gpfn) {
                                gpfn = gpf->next;
                                if (gpfn && gpf->framenum == gpfn->framenum) {
-                                       gpencil_layer_delframe(gpl, gpf);
+                                       BKE_gpencil_layer_delframe(gpl, gpf);
                                }
                        }
                }
@@ -7488,7 +7496,11 @@ static void createTransGPencil(bContext *C, TransInfo *t)
                                if (ED_gpencil_stroke_can_use(C, gps) == false) {
                                        continue;
                                }
-                               
+                               /* check if the color is editable */
+                               if (ED_gpencil_stroke_color_use(gpl, gps) == false) {
+                                       continue;
+                               }
+
                                if (is_prop_edit) {
                                        /* Proportional Editing... */
                                        if (is_prop_edit_connected) {
@@ -7536,14 +7548,27 @@ static void createTransGPencil(bContext *C, TransInfo *t)
                if (gpencil_layer_is_editable(gpl) && (gpl->actframe != NULL)) {
                        bGPDframe *gpf = gpl->actframe;
                        bGPDstroke *gps;
+                       float diff_mat[4][4];
+                       float inverse_diff_mat[4][4];
+
+                       /* calculate difference matrix if parent object */
+                       if (gpl->parent != NULL) {
+                               ED_gpencil_parent_location(gpl, diff_mat);
+                               /* undo matrix */
+                               invert_m4_m4(inverse_diff_mat, diff_mat);
+                       }
                        
-                       /* Make a new frame to work on if the layer's frame and the current scene frame don't match up 
+                       /* Make a new frame to work on if the layer's frame and the current scene frame don't match up
                         * - This is useful when animating as it saves that "uh-oh" moment when you realize you've
                         *   spent too much time editing the wrong frame...
                         */
                        // XXX: should this be allowed when framelock is enabled?
                        if (gpf->framenum != cfra) {
-                               gpf = gpencil_frame_addcopy(gpl, cfra);
+                               gpf = BKE_gpencil_frame_addcopy(gpl, cfra);
+                               /* in some weird situations (framelock enabled) return NULL */
+                               if (gpf == NULL) {
+                                       continue;
+                               }
                        }
                        
                        /* Loop over strokes, adding TransData for points as needed... */
@@ -7556,7 +7581,10 @@ static void createTransGPencil(bContext *C, TransInfo *t)
                                if (ED_gpencil_stroke_can_use(C, gps) == false) {
                                        continue;
                                }
-                               
+                               /* check if the color is editable */
+                               if (ED_gpencil_stroke_color_use(gpl, gps) == false) {
+                                       continue;
+                               }
                                /* What we need to include depends on proportional editing settings... */
                                if (is_prop_edit) {
                                        if (is_prop_edit_connected) {
@@ -7625,9 +7653,18 @@ static void createTransGPencil(bContext *C, TransInfo *t)
                                                                /* screenspace */
                                                                td->protectflag = OB_LOCK_LOCZ | OB_LOCK_ROTZ | OB_LOCK_SCALEZ;
                                                                
-                                                               copy_m3_m4(td->smtx, t->persmat);
-                                                               copy_m3_m4(td->mtx, t->persinv);
-                                                               unit_m3(td->axismtx);
+                                                               /* apply parent transformations */
+                                                               if (gpl->parent == NULL) {
+                                                                       copy_m3_m4(td->smtx, t->persmat);
+                                                                       copy_m3_m4(td->mtx, t->persinv);
+                                                                       unit_m3(td->axismtx);
+                                                               }
+                                                               else {
+                                                                       /* apply matrix transformation relative to parent */
+                                                                       copy_m3_m4(td->smtx, inverse_diff_mat); /* final position */
+                                                                       copy_m3_m4(td->mtx, diff_mat); /* display position */
+                                                                       copy_m3_m4(td->axismtx, diff_mat); /* axis orientation */
+                                                               }
                                                        }
                                                        else {
                                                                /* configure 2D dataspace points so that they don't play up... */
@@ -7636,9 +7673,18 @@ static void createTransGPencil(bContext *C, TransInfo *t)
                                                                        // XXX: matrices may need to be different?
                                                                }
                                                                
-                                                               copy_m3_m3(td->smtx, smtx);
-                                                               copy_m3_m3(td->mtx, mtx);
-                                                               unit_m3(td->axismtx); // XXX?
+                                                               /* apply parent transformations */
+                                                               if (gpl->parent == NULL) {
+                                                                       copy_m3_m3(td->smtx, smtx);
+                                                                       copy_m3_m3(td->mtx, mtx);
+                                                                       unit_m3(td->axismtx); // XXX?
+                                                               }
+                                                               else {
+                                                                       /* apply matrix transformation relative to parent */
+                                                                       copy_m3_m4(td->smtx, inverse_diff_mat); /* final position */
+                                                                       copy_m3_m4(td->mtx, diff_mat);  /* display position */
+                                                                       copy_m3_m4(td->axismtx, diff_mat); /* axis orientation */
+                                                               }
                                                        }
                                                        /* Triangulation must be calculated again, so save the stroke for recalc function */
                                                        td->extra = gps;