Blender V5.0
blenkernel/intern/nla_test.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include "BLI_listbase.h"
6
7#include "BKE_nla.hh"
8
9#include "DNA_anim_types.h"
10
11#include "testing/testing.h"
12
13namespace blender::bke::tests {
14
16{
17 NlaStrip strip{};
18 strip.blendin = 4.0;
19 strip.blendout = 5.0;
20 strip.start = 1;
21 strip.end = 10;
22
23 /* Scaling a strip up doesn't affect the blend in/out value. */
24 strip.end = 20;
26 EXPECT_FLOAT_EQ(strip.blendin, 4.0);
27 EXPECT_FLOAT_EQ(strip.blendout, 5.0);
28
29 /* Scaling a strip down affects the blend-in value before the blend-out value. */
30 strip.end = 7;
32 EXPECT_FLOAT_EQ(strip.blendin, 1.0);
33 EXPECT_FLOAT_EQ(strip.blendout, 5.0);
34
35 /* Scaling a strip down to nothing updates the blend in/out values accordingly. */
36 strip.end = 1.1;
38 EXPECT_FLOAT_EQ(strip.blendin, 0.0);
39 EXPECT_FLOAT_EQ(strip.blendout, 0.1);
40}
41
43{
44 ListBase strips{};
45 NlaStrip strip1{};
46 strip1.start = 0;
47 strip1.end = 10;
48 strips.first = &strip1;
49
50 NlaStrip strip2{};
51 strip2.start = 5;
52 strip2.end = 10;
53
54 /* Can't add a null NLA strip to an NLA Track. */
55 EXPECT_FALSE(BKE_nlastrips_add_strip(&strips, nullptr));
56
57 /* Can't add an NLA strip to an NLA Track that overlaps another NLA strip. */
58 EXPECT_FALSE(BKE_nlastrips_add_strip(&strips, &strip2));
59
60 strip2.start = 15;
61 strip2.end = 20;
62 /* Can add an NLA strip to an NLA Track that doesn't overlaps another NLA strip. */
63 EXPECT_TRUE(BKE_nlastrips_add_strip(&strips, &strip2));
64}
65
67{
68 NlaStrip strip{};
69
70 strip.actstart = 2.0f;
71 strip.actend = 4.0f;
72 EXPECT_FLOAT_EQ(BKE_nla_clip_length_get_nonzero(&strip), 2.0f);
73
74 strip.actstart = 2.0f;
75 strip.actend = 3.0f;
76 EXPECT_FLOAT_EQ(BKE_nla_clip_length_get_nonzero(&strip), 1.0f);
77
78 strip.actstart = 2.0f;
79 strip.actend = 2.0625f;
80 EXPECT_FLOAT_EQ(BKE_nla_clip_length_get_nonzero(&strip), 0.0625f);
81
82 strip.actstart = 2.0f;
83 strip.actend = 2.0f;
84 EXPECT_FLOAT_EQ(BKE_nla_clip_length_get_nonzero(&strip), 1.0f);
85}
86
88{
89 float start, end;
90
91 start = 2.0f;
92 end = 4.0f;
94 EXPECT_FLOAT_EQ(end, 4.0f);
95
96 start = 2.0f;
97 end = 3.0f;
99 EXPECT_FLOAT_EQ(end, 3.0f);
100
101 start = 2.0f;
102 end = 2.0625f;
104 EXPECT_FLOAT_EQ(end, 2.0625f);
105
106 start = 2.0f;
107 end = 2.0f;
109 EXPECT_FLOAT_EQ(end, 3.0f);
110}
111
113{
114 NlaTrack track{};
115 ListBase strips{};
116 NlaStrip strip1{};
117 strip1.start = 0;
118 strip1.end = 10;
119
120 NlaStrip strip2{};
121 strip2.start = 11;
122 strip2.end = 20;
123
124 /* Add NLA strips to the NLATrack. */
125 BKE_nlastrips_add_strip(&strips, &strip1);
126 BKE_nlastrips_add_strip(&strips, &strip2);
127 track.strips = strips;
128
129 /* Ensure we have 2 strips in the track. */
131
132 BKE_nlatrack_remove_strip(&track, &strip2);
134 /* Ensure the correct strip was removed. */
135 EXPECT_EQ(-1, BLI_findindex(&track.strips, &strip2));
136}
137
139{
140 AnimData adt{};
141
142 /* Add NLA tracks to the Animation Data. */
143 NlaTrack *track1 = BKE_nlatrack_new_tail(&adt.nla_tracks, false);
144 NlaTrack *track2 = BKE_nlatrack_new_tail(&adt.nla_tracks, false);
145
146 /* Ensure we have 2 tracks in the track. */
148
149 BKE_nlatrack_remove_and_free(&adt.nla_tracks, track2, false);
151
152 /* Ensure the correct track was removed. */
153 EXPECT_EQ(-1, BLI_findindex(&adt.nla_tracks, track2));
154
155 /* Free the rest of the tracks, and ensure they are removed. */
156 BKE_nlatrack_remove_and_free(&adt.nla_tracks, track1, false);
158 EXPECT_EQ(-1, BLI_findindex(&adt.nla_tracks, track1));
159}
160
162{
163 AnimData adt{};
164 NlaTrack *trackB = BKE_nlatrack_new_tail(&adt.nla_tracks, false);
165 NlaTrack *trackA = BKE_nlatrack_new_tail(&adt.nla_tracks, false);
166
167 /* Expect that Track B was added before track A. */
168 EXPECT_EQ(1, BLI_findindex(&adt.nla_tracks, trackA));
169 EXPECT_EQ(0, BLI_findindex(&adt.nla_tracks, trackB));
170
171 /* Free the tracks. */
172 BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackA, false);
173 BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackB, false);
174}
175
177{
178 AnimData adt{};
179 NlaTrack *trackB = BKE_nlatrack_new_head(&adt.nla_tracks, false);
180 NlaTrack *trackA = BKE_nlatrack_new_head(&adt.nla_tracks, false);
181
182 /* Expect that Track A was added before track B. */
183 EXPECT_EQ(0, BLI_findindex(&adt.nla_tracks, trackA));
184 EXPECT_EQ(1, BLI_findindex(&adt.nla_tracks, trackB));
185
186 /* Free the tracks. */
187 BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackA, false);
188 BKE_nlatrack_remove_and_free(&adt.nla_tracks, trackB, false);
189}
190
191} // namespace blender::bke::tests
void BKE_nla_clip_length_ensure_nonzero(const float *actstart, float *r_actend)
void BKE_nlatrack_remove_strip(NlaTrack *track, NlaStrip *strip)
bool BKE_nlastrips_add_strip(ListBase *strips, NlaStrip *strip)
NlaTrack * BKE_nlatrack_new_tail(ListBase *nla_tracks, const bool is_liboverride)
void BKE_nlastrip_recalculate_blend(NlaStrip *strip)
NlaTrack * BKE_nlatrack_new_head(ListBase *nla_tracks, bool is_liboverride)
float BKE_nla_clip_length_get_nonzero(const NlaStrip *strip)
void BKE_nlatrack_remove_and_free(ListBase *tracks, NlaTrack *nlt, bool do_id_user)
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
int BLI_findindex(const ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:586
int BLI_listbase_count(const ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:524
TEST(action_groups, ReconstructGroupsWithReordering)
ListBase nla_tracks
void * first
ListBase strips