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

Unified Diff: chrome/browser/android/vr_shell/vr_controller_model.cc

Issue 2775283004: Rendering Daydream controller in a fixed position. (Closed)
Patch Set: Moving code to more appropriate locations. Created 3 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/android/vr_shell/vr_controller_model.h ('k') | chrome/browser/android/vr_shell/vr_shell.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/android/vr_shell/vr_controller_model.cc
diff --git a/chrome/browser/android/vr_shell/vr_controller_model.cc b/chrome/browser/android/vr_shell/vr_controller_model.cc
new file mode 100644
index 0000000000000000000000000000000000000000..a0a60d3094a7622db648c57263a78a2af76387db
--- /dev/null
+++ b/chrome/browser/android/vr_shell/vr_controller_model.cc
@@ -0,0 +1,168 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/android/vr_shell/vr_controller_model.h"
+
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/memory/ptr_util.h"
+#include "base/path_service.h"
+#include "chrome/browser/android/vr_shell/gltf_parser.h"
+#include "components/component_updater/component_updater_paths.h"
+#include "ui/gfx/codec/png_codec.h"
+
+namespace vr_shell {
+
+namespace {
+
+enum {
+ ELEMENTS_BUFFER_ID = 0,
+ INDICES_BUFFER_ID = 1,
+};
+
+constexpr char kPosition[] = "POSITION";
+constexpr char kTexCoord[] = "TEXCOORD_0";
+
+} // namespace
+
+constexpr char const VrControllerModel::kComponentName[];
+constexpr char const VrControllerModel::kDefaultVersion[];
+constexpr char const VrControllerModel::kModelsDirectory[];
+constexpr char const VrControllerModel::kModelFilename[];
+constexpr char const VrControllerModel::kTexturesDirectory[];
+constexpr char const* VrControllerModel::kTextureFilenames[];
+
+VrControllerModel::VrControllerModel(
+ std::unique_ptr<gltf::Asset> gltf_asset,
+ std::vector<std::unique_ptr<gltf::Buffer>> buffers)
+ : gltf_asset_(std::move(gltf_asset)),
+ texture_bitmaps_(State::STATE_COUNT),
+ buffers_(std::move(buffers)) {}
+
+VrControllerModel::~VrControllerModel() = default;
+
+const GLvoid* VrControllerModel::ElementsBuffer() const {
+ const gltf::BufferView* buffer_view =
+ gltf_asset_->GetBufferView(ELEMENTS_BUFFER_ID);
+ DCHECK(buffer_view && buffer_view->target == GL_ARRAY_BUFFER);
+ const char* buffer = Buffer();
+ return buffer ? buffer + buffer_view->byte_offset : nullptr;
+}
+
+GLsizeiptr VrControllerModel::ElementsBufferSize() const {
+ const gltf::BufferView* buffer_view =
+ gltf_asset_->GetBufferView(ELEMENTS_BUFFER_ID);
+ DCHECK(buffer_view && buffer_view->target == GL_ARRAY_BUFFER);
+ return buffer_view->byte_length;
+}
+
+const GLvoid* VrControllerModel::IndicesBuffer() const {
+ const gltf::BufferView* buffer_view =
+ gltf_asset_->GetBufferView(INDICES_BUFFER_ID);
+ DCHECK(buffer_view && buffer_view->target == GL_ELEMENT_ARRAY_BUFFER);
+ const char* buffer = Buffer();
+ return buffer ? buffer + buffer_view->byte_offset : nullptr;
+}
+
+GLsizeiptr VrControllerModel::IndicesBufferSize() const {
+ const gltf::BufferView* buffer_view =
+ gltf_asset_->GetBufferView(INDICES_BUFFER_ID);
+ DCHECK(buffer_view && buffer_view->target == GL_ELEMENT_ARRAY_BUFFER);
+ return buffer_view->byte_length;
+}
+
+GLenum VrControllerModel::DrawMode() const {
+ const gltf::Mesh* mesh = gltf_asset_->GetMesh(0);
+ DCHECK(mesh && mesh->primitives.size());
+ return mesh->primitives[0]->mode;
+}
+
+const gltf::Accessor* VrControllerModel::IndicesAccessor() const {
+ const gltf::Mesh* mesh = gltf_asset_->GetMesh(0);
+ DCHECK(mesh && mesh->primitives.size());
+ return mesh->primitives[0]->indices;
+}
+
+const gltf::Accessor* VrControllerModel::PositionAccessor() const {
+ return Accessor(kPosition);
+}
+
+const gltf::Accessor* VrControllerModel::TextureCoordinateAccessor() const {
+ return Accessor(kTexCoord);
+}
+
+void VrControllerModel::SetTexture(int state,
+ std::unique_ptr<SkBitmap> bitmap) {
+ DCHECK(state >= 0 && state < STATE_COUNT);
+ texture_bitmaps_[state] = std::move(bitmap);
+}
+
+const SkBitmap* VrControllerModel::GetTexture(int state) const {
+ DCHECK(state >= 0 && state < STATE_COUNT);
+ return texture_bitmaps_[state].get();
+}
+
+const char* VrControllerModel::Buffer() const {
+ if (buffers_.empty())
+ return nullptr;
+ return buffers_[0]->data();
+}
+
+const gltf::Accessor* VrControllerModel::Accessor(
+ const std::string& key) const {
+ const gltf::Mesh* mesh = gltf_asset_->GetMesh(0);
+ DCHECK(mesh && mesh->primitives.size());
+ auto it = mesh->primitives[0]->attributes.find(key);
+ DCHECK(it != mesh->primitives[0]->attributes.begin());
+ return it->second;
+}
+
+std::unique_ptr<VrControllerModel> VrControllerModel::LoadFromComponent() {
+ base::FilePath models_path;
+ PathService::Get(component_updater::DIR_COMPONENT_USER, &models_path);
+ models_path = models_path.Append(VrControllerModel::kComponentName)
+ .Append(VrControllerModel::kDefaultVersion)
+ .Append(VrControllerModel::kModelsDirectory);
+ auto model_path = models_path.Append(VrControllerModel::kModelFilename);
+
+ // No further action if model file is not present
+ if (!base::PathExists(model_path)) {
+ LOG(WARNING) << "Controller model files not found";
+ return nullptr;
+ }
+
+ GltfParser gltf_parser;
+ std::vector<std::unique_ptr<gltf::Buffer>> buffers;
+ auto asset = gltf_parser.Parse(model_path, &buffers);
+ if (!asset) {
+ LOG(ERROR) << "Failed to read controller model";
+ return nullptr;
+ }
+
+ auto controller_model =
+ base::MakeUnique<VrControllerModel>(std::move(asset), std::move(buffers));
+
+ auto textures_path =
+ models_path.Append(VrControllerModel::kTexturesDirectory);
+
+ for (int i = 0; i < VrControllerModel::STATE_COUNT; i++) {
+ auto texture_path =
+ textures_path.Append(VrControllerModel::kTextureFilenames[i]);
+ std::string data;
+ auto bitmap = base::MakeUnique<SkBitmap>();
+ if (!base::ReadFileToString(texture_path, &data) ||
+ !gfx::PNGCodec::Decode(
+ reinterpret_cast<const unsigned char*>(data.data()), data.size(),
+ bitmap.get()) ||
+ bitmap->colorType() != kRGBA_8888_SkColorType) {
+ LOG(ERROR) << "Failed to read controller texture";
+ return nullptr;
+ }
+ controller_model->SetTexture(i, std::move(bitmap));
+ }
+
+ return controller_model;
+}
+
+} // namespace vr_shell
« no previous file with comments | « chrome/browser/android/vr_shell/vr_controller_model.h ('k') | chrome/browser/android/vr_shell/vr_shell.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698