[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