Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGermano Cavalcante <germano.costa@ig.com.br>2021-09-07 17:03:48 +0300
committerGermano Cavalcante <germano.costa@ig.com.br>2021-09-07 17:04:20 +0300
commit08acbdc1ff75607001f770b4281f53ec87449b7f (patch)
tree44cdc65b8815c4f9249bf16ad6745fe59f8fa6ab
parent2b4afcbb4cdc231aebe343cd444d001b9f191204 (diff)
Fix T91219: Crash canceling scale keyframes in dope sheet grease pencil
Caused by {rBb0d9e6797fb8} Ideally `td->loc` should always be set and point to a 3d array.
-rw-r--r--source/blender/editors/transform/transform_convert_action.c20
-rw-r--r--source/blender/editors/transform/transform_generics.c2
2 files changed, 12 insertions, 10 deletions
diff --git a/source/blender/editors/transform/transform_convert_action.c b/source/blender/editors/transform/transform_convert_action.c
index 075db30fa61..a6658ae00a3 100644
--- a/source/blender/editors/transform/transform_convert_action.c
+++ b/source/blender/editors/transform/transform_convert_action.c
@@ -51,7 +51,10 @@
/* helper struct for gp-frame transforms */
typedef struct tGPFtransdata {
- float val; /* where transdata writes transform */
+ union {
+ float val; /* where transdata writes transform */
+ float loc[3]; /* #td->val and #td->loc share the same pointer. */
+ };
int *sdata; /* pointer to gpf->framenum */
} tGPFtransdata;
@@ -245,8 +248,8 @@ static int GPLayerToTransData(TransData *td,
tfd->val = (float)gpf->framenum;
tfd->sdata = &gpf->framenum;
- td->val = td->loc = &tfd->val; /* XXX: It's not a 3d array. */
- td->ival = td->iloc[0] = (float)gpf->framenum;
+ td->val = td->loc = &tfd->val;
+ td->ival = td->iloc[0] = tfd->val;
td->center[0] = td->ival;
td->center[1] = ypos;
@@ -279,16 +282,15 @@ static int MaskLayerToTransData(TransData *td,
masklay_shape = masklay_shape->next) {
if (is_prop_edit || (masklay_shape->flag & MASK_SHAPE_SELECT)) {
if (FrameOnMouseSide(side, (float)masklay_shape->frame, cfra)) {
- /* memory is calloc'ed, so that should zero everything nicely for us */
- td->val = &tfd->val;
- td->ival = (float)masklay_shape->frame;
+ tfd->val = (float)masklay_shape->frame;
+ tfd->sdata = &masklay_shape->frame;
+
+ td->val = td->loc = &tfd->val;
+ td->ival = td->iloc[0] = tfd->val;
td->center[0] = td->ival;
td->center[1] = ypos;
- tfd->val = (float)masklay_shape->frame;
- tfd->sdata = &masklay_shape->frame;
-
/* advance td now */
td++;
tfd++;
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index 9f5e74db501..0dfb229191c 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -791,7 +791,7 @@ static void restoreElement(TransData *td)
{
transdata_restore_basic((TransDataBasic *)td);
- if (td->val) {
+ if (td->val && td->val != td->loc) {
*td->val = td->ival;
}