Cleanup: NLA transforms, simplify recalcData_nla()
Refactor the `recalcData_nla()` function, which takes data from the transform system and updates NLA strips, such that the actual logic to change the strip is moved into its own function. This also moves some generic code (find prev/next strip) from that function to BKE. This is to make the code easier to adjust when different transform operations need to perform different modifications of the strip (i.e. to fix T101130). Manifest Task: T101130 Reviewed By: sybren Differential Revision: https://developer.blender.org/D16181
This commit is contained in:
committed by
Sybren A. Stüvel
parent
82a5790d2a
commit
962b647690
@@ -246,6 +246,24 @@ float BKE_nlastrip_compute_frame_from_previous_strip(struct NlaStrip *strip);
|
||||
*/
|
||||
float BKE_nlastrip_compute_frame_to_next_strip(struct NlaStrip *strip);
|
||||
|
||||
/**
|
||||
* Returns the next strip in this strip's NLA track, or a null pointer.
|
||||
*
|
||||
* \param strip The strip to find the next trip from.
|
||||
* \param check_transitions Whether or not to skip transitions.
|
||||
* \return The next strip in the track, or NULL if none are present.
|
||||
*/
|
||||
struct NlaStrip *BKE_nlastrip_next_in_track(struct NlaStrip *strip, bool skip_transitions);
|
||||
|
||||
/**
|
||||
* Returns the previous strip in this strip's NLA track, or a null pointer.
|
||||
*
|
||||
* \param strip The strip to find the previous trip from.
|
||||
* \param check_transitions Whether or not to skip transitions.
|
||||
* \return The previous strip in the track, or NULL if none are present.
|
||||
*/
|
||||
struct NlaStrip *BKE_nlastrip_prev_in_track(struct NlaStrip *strip, bool skip_transitions);
|
||||
|
||||
/* ............ */
|
||||
|
||||
/**
|
||||
|
||||
@@ -1272,6 +1272,34 @@ float BKE_nlastrip_compute_frame_to_next_strip(NlaStrip *strip)
|
||||
return limit_next;
|
||||
}
|
||||
|
||||
NlaStrip *BKE_nlastrip_next_in_track(struct NlaStrip *strip, bool skip_transitions)
|
||||
{
|
||||
NlaStrip *next = strip->next;
|
||||
while (next != NULL) {
|
||||
if (skip_transitions && (next->type & NLASTRIP_TYPE_TRANSITION)) {
|
||||
next = next->next;
|
||||
}
|
||||
else {
|
||||
return next;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
NlaStrip *BKE_nlastrip_prev_in_track(struct NlaStrip *strip, bool skip_transitions)
|
||||
{
|
||||
NlaStrip *prev = strip->prev;
|
||||
while (prev != NULL) {
|
||||
if (skip_transitions && (prev->type & NLASTRIP_TYPE_TRANSITION)) {
|
||||
prev = prev->prev;
|
||||
}
|
||||
else {
|
||||
return prev;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
NlaStrip *BKE_nlastrip_find_active(NlaTrack *nlt)
|
||||
{
|
||||
if (nlt == NULL) {
|
||||
|
||||
@@ -55,6 +55,29 @@ typedef struct TransDataNla {
|
||||
int handle;
|
||||
} TransDataNla;
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name Transform application to NLA strips
|
||||
* \{ */
|
||||
|
||||
/**
|
||||
* \brief Applies a translation to the given NlaStrip.
|
||||
* \param strip_rna_ptr The RNA pointer of the NLA strip to modify.
|
||||
* \param transdata The transformation info structure.
|
||||
*/
|
||||
static void applyTransformNLA_translation(PointerRNA *strip_rna_ptr, const TransDataNla *transdata)
|
||||
{
|
||||
/* NOTE: we write these twice to avoid truncation errors which can arise when
|
||||
* moving the strips a large distance using numeric input T33852.
|
||||
*/
|
||||
RNA_float_set(strip_rna_ptr, "frame_start", transdata->h1[0]);
|
||||
RNA_float_set(strip_rna_ptr, "frame_end", transdata->h2[0]);
|
||||
|
||||
RNA_float_set(strip_rna_ptr, "frame_start", transdata->h1[0]);
|
||||
RNA_float_set(strip_rna_ptr, "frame_end", transdata->h2[0]);
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name NLA Transform Creation
|
||||
* \{ */
|
||||
@@ -329,15 +352,8 @@ static void recalcData_nla(TransInfo *t)
|
||||
*
|
||||
* this is done as a iterative procedure (done 5 times max for now)
|
||||
*/
|
||||
NlaStrip *prev = strip->prev;
|
||||
while (prev != NULL && (prev->type & NLASTRIP_TYPE_TRANSITION)) {
|
||||
prev = prev->prev;
|
||||
}
|
||||
|
||||
NlaStrip *next = strip->next;
|
||||
while (next != NULL && (next->type & NLASTRIP_TYPE_TRANSITION)) {
|
||||
next = next->next;
|
||||
}
|
||||
NlaStrip *prev = BKE_nlastrip_prev_in_track(strip, true);
|
||||
NlaStrip *next = BKE_nlastrip_next_in_track(strip, true);
|
||||
|
||||
for (short iter = 0; iter < 5; iter++) {
|
||||
const bool pExceeded = (prev != NULL) && (tdn->h1[0] < prev->end);
|
||||
@@ -380,17 +396,10 @@ static void recalcData_nla(TransInfo *t)
|
||||
|
||||
/* Use RNA to write the values to ensure that constraints on these are obeyed
|
||||
* (e.g. for transition strips, the values are taken from the neighbors)
|
||||
*
|
||||
* NOTE: we write these twice to avoid truncation errors which can arise when
|
||||
* moving the strips a large distance using numeric input T33852.
|
||||
*/
|
||||
RNA_pointer_create(NULL, &RNA_NlaStrip, strip, &strip_ptr);
|
||||
|
||||
RNA_float_set(&strip_ptr, "frame_start", tdn->h1[0]);
|
||||
RNA_float_set(&strip_ptr, "frame_end", tdn->h2[0]);
|
||||
|
||||
RNA_float_set(&strip_ptr, "frame_start", tdn->h1[0]);
|
||||
RNA_float_set(&strip_ptr, "frame_end", tdn->h2[0]);
|
||||
applyTransformNLA_translation(&strip_ptr, tdn);
|
||||
|
||||
/* flush transforms to child strips (since this should be a meta) */
|
||||
BKE_nlameta_flush_transforms(strip);
|
||||
|
||||
Reference in New Issue
Block a user