Skip to content

Commit 1f0de00

Browse files
committed
Support overriding global interpolation for individual entities
1 parent d02c1ab commit 1f0de00

File tree

2 files changed

+81
-16
lines changed

2 files changed

+81
-16
lines changed

src/interpolation.rs

Lines changed: 69 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
use crate::{RotationEasingState, ScaleEasingState, TranslationEasingState};
1+
#![allow(clippy::type_complexity)]
2+
3+
use crate::*;
24
use bevy::{
35
ecs::component::{ComponentHooks, StorageType},
46
prelude::*,
@@ -90,48 +92,102 @@ impl Component for ScaleInterpolation {
9092
}
9193
}
9294

93-
pub fn update_translation_interpolation_start(
94-
mut query: Query<(&Transform, &mut TranslationEasingState), With<TranslationInterpolation>>,
95+
/// Explicitly marks this entity as having translation interpolation disabled.
96+
///
97+
/// This can be used to override [`TransformInterpolationPlugin::global_translation_interpolation`]
98+
/// for this entity if the option is `true`.
99+
#[derive(Component, Clone, Copy, Debug, Default, PartialEq, Eq, Reflect)]
100+
#[reflect(Component, Debug, Default)]
101+
pub struct NoTranslationInterpolation;
102+
103+
/// Explicitly marks this entity as having rotation interpolation disabled.
104+
///
105+
/// This can be used to override [`TransformInterpolationPlugin::global_rotation_interpolation`]
106+
/// for this entity if the option is `true`.
107+
#[derive(Component, Clone, Copy, Debug, Default, PartialEq, Eq, Reflect)]
108+
#[reflect(Component, Debug, Default)]
109+
pub struct NoRotationInterpolation;
110+
111+
/// Explicitly marks this entity as having scale interpolation disabled.
112+
///
113+
/// This can be used to override [`TransformInterpolationPlugin::global_scale_interpolation`]
114+
/// for this entity if the option is `true`.
115+
#[derive(Component, Clone, Copy, Debug, Default, PartialEq, Eq, Reflect)]
116+
#[reflect(Component, Debug, Default)]
117+
pub struct NoScaleInterpolation;
118+
119+
pub(crate) fn update_translation_interpolation_start(
120+
mut query: Query<
121+
(&Transform, &mut TranslationEasingState),
122+
(
123+
With<TranslationInterpolation>,
124+
Without<NoTranslationInterpolation>,
125+
),
126+
>,
95127
) {
96128
for (transform, mut easing) in &mut query {
97129
easing.start = Some(transform.translation);
98130
}
99131
}
100132

101-
pub fn update_translation_interpolation_end(
102-
mut query: Query<(&Transform, &mut TranslationEasingState), With<TranslationInterpolation>>,
133+
pub(crate) fn update_translation_interpolation_end(
134+
mut query: Query<
135+
(&Transform, &mut TranslationEasingState),
136+
(
137+
With<TranslationInterpolation>,
138+
Without<NoTranslationInterpolation>,
139+
),
140+
>,
103141
) {
104142
for (transform, mut easing) in &mut query {
105143
easing.end = Some(transform.translation);
106144
}
107145
}
108146

109-
pub fn update_rotation_interpolation_start(
110-
mut query: Query<(&Transform, &mut RotationEasingState), With<RotationInterpolation>>,
147+
pub(crate) fn update_rotation_interpolation_start(
148+
mut query: Query<
149+
(&Transform, &mut RotationEasingState),
150+
(
151+
With<RotationInterpolation>,
152+
Without<NoRotationInterpolation>,
153+
),
154+
>,
111155
) {
112156
for (transform, mut easing) in &mut query {
113157
easing.start = Some(transform.rotation);
114158
}
115159
}
116160

117-
pub fn update_rotation_interpolation_end(
118-
mut query: Query<(&Transform, &mut RotationEasingState), With<RotationInterpolation>>,
161+
pub(crate) fn update_rotation_interpolation_end(
162+
mut query: Query<
163+
(&Transform, &mut RotationEasingState),
164+
(
165+
With<RotationInterpolation>,
166+
Without<NoRotationInterpolation>,
167+
),
168+
>,
119169
) {
120170
for (transform, mut easing) in &mut query {
121171
easing.end = Some(transform.rotation);
122172
}
123173
}
124174

125-
pub fn update_scale_interpolation_start(
126-
mut query: Query<(&Transform, &mut ScaleEasingState), With<ScaleInterpolation>>,
175+
pub(crate) fn update_scale_interpolation_start(
176+
mut query: Query<
177+
(&Transform, &mut ScaleEasingState),
178+
(With<ScaleInterpolation>, Without<NoScaleInterpolation>),
179+
>,
127180
) {
128181
for (transform, mut easing) in &mut query {
129182
easing.start = Some(transform.scale);
130183
}
131184
}
132185

133-
pub fn update_scale_interpolation_end(
134-
mut query: Query<(&Transform, &mut ScaleEasingState), With<ScaleInterpolation>>,
186+
pub(crate) fn update_scale_interpolation_end(
187+
mut query: Query<
188+
(&Transform, &mut ScaleEasingState),
189+
(With<ScaleInterpolation>, Without<NoScaleInterpolation>),
190+
>,
135191
) {
136192
for (transform, mut easing) in &mut query {
137193
easing.end = Some(transform.scale);

src/lib.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,17 @@ pub use interpolation::*;
88
/// Performs transform interpolation.
99
#[derive(Debug, Default)]
1010
pub struct TransformInterpolationPlugin {
11+
/// If `true`, translation will be interpolated for all entities with the [`Transform`] component by default.
12+
///
13+
/// This can be overridden for individual entities by adding the [`NoTranslationInterpolation`] component.
1114
pub global_translation_interpolation: bool,
15+
/// If `true`, rotation will be interpolated for all entities with the [`Transform`] component by default.
16+
///
17+
/// This can be overridden for individual entities by adding the [`NoRotationInterpolation`] component.
1218
pub global_rotation_interpolation: bool,
19+
/// If `true`, scale will be interpolated for all entities with the [`Transform`] component by default.
20+
///
21+
/// This can be overridden for individual entities by adding the [`NoScaleInterpolation`] component.
1322
pub global_scale_interpolation: bool,
1423
}
1524

@@ -28,7 +37,7 @@ impl Plugin for TransformInterpolationPlugin {
2837

2938
app.configure_sets(
3039
PostUpdate,
31-
TransformInterpolationSet.before(TransformSystem::TransformPropagate),
40+
TransformEasingSet.before(TransformSystem::TransformPropagate),
3241
);
3342

3443
app.add_systems(
@@ -58,7 +67,7 @@ impl Plugin for TransformInterpolationPlugin {
5867

5968
app.add_systems(
6069
PostUpdate,
61-
(ease_translation, ease_rotation, ease_scale).in_set(TransformInterpolationSet),
70+
(ease_translation, ease_rotation, ease_scale).in_set(TransformEasingSet),
6271
);
6372

6473
let interpolate_translation = self.global_translation_interpolation;
@@ -89,7 +98,7 @@ impl Plugin for TransformInterpolationPlugin {
8998
///
9099
/// [transform interpolation]: TransformInterpolation
91100
#[derive(SystemSet, Clone, Copy, Debug, PartialEq, Eq, Hash)]
92-
pub struct TransformInterpolationSet;
101+
pub struct TransformEasingSet;
93102

94103
/// Stores the start and end states used for interpolating the translation of an entity.
95104
/// The change in translation is smoothed from `start` to `end` in between [`FixedUpdate`] runs.

0 commit comments

Comments
 (0)