blob: c5be3a500c5b2f5924bed3a82c35ae00115aa19a [file] [log] [blame]
// 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.
#ifndef CHROME_BROWSER_VR_ELEMENTS_RETICLE_H_
#define CHROME_BROWSER_VR_ELEMENTS_RETICLE_H_
#include "chrome/browser/vr/elements/ui_element.h"
#include "chrome/browser/vr/renderers/base_quad_renderer.h"
#include "ui/gfx/geometry/point3_f.h"
namespace vr {
class UiScene;
struct Model;
class Reticle : public UiElement {
public:
Reticle(UiScene* scene, Model* model);
~Reticle() override;
UiElement* TargetElement() const;
class Renderer : public BaseQuadRenderer {
public:
Renderer();
~Renderer() override;
void Draw(float opacity, const gfx::Transform& view_proj_matrix);
static const char* VertexShader();
private:
GLuint model_view_proj_matrix_handle_;
GLuint color_handle_;
GLuint ring_diameter_handle_;
GLuint inner_hole_handle_;
GLuint inner_ring_end_handle_;
GLuint inner_ring_thickness_handle_;
GLuint mid_ring_end_handle_;
GLuint mid_ring_opacity_handle_;
GLuint opacity_handle_;
DISALLOW_COPY_AND_ASSIGN(Renderer);
};
private:
void Render(UiElementRenderer* renderer,
const CameraModel& model) const final;
gfx::Transform LocalTransform() const final;
gfx::Transform GetTargetLocalTransform() const final;
bool ShouldUpdateWorldSpaceTransform(
bool parent_transform_changed) const final;
gfx::Point3F origin_;
gfx::Point3F target_;
// This is used to convert the target id into a UiElement instance. We are not
// permitted to retain pointers to UiElements since they may be destructed,
// but the scene itself is constant, so we will look up our elements on the
// fly.
UiScene* scene_;
// Unlike other UiElements which bind their values form the model, the reticle
// must derive values from the model late in the pipeline after the scene has
// fully updated its geometry. We therefore retain a pointer to the model and
// make use of it in |Render|.
Model* model_;
DISALLOW_COPY_AND_ASSIGN(Reticle);
};
} // namespace vr
#endif // CHROME_BROWSER_VR_ELEMENTS_RETICLE_H_