| 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_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" |
| 11 #include "base/time/time.h" | 11 #include "base/time/time.h" |
| 12 #include "base/values.h" | 12 #include "base/values.h" |
| 13 #include "chrome/browser/android/vr_shell/animation.h" | 13 #include "chrome/browser/android/vr_shell/animation.h" |
| 14 #include "chrome/browser/android/vr_shell/easing.h" | 14 #include "chrome/browser/android/vr_shell/easing.h" |
| 15 #include "chrome/browser/android/vr_shell/ui_elements.h" | 15 #include "chrome/browser/android/vr_shell/ui_elements.h" |
| 16 #include "device/vr/vr_math.h" |
| 16 | 17 |
| 17 namespace vr_shell { | 18 namespace vr_shell { |
| 18 | 19 |
| 19 namespace { | 20 namespace { |
| 20 | 21 |
| 21 // Parse an integer to an int or enum value. | 22 // Parse an integer to an int or enum value. |
| 22 template <typename T> | 23 template <typename T> |
| 23 bool ParseInt(const base::DictionaryValue& dict, | 24 bool ParseInt(const base::DictionaryValue& dict, |
| 24 const std::string& key, | 25 const std::string& key, |
| 25 T* output) { | 26 T* output) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 39 double value; | 40 double value; |
| 40 if (!dict.GetDouble(key, &value)) { | 41 if (!dict.GetDouble(key, &value)) { |
| 41 return false; | 42 return false; |
| 42 } | 43 } |
| 43 *output = value; | 44 *output = value; |
| 44 return true; | 45 return true; |
| 45 } | 46 } |
| 46 | 47 |
| 47 bool ParseColorf(const base::DictionaryValue& dict, | 48 bool ParseColorf(const base::DictionaryValue& dict, |
| 48 const std::string& key, | 49 const std::string& key, |
| 49 Colorf* output) { | 50 vr::Colorf* output) { |
| 50 const base::DictionaryValue* item_dict; | 51 const base::DictionaryValue* item_dict; |
| 51 if (dict.GetDictionary(key, &item_dict)) { | 52 if (dict.GetDictionary(key, &item_dict)) { |
| 52 double value; | 53 double value; |
| 53 CHECK(item_dict->GetDouble("r", &value)); | 54 CHECK(item_dict->GetDouble("r", &value)); |
| 54 output->r = value; | 55 output->r = value; |
| 55 CHECK(item_dict->GetDouble("g", &value)); | 56 CHECK(item_dict->GetDouble("g", &value)); |
| 56 output->g = value; | 57 output->g = value; |
| 57 CHECK(item_dict->GetDouble("b", &value)); | 58 CHECK(item_dict->GetDouble("b", &value)); |
| 58 output->b = value; | 59 output->b = value; |
| 59 CHECK(item_dict->GetDouble("a", &value)); | 60 CHECK(item_dict->GetDouble("a", &value)); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 142 } | 143 } |
| 143 | 144 |
| 144 void ApplyAnchoring(const ContentRectangle& parent, | 145 void ApplyAnchoring(const ContentRectangle& parent, |
| 145 XAnchoring x_anchoring, | 146 XAnchoring x_anchoring, |
| 146 YAnchoring y_anchoring, | 147 YAnchoring y_anchoring, |
| 147 Transform* transform) { | 148 Transform* transform) { |
| 148 // To anchor a child, use the parent's size to find its edge. | 149 // To anchor a child, use the parent's size to find its edge. |
| 149 float x_offset; | 150 float x_offset; |
| 150 switch (x_anchoring) { | 151 switch (x_anchoring) { |
| 151 case XLEFT: | 152 case XLEFT: |
| 152 x_offset = -0.5f * parent.size.x; | 153 x_offset = -0.5f * parent.size.x(); |
| 153 break; | 154 break; |
| 154 case XRIGHT: | 155 case XRIGHT: |
| 155 x_offset = 0.5f * parent.size.x; | 156 x_offset = 0.5f * parent.size.x(); |
| 156 break; | 157 break; |
| 157 case XNONE: | 158 case XNONE: |
| 158 x_offset = 0.0f; | 159 x_offset = 0.0f; |
| 159 break; | 160 break; |
| 160 } | 161 } |
| 161 float y_offset; | 162 float y_offset; |
| 162 switch (y_anchoring) { | 163 switch (y_anchoring) { |
| 163 case YTOP: | 164 case YTOP: |
| 164 y_offset = 0.5f * parent.size.y; | 165 y_offset = 0.5f * parent.size.y(); |
| 165 break; | 166 break; |
| 166 case YBOTTOM: | 167 case YBOTTOM: |
| 167 y_offset = -0.5f * parent.size.y; | 168 y_offset = -0.5f * parent.size.y(); |
| 168 break; | 169 break; |
| 169 case YNONE: | 170 case YNONE: |
| 170 y_offset = 0.0f; | 171 y_offset = 0.0f; |
| 171 break; | 172 break; |
| 172 } | 173 } |
| 173 transform->Translate(x_offset, y_offset, 0); | 174 transform->Translate(gfx::Vector3dF(x_offset, y_offset, 0)); |
| 174 } | 175 } |
| 175 | 176 |
| 176 } // namespace | 177 } // namespace |
| 177 | 178 |
| 178 void UiScene::AddUiElement(std::unique_ptr<ContentRectangle> element) { | 179 void UiScene::AddUiElement(std::unique_ptr<ContentRectangle> element) { |
| 179 CHECK_GE(element->id, 0); | 180 CHECK_GE(element->id, 0); |
| 180 CHECK_EQ(GetUiElementById(element->id), nullptr); | 181 CHECK_EQ(GetUiElementById(element->id), nullptr); |
| 181 if (element->parent_id >= 0) { | 182 if (element->parent_id >= 0) { |
| 182 CHECK_NE(GetUiElementById(element->parent_id), nullptr); | 183 CHECK_NE(GetUiElementById(element->parent_id), nullptr); |
| 183 } else { | 184 } else { |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 elements.push_back(element.get()); | 367 elements.push_back(element.get()); |
| 367 } | 368 } |
| 368 } | 369 } |
| 369 return elements; | 370 return elements; |
| 370 } | 371 } |
| 371 | 372 |
| 372 bool UiScene::HasVisibleHeadLockedElements() const { | 373 bool UiScene::HasVisibleHeadLockedElements() const { |
| 373 return !GetHeadLockedElements().empty(); | 374 return !GetHeadLockedElements().empty(); |
| 374 } | 375 } |
| 375 | 376 |
| 376 const Colorf& UiScene::GetBackgroundColor() const { | 377 const vr::Colorf& UiScene::GetBackgroundColor() const { |
| 377 return background_color_; | 378 return background_color_; |
| 378 } | 379 } |
| 379 | 380 |
| 380 float UiScene::GetBackgroundDistance() const { | 381 float UiScene::GetBackgroundDistance() const { |
| 381 return background_distance_; | 382 return background_distance_; |
| 382 } | 383 } |
| 383 | 384 |
| 384 bool UiScene::GetWebVrRenderingEnabled() const { | 385 bool UiScene::GetWebVrRenderingEnabled() const { |
| 385 return webvr_rendering_enabled_; | 386 return webvr_rendering_enabled_; |
| 386 } | 387 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 399 return; | 400 return; |
| 400 | 401 |
| 401 ContentRectangle* parent = nullptr; | 402 ContentRectangle* parent = nullptr; |
| 402 if (element->parent_id >= 0) { | 403 if (element->parent_id >= 0) { |
| 403 parent = GetUiElementById(element->parent_id); | 404 parent = GetUiElementById(element->parent_id); |
| 404 CHECK(parent != nullptr); | 405 CHECK(parent != nullptr); |
| 405 } | 406 } |
| 406 | 407 |
| 407 Transform* transform = element->mutable_transform(); | 408 Transform* transform = element->mutable_transform(); |
| 408 transform->MakeIdentity(); | 409 transform->MakeIdentity(); |
| 409 transform->Scale(element->size.x, element->size.y, element->size.z); | 410 transform->Scale(element->size); |
| 410 element->computed_opacity = element->opacity; | 411 element->computed_opacity = element->opacity; |
| 411 element->computed_lock_to_fov = element->lock_to_fov; | 412 element->computed_lock_to_fov = element->lock_to_fov; |
| 412 | 413 |
| 413 // Compute an inheritable transformation that can be applied to this element, | 414 // Compute an inheritable transformation that can be applied to this element, |
| 414 // and it's children, if applicable. | 415 // and it's children, if applicable. |
| 415 Transform* inheritable = &element->inheritable_transform; | 416 Transform* inheritable = &element->inheritable_transform; |
| 416 inheritable->MakeIdentity(); | 417 inheritable->MakeIdentity(); |
| 417 inheritable->Scale(element->scale.x, element->scale.y, element->scale.z); | 418 inheritable->Scale(element->scale); |
| 418 inheritable->Rotate(element->rotation.x, element->rotation.y, | 419 inheritable->Rotate(element->rotation); |
| 419 element->rotation.z, element->rotation.angle); | 420 inheritable->Translate(element->translation); |
| 420 inheritable->Translate(element->translation.x, element->translation.y, | |
| 421 element->translation.z); | |
| 422 if (parent) { | 421 if (parent) { |
| 423 ApplyAnchoring(*parent, element->x_anchoring, element->y_anchoring, | 422 ApplyAnchoring(*parent, element->x_anchoring, element->y_anchoring, |
| 424 inheritable); | 423 inheritable); |
| 425 ApplyRecursiveTransforms(parent); | 424 ApplyRecursiveTransforms(parent); |
| 426 inheritable->to_world = MatrixMul(parent->inheritable_transform.to_world, | 425 vr::MatrixMul(parent->inheritable_transform.to_world, inheritable->to_world, |
| 427 inheritable->to_world); | 426 &inheritable->to_world); |
| 428 | 427 |
| 429 element->computed_opacity *= parent->opacity; | 428 element->computed_opacity *= parent->opacity; |
| 430 element->computed_lock_to_fov = parent->lock_to_fov; | 429 element->computed_lock_to_fov = parent->lock_to_fov; |
| 431 } | 430 } |
| 432 | 431 |
| 433 transform->to_world = MatrixMul(inheritable->to_world, transform->to_world); | 432 vr::MatrixMul(inheritable->to_world, transform->to_world, |
| 433 &transform->to_world); |
| 434 element->dirty = false; | 434 element->dirty = false; |
| 435 } | 435 } |
| 436 | 436 |
| 437 void UiScene::ApplyDictToElement(const base::DictionaryValue& dict, | 437 void UiScene::ApplyDictToElement(const base::DictionaryValue& dict, |
| 438 ContentRectangle* element) { | 438 ContentRectangle* element) { |
| 439 int parent_id; | 439 int parent_id; |
| 440 | 440 |
| 441 if (ParseInt(dict, "parentId", &parent_id)) { | 441 if (ParseInt(dict, "parentId", &parent_id)) { |
| 442 CHECK_GE(parent_id, 0); | 442 CHECK_GE(parent_id, 0); |
| 443 CHECK_NE(GetUiElementById(parent_id), nullptr); | 443 CHECK_NE(GetUiElementById(parent_id), nullptr); |
| 444 element->parent_id = parent_id; | 444 element->parent_id = parent_id; |
| 445 } | 445 } |
| 446 | 446 |
| 447 dict.GetString("name", &element->name); | 447 dict.GetString("name", &element->name); |
| 448 dict.GetBoolean("visible", &element->visible); | 448 dict.GetBoolean("visible", &element->visible); |
| 449 dict.GetBoolean("hitTestable", &element->hit_testable); | 449 dict.GetBoolean("hitTestable", &element->hit_testable); |
| 450 dict.GetBoolean("lockToFov", &element->lock_to_fov); | 450 dict.GetBoolean("lockToFov", &element->lock_to_fov); |
| 451 ParseInt(dict, "drawPhase", &element->draw_phase); | 451 ParseInt(dict, "drawPhase", &element->draw_phase); |
| 452 ParseFloat(dict, "opacity", &element->opacity); | 452 ParseFloat(dict, "opacity", &element->opacity); |
| 453 | 453 |
| 454 DCHECK(!(element->lock_to_fov && element->parent_id != -1)); | 454 DCHECK(!(element->lock_to_fov && element->parent_id != -1)); |
| 455 | 455 float val; |
| 456 ParseFloat(dict, "sizeX", &element->size.x); | 456 ParseFloat(dict, "sizeX", &val); |
| 457 ParseFloat(dict, "sizeY", &element->size.y); | 457 element->size.set_x(val); |
| 458 ParseFloat(dict, "scaleX", &element->scale.x); | 458 ParseFloat(dict, "sizeY", &val); |
| 459 ParseFloat(dict, "scaleY", &element->scale.y); | 459 element->size.set_y(val); |
| 460 ParseFloat(dict, "scaleZ", &element->scale.z); | 460 ParseFloat(dict, "scaleX", &val); |
| 461 element->scale.set_x(val); |
| 462 ParseFloat(dict, "scaleY", &val); |
| 463 element->scale.set_y(val); |
| 464 ParseFloat(dict, "scaleZ", &val); |
| 465 element->scale.set_z(val); |
| 466 ParseFloat(dict, "translationX", &val); |
| 467 element->translation.set_x(val); |
| 468 ParseFloat(dict, "translationY", &val); |
| 469 element->translation.set_y(val); |
| 470 ParseFloat(dict, "translationZ", &val); |
| 471 element->translation.set_z(val); |
| 461 ParseFloat(dict, "rotationX", &element->rotation.x); | 472 ParseFloat(dict, "rotationX", &element->rotation.x); |
| 462 ParseFloat(dict, "rotationY", &element->rotation.y); | 473 ParseFloat(dict, "rotationY", &element->rotation.y); |
| 463 ParseFloat(dict, "rotationZ", &element->rotation.z); | 474 ParseFloat(dict, "rotationZ", &element->rotation.z); |
| 464 ParseFloat(dict, "rotationAngle", &element->rotation.angle); | 475 ParseFloat(dict, "rotationAngle", &element->rotation.angle); |
| 465 ParseFloat(dict, "translationX", &element->translation.x); | |
| 466 ParseFloat(dict, "translationY", &element->translation.y); | |
| 467 ParseFloat(dict, "translationZ", &element->translation.z); | |
| 468 | 476 |
| 469 if (ParseInt(dict, "xAnchoring", &element->x_anchoring)) { | 477 if (ParseInt(dict, "xAnchoring", &element->x_anchoring)) { |
| 470 CHECK_GE(element->parent_id, 0); | 478 CHECK_GE(element->parent_id, 0); |
| 471 } | 479 } |
| 472 if (ParseInt(dict, "yAnchoring", &element->y_anchoring)) { | 480 if (ParseInt(dict, "yAnchoring", &element->y_anchoring)) { |
| 473 CHECK_GE(element->parent_id, 0); | 481 CHECK_GE(element->parent_id, 0); |
| 474 } | 482 } |
| 475 | 483 |
| 476 // Parse the element fill. | 484 // Parse the element fill. |
| 477 if (ParseInt(dict, "fillType", &element->fill)) { | 485 if (ParseInt(dict, "fillType", &element->fill)) { |
| 478 // If the previous content element has a new filling now make sure this is | 486 // If the previous content element has a new filling now make sure this is |
| 479 // tracked correctly. | 487 // tracked correctly. |
| 480 if (content_element_ == element && element->fill != Fill::CONTENT) { | 488 if (content_element_ == element && element->fill != Fill::CONTENT) { |
| 481 content_element_ = nullptr; | 489 content_element_ = nullptr; |
| 482 } | 490 } |
| 483 | 491 |
| 492 int val; |
| 484 switch (element->fill) { | 493 switch (element->fill) { |
| 485 case Fill::SPRITE: | 494 case Fill::SPRITE: |
| 486 CHECK(ParseInt(dict, "copyRectX", &element->copy_rect.x)); | 495 CHECK(ParseInt(dict, "copyRectX", &val)); |
| 487 CHECK(ParseInt(dict, "copyRectY", &element->copy_rect.y)); | 496 element->copy_rect.set_x(val); |
| 488 CHECK(ParseInt(dict, "copyRectWidth", &element->copy_rect.width)); | 497 CHECK(ParseInt(dict, "copyRectY", &val)); |
| 489 CHECK(ParseInt(dict, "copyRectHeight", &element->copy_rect.height)); | 498 element->copy_rect.set_y(val); |
| 499 CHECK(ParseInt(dict, "copyRectWidth", &val)); |
| 500 element->copy_rect.set_width(val); |
| 501 CHECK(ParseInt(dict, "copyRectHeight", &val)); |
| 502 element->copy_rect.set_height(val); |
| 490 break; | 503 break; |
| 491 case Fill::OPAQUE_GRADIENT: | 504 case Fill::OPAQUE_GRADIENT: |
| 492 CHECK(ParseColorf(dict, "edgeColor", &element->edge_color)); | 505 CHECK(ParseColorf(dict, "edgeColor", &element->edge_color)); |
| 493 CHECK(ParseColorf(dict, "centerColor", &element->center_color)); | 506 CHECK(ParseColorf(dict, "centerColor", &element->center_color)); |
| 494 break; | 507 break; |
| 495 case Fill::GRID_GRADIENT: | 508 case Fill::GRID_GRADIENT: |
| 496 CHECK(ParseColorf(dict, "edgeColor", &element->edge_color)); | 509 CHECK(ParseColorf(dict, "edgeColor", &element->edge_color)); |
| 497 CHECK(ParseColorf(dict, "centerColor", &element->center_color)); | 510 CHECK(ParseColorf(dict, "centerColor", &element->center_color)); |
| 498 CHECK(ParseInt(dict, "gridlineCount", &element->gridline_count)); | 511 CHECK(ParseInt(dict, "gridlineCount", &element->gridline_count)); |
| 499 CHECK_GE(element->gridline_count, 0); | 512 CHECK_GE(element->gridline_count, 0); |
| 500 break; | 513 break; |
| 501 case Fill::CONTENT: | 514 case Fill::CONTENT: |
| 502 CHECK_EQ(content_element_, nullptr); | 515 CHECK_EQ(content_element_, nullptr); |
| 503 content_element_ = element; | 516 content_element_ = element; |
| 504 break; | 517 break; |
| 505 default: | 518 default: |
| 506 element->fill = Fill::NONE; | 519 element->fill = Fill::NONE; |
| 507 break; | 520 break; |
| 508 } | 521 } |
| 509 } | 522 } |
| 510 } | 523 } |
| 511 | 524 |
| 512 } // namespace vr_shell | 525 } // namespace vr_shell |
| OLD | NEW |