OLD | NEW |
1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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_scene.h" | 5 #include "chrome/browser/android/vr_shell/ui_scene.h" |
6 | 6 |
7 #define _USE_MATH_DEFINES // For M_PI in MSVC. | 7 #define _USE_MATH_DEFINES // For M_PI in MSVC. |
8 #include <cmath> | 8 #include <cmath> |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
(...skipping 21 matching lines...) Expand all Loading... |
32 base::TimeTicks usToTicks(uint64_t us) { | 32 base::TimeTicks usToTicks(uint64_t us) { |
33 return base::TimeTicks::FromInternalValue(us); | 33 return base::TimeTicks::FromInternalValue(us); |
34 } | 34 } |
35 | 35 |
36 base::TimeDelta usToDelta(uint64_t us) { | 36 base::TimeDelta usToDelta(uint64_t us) { |
37 return base::TimeDelta::FromInternalValue(us); | 37 return base::TimeDelta::FromInternalValue(us); |
38 } | 38 } |
39 | 39 |
40 void addElement(UiScene* scene, int id) { | 40 void addElement(UiScene* scene, int id) { |
41 auto element = base::MakeUnique<UiElement>(); | 41 auto element = base::MakeUnique<UiElement>(); |
42 element->id = id; | 42 element->set_id(id); |
43 scene->AddUiElement(std::move(element)); | 43 scene->AddUiElement(std::move(element)); |
44 } | 44 } |
45 | 45 |
46 void addAnimation(UiScene* scene, | 46 void addAnimation(UiScene* scene, |
47 int element_id, | 47 int element_id, |
48 int animation_id, | 48 int animation_id, |
49 Animation::Property property) { | 49 Animation::Property property) { |
50 std::unique_ptr<easing::Easing> easing = base::MakeUnique<easing::Linear>(); | 50 std::unique_ptr<easing::Easing> easing = base::MakeUnique<easing::Linear>(); |
51 std::vector<float> from = {}; | 51 std::vector<float> from = {}; |
52 std::vector<float> to = {1, 1, 1, 1}; | 52 std::vector<float> to = {1, 1, 1, 1}; |
(...skipping 28 matching lines...) Expand all Loading... |
81 scene.RemoveUiElement(0); | 81 scene.RemoveUiElement(0); |
82 scene.RemoveUiElement(99); | 82 scene.RemoveUiElement(99); |
83 EXPECT_EQ(scene.GetUiElements().size(), 0u); | 83 EXPECT_EQ(scene.GetUiElements().size(), 0u); |
84 } | 84 } |
85 | 85 |
86 TEST(UiScene, AddRemoveAnimations) { | 86 TEST(UiScene, AddRemoveAnimations) { |
87 UiScene scene; | 87 UiScene scene; |
88 addElement(&scene, 0); | 88 addElement(&scene, 0); |
89 auto* element = scene.GetUiElementById(0); | 89 auto* element = scene.GetUiElementById(0); |
90 | 90 |
91 EXPECT_EQ(element->animations.size(), 0u); | 91 EXPECT_EQ(element->animations().size(), 0u); |
92 addAnimation(&scene, 0, 0, Animation::Property::SIZE); | 92 addAnimation(&scene, 0, 0, Animation::Property::SIZE); |
93 EXPECT_EQ(element->animations.size(), 1u); | 93 EXPECT_EQ(element->animations().size(), 1u); |
94 EXPECT_EQ(element->animations[0]->property, Animation::Property::SIZE); | 94 EXPECT_EQ(element->animations()[0]->property, Animation::Property::SIZE); |
95 addAnimation(&scene, 0, 1, Animation::Property::SCALE); | 95 addAnimation(&scene, 0, 1, Animation::Property::SCALE); |
96 EXPECT_EQ(element->animations.size(), 2u); | 96 EXPECT_EQ(element->animations().size(), 2u); |
97 EXPECT_EQ(element->animations[1]->property, Animation::Property::SCALE); | 97 EXPECT_EQ(element->animations()[1]->property, Animation::Property::SCALE); |
98 | 98 |
99 scene.RemoveAnimation(0, 0); | 99 scene.RemoveAnimation(0, 0); |
100 EXPECT_EQ(element->animations.size(), 1u); | 100 EXPECT_EQ(element->animations().size(), 1u); |
101 EXPECT_EQ(element->animations[0]->property, Animation::Property::SCALE); | 101 EXPECT_EQ(element->animations()[0]->property, Animation::Property::SCALE); |
102 scene.RemoveAnimation(0, 1); | 102 scene.RemoveAnimation(0, 1); |
103 EXPECT_EQ(element->animations.size(), 0u); | 103 EXPECT_EQ(element->animations().size(), 0u); |
104 | 104 |
105 scene.RemoveAnimation(0, 0); | 105 scene.RemoveAnimation(0, 0); |
106 EXPECT_EQ(element->animations.size(), 0u); | 106 EXPECT_EQ(element->animations().size(), 0u); |
107 } | 107 } |
108 | 108 |
109 // This test creates a parent and child UI element, each with their own | 109 // This test creates a parent and child UI element, each with their own |
110 // transformations, and ensures that the child's computed total transform | 110 // transformations, and ensures that the child's computed total transform |
111 // incorporates the parent's transform as well as its own. | 111 // incorporates the parent's transform as well as its own. |
112 TEST(UiScene, ParentTransformAppliesToChild) { | 112 TEST(UiScene, ParentTransformAppliesToChild) { |
113 UiScene scene; | 113 UiScene scene; |
114 | 114 |
115 // Add a parent element, with distinct transformations. | 115 // Add a parent element, with distinct transformations. |
116 // Size of the parent should be ignored by the child. | 116 // Size of the parent should be ignored by the child. |
117 auto element = base::MakeUnique<UiElement>(); | 117 auto element = base::MakeUnique<UiElement>(); |
118 element->id = 0; | 118 element->set_id(0); |
119 element->size = {1000, 1000, 1}; | 119 element->set_size({1000, 1000, 1}); |
120 element->scale = {3, 3, 1}; | 120 element->set_scale({3, 3, 1}); |
121 element->rotation = {0, 0, 1, M_PI / 2}; | 121 element->set_rotation({0, 0, 1, M_PI / 2}); |
122 element->translation = {6, 1, 0}; | 122 element->set_translation({6, 1, 0}); |
123 scene.AddUiElement(std::move(element)); | 123 scene.AddUiElement(std::move(element)); |
124 | 124 |
125 // Add a child to the parent, with different transformations. | 125 // Add a child to the parent, with different transformations. |
126 element = base::MakeUnique<UiElement>(); | 126 element = base::MakeUnique<UiElement>(); |
127 element->id = 1; | 127 element->set_id(1); |
128 element->parent_id = 0; | 128 element->set_parent_id(0); |
129 element->size = {1, 1, 1}; | 129 element->set_size({1, 1, 1}); |
130 element->scale = {2, 2, 1}; | 130 element->set_scale({2, 2, 1}); |
131 element->rotation = {0, 0, 1, M_PI / 2}; | 131 element->set_rotation({0, 0, 1, M_PI / 2}); |
132 element->translation = {3, 0, 0}; | 132 element->set_translation({3, 0, 0}); |
133 scene.AddUiElement(std::move(element)); | 133 scene.AddUiElement(std::move(element)); |
134 const UiElement* child = scene.GetUiElementById(1); | 134 const UiElement* child = scene.GetUiElementById(1); |
135 | 135 |
136 const gfx::Vector3dF origin(0, 0, 0); | 136 const gfx::Vector3dF origin(0, 0, 0); |
137 const gfx::Vector3dF point(1, 0, 0); | 137 const gfx::Vector3dF point(1, 0, 0); |
138 | 138 |
139 scene.UpdateTransforms(usToTicks(0)); | 139 scene.UpdateTransforms(usToTicks(0)); |
140 auto new_origin = vr::MatrixVectorMul(child->TransformMatrix(), origin); | 140 auto new_origin = vr::MatrixVectorMul(child->TransformMatrix(), origin); |
141 auto new_point = vr::MatrixVectorMul(child->TransformMatrix(), point); | 141 auto new_point = vr::MatrixVectorMul(child->TransformMatrix(), point); |
142 EXPECT_VEC3F_NEAR(gfx::Vector3dF(6, 10, 0), new_origin); | 142 EXPECT_VEC3F_NEAR(gfx::Vector3dF(6, 10, 0), new_origin); |
143 EXPECT_VEC3F_NEAR(gfx::Vector3dF(0, 10, 0), new_point); | 143 EXPECT_VEC3F_NEAR(gfx::Vector3dF(0, 10, 0), new_point); |
144 } | 144 } |
145 | 145 |
146 TEST(UiScene, Opacity) { | 146 TEST(UiScene, Opacity) { |
147 UiScene scene; | 147 UiScene scene; |
148 | 148 |
149 auto element = base::MakeUnique<UiElement>(); | 149 auto element = base::MakeUnique<UiElement>(); |
150 element->id = 0; | 150 element->set_id(0); |
151 element->opacity = 0.5; | 151 element->set_opacity(0.5); |
152 scene.AddUiElement(std::move(element)); | 152 scene.AddUiElement(std::move(element)); |
153 | 153 |
154 element = base::MakeUnique<UiElement>(); | 154 element = base::MakeUnique<UiElement>(); |
155 element->id = 1; | 155 element->set_id(1); |
156 element->parent_id = 0; | 156 element->set_parent_id(0); |
157 element->opacity = 0.5; | 157 element->set_opacity(0.5); |
158 scene.AddUiElement(std::move(element)); | 158 scene.AddUiElement(std::move(element)); |
159 | 159 |
160 scene.UpdateTransforms(usToTicks(0)); | 160 scene.UpdateTransforms(usToTicks(0)); |
161 EXPECT_EQ(scene.GetUiElementById(0)->computed_opacity, 0.5f); | 161 EXPECT_EQ(0.5f, scene.GetUiElementById(0)->computed_opacity()); |
162 EXPECT_EQ(scene.GetUiElementById(1)->computed_opacity, 0.25f); | 162 EXPECT_EQ(0.25f, scene.GetUiElementById(1)->computed_opacity()); |
163 } | 163 } |
164 | 164 |
165 TEST(UiScene, LockToFov) { | 165 TEST(UiScene, LockToFov) { |
166 UiScene scene; | 166 UiScene scene; |
167 | 167 |
168 auto element = base::MakeUnique<UiElement>(); | 168 auto element = base::MakeUnique<UiElement>(); |
169 element->id = 0; | 169 element->set_id(0); |
170 element->lock_to_fov = true; | 170 element->set_lock_to_fov(true); |
171 scene.AddUiElement(std::move(element)); | 171 scene.AddUiElement(std::move(element)); |
172 | 172 |
173 element = base::MakeUnique<UiElement>(); | 173 element = base::MakeUnique<UiElement>(); |
174 element->id = 1; | 174 element->set_id(1); |
175 element->parent_id = 0; | 175 element->set_parent_id(0); |
176 element->lock_to_fov = false; | 176 element->set_lock_to_fov(false); |
177 scene.AddUiElement(std::move(element)); | 177 scene.AddUiElement(std::move(element)); |
178 | 178 |
179 scene.UpdateTransforms(usToTicks(0)); | 179 scene.UpdateTransforms(usToTicks(0)); |
180 EXPECT_EQ(scene.GetUiElementById(0)->computed_lock_to_fov, true); | 180 EXPECT_TRUE(scene.GetUiElementById(0)->computed_lock_to_fov()); |
181 EXPECT_EQ(scene.GetUiElementById(1)->computed_lock_to_fov, true); | 181 EXPECT_TRUE(scene.GetUiElementById(1)->computed_lock_to_fov()); |
182 } | 182 } |
183 | 183 |
184 typedef struct { | 184 typedef struct { |
185 XAnchoring x_anchoring; | 185 XAnchoring x_anchoring; |
186 YAnchoring y_anchoring; | 186 YAnchoring y_anchoring; |
187 float expected_x; | 187 float expected_x; |
188 float expected_y; | 188 float expected_y; |
189 } AnchoringTestCase; | 189 } AnchoringTestCase; |
190 | 190 |
191 class AnchoringTest : public ::testing::TestWithParam<AnchoringTestCase> {}; | 191 class AnchoringTest : public ::testing::TestWithParam<AnchoringTestCase> {}; |
192 | 192 |
193 TEST_P(AnchoringTest, VerifyCorrectPosition) { | 193 TEST_P(AnchoringTest, VerifyCorrectPosition) { |
194 UiScene scene; | 194 UiScene scene; |
195 | 195 |
196 // Create a parent element with non-unity size and scale. | 196 // Create a parent element with non-unity size and scale. |
197 auto element = base::MakeUnique<UiElement>(); | 197 auto element = base::MakeUnique<UiElement>(); |
198 element->id = 0; | 198 element->set_id(0); |
199 element->size = {2, 2, 1}; | 199 element->set_size({2, 2, 1}); |
200 element->scale = {2, 2, 1}; | 200 element->set_scale({2, 2, 1}); |
201 scene.AddUiElement(std::move(element)); | 201 scene.AddUiElement(std::move(element)); |
202 | 202 |
203 // Add a child to the parent, with anchoring. | 203 // Add a child to the parent, with anchoring. |
204 element = base::MakeUnique<UiElement>(); | 204 element = base::MakeUnique<UiElement>(); |
205 element->id = 1; | 205 element->set_id(1); |
206 element->parent_id = 0; | 206 element->set_parent_id(0); |
207 element->x_anchoring = GetParam().x_anchoring; | 207 element->set_x_anchoring(GetParam().x_anchoring); |
208 element->y_anchoring = GetParam().y_anchoring; | 208 element->set_y_anchoring(GetParam().y_anchoring); |
209 scene.AddUiElement(std::move(element)); | 209 scene.AddUiElement(std::move(element)); |
210 | 210 |
211 scene.UpdateTransforms(usToTicks(0)); | 211 scene.UpdateTransforms(usToTicks(0)); |
212 const UiElement* child = scene.GetUiElementById(1); | 212 const UiElement* child = scene.GetUiElementById(1); |
213 EXPECT_NEAR(child->GetCenter().x(), GetParam().expected_x, TOLERANCE); | 213 EXPECT_NEAR(GetParam().expected_x, child->GetCenter().x(), TOLERANCE); |
214 EXPECT_NEAR(child->GetCenter().y(), GetParam().expected_y, TOLERANCE); | 214 EXPECT_NEAR(GetParam().expected_y, child->GetCenter().y(), TOLERANCE); |
215 scene.RemoveUiElement(1); | 215 scene.RemoveUiElement(1); |
216 } | 216 } |
217 | 217 |
218 const std::vector<AnchoringTestCase> anchoring_test_cases = { | 218 const std::vector<AnchoringTestCase> anchoring_test_cases = { |
219 {XAnchoring::XNONE, YAnchoring::YNONE, 0, 0}, | 219 {XAnchoring::XNONE, YAnchoring::YNONE, 0, 0}, |
220 {XAnchoring::XLEFT, YAnchoring::YNONE, -2, 0}, | 220 {XAnchoring::XLEFT, YAnchoring::YNONE, -2, 0}, |
221 {XAnchoring::XRIGHT, YAnchoring::YNONE, 2, 0}, | 221 {XAnchoring::XRIGHT, YAnchoring::YNONE, 2, 0}, |
222 {XAnchoring::XNONE, YAnchoring::YTOP, 0, 2}, | 222 {XAnchoring::XNONE, YAnchoring::YTOP, 0, 2}, |
223 {XAnchoring::XNONE, YAnchoring::YBOTTOM, 0, -2}, | 223 {XAnchoring::XNONE, YAnchoring::YBOTTOM, 0, -2}, |
224 {XAnchoring::XLEFT, YAnchoring::YTOP, -2, 2}, | 224 {XAnchoring::XLEFT, YAnchoring::YTOP, -2, 2}, |
225 }; | 225 }; |
226 | 226 |
227 INSTANTIATE_TEST_CASE_P(AnchoringTestCases, | 227 INSTANTIATE_TEST_CASE_P(AnchoringTestCases, |
228 AnchoringTest, | 228 AnchoringTest, |
229 ::testing::ValuesIn(anchoring_test_cases)); | 229 ::testing::ValuesIn(anchoring_test_cases)); |
230 | 230 |
231 } // namespace vr_shell | 231 } // namespace vr_shell |
OLD | NEW |