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

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

Issue 2775283004: Rendering Daydream controller in a fixed position. (Closed)
Patch Set: Using textures for corresponding button states. 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
Index: chrome/browser/android/vr_shell/vr_shell_renderer.cc
diff --git a/chrome/browser/android/vr_shell/vr_shell_renderer.cc b/chrome/browser/android/vr_shell/vr_shell_renderer.cc
index 77d04c6676ff4f4ce359d4e81206d46a0a3f635a..496848e1ea87012c0b9a75e29e20d2690c89d651 100644
--- a/chrome/browser/android/vr_shell/vr_shell_renderer.cc
+++ b/chrome/browser/android/vr_shell/vr_shell_renderer.cc
@@ -8,6 +8,7 @@
#include <algorithm>
#include <string>
+#include "base/memory/ptr_util.h"
#include "chrome/browser/android/vr_shell/vr_gl_util.h"
namespace {
@@ -73,6 +74,7 @@ const char* GetShaderSource(vr_shell::ShaderID shader) {
case vr_shell::ShaderID::TEXTURE_QUAD_VERTEX_SHADER:
case vr_shell::ShaderID::RETICLE_VERTEX_SHADER:
case vr_shell::ShaderID::LASER_VERTEX_SHADER:
+ case vr_shell::ShaderID::CONTROLLER_VERTEX_SHADER:
return SHADER(
/* clang-format off */
uniform mat4 u_ModelViewProjMatrix;
@@ -213,6 +215,16 @@ const char* GetShaderSource(vr_shell::ShaderID shader) {
u_EdgeColor * edgeColorWeight) * vec4(1.0, 1.0, 1.0, u_Opacity);
}
/* clang-format on */);
+ case vr_shell::ShaderID::CONTROLLER_FRAGMENT_SHADER:
+ return SHADER(
+ /* clang-format off */
+ uniform sampler2D u_texture;
+ varying vec2 v_TexCoordinate;
+
+ void main() {
+ gl_FragColor = texture2D(u_texture, v_TexCoordinate);
+ }
+ /* clang-format on */);
default:
LOG(ERROR) << "Shader source requested for unknown shader";
return "";
@@ -247,8 +259,15 @@ BaseRenderer::BaseRenderer(ShaderID vertex_id, ShaderID fragment_id) {
BaseRenderer::~BaseRenderer() = default;
-void BaseRenderer::PrepareToDraw(GLuint view_proj_matrix_handle,
- const gvr::Mat4f& view_proj_matrix) {
+BaseQuadRenderer::BaseQuadRenderer(ShaderID vertex_id, ShaderID fragment_id)
+ : BaseRenderer(vertex_id, fragment_id) {}
+
+GLuint BaseQuadRenderer::vertex_buffer_ = 0;
+
+BaseQuadRenderer::~BaseQuadRenderer() = default;
+
+void BaseQuadRenderer::PrepareToDraw(GLuint view_proj_matrix_handle,
+ const gvr::Mat4f& view_proj_matrix) {
glUseProgram(program_handle_);
// Pass in model view project matrix.
@@ -273,16 +292,13 @@ void BaseRenderer::PrepareToDraw(GLuint view_proj_matrix_handle,
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
-BaseQuadRenderer::BaseQuadRenderer(ShaderID vertex_id, ShaderID fragment_id)
- : BaseRenderer(vertex_id, fragment_id) {
+void BaseQuadRenderer::SetVertexBuffer() {
glGenBuffersARB(1, &vertex_buffer_);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
glBufferData(GL_ARRAY_BUFFER, kTextureQuadVerticesSize, kTextureQuadVertices,
GL_STATIC_DRAW);
}
-BaseQuadRenderer::~BaseQuadRenderer() = default;
-
TexturedQuadRenderer::TexturedQuadRenderer()
: BaseQuadRenderer(TEXTURE_QUAD_VERTEX_SHADER,
TEXTURE_QUAD_FRAGMENT_SHADER) {
@@ -507,6 +523,78 @@ void LaserRenderer::Draw(const gvr::Mat4f& view_proj_matrix) {
LaserRenderer::~LaserRenderer() = default;
+ControllerRenderer::ControllerRenderer()
+ : BaseRenderer(CONTROLLER_VERTEX_SHADER, CONTROLLER_FRAGMENT_SHADER),
+ texture_handles_(VrControllerModel::STATE_COUNT) {
+ model_view_proj_matrix_handle_ =
+ glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix");
+ tex_uniform_handle_ = glGetUniformLocation(program_handle_, "u_Texture");
+}
+
+ControllerRenderer::~ControllerRenderer() = default;
+
+void ControllerRenderer::SetUp(const VrControllerModel& model) {
+ glGenBuffersARB(1, &indices_buffer_);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices_buffer_);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, model.IndicesBufferSize(),
+ model.IndicesBuffer(), GL_STATIC_DRAW);
+
+ glGenBuffersARB(1, &vertex_buffer_);
+ glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
+ glBufferData(GL_ARRAY_BUFFER, model.ElementsBufferSize(),
+ model.ElementsBuffer(), GL_STATIC_DRAW);
+
+ glGenTextures(VrControllerModel::STATE_COUNT, texture_handles_.data());
+ for (int i = 0; i < VrControllerModel::STATE_COUNT; i++) {
+ glBindTexture(GL_TEXTURE_2D, texture_handles_[i]);
+ const SkBitmap* bitmap = model.GetTexture(i);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bitmap->width(), bitmap->height(),
+ 0, GL_RGBA, GL_UNSIGNED_BYTE, bitmap->getPixels());
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ }
+}
+
+void ControllerRenderer::Draw(const VrControllerModel& model,
+ VrControllerModel::State state,
+ const gvr::Mat4f& view_proj_matrix) {
+ glUseProgram(program_handle_);
+
+ glUniformMatrix4fv(model_view_proj_matrix_handle_, 1, false,
+ MatrixToGLArray(view_proj_matrix).data());
+
+ glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
+
+ const gltf::Accessor* accessor = model.PositionAccessor();
+ glVertexAttribPointer(
+ position_handle_, gltf::GetTypeComponents(accessor->type),
+ accessor->component_type, GL_FALSE, accessor->byte_stride,
+ VOID_OFFSET(accessor->byte_offset));
+ glEnableVertexAttribArray(position_handle_);
+
+ accessor = model.TextureCoordinateAccessor();
+ glVertexAttribPointer(
+ tex_coord_handle_, gltf::GetTypeComponents(accessor->type),
+ accessor->component_type, GL_FALSE, accessor->byte_stride,
+ VOID_OFFSET(accessor->byte_offset));
+ glEnableVertexAttribArray(tex_coord_handle_);
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices_buffer_);
+
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D, texture_handles_[state]);
+ glUniform1i(tex_uniform_handle_, 0);
+
+ accessor = model.IndicesAccessor();
+ glDrawElements(model.DrawMode(), accessor->count, accessor->component_type,
+ VOID_OFFSET(accessor->byte_offset));
+}
+
GradientQuadRenderer::GradientQuadRenderer()
: BaseQuadRenderer(GRADIENT_QUAD_VERTEX_SHADER,
GRADIENT_QUAD_FRAGMENT_SHADER) {
@@ -629,12 +717,15 @@ void GradientGridRenderer::MakeGridLines(int gridline_count) {
}
VrShellRenderer::VrShellRenderer()
- : textured_quad_renderer_(new TexturedQuadRenderer),
- webvr_renderer_(new WebVrRenderer),
- reticle_renderer_(new ReticleRenderer),
- laser_renderer_(new LaserRenderer),
- gradient_quad_renderer_(new GradientQuadRenderer),
- gradient_grid_renderer_(new GradientGridRenderer) {}
+ : textured_quad_renderer_(base::MakeUnique<TexturedQuadRenderer>()),
cjgrant 2017/03/29 13:20:54 Thank you. :)
acondor_ 2017/03/29 20:13:26 :)
+ webvr_renderer_(base::MakeUnique<WebVrRenderer>()),
+ reticle_renderer_(base::MakeUnique<ReticleRenderer>()),
+ laser_renderer_(base::MakeUnique<LaserRenderer>()),
+ controller_renderer_(base::MakeUnique<ControllerRenderer>()),
+ gradient_quad_renderer_(base::MakeUnique<GradientQuadRenderer>()),
+ gradient_grid_renderer_(base::MakeUnique<GradientGridRenderer>()) {
+ BaseQuadRenderer::SetVertexBuffer();
+}
VrShellRenderer::~VrShellRenderer() = default;

Powered by Google App Engine
This is Rietveld 408576698