diff --git a/apps/OpenSpace/ext/sgct b/apps/OpenSpace/ext/sgct index 2c774af032..fce9f015d9 160000 --- a/apps/OpenSpace/ext/sgct +++ b/apps/OpenSpace/ext/sgct @@ -1 +1 @@ -Subproject commit 2c774af03285e57d0bdaf9f7ca60c71bb0c144bf +Subproject commit fce9f015d90523b32213a8ce35470b526ccf134e diff --git a/apps/OpenSpace/main.cpp b/apps/OpenSpace/main.cpp index 63de2cda2c..b78007fd72 100644 --- a/apps/OpenSpace/main.cpp +++ b/apps/OpenSpace/main.cpp @@ -1043,6 +1043,15 @@ void setSgctDelegateFunctions() { sgctDelegate.openGLProcedureAddress = [](const char* func) { return glfwGetProcAddress(func); }; + sgctDelegate.getHorizFieldOfView = []() { + return static_cast( + sgct::Engine::instance()->getWindowPtr(0)->getHorizFieldOfViewDegrees() + ); + }; + sgctDelegate.setHorizFieldOfView = [](float hFovDeg) { + sgct::SGCTWindow* w = sgct::Engine::instance()->getWindowPtr(0); + w->setHorizFieldOfView(hFovDeg); + }; } int main(int argc, char** argv) { diff --git a/include/openspace/engine/windowdelegate.h b/include/openspace/engine/windowdelegate.h index 72ec9cbdce..52029add37 100644 --- a/include/openspace/engine/windowdelegate.h +++ b/include/openspace/engine/windowdelegate.h @@ -113,6 +113,10 @@ struct WindowDelegate { int (*currentWindowId)() = []() { return 0; }; + double (*getHorizFieldOfView)() = []() { return 0.0; }; + + void (*setHorizFieldOfView)(float hFovDeg) = [](float) { }; + using GLProcAddress = void(*)(void); GLProcAddress (*openGLProcedureAddress)(const char*) = diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index 311c352a40..e34d769e21 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -195,6 +195,7 @@ private: properties::FloatProperty _hdrExposure; properties::FloatProperty _hdrBackground; properties::FloatProperty _gamma; + properties::FloatProperty _horizFieldOfView; properties::Vec3Property _globalRotation; properties::Vec3Property _screenSpaceRotation; diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index d06428a3c5..74e20b2f46 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -209,6 +209,14 @@ namespace { "Gamma, is the nonlinear operation used to encode and decode luminance or " "tristimulus values in the image." }; + + constexpr openspace::properties::Property::PropertyInfo HorizFieldOfViewInfo = { + "HorizFieldOfView", + "Horizontal Field of View", + "Adjusts the degrees of the horizontal field of view. The vertical field of " + "view will be automatically adjusted to match, according to the current " + "aspect ratio." + }; } // namespace @@ -247,6 +255,7 @@ RenderEngine::RenderEngine() glm::vec3(-glm::pi()), glm::vec3(glm::pi()) ) + , _horizFieldOfView(HorizFieldOfViewInfo, 80.f, 1.f, 179.0f) { _doPerformanceMeasurements.onChange([this](){ global::performanceManager.setEnabled(_doPerformanceMeasurements); @@ -288,6 +297,11 @@ RenderEngine::RenderEngine() addProperty(_applyWarping); + _horizFieldOfView.onChange([this]() { + global::windowDelegate.setHorizFieldOfView(_horizFieldOfView); + }); + addProperty(_horizFieldOfView); + _takeScreenshot.onChange([this](){ _shouldTakeScreenshot = true; }); @@ -391,6 +405,10 @@ void RenderEngine::initializeGL() { // development global::windowDelegate.setNearFarClippingPlane(0.001f, 1000.f); + //Set horizontal FOV value with whatever the field of view (in degrees) is of the + // initialized window + _horizFieldOfView = global::windowDelegate.getHorizFieldOfView(); + constexpr const float FontSizeBig = 50.f; _fontBig = global::fontManager.font(KeyFontMono, FontSizeBig); constexpr const float FontSizeTime = 15.f; @@ -455,6 +473,8 @@ void RenderEngine::updateRenderer() { using FR = ghoul::fontrendering::FontRenderer; FR::defaultRenderer().setFramebufferSize(fontResolution()); FR::defaultProjectionRenderer().setFramebufferSize(renderingResolution()); + //Override the aspect ratio property value to match that of resized window + _horizFieldOfView = global::windowDelegate.getHorizFieldOfView(); } _renderer->update();