Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(455)

Side by Side Diff: chrome/browser/android/vr_shell/ui_scene.cc

Issue 2777633003: Avoid duplicate math when computing VR scene hierarchy. (Closed)
Patch Set: s/GetTransform()/mutable_transform()/ Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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_scene.h" 5 #include "chrome/browser/android/vr_shell/ui_scene.h"
6 6
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 case Command::CONFIGURE_SCENE: 321 case Command::CONFIGURE_SCENE:
322 ParseColorf(*data, "backgroundColor", &background_color_); 322 ParseColorf(*data, "backgroundColor", &background_color_);
323 ParseFloat(*data, "backgroundDistance", &background_distance_); 323 ParseFloat(*data, "backgroundDistance", &background_distance_);
324 data->GetBoolean("drawWebVr", &webvr_rendering_enabled_); 324 data->GetBoolean("drawWebVr", &webvr_rendering_enabled_);
325 break; 325 break;
326 } 326 }
327 } 327 }
328 } 328 }
329 329
330 void UiScene::UpdateTransforms(int64_t time_in_micro) { 330 void UiScene::UpdateTransforms(int64_t time_in_micro) {
331 // Process all animations before calculating object transforms.
332 for (auto& element : ui_elements_) { 331 for (auto& element : ui_elements_) {
332 // Process all animations before calculating object transforms.
333 element->Animate(time_in_micro); 333 element->Animate(time_in_micro);
334 element->dirty = true;
334 } 335 }
335 for (auto& element : ui_elements_) { 336 for (auto& element : ui_elements_) {
336 Transform transform; 337 ApplyRecursiveTransforms(element.get());
337 transform.MakeIdentity();
338 transform.Scale(element->size.x, element->size.y, element->size.z);
339 element->computed_opacity = 1.0f;
340 element->computed_lock_to_fov = false;
341 ApplyRecursiveTransforms(*element.get(), &transform,
342 &element->computed_opacity,
343 &element->computed_lock_to_fov);
344 element->SetTransform(transform);
345 } 338 }
346 } 339 }
347 340
348 ContentRectangle* UiScene::GetUiElementById(int element_id) { 341 ContentRectangle* UiScene::GetUiElementById(int element_id) {
349 for (auto& element : ui_elements_) { 342 for (auto& element : ui_elements_) {
350 if (element->id == element_id) { 343 if (element->id == element_id) {
351 return element.get(); 344 return element.get();
352 } 345 }
353 } 346 }
354 return nullptr; 347 return nullptr;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 385
393 const std::vector<std::unique_ptr<ContentRectangle>>& UiScene::GetUiElements() 386 const std::vector<std::unique_ptr<ContentRectangle>>& UiScene::GetUiElements()
394 const { 387 const {
395 return ui_elements_; 388 return ui_elements_;
396 } 389 }
397 390
398 UiScene::UiScene() = default; 391 UiScene::UiScene() = default;
399 392
400 UiScene::~UiScene() = default; 393 UiScene::~UiScene() = default;
401 394
402 void UiScene::ApplyRecursiveTransforms(const ContentRectangle& element, 395 void UiScene::ApplyRecursiveTransforms(ContentRectangle* element) {
403 Transform* transform, 396 if (!element->dirty)
404 float* opacity, 397 return;
405 bool* lock_to_fov) {
406 transform->Scale(element.scale.x, element.scale.y, element.scale.z);
407 transform->Rotate(element.rotation.x, element.rotation.y, element.rotation.z,
408 element.rotation.angle);
409 transform->Translate(element.translation.x, element.translation.y,
410 element.translation.z);
411 *opacity *= element.opacity;
412 // Head-locked state inherited from a parent element.
413 *lock_to_fov = element.lock_to_fov;
414 398
415 if (element.parent_id >= 0) { 399 ContentRectangle* parent = nullptr;
416 const ContentRectangle* parent = GetUiElementById(element.parent_id); 400 if (element->parent_id >= 0) {
401 parent = GetUiElementById(element->parent_id);
417 CHECK(parent != nullptr); 402 CHECK(parent != nullptr);
418 ApplyAnchoring(*parent, element.x_anchoring, element.y_anchoring,
419 transform);
420 ApplyRecursiveTransforms(*parent, transform, opacity, lock_to_fov);
421 } 403 }
404
405 Transform* transform = element->mutable_transform();
406 transform->MakeIdentity();
407 transform->Scale(element->size.x, element->size.y, element->size.z);
408 element->computed_opacity = element->opacity;
409 element->computed_lock_to_fov = element->lock_to_fov;
410
411 // Compute an inheritable transformation that can be applied to this element,
412 // and it's children, if applicable.
413 Transform* inheritable = &element->inheritable_transform;
414 inheritable->MakeIdentity();
415 inheritable->Scale(element->scale.x, element->scale.y, element->scale.z);
416 inheritable->Rotate(element->rotation.x, element->rotation.y,
417 element->rotation.z, element->rotation.angle);
418 inheritable->Translate(element->translation.x, element->translation.y,
419 element->translation.z);
420 if (parent) {
421 ApplyAnchoring(*parent, element->x_anchoring, element->y_anchoring,
422 inheritable);
423 ApplyRecursiveTransforms(parent);
424 inheritable->to_world = MatrixMul(parent->inheritable_transform.to_world,
425 inheritable->to_world);
426
427 element->computed_opacity *= parent->opacity;
428 element->computed_lock_to_fov = parent->lock_to_fov;
429 }
430
431 transform->to_world = MatrixMul(inheritable->to_world, transform->to_world);
432 element->dirty = false;
422 } 433 }
423 434
424 void UiScene::ApplyDictToElement(const base::DictionaryValue& dict, 435 void UiScene::ApplyDictToElement(const base::DictionaryValue& dict,
425 ContentRectangle* element) { 436 ContentRectangle* element) {
426 int parent_id; 437 int parent_id;
427 438
428 if (ParseInt(dict, "parentId", &parent_id)) { 439 if (ParseInt(dict, "parentId", &parent_id)) {
429 CHECK_GE(parent_id, 0); 440 CHECK_GE(parent_id, 0);
430 CHECK_NE(GetUiElementById(parent_id), nullptr); 441 CHECK_NE(GetUiElementById(parent_id), nullptr);
431 element->parent_id = parent_id; 442 element->parent_id = parent_id;
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 content_element_ = element; 500 content_element_ = element;
490 break; 501 break;
491 default: 502 default:
492 element->fill = Fill::NONE; 503 element->fill = Fill::NONE;
493 break; 504 break;
494 } 505 }
495 } 506 }
496 } 507 }
497 508
498 } // namespace vr_shell 509 } // namespace vr_shell
OLDNEW
« no previous file with comments | « chrome/browser/android/vr_shell/ui_scene.h ('k') | chrome/browser/android/vr_shell/ui_scene_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698