13 #include <glm/glm.hpp>
14 #include <glm/gtc/quaternion.hpp>
16 #include <QtCore/QSize>
17 #include <QtCore/QPoint>
18 #include <QtCore/QElapsedTimer>
19 #include <QtCore/QJsonObject>
20 #include <QtCore/QMutex>
21 #include <QtCore/QSharedPointer>
22 #include <QtCore/QWaitCondition>
24 #include <GLMHelpers.h>
25 #include <NumericalConstants.h>
26 #include <RegisteredMetaTypes.h>
27 #include <shared/Bilateral.h>
28 #include <SimpleMovingAverage.h>
29 #include <gpu/Forward.h>
31 #include "StencilMaskMode.h"
33 class QOpenGLFramebufferObject;
38 Left = (int)bilateral::Side::Left,
39 Right = (
int)bilateral::Side::Right
46 void for_each_eye(F f) {
54 template <
typename F,
typename FF>
55 void for_each_eye(F f, FF ff) {
63 #define AVERAGE_HUMAN_IPD 0.064f
67 using TexturePointer = std::shared_ptr<Texture>;
71 using NetworkTexturePointer = QSharedPointer<NetworkTexture>;
72 typedef struct __GLsync *GLsync;
80 virtual glm::mat4 getEyeProjection(Eye eye,
const glm::mat4& baseProjection)
const {
81 return baseProjection;
84 virtual glm::mat4 getCullingProjection(
const glm::mat4& baseProjection)
const {
85 return baseProjection;
88 virtual float getIPD()
const {
return AVERAGE_HUMAN_IPD; }
94 class RefreshRateController;
95 class HmdDisplay :
public StereoDisplay {
99 virtual glm::mat4 getEyeToHeadTransform(Eye eye)
const;
102 virtual glm::mat4 getHeadPose()
const {
106 virtual void abandonCalibration() {}
108 virtual void resetSensors() {}
115 virtual bool suppressKeyboard() {
return false; }
116 virtual void unsuppressKeyboard() {};
117 virtual bool isKeyboardVisible() {
return false; }
119 virtual QRectF getPlayAreaRect() {
return QRectF(); }
120 virtual QVector<glm::vec3> getSensorPositions() {
return QVector<glm::vec3>(); }
123 class DisplayPlugin :
public Plugin,
public HmdDisplay {
125 using Parent = Plugin;
127 virtual int getRequiredThreadCount()
const {
return 0; }
128 virtual bool isHmd()
const {
return false; }
129 virtual int getHmdScreen()
const {
return -1; }
131 virtual bool isStereo()
const {
return isHmd(); }
132 virtual bool isThrottled()
const {
return false; }
134 virtual float getTargetFrameRate()
const {
return 1.0f; }
135 virtual bool hasAsyncReprojection()
const {
return false; }
141 virtual bool isDisplayVisible()
const {
return false; }
143 virtual QString getPreferredAudioInDevice()
const {
return QString(); }
144 virtual QString getPreferredAudioOutDevice()
const {
return QString(); }
147 virtual void setContext(
const gpu::ContextPointer& context)
final { _gpuContext = context; }
148 virtual void submitFrame(
const gpu::FramePointer& newFrame) = 0;
149 virtual void captureFrame(
const std::string& outputName)
const { }
152 virtual glm::uvec2 getRecommendedRenderSize()
const = 0;
155 virtual glm::uvec2 getRecommendedUiSize()
const {
156 return getRecommendedRenderSize();
160 virtual float getRecommendedAspectRatio()
const {
161 return aspect(getRecommendedRenderSize());
165 virtual QRect getRecommendedHUDRect()
const {
166 const int DESKTOP_SCREEN_PADDING = 50;
167 auto recommendedSize = getRecommendedUiSize() - glm::uvec2(DESKTOP_SCREEN_PADDING);
168 return QRect(0, 0, recommendedSize.x, recommendedSize.y);
172 virtual bool beginFrameRender(uint32_t frameIndex) {
return true; }
175 virtual bool setDisplayTexture(
const QString& name) {
return false; }
177 virtual float devicePixelRatio() {
return 1.0f; }
179 virtual float renderRate()
const {
return -1.0f; }
181 virtual float presentRate()
const {
return -1.0f; }
183 virtual void resetPresentRate() {}
185 virtual float normalizedPresentRate()
const {
return presentRate() / getTargetFrameRate(); }
188 virtual float stutterRate()
const {
return -1.0f; }
190 virtual float newFramePresentRate()
const {
return -1.0f; }
192 virtual float droppedFrameRate()
const {
return -1.0f; }
193 virtual bool getSupportsAutoSwitch() {
return false; }
196 virtual QJsonObject getHardwareStats()
const {
return QJsonObject(); }
198 virtual void copyTextureToQuickFramebuffer(NetworkTexturePointer source, QOpenGLFramebufferObject* target, GLsync* fenceSync) = 0;
200 uint32_t presentCount()
const {
return _presentedFrameIndex; }
202 int64_t getPaintDelayUsecs()
const;
204 virtual void cycleDebugOutput() {}
206 void waitForPresent();
207 float getAveragePresentTime() {
return _movingAveragePresent.average / (float)USECS_PER_MSEC; }
209 static const QString& MENU_PATH();
212 virtual void pluginUpdate() = 0;
214 virtual std::function<void(gpu::Batch&,
const gpu::TexturePointer&)> getHUDOperator() {
return nullptr; }
215 virtual StencilMaskMode getStencilMaskMode()
const {
return StencilMaskMode::NONE; }
216 using StencilMaskMeshOperator = std::function<void(gpu::Batch&)>;
217 virtual StencilMaskMeshOperator getStencilMaskMeshOperator() {
return nullptr; }
218 virtual void updateParameters(
float visionSqueezeX,
float visionSqueezeY,
float visionSqueezeTransition,
219 int visionSqueezePerEye,
float visionSqueezeGroundPlaneY,
220 float visionSqueezeSpotlightSize) {}
223 void recommendedFramebufferSizeChanged(
const QSize& size);
224 void resetSensorsRequested();
225 void presented(quint32 frame);
228 void incrementPresentCount();
230 gpu::ContextPointer _gpuContext;
232 MovingAverage<float, 10> _movingAveragePresent;
235 QMutex _presentMutex;
236 QWaitCondition _presentCondition;
237 std::atomic<uint32_t> _presentedFrameIndex;
238 mutable std::mutex _paintDelayMutex;
239 QElapsedTimer _paintDelayTimer;
A texture loaded from the network.
Definition: material-networking/src/material-networking/TextureCache.h:52
A simple object wrapper for an OpenGL texture.
Definition: material-networking/src/material-networking/TextureCache.h:39