blob: abac33992d96076b2c0e1a8d06473ab61ea77b94 [file] [log] [blame]
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_VIEW_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_VIEW_H_
#include "device/vr/public/mojom/vr_service.mojom-blink.h"
#include "third_party/blink/renderer/core/typed_arrays/dom_typed_array.h"
#include "third_party/blink/renderer/modules/xr/xr_viewport.h"
#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
#include "third_party/blink/renderer/platform/wtf/forward.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
#include "ui/gfx/geometry/point3_f.h"
#include "ui/gfx/geometry/transform.h"
#include "third_party/blink/renderer/modules/xr/xr_rigid_transform.h"
namespace blink {
class XRCamera;
class XRFrame;
class XRSession;
class XRViewData;
class MODULES_EXPORT XRView final : public ScriptWrappable {
DEFINE_WRAPPERTYPEINFO();
public:
XRView(XRFrame* frame,
XRViewData* view_data,
const gfx::Transform& ref_space_from_mojo);
const String& eye() const { return eye_string_; }
device::mojom::blink::XREye EyeValue() const { return eye_; }
XRViewData* ViewData() const { return view_data_; }
XRViewport* Viewport(double scale);
XRFrame* frame() const;
XRSession* session() const;
DOMFloat32Array* projectionMatrix() const;
XRRigidTransform* refSpaceFromView() const;
XRCamera* camera() const;
// isFirstPersonObserver is only true for views that composed with a video
// feed that is not directly displayed on the viewer device. Primarily this is
// used for video streams from optically transparent AR headsets.
bool isFirstPersonObserver() const;
absl::optional<double> recommendedViewportScale() const;
void requestViewportScale(absl::optional<double> scale);
void Trace(Visitor*) const override;
private:
device::mojom::blink::XREye eye_;
String eye_string_;
Member<XRFrame> frame_;
Member<XRViewData> view_data_;
// The transform from the view to the reference space requested by
// XRFrame::getViewerPose.
Member<XRRigidTransform> ref_space_from_view_;
Member<DOMFloat32Array> projection_matrix_;
Member<XRViewport> viewport_;
};
class MODULES_EXPORT XRViewData final : public GarbageCollected<XRViewData> {
public:
explicit XRViewData(device::mojom::blink::XREye eye, gfx::Rect viewport)
: eye_(eye), viewport_(viewport) {}
XRViewData(const device::mojom::blink::XRViewPtr& view,
double depth_near,
double depth_far);
void UpdateView(const device::mojom::blink::XRViewPtr& view,
double depth_near,
double depth_far);
void UpdateProjectionMatrixFromFoV(float up_rad,
float down_rad,
float left_rad,
float right_rad,
float near_depth,
float far_depth);
void UpdateProjectionMatrixFromAspect(float fovy,
float aspect,
float near_depth,
float far_depth);
gfx::Transform UnprojectPointer(double x,
double y,
double canvas_width,
double canvas_height);
void SetMojoFromView(const gfx::Transform& mojo_from_view);
device::mojom::blink::XREye Eye() const { return eye_; }
const gfx::Transform& MojoFromView() const { return mojo_from_view_; }
const gfx::Transform& ProjectionMatrix() const { return projection_matrix_; }
const gfx::Rect& Viewport() const { return viewport_; }
bool IsFirstPersonObserver() const { return is_first_person_observer_; }
absl::optional<double> recommendedViewportScale() const;
void SetRecommendedViewportScale(absl::optional<double> scale) {
recommended_viewport_scale_ = scale;
}
void requestViewportScale(absl::optional<double> scale);
bool ViewportModifiable() const { return viewport_modifiable_; }
void SetViewportModifiable(bool modifiable) {
viewport_modifiable_ = modifiable;
}
double CurrentViewportScale() const { return current_viewport_scale_; }
void SetCurrentViewportScale(double scale) {
current_viewport_scale_ = scale;
}
double RequestedViewportScale() const { return requested_viewport_scale_; }
void Trace(Visitor*) const {}
private:
const device::mojom::blink::XREye eye_;
gfx::Transform mojo_from_view_;
gfx::Transform projection_matrix_;
gfx::Transform inv_projection_;
bool inv_projection_dirty_ = true;
gfx::Rect viewport_;
bool is_first_person_observer_ = false;
absl::optional<double> recommended_viewport_scale_ = absl::nullopt;
double requested_viewport_scale_ = 1.0;
double current_viewport_scale_ = 1.0;
bool viewport_modifiable_ = false;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_VIEW_H_