blob: ddead5aab501ab4c16a58c2c12d8cbdc1bfad886 [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use crate::{
animation::KeyFrame,
core::{Core, Object, ObjectRef, OnAdded, Property},
math,
};
use super::Animator;
#[derive(Debug, Default)]
pub struct KeyFrameDouble {
key_frame: KeyFrame,
value: Property<f32>,
}
impl ObjectRef<'_, KeyFrameDouble> {
pub fn value(&self) -> f32 {
self.value.get()
}
pub fn set_value(&self, value: f32) {
self.value.set(value);
}
}
fn apply_double(core: Object, property_key: u64, mix: f32, value: f32) {
let core = core.as_ref();
let property = core
.get_property::<f32>(property_key as u16)
.expect("KeyFrameDouble references wrong property");
if mix == 1.0 {
core.animate(&core, property_key, &Animator::new(value));
} else {
core.animate(&core, property_key, &Animator::new(math::lerp(property.get(), value, mix)));
}
}
impl ObjectRef<'_, KeyFrameDouble> {
pub fn apply(&self, core: Object, property_key: u64, mix: f32) {
apply_double(core, property_key, mix, self.value());
}
pub fn apply_interpolation(
&self,
core: Object,
property_key: u64,
current_time: f32,
next_frame: ObjectRef<'_, KeyFrame>,
mix: f32,
) {
let key_frame = self.cast::<KeyFrame>();
let next_double = next_frame.cast::<KeyFrameDouble>();
let mut f =
(current_time - key_frame.seconds()) / (next_frame.seconds() - key_frame.seconds());
if let Some(cubic_interpolator) = key_frame.interpolator() {
f = cubic_interpolator.as_ref().transform(f);
}
apply_double(core, property_key, mix, math::lerp(self.value(), next_double.value(), f));
}
}
impl Core for KeyFrameDouble {
parent_types![(key_frame, KeyFrame)];
properties![(70, value, set_value), key_frame];
}
impl OnAdded for ObjectRef<'_, KeyFrameDouble> {
on_added!(KeyFrame);
}