Index: chrome/browser/android/vr_shell/ui_elements.cc |
diff --git a/chrome/browser/android/vr_shell/ui_elements.cc b/chrome/browser/android/vr_shell/ui_elements.cc |
index ce2bcbbc22c2b72095d2c963045fe24757047422..8b8d7f774f59f3cbe4134769e071da483f976b2f 100644 |
--- a/chrome/browser/android/vr_shell/ui_elements.cc |
+++ b/chrome/browser/android/vr_shell/ui_elements.cc |
@@ -5,7 +5,8 @@ |
#include "chrome/browser/android/vr_shell/ui_elements.h" |
#include <cmath> |
-#include <vector> |
+ |
+#include "chrome/browser/android/vr_shell/animation.h" |
namespace vr_shell { |
@@ -86,5 +87,95 @@ ContentRectangle::ContentRectangle() = default; |
ContentRectangle::~ContentRectangle() = default; |
+void ContentRectangle::Animate(int64_t time) { |
+ for (auto& it : animations) { |
+ Animation& animation = *it; |
David Trainor- moved to gerrit
2016/09/14 21:43:30
Does it make sense to push this logic into Animati
mthiesse
2016/09/14 22:15:21
(Full disclosure, I wrote this code originally :P)
cjgrant
2016/09/16 17:47:08
Personally, I'd like to keep Animation as basicall
|
+ if (time < animation.start) |
+ continue; |
+ |
+ // If |from| is not specified, start at the current values. |
+ if (animation.from.size() == 0) { |
+ switch (animation.property) { |
+ case Animation::COPYRECT: |
+ animation.from.push_back(copy_rect.x); |
+ animation.from.push_back(copy_rect.y); |
+ animation.from.push_back(copy_rect.width); |
+ animation.from.push_back(copy_rect.height); |
+ break; |
+ case Animation::SIZE: |
+ animation.from.push_back(size.x); |
+ animation.from.push_back(size.y); |
+ animation.from.push_back(size.z); |
+ break; |
+ case Animation::TRANSLATION: |
+ animation.from.push_back(translation.x); |
+ animation.from.push_back(translation.y); |
+ animation.from.push_back(translation.z); |
+ break; |
+ case Animation::ROTATION: |
+ animation.from.push_back(rotation_axis_angle[0]); |
+ animation.from.push_back(rotation_axis_angle[1]); |
+ animation.from.push_back(rotation_axis_angle[2]); |
+ animation.from.push_back(rotation_axis_angle[3]); |
+ break; |
+ case Animation::UNUSED: |
+ break; |
+ } |
+ } |
+ DCHECK_EQ(animation.from.size(), animation.to.size()); |
+ |
+ std::vector<float> values(animation.from.size()); |
+ for (std::size_t i = 0; i < animation.from.size(); ++i) { |
+ if (animation.to[i] == animation.from[i] || |
+ time >= (animation.start + animation.duration)) { |
+ values[i] = animation.to[i]; |
+ continue; |
+ } |
+ double value = animation.easing->CalculateValue( |
+ (double)(time - animation.start) / (double)animation.duration); |
+ values[i] = |
+ animation.from[i] + (value * (animation.to[i] - animation.from[i])); |
+ } |
+ switch (animation.property) { |
+ case Animation::COPYRECT: |
+ DCHECK_EQ(animation.from.size(), 4u); |
+ copy_rect.x = values[0]; |
+ copy_rect.y = values[1]; |
+ copy_rect.width = values[2]; |
+ copy_rect.height = values[3]; |
+ break; |
+ case Animation::SIZE: |
+ DCHECK_EQ(animation.from.size(), 3u); |
+ size.x = values[0]; |
+ size.y = values[1]; |
+ size.z = values[2]; |
+ break; |
+ case Animation::TRANSLATION: |
+ DCHECK_EQ(animation.from.size(), 3u); |
+ translation.x = values[0]; |
+ translation.y = values[1]; |
+ translation.z = values[2]; |
+ break; |
+ case Animation::ROTATION: |
+ DCHECK_EQ(animation.from.size(), 4u); |
+ rotation_axis_angle[0] = values[0]; |
+ rotation_axis_angle[1] = values[1]; |
+ rotation_axis_angle[2] = values[2]; |
+ rotation_axis_angle[3] = values[3]; |
+ break; |
+ case Animation::UNUSED: |
+ break; |
+ } |
+ } |
+ for (auto it = animations.begin(); it != animations.end();) { |
+ const Animation& animation = **it; |
+ if (time >= (animation.start + animation.duration)) { |
+ it = animations.erase(it); |
+ } else { |
+ ++it; |
+ } |
+ } |
+} |
+ |
} // namespace vr_shell |