// 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_