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

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

Issue 2668093002: VrShell background implemented in JS. (Closed)
Patch Set: Fixed tests Created 3 years, 10 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 ad283143396868a3e72022c8d50325982c627f76..c30b383f5d16369fef16eb6cc24d02a5da1905b2 100644
--- a/chrome/browser/android/vr_shell/vr_shell_renderer.cc
+++ b/chrome/browser/android/vr_shell/vr_shell_renderer.cc
@@ -16,12 +16,11 @@ namespace {
{ left, bottom, left, top, right, bottom, left, top, right, top, right, \
bottom }
-static constexpr float kHalfHeight = 0.5f;
-static constexpr float kHalfWidth = 0.5f;
+static constexpr float kHalfSize = 0.5f;
static constexpr float kTextureQuadPosition[18] = {
- -kHalfWidth, kHalfHeight, 0.0f, -kHalfWidth, -kHalfHeight, 0.0f,
- kHalfWidth, kHalfHeight, 0.0f, -kHalfWidth, -kHalfHeight, 0.0f,
- kHalfWidth, -kHalfHeight, 0.0f, kHalfWidth, kHalfHeight, 0.0f};
+ -kHalfSize, kHalfSize, 0.0f, -kHalfSize, -kHalfSize, 0.0f,
+ kHalfSize, kHalfSize, 0.0f, -kHalfSize, -kHalfSize, 0.0f,
+ kHalfSize, -kHalfSize, 0.0f, kHalfSize, kHalfSize, 0.0f};
static constexpr int kPositionDataSize = 3;
// Number of vertices passed to glDrawArrays().
static constexpr int kVerticesNumber = 6;
@@ -55,11 +54,6 @@ static constexpr float kLaserColor[] = {1.0f, 1.0f, 1.0f, 0.5f};
static constexpr int kLaserDataWidth = 48;
static constexpr int kLaserDataHeight = 1;
-// Background constants.
-static constexpr float kGroundTileSize = 2.5f;
-static constexpr float kGroundMaxSize = 25.0f;
-static constexpr float kGroundYPosition = -2.0f;
-
// Laser texture data, 48x1 RGBA.
// TODO(mthiesse): As we add more resources for VR Shell, we should put them
// in Chrome's resource files.
@@ -97,7 +91,8 @@ const char* GetShaderSource(vr_shell::ShaderID shader) {
gl_Position = u_ModelViewProjMatrix * a_Position;
}
/* clang-format on */);
- case vr_shell::ShaderID::BACKGROUND_VERTEX_SHADER:
+ case vr_shell::ShaderID::GRADIENT_QUAD_VERTEX_SHADER:
+ case vr_shell::ShaderID::GRADIENT_GRID_VERTEX_SHADER:
return SHADER(
/* clang-format off */
uniform mat4 u_ModelViewProjMatrix;
@@ -106,7 +101,7 @@ const char* GetShaderSource(vr_shell::ShaderID shader) {
varying vec2 v_GridPosition;
void main() {
- v_GridPosition = a_Position.xz / u_SceneRadius;
+ v_GridPosition = a_Position.xy / u_SceneRadius;
gl_Position = u_ModelViewProjMatrix * a_Position;
}
/* clang-format on */);
@@ -207,19 +202,21 @@ const char* GetShaderSource(vr_shell::ShaderID shader) {
gl_FragColor = vec4(final_color.xyz, final_color.w * total_fade);
}
/* clang-format on */);
- case vr_shell::ShaderID::BACKGROUND_FRAGMENT_SHADER:
- return SHADER(
+ case vr_shell::ShaderID::GRADIENT_QUAD_FRAGMENT_SHADER:
+ case vr_shell::ShaderID::GRADIENT_GRID_FRAGMENT_SHADER:
+ return OEIE_SHADER(
/* clang-format off */
precision highp float;
varying vec2 v_GridPosition;
uniform vec4 u_CenterColor;
uniform vec4 u_EdgeColor;
+ uniform mediump float u_Opacity;
void main() {
float edgeColorWeight = clamp(length(v_GridPosition), 0.0, 1.0);
float centerColorWeight = 1.0 - edgeColorWeight;
- gl_FragColor = u_CenterColor * centerColorWeight +
- u_EdgeColor * edgeColorWeight;
+ gl_FragColor = (u_CenterColor * centerColorWeight +
+ u_EdgeColor * edgeColorWeight) * vec4(1.0, 1.0, 1.0, u_Opacity);
}
/* clang-format on */);
default:
@@ -453,122 +450,120 @@ void LaserRenderer::Draw(const gvr::Mat4f& view_proj_matrix) {
LaserRenderer::~LaserRenderer() = default;
-BackgroundRenderer::BackgroundRenderer()
- : BaseRenderer(BACKGROUND_VERTEX_SHADER, BACKGROUND_FRAGMENT_SHADER) {
+GradientQuadRenderer::GradientQuadRenderer()
+ : BaseRenderer(GRADIENT_QUAD_VERTEX_SHADER, GRADIENT_QUAD_FRAGMENT_SHADER) {
model_view_proj_matrix_handle_ =
glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix");
scene_radius_handle_ = glGetUniformLocation(program_handle_, "u_SceneRadius");
center_color_handle_ = glGetUniformLocation(program_handle_, "u_CenterColor");
edge_color_handle_ = glGetUniformLocation(program_handle_, "u_EdgeColor");
+ opacity_handle_ = glGetUniformLocation(program_handle_, "u_Opacity");
+}
- // Make ground grid.
- int groundTilesNumber = kGroundMaxSize / kGroundTileSize;
- scene_radius_ = groundTilesNumber * kGroundTileSize * 0.5f;
- int groundLinesNumber = 2 * (groundTilesNumber + 1);
- ground_grid_lines_.resize(groundLinesNumber);
+void GradientQuadRenderer::Draw(const gvr::Mat4f& view_proj_matrix,
+ const Colorf& edge_color,
+ const Colorf& center_color,
+ float opacity) {
+ PrepareToDraw(model_view_proj_matrix_handle_, view_proj_matrix);
- for (int i = 0; i < groundLinesNumber - 1; i += 2) {
- float position =
- -scene_radius_ + (i / 2) * scene_radius_ * 2.0f / groundTilesNumber;
+ // Tell shader the grid size so that it can calculate the fading.
+ glUniform1f(scene_radius_handle_, kHalfSize);
- // Line parallel to the z axis.
- Line3d& zLine = ground_grid_lines_[i];
- // Line parallel to the x axis.
- Line3d& xLine = ground_grid_lines_[i + 1];
+ // Set the edge color to the fog color so that it seems to fade out.
+ glUniform4f(edge_color_handle_, edge_color.r, edge_color.g, edge_color.b,
+ edge_color.a);
+ glUniform4f(center_color_handle_, center_color.r, center_color.g,
+ center_color.b, center_color.a);
+ glUniform1f(opacity_handle_, opacity);
- zLine.start.x = position;
- zLine.start.y = kGroundYPosition;
- zLine.start.z = -scene_radius_;
- zLine.end.x = position;
- zLine.end.y = kGroundYPosition;
- zLine.end.z = scene_radius_;
- xLine.start.x = -scene_radius_;
- xLine.start.y = kGroundYPosition;
- xLine.start.z = position;
- xLine.end.x = scene_radius_;
- xLine.end.y = kGroundYPosition;
- xLine.end.z = position;
- }
+ glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber);
- // Make plane for ground and ceilings.
- // clang-format off
- ground_ceiling_plane_positions_ = {
- // First triangle.
- -scene_radius_, 0.0f, scene_radius_,
- scene_radius_, 0.0f, scene_radius_,
- -scene_radius_, 0.0f, -scene_radius_,
- // Second triangle.
- -scene_radius_, 0.0f, -scene_radius_,
- scene_radius_, 0.0f, scene_radius_,
- scene_radius_, 0.0f, -scene_radius_};
- // clang-format on
-
- // Make the transform to draw the plane either on the ground or the ceiling.
- SetIdentityM(ground_plane_transform_mat_);
- TranslateMRight(ground_plane_transform_mat_, ground_plane_transform_mat_,
- 0.0f, kGroundYPosition - 0.1f, 0.0f);
-
- SetIdentityM(ceiling_plane_transform_mat_);
- gvr::Quatf rotation_quat = QuatFromAxisAngle({1.0f, 0.0f, 0.0f}, M_PI);
- ceiling_plane_transform_mat_ =
- MatrixMul(ceiling_plane_transform_mat_, QuatToMatrix(rotation_quat));
- TranslateMRight(ceiling_plane_transform_mat_, ceiling_plane_transform_mat_,
- 0.0f, kGroundYPosition - 0.1f, 0.0f);
+ glDisableVertexAttribArray(position_handle_);
+ glDisableVertexAttribArray(tex_coord_handle_);
}
-void BackgroundRenderer::Draw(const gvr::Mat4f& view_proj_matrix) {
- glUseProgram(program_handle_);
+GradientQuadRenderer::~GradientQuadRenderer() = default;
+
+GradientGridRenderer::GradientGridRenderer()
+ : BaseRenderer(GRADIENT_QUAD_VERTEX_SHADER, GRADIENT_QUAD_FRAGMENT_SHADER) {
+ model_view_proj_matrix_handle_ =
+ glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix");
+ scene_radius_handle_ = glGetUniformLocation(program_handle_, "u_SceneRadius");
+ center_color_handle_ = glGetUniformLocation(program_handle_, "u_CenterColor");
+ edge_color_handle_ = glGetUniformLocation(program_handle_, "u_EdgeColor");
+ opacity_handle_ = glGetUniformLocation(program_handle_, "u_Opacity");
+}
+
+void GradientGridRenderer::Draw(const gvr::Mat4f& view_proj_matrix,
+ const Colorf& edge_color,
+ const Colorf& center_color,
+ int gridline_count,
+ float opacity) {
+ // In case the tile number changed we have to regenerate the grid lines.
+ if (grid_lines_.size() != static_cast<size_t>(2 * (gridline_count + 1))) {
+ MakeGridLines(gridline_count);
+ }
// Pass in model view project matrix.
glUniformMatrix4fv(model_view_proj_matrix_handle_, 1, false,
MatrixToGLArray(view_proj_matrix).data());
// Tell shader the grid size so that it can calculate the fading.
- int groundTilesNumber = kGroundMaxSize / kGroundTileSize;
- glUniform1f(scene_radius_handle_, scene_radius_);
+ glUniform1f(scene_radius_handle_, kHalfSize);
// Set the edge color to the fog color so that it seems to fade out.
- glUniform4f(edge_color_handle_, kFogBrightness, kFogBrightness,
- kFogBrightness, 1.0f);
+ glUniform4f(edge_color_handle_, edge_color.r, edge_color.g, edge_color.b,
+ edge_color.a);
+ glUniform4f(center_color_handle_, center_color.r, center_color.g,
+ center_color.b, center_color.a);
+ glUniform1f(opacity_handle_, opacity);
- // Draw the ground grid.
+ // Draw the grid.
glEnableVertexAttribArray(position_handle_);
glVertexAttribPointer(position_handle_, kPositionDataSize, GL_FLOAT, false, 0,
- (float*)ground_grid_lines_.data());
- glUniform4f(center_color_handle_, kGridBrightness, kGridBrightness,
- kGridBrightness, 1.0f);
- int groundVerticesNumber = 4 * (groundTilesNumber + 1);
- glDrawArrays(GL_LINES, 0, groundVerticesNumber);
-
- // Draw the ground plane.
- gvr::Mat4f transformed_matrix =
- MatrixMul(view_proj_matrix, ground_plane_transform_mat_);
- glUniformMatrix4fv(model_view_proj_matrix_handle_, 1, false,
- MatrixToGLArray(transformed_matrix).data());
- glUniform4f(center_color_handle_, kGroundCeilingBrightness,
- kGroundCeilingBrightness, kGroundCeilingBrightness, 1.0f);
- glVertexAttribPointer(position_handle_, kPositionDataSize, GL_FLOAT, false, 0,
- ground_ceiling_plane_positions_.data());
- glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber);
-
- // Draw the ceiling plane.
- transformed_matrix =
- MatrixMul(view_proj_matrix, ceiling_plane_transform_mat_);
- glUniformMatrix4fv(model_view_proj_matrix_handle_, 1, false,
- MatrixToGLArray(transformed_matrix).data());
- glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber);
+ (float*)grid_lines_.data());
+ int verticesNumber = 4 * (gridline_count + 1);
+ glDrawArrays(GL_LINES, 0, verticesNumber);
glDisableVertexAttribArray(position_handle_);
}
-BackgroundRenderer::~BackgroundRenderer() = default;
+GradientGridRenderer::~GradientGridRenderer() = default;
+
+void GradientGridRenderer::MakeGridLines(int gridline_count) {
+ int linesNumber = 2 * (gridline_count + 1);
+ grid_lines_.resize(linesNumber);
+
+ for (int i = 0; i < linesNumber - 1; i += 2) {
+ float position = -kHalfSize + (i / 2) * kHalfSize * 2.0f / gridline_count;
+
+ // Line parallel to the z axis.
+ Line3d& zLine = grid_lines_[i];
+ // Line parallel to the x axis.
+ Line3d& xLine = grid_lines_[i + 1];
+
+ zLine.start.x = position;
+ zLine.start.y = kHalfSize;
+ zLine.start.z = 0.0f;
+ zLine.end.x = position;
+ zLine.end.y = -kHalfSize;
+ zLine.end.z = 0.0f;
+ xLine.start.x = -kHalfSize;
+ xLine.start.y = -position;
+ xLine.start.z = 0.0f;
+ xLine.end.x = kHalfSize;
+ xLine.end.y = -position;
+ xLine.end.z = 0.0f;
+ }
+}
VrShellRenderer::VrShellRenderer()
: textured_quad_renderer_(new TexturedQuadRenderer),
webvr_renderer_(new WebVrRenderer),
reticle_renderer_(new ReticleRenderer),
laser_renderer_(new LaserRenderer),
- background_renderer_(new BackgroundRenderer) {}
+ gradient_quad_renderer_(new GradientQuadRenderer),
+ gradient_grid_renderer_(new GradientGridRenderer) {}
VrShellRenderer::~VrShellRenderer() = default;
« no previous file with comments | « chrome/browser/android/vr_shell/vr_shell_renderer.h ('k') | chrome/browser/resources/vr_shell/vr_shell_ui.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698