OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/android/vr_shell/ui_elements.h" | 5 #include "chrome/browser/android/vr_shell/ui_elements.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "chrome/browser/android/vr_shell/animation.h" | |
11 #include "chrome/browser/android/vr_shell/vr_math.h" | |
12 | |
10 namespace vr_shell { | 13 namespace vr_shell { |
11 | 14 |
12 namespace { | 15 namespace { |
13 | 16 |
14 float GetRayPlaneIntersection(gvr::Vec3f ray_origin, | 17 float GetRayPlaneIntersection(gvr::Vec3f ray_origin, |
15 gvr::Vec3f ray_vector, | 18 gvr::Vec3f ray_vector, |
16 gvr::Vec3f plane_origin, | 19 gvr::Vec3f plane_origin, |
17 gvr::Vec3f plane_normal) { | 20 gvr::Vec3f plane_normal) { |
18 float denom = vr_shell::VectorDot(ray_vector, plane_normal); | 21 float denom = vr_shell::VectorDot(ray_vector, plane_normal); |
19 if (denom == 0) { | 22 if (denom == 0) { |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
79 float WorldRectangle::GetRayDistance(gvr::Vec3f ray_origin, | 82 float WorldRectangle::GetRayDistance(gvr::Vec3f ray_origin, |
80 gvr::Vec3f ray_vector) const { | 83 gvr::Vec3f ray_vector) const { |
81 return GetRayPlaneIntersection(ray_origin, ray_vector, GetCenter(), | 84 return GetRayPlaneIntersection(ray_origin, ray_vector, GetCenter(), |
82 GetNormal()); | 85 GetNormal()); |
83 } | 86 } |
84 | 87 |
85 ContentRectangle::ContentRectangle() = default; | 88 ContentRectangle::ContentRectangle() = default; |
86 | 89 |
87 ContentRectangle::~ContentRectangle() = default; | 90 ContentRectangle::~ContentRectangle() = default; |
88 | 91 |
92 void ContentRectangle::Animate(int64_t time) { | |
93 for (auto& it : animations) { | |
94 Animation& animation = *it; | |
95 if (time < animation.start) | |
96 continue; | |
97 | |
98 // If no "from" was specified, use the current value. | |
bshe
2016/09/12 15:38:26
s/"from"/|from|
| |
99 if (animation.from.size() == 0) { | |
100 switch (animation.property) { | |
101 case Animation::COPYRECT: | |
102 animation.from.push_back(copy_rect.x); | |
103 animation.from.push_back(copy_rect.y); | |
104 animation.from.push_back(copy_rect.width); | |
105 animation.from.push_back(copy_rect.height); | |
106 break; | |
107 case Animation::SIZE: | |
108 animation.from.push_back(size.x); | |
109 animation.from.push_back(size.y); | |
110 animation.from.push_back(size.z); | |
111 break; | |
112 case Animation::TRANSLATION: | |
113 animation.from.push_back(translation.x); | |
114 animation.from.push_back(translation.y); | |
115 animation.from.push_back(translation.z); | |
116 break; | |
117 case Animation::ROTATION: | |
118 animation.from.push_back(rotation_axis_angle[0]); | |
119 animation.from.push_back(rotation_axis_angle[1]); | |
120 animation.from.push_back(rotation_axis_angle[2]); | |
121 animation.from.push_back(rotation_axis_angle[3]); | |
122 break; | |
123 case Animation::UNUSED: | |
124 break; | |
125 } | |
126 } else { | |
127 DCHECK_EQ(animation.from.size(), animation.to.size()); | |
128 } | |
129 | |
130 std::vector<float> values(animation.from.size()); | |
131 for (std::size_t i = 0; i < animation.from.size(); ++i) { | |
132 if (animation.to[i] == animation.from[i] || | |
133 time >= (animation.start + animation.duration)) { | |
134 values[i] = animation.to[i]; | |
135 continue; | |
136 } | |
137 double value = animation.easing->CalculateValue( | |
138 (double)(time - animation.start) / (double)animation.duration); | |
139 values[i] = | |
140 animation.from[i] + (value * (animation.to[i] - animation.from[i])); | |
141 } | |
142 switch (animation.property) { | |
143 case Animation::COPYRECT: | |
144 DCHECK_EQ(animation.from.size(), 4UL); | |
145 copy_rect.x = values[0]; | |
146 copy_rect.y = values[1]; | |
147 copy_rect.width = values[2]; | |
148 copy_rect.height = values[3]; | |
149 break; | |
150 case Animation::SIZE: | |
151 DCHECK_EQ(animation.from.size(), 3UL); | |
152 size.x = values[0]; | |
153 size.y = values[1]; | |
154 size.z = values[2]; | |
155 break; | |
156 case Animation::TRANSLATION: | |
157 DCHECK_EQ(animation.from.size(), 3UL); | |
158 translation.x = values[0]; | |
159 translation.y = values[1]; | |
160 translation.z = values[2]; | |
161 break; | |
162 case Animation::ROTATION: | |
163 DCHECK_EQ(animation.from.size(), 4UL); | |
164 rotation_axis_angle[0] = values[0]; | |
165 rotation_axis_angle[1] = values[1]; | |
166 rotation_axis_angle[2] = values[2]; | |
167 rotation_axis_angle[3] = values[3]; | |
168 break; | |
169 case Animation::UNUSED: | |
170 break; | |
171 } | |
172 } | |
173 for (auto it = animations.begin(); it != animations.end();) { | |
bshe
2016/09/12 15:38:26
perhaps use "for (auto& it : animations)" to be co
cjgrant
2016/09/13 17:32:16
Here, we're managing the increment explicitly sinc
bshe
2016/09/13 19:37:22
hah. I see. Missed the erase here.
| |
174 const Animation& animation = **it; | |
175 if (time >= (animation.start + animation.duration)) { | |
176 it = animations.erase(it); | |
177 } else { | |
178 ++it; | |
179 } | |
180 } | |
181 } | |
182 | |
89 } // namespace vr_shell | 183 } // namespace vr_shell |
90 | 184 |
OLD | NEW |