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..0898d6cb7f9b1208f6ef7c14a68d07deb09e2a93 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,89 @@ 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(std::unique_ptr<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); |
+ } |
+ |
+ const gltf::Accessor* accessor = model->PositionAccessor(); |
+ position_components_ = gltf::GetTypeComponents(accessor->type); |
+ position_type_ = accessor->component_type; |
+ position_stride_ = accessor->byte_stride; |
+ position_offset_ = VOID_OFFSET(accessor->byte_offset); |
+ |
+ accessor = model->TextureCoordinateAccessor(); |
+ tex_coord_components_ = gltf::GetTypeComponents(accessor->type); |
+ tex_coord_type_ = accessor->component_type; |
+ tex_coord_stride_ = accessor->byte_stride; |
+ tex_coord_offset_ = VOID_OFFSET(accessor->byte_offset); |
+ |
+ draw_mode_ = model->DrawMode(); |
+ accessor = model->IndicesAccessor(); |
+ indices_count_ = accessor->count; |
+ indices_type_ = accessor->component_type; |
+ indices_offset_ = VOID_OFFSET(accessor->byte_offset); |
+ setup_ = true; |
+} |
+ |
+void ControllerRenderer::Draw(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_); |
+ |
+ glVertexAttribPointer(position_handle_, position_components_, position_type_, |
+ GL_FALSE, position_stride_, position_offset_); |
+ glEnableVertexAttribArray(position_handle_); |
+ |
+ glVertexAttribPointer(tex_coord_handle_, tex_coord_components_, |
+ tex_coord_type_, GL_FALSE, tex_coord_stride_, |
+ tex_coord_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); |
+ |
+ glDrawElements(draw_mode_, indices_count_, indices_type_, indices_offset_); |
+} |
+ |
GradientQuadRenderer::GradientQuadRenderer() |
: BaseQuadRenderer(GRADIENT_QUAD_VERTEX_SHADER, |
GRADIENT_QUAD_FRAGMENT_SHADER) { |
@@ -629,12 +728,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>()), |
+ 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; |