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; |