10 #ifndef hifi_GraphicsEngine_h
11 #define hifi_GraphicsEngine_h
13 #include <gl/OffscreenGLCanvas.h>
15 #include <gl/GLWidget.h>
17 #include <vk/VKWidget.h>
21 #include <render/Engine.h>
22 #include <procedural/ProceduralSkybox.h>
24 #include <OctreeConstants.h>
25 #include <shared/RateCounter.h>
27 #include "FrameTimingsScriptingInterface.h"
30 struct AppRenderArgs {
31 render::Args _renderArgs;
32 glm::mat4 _eyeToWorld;
34 glm::mat4 _eyeOffsets[2];
35 glm::mat4 _eyeProjections[2];
37 glm::mat4 _sensorToWorld;
38 float _sensorToWorldScale{ 1.0f };
39 bool _isStereo{
false };
42 using RenderArgsEditor = std::function <void(AppRenderArgs&)>;
45 class GraphicsEngine {
55 void initializeRender();
59 render::ScenePointer getRenderScene()
const {
return _renderScene; }
60 render::EnginePointer getRenderEngine()
const {
return _renderEngine; }
61 gpu::ContextPointer getGPUContext()
const {
return _gpuContext; }
64 bool shouldPaint()
const;
65 bool checkPendingRenderEvent();
67 size_t getRenderFrameCount()
const {
return _renderFrameCount; }
68 float getRenderLoopRate()
const {
return _renderLoopCounter.rate(); }
71 void editRenderArgs(RenderArgsEditor editor);
75 void render_performFrame();
76 void render_runRenderFrame(RenderArgs* renderArgs);
80 mutable QRecursiveMutex _renderArgsMutex;
81 AppRenderArgs _appRenderArgs;
83 RateCounter<500> _renderLoopCounter;
85 uint32_t _renderFrameCount{ 0 };
86 render::ScenePointer _renderScene{
new render::Scene(glm::vec3(-0.5f * (
float)TREE_SCALE), (
float)TREE_SCALE) };
87 render::EnginePointer _renderEngine{
new render::RenderEngine() };
89 gpu::ContextPointer _gpuContext;
91 QObject* _renderEventHandler{
nullptr };
92 friend class RenderEventHandler;
94 FrameTimingsScriptingInterface _frameTimingsScriptingInterface;
96 std::shared_ptr<ProceduralSkybox> _splashScreen { std::make_shared<ProceduralSkybox>() };
97 NetworkTexturePointer _texture;
99 std::atomic<bool> _programsCompiled {
false };
101 std::atomic<bool> _programsCompiled {
true };
104 friend class Application;