[Bf-blender-cvs] [082c5e4a0b5] temp-vse-preview-transform2: Fix mirror X/Y not being taken into consideration.

Richard Antalik noreply at git.blender.org
Fri Sep 17 10:06:15 CEST 2021


Commit: 082c5e4a0b534a790cf0d561b3b5bafdf96d17d5
Author: Richard Antalik
Date:   Fri Sep 17 10:03:17 2021 +0200
Branches: temp-vse-preview-transform2
https://developer.blender.org/rB082c5e4a0b534a790cf0d561b3b5bafdf96d17d5

Fix mirror X/Y not being taken into consideration.

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

M	source/blender/editors/space_sequencer/sequencer_draw.c
M	source/blender/editors/transform/transform_convert_sequencer_image.c
M	source/blender/editors/transform/transform_gizmo_2d.c
M	source/blender/sequencer/SEQ_transform.h
M	source/blender/sequencer/intern/render.c
M	source/blender/sequencer/intern/strip_transform.c

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

diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index cebdcf00807..5dabcb094fc 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -2062,15 +2062,10 @@ static void seq_draw_image_origin_and_outline(const bContext *C, Sequence *seq)
     return;
   }
 
-  const StripTransform *transform = seq->strip->transform;
-
   float origin[2];
   SEQ_image_transform_origin_offset_pixelspace_get(CTX_data_scene(C), seq, origin);
 
   /* Origin. */
-  float x = transform->xofs + origin[0];
-  float y = transform->yofs + origin[1];
-
   GPUVertFormat *format = immVertexFormat();
   uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
   immBindBuiltinProgram(GPU_SHADER_2D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_OUTLINE_AA);
@@ -2079,18 +2074,11 @@ static void seq_draw_image_origin_and_outline(const bContext *C, Sequence *seq)
   immUniform4f("outlineColor", 0.0f, 0.0f, 0.0f, 1.0f);
   immUniform1f("size", 15.0f * U.pixelsize);
   immBegin(GPU_PRIM_POINTS, 1);
-  immVertex2f(pos, x, y);
+  immVertex2f(pos, origin[0], origin[1]);
   immEnd();
   immUnbindProgram();
 
   /* Outline. */
-  float transform_matrix[3][3];
-  loc_rot_size_to_mat3(transform_matrix,
-                       (const float[]){transform->xofs, transform->yofs},
-                       transform->rotation,
-                       (const float[]){transform->scale_x, transform->scale_y});
-  transform_pivot_set_m3(transform_matrix, origin);
-
   float seq_image_quad[4][2];
   SEQ_image_transform_final_quad_get(CTX_data_scene(C), seq, seq_image_quad);
 
diff --git a/source/blender/editors/transform/transform_convert_sequencer_image.c b/source/blender/editors/transform/transform_convert_sequencer_image.c
index 57de0a03570..718c85fbdcb 100644
--- a/source/blender/editors/transform/transform_convert_sequencer_image.c
+++ b/source/blender/editors/transform/transform_convert_sequencer_image.c
@@ -46,8 +46,9 @@
 /** Used for sequencer transform. */
 typedef struct TransDataSeq {
   struct Sequence *seq;
-  float orig_scale_x;
-  float orig_scale_y;
+  float orig_origin_position[2];
+  float orig_translation[2];
+  float orig_scale[2];
   float orig_rotation;
 } TransDataSeq;
 
@@ -61,7 +62,7 @@ static TransData *SeqToTransData(const Scene *scene,
   const StripTransform *transform = seq->strip->transform;
   float origin[2];
   SEQ_image_transform_origin_offset_pixelspace_get(scene, seq, origin);
-  float vertex[2] = {transform->xofs + origin[0], transform->yofs + origin[1]};
+  float vertex[2] = {origin[0], origin[1]};
 
   /* Add control vertex, so rotation and scale can be calculated. */
   if (vert_index == 1) {
@@ -77,8 +78,8 @@ static TransData *SeqToTransData(const Scene *scene,
   td->loc = td2d->loc;
   copy_v3_v3(td->iloc, td->loc);
 
-  td->center[0] = transform->xofs + origin[0];
-  td->center[1] = transform->yofs + origin[1];
+  td->center[0] = origin[0];
+  td->center[1] = origin[1];
 
   memset(td->axismtx, 0, sizeof(td->axismtx));
   td->axismtx[2][2] = 1.0f;
@@ -86,8 +87,11 @@ static TransData *SeqToTransData(const Scene *scene,
   unit_m3(td->smtx);
 
   tdseq->seq = seq;
-  tdseq->orig_scale_x = transform->scale_x;
-  tdseq->orig_scale_y = transform->scale_y;
+  copy_v2_v2(tdseq->orig_origin_position, origin);
+  tdseq->orig_translation[0] = transform->xofs;
+  tdseq->orig_translation[1] = transform->yofs;
+  tdseq->orig_scale[0] = transform->scale_x;
+  tdseq->orig_scale[1] = transform->scale_y;
   tdseq->orig_rotation = transform->rotation;
 
   td->extra = (void *)tdseq;
@@ -164,15 +168,25 @@ void recalcData_sequencer_image(TransInfo *t)
     TransDataSeq *tdseq = td->extra;
     Sequence *seq = tdseq->seq;
     StripTransform *transform = seq->strip->transform;
-    float origin[2];
-    SEQ_image_transform_origin_offset_pixelspace_get(t->scene, seq, origin);
-    transform->xofs = round_fl_to_int(loc[0] - origin[0]);
-    transform->yofs = round_fl_to_int(loc[1] - origin[1]);
-    transform->scale_x = tdseq->orig_scale_x * fabs(len_v2(handle_x));
-    transform->scale_y = tdseq->orig_scale_y * fabs(len_v2(handle_y));
-    /* Scaling can cause negative rotation. */
+    float mirror[2];
+    SEQ_image_transform_mirror_factor_get(seq, mirror);
+
+    /* Calculate translation. */
+    float translation[2];
+    copy_v2_v2(translation, tdseq->orig_origin_position);
+    sub_v2_v2(translation, loc);
+    mul_v2_v2(translation, mirror);
+    transform->xofs = tdseq->orig_translation[0] - translation[0];
+    transform->yofs = tdseq->orig_translation[1] - translation[1];
+
+    /* Scale. */
+    transform->scale_x = tdseq->orig_scale[0] * fabs(len_v2(handle_x));
+    transform->scale_y = tdseq->orig_scale[1] * fabs(len_v2(handle_y));
+
+    /* Rotation. Scaling can cause negative rotation. */
     if (t->mode == TFM_ROTATION) {
-      transform->rotation = tdseq->orig_rotation + angle_signed_v2v2(handle_x, (float[]){1, 0});
+      float rotation = angle_signed_v2v2(handle_x, (float[]){1, 0}) * mirror[0] * mirror[1];
+      transform->rotation = tdseq->orig_rotation + rotation;
       transform->rotation += DEG2RAD(360.0);
       transform->rotation = fmod(transform->rotation, DEG2RAD(360.0));
     }
diff --git a/source/blender/editors/transform/transform_gizmo_2d.c b/source/blender/editors/transform/transform_gizmo_2d.c
index 92a1b95e17a..cc0445fc10f 100644
--- a/source/blender/editors/transform/transform_gizmo_2d.c
+++ b/source/blender/editors/transform/transform_gizmo_2d.c
@@ -256,8 +256,10 @@ static float gizmo2d_calc_rotation(const bContext *C)
   SEQ_ITERATOR_FOREACH (seq, strips) {
     if (seq == ed->act_seq) {
       StripTransform *transform = seq->strip->transform;
+      float mirror[2];
+      SEQ_image_transform_mirror_factor_get(seq, mirror);
       SEQ_collection_free(strips);
-      return transform->rotation;
+      return transform->rotation * mirror[0] * mirror[1];
     }
   }
 
@@ -292,8 +294,7 @@ static bool gizmo2d_calc_center(const bContext *C, float r_center[2])
       StripTransform *transform = seq->strip->transform;
       float origin[2];
       SEQ_image_transform_origin_offset_pixelspace_get(scene, seq, origin);
-      r_center[0] += transform->xofs + origin[0];
-      r_center[1] += transform->yofs + origin[1];
+      copy_v2_v2(r_center, origin);
     }
     r_center[0] /= SEQ_collection_len(strips);
     r_center[1] /= SEQ_collection_len(strips);
diff --git a/source/blender/sequencer/SEQ_transform.h b/source/blender/sequencer/SEQ_transform.h
index 146edd7cb40..328efb9424a 100644
--- a/source/blender/sequencer/SEQ_transform.h
+++ b/source/blender/sequencer/SEQ_transform.h
@@ -60,6 +60,9 @@ void SEQ_transform_offset_after_frame(struct Scene *scene,
                                       struct ListBase *seqbase,
                                       const int delta,
                                       const int timeline_frame);
+
+/* Image transformation. */
+void SEQ_image_transform_mirror_factor_get(const struct Sequence *seq, float r_mirror[2]);
 void SEQ_image_transform_origin_offset_pixelspace_get(const struct Scene *scene,
                                                       const struct Sequence *seq,
                                                       float r_origin[2]);
diff --git a/source/blender/sequencer/intern/render.c b/source/blender/sequencer/intern/render.c
index c0d0dad534c..b0258f62ec2 100644
--- a/source/blender/sequencer/intern/render.c
+++ b/source/blender/sequencer/intern/render.c
@@ -412,9 +412,7 @@ static void sequencer_image_crop_transform_matrix(const Scene *scene,
   const float image_center_offs_y = (out->y - in->y) / 2;
   const float translate_x = transform->xofs * preview_scale_factor + image_center_offs_x;
   const float translate_y = transform->yofs * preview_scale_factor + image_center_offs_y;
-  float origin[2];
-  SEQ_image_transform_origin_offset_pixelspace_get(scene, seq, origin);
-  const float pivot[2] = {(in->x / 2) + origin[0], (in->y / 2) + origin[1]};
+  const float pivot[2] = {in->x * transform->origin[0], in->y * transform->origin[1]};
   loc_rot_size_to_mat3(r_transform_matrix,
                        (const float[]){translate_x, translate_y},
                        transform->rotation,
diff --git a/source/blender/sequencer/intern/strip_transform.c b/source/blender/sequencer/intern/strip_transform.c
index 8ef73f1028f..d5ff455c694 100644
--- a/source/blender/sequencer/intern/strip_transform.c
+++ b/source/blender/sequencer/intern/strip_transform.c
@@ -422,8 +422,22 @@ void SEQ_transform_offset_after_frame(Scene *scene,
   }
 }
 
+void SEQ_image_transform_mirror_factor_get(const Sequence *seq, float r_mirror[2])
+{
+  r_mirror[0] = 1.0f;
+  r_mirror[1] = 1.0f;
+
+  if ((seq->flag & SEQ_FLIPX) != 0) {
+    r_mirror[0] = -1.0f;
+  }
+  if ((seq->flag & SEQ_FLIPY) != 0) {
+    r_mirror[1] = -1.0f;
+  }
+}
+
 /**
  * Get strip transform origin offset from image center
+ * Note: This function does not apply axis mirror.
  *
  * \param scene: Scene in which strips are located
  * \param seq: Sequence to calculate image transform origin
@@ -445,10 +459,22 @@ void SEQ_image_transform_origin_offset_pixelspace_get(const Scene *scene,
   }
 
   const StripTransform *transform = seq->strip->transform;
-  r_origin[0] = (image_size[0] * transform->origin[0]) - (image_size[0] * 0.5f);
-  r_origin[1] = (image_size[1] * transform->origin[1]) - (image_size[1] * 0.5f);
+  r_origin[0] = (image_size[0] * transform->origin[0]) - (image_size[0] * 0.5f) + transform->xofs;
+  r_origin[1] = (image_size[1] * transform->origin[1]) - (image_size[1] * 0.5f) + transform->yofs;
+
+  float mirror[2];
+  SEQ_image_transform_mirror_factor_get(seq, mirror);
+  mul_v2_v2(r_origin, mirror);
 }
 
+/**
+ * Get strip transform origin offset from image center
+ *
+ * \param scene: Scene in which strips are located
+ * \param seq: Sequence to calculate image transform origin
+ * \param r_origin: return value
+ */
+
 void SEQ_image_transform_final_quad_get(const Scene *scene,
                                         const Sequence *seq,
                       

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list