10 #ifndef hifi_GraphicsEngine_h
11 #define hifi_GraphicsEngine_h
13 #include <gl/OffscreenGLCanvas.h>
14 #include <gl/GLWidget.h>
17 #include <render/Engine.h>
18 #include <procedural/ProceduralSkybox.h>
20 #include <OctreeConstants.h>
21 #include <shared/RateCounter.h>
23 #include "FrameTimingsScriptingInterface.h"
26 struct AppRenderArgs {
27 render::Args _renderArgs;
28 glm::mat4 _eyeToWorld;
30 glm::mat4 _eyeOffsets[2];
31 glm::mat4 _eyeProjections[2];
33 glm::mat4 _sensorToWorld;
34 float _sensorToWorldScale{ 1.0f };
35 bool _isStereo{
false };
38 using RenderArgsEditor = std::function <void(AppRenderArgs&)>;
41 class GraphicsEngine {
47 void initializeRender();
51 render::ScenePointer getRenderScene()
const {
return _renderScene; }
52 render::EnginePointer getRenderEngine()
const {
return _renderEngine; }
53 gpu::ContextPointer getGPUContext()
const {
return _gpuContext; }
56 bool shouldPaint()
const;
57 bool checkPendingRenderEvent();
59 size_t getRenderFrameCount()
const {
return _renderFrameCount; }
60 float getRenderLoopRate()
const {
return _renderLoopCounter.rate(); }
63 void editRenderArgs(RenderArgsEditor editor);
67 void render_performFrame();
68 void render_runRenderFrame(RenderArgs* renderArgs);
72 mutable QRecursiveMutex _renderArgsMutex;
73 AppRenderArgs _appRenderArgs;
75 RateCounter<500> _renderLoopCounter;
77 uint32_t _renderFrameCount{ 0 };
78 render::ScenePointer _renderScene{
new render::Scene(glm::vec3(-0.5f * (
float)TREE_SCALE), (
float)TREE_SCALE) };
79 render::EnginePointer _renderEngine{
new render::RenderEngine() };
81 gpu::ContextPointer _gpuContext;
83 QObject* _renderEventHandler{
nullptr };
84 friend class RenderEventHandler;
86 FrameTimingsScriptingInterface _frameTimingsScriptingInterface;
88 std::shared_ptr<ProceduralSkybox> _splashScreen { std::make_shared<ProceduralSkybox>() };
90 std::atomic<bool> _programsCompiled {
false };
92 std::atomic<bool> _programsCompiled {
true };
95 friend class Application;