10 #include <ThreadSafeValueCache.h>
15 #include <Transform.h>
17 #include <gpu/Format.h>
18 #include <gpu/Stream.h>
20 #include "../CompositorHelper.h"
21 #include "../OpenGLDisplayPlugin.h"
23 class HmdDisplayPlugin :
public OpenGLDisplayPlugin {
25 using Parent = OpenGLDisplayPlugin;
28 bool isHmd() const override final {
return true; }
29 float getIPD() const override final {
return _ipd; }
30 glm::mat4 getEyeToHeadTransform(Eye eye)
const override final;
31 glm::mat4 getEyeProjection(Eye eye,
const glm::mat4& baseProjection)
const override;
32 glm::mat4 getCullingProjection(
const glm::mat4& baseProjection)
const override;
33 glm::uvec2 getRecommendedUiSize() const override final;
34 glm::uvec2 getRecommendedRenderSize() const override final {
return _renderTargetSize; }
35 bool isDisplayVisible()
const override {
return isHmdMounted(); }
37 ivec4 eyeViewport(Eye eye)
const;
39 QRect getRecommendedHUDRect() const override final;
41 virtual glm::mat4 getHeadPose() const override;
43 bool wantVsync()
const override {
47 float stutterRate()
const override;
49 virtual bool onDisplayTextureReset()
override { _clearPreviewFlag =
true;
return true; };
51 void pluginUpdate()
override {};
53 std::function<void(gpu::Batch&,
const gpu::TexturePointer&)> getHUDOperator()
override;
54 virtual StencilMaskMode getStencilMaskMode()
const override {
return StencilMaskMode::PAINT; }
55 void updateVisionSqueezeParameters(
float visionSqueezeX,
float visionSqueezeY,
float visionSqueezeTransition,
56 int visionSqueezePerEye,
float visionSqueezeGroundPlaneY,
57 float visionSqueezeSpotlightSize);
59 int getRequiredThreadCount()
const override {
return 2; }
62 void hmdMountedChanged();
63 void hmdVisibleChanged(
bool visible);
66 virtual void hmdPresent() = 0;
67 virtual bool isHmdMounted()
const = 0;
68 virtual void postPreview() {};
69 virtual void updatePresentPose();
71 bool internalActivate()
override;
72 void internalDeactivate()
override;
73 void compositePointer()
override;
74 void internalPresent()
override;
75 void customizeContext()
override;
76 void uncustomizeContext()
override;
77 void updateFrameData()
override;
78 glm::mat4 getViewCorrection()
override;
80 std::array<mat4, 2> _eyeOffsets;
81 std::array<mat4, 2> _eyeProjections;
82 std::array<mat4, 2> _eyeInverseProjections;
84 mat4 _cullingProjection;
85 uvec2 _renderTargetSize;
86 float _ipd { 0.064f };
91 double sensorSampleTime { 0 };
92 double predictedDisplayTime { 0 };
95 QMap<uint32_t, FrameInfo> _frameInfos;
96 FrameInfo _currentPresentFrameInfo;
97 FrameInfo _currentRenderFrameInfo;
98 RateCounter<> _stutterRate;
100 bool _disablePreview {
true };
102 class VisionSqueezeParameters {
104 float _visionSqueezeX { 0.0f };
105 float _visionSqueezeY { 0.0f };
106 float _spareA { 0.0f };
107 float _spareB { 0.0f };
108 glm::mat4 _leftProjection;
109 glm::mat4 _rightProjection;
110 glm::mat4 _hmdSensorMatrix;
111 float _visionSqueezeTransition { 0.15f };
112 int _visionSqueezePerEye { 0 };
113 float _visionSqueezeGroundPlaneY { 0.0f };
114 float _visionSqueezeSpotlightSize { 0.0f };
116 VisionSqueezeParameters() {}
118 typedef gpu::BufferView UniformBufferView;
119 gpu::BufferView _visionSqueezeParametersBuffer;
121 virtual void setupCompositeScenePipeline(gpu::Batch& batch)
override;
123 float _visionSqueezeDeviceLowX { 0.0f };
124 float _visionSqueezeDeviceHighX { 1.0f };
125 float _visionSqueezeDeviceLowY { 0.0f };
126 float _visionSqueezeDeviceHighY { 1.0f };
129 ivec4 getViewportForSourceSize(
const uvec2& size)
const;
130 float getLeftCenterPixel()
const;
132 bool _monoPreview {
true };
133 bool _clearPreviewFlag {
false };
134 gpu::TexturePointer _previewTexture;
135 glm::vec2 _lastWindowSize;
138 gpu::Stream::FormatPointer format;
139 gpu::BufferPointer vertices;
140 gpu::BufferPointer indices;
141 uint32_t indexCount { 0 };
142 gpu::PipelinePointer pipeline {
nullptr };
144 gpu::BufferPointer uniformsBuffer;
147 float alpha { 1.0f };
155 static const size_t VERTEX_OFFSET { offsetof(Vertex, pos) };
156 static const size_t TEXTURE_OFFSET { offsetof(Vertex, uv) };
157 static const int VERTEX_STRIDE {
sizeof(Vertex) };
160 std::function<void(gpu::Batch&,
const gpu::TexturePointer&)> render();
164 const int drawTextureWithVisionSqueezeParamsSlot = 1;