From 6d725a7d50a04eb2bb70d2a96474478035961753 Mon Sep 17 00:00:00 2001 From: Emil Axelsson Date: Tue, 16 Jul 2019 13:29:21 +0200 Subject: [PATCH] Revive screen space browser and add example (#932) * Revive screen space browser and add example * Add reload triggerproperty and change autoplay policy --- data/assets/examples/screenspacebrowser.asset | 10 ++++++++ data/assets/util/asset_helper.asset | 24 +++++++++++++++++++ .../rendering/screenspacerenderable.h | 2 +- modules/cefwebgui/include/guirenderhandler.h | 4 ++-- modules/cefwebgui/shaders/gui_vs.glsl | 3 +-- modules/webbrowser/include/eventhandler.h | 4 ++-- .../webbrowser/include/screenspacebrowser.h | 9 +++++-- modules/webbrowser/src/eventhandler.cpp | 2 +- modules/webbrowser/src/screenspacebrowser.cpp | 23 ++++++++++++++---- modules/webbrowser/src/webbrowserapp.cpp | 3 ++- modules/webbrowser/src/webrenderhandler.cpp | 9 ++++--- modules/webbrowser/webbrowsermodule.cpp | 2 +- src/rendering/dashboard_lua.inl | 8 ++++++- src/rendering/screenspacerenderable.cpp | 5 ++-- 14 files changed, 85 insertions(+), 23 deletions(-) create mode 100644 data/assets/examples/screenspacebrowser.asset diff --git a/data/assets/examples/screenspacebrowser.asset b/data/assets/examples/screenspacebrowser.asset new file mode 100644 index 0000000000..f10350749e --- /dev/null +++ b/data/assets/examples/screenspacebrowser.asset @@ -0,0 +1,10 @@ +local assetHelper = asset.require('util/asset_helper') + +local spec = { + Type = "ScreenSpaceBrowser", + Identifier = "ScreenSpaceBrowserExample", + Name = "Screen Space Browser Example", + Url = "https://www.openspaceproject.com/" +}; + +assetHelper.registerScreenSpaceRenderables(asset, { spec }) diff --git a/data/assets/util/asset_helper.asset b/data/assets/util/asset_helper.asset index 8664122cbc..a785329785 100644 --- a/data/assets/util/asset_helper.asset +++ b/data/assets/util/asset_helper.asset @@ -42,6 +42,29 @@ local registerSceneGraphNodes = function (sceneAsset, nodes, override) end) end + +local registerScreenSpaceRenderables = function (sceneAsset, renderables, override) + override = override or false + if not override then + if tableLength(renderables) == 0 then + openspace.printWarning(sceneAsset.filePath .. ": Register function was called with an empty node list. Pass 'true' as third argument to silence this warning.") + return + end + end + + sceneAsset.onInitialize(function () + for i, node in ipairs(renderables) do + openspace.addScreenSpaceRenderable(node) + end + end) + sceneAsset.onDeinitialize(function () + for i = #renderables, 1, -1 do + renderable = renderables[i] + openspace.removeScreenSpaceRenderable(renderable.Identifier) + end + end) +end + local registerDashboardItems = function (dashboardAsset, items) dashboardAsset.onInitialize( function () @@ -176,6 +199,7 @@ end asset.export("registerSceneGraphNodes", registerSceneGraphNodes) asset.export("registerSceneGraphNodesAndExport", registerSceneGraphNodesAndExport) +asset.export("registerScreenSpaceRenderables", registerScreenSpaceRenderables) asset.export("registerSpiceKernels", registerSpiceKernels) asset.export("registerDashboardItems", registerDashboardItems) asset.export("requireAll", requireAll) diff --git a/include/openspace/rendering/screenspacerenderable.h b/include/openspace/rendering/screenspacerenderable.h index 6f780f29b4..e846f76de9 100644 --- a/include/openspace/rendering/screenspacerenderable.h +++ b/include/openspace/rendering/screenspacerenderable.h @@ -82,7 +82,7 @@ protected: void draw(glm::mat4 modelTransform); - virtual void bindTexture(); + virtual void bindTexture() = 0; virtual void unbindTexture(); properties::BoolProperty _enabled; diff --git a/modules/cefwebgui/include/guirenderhandler.h b/modules/cefwebgui/include/guirenderhandler.h index 203ccf3eb9..b28a1875f5 100644 --- a/modules/cefwebgui/include/guirenderhandler.h +++ b/modules/cefwebgui/include/guirenderhandler.h @@ -39,8 +39,8 @@ public: GUIRenderHandler(); virtual ~GUIRenderHandler(); - void draw(); - void render(); + void draw() override; + void render() override; private: std::unique_ptr _programObject; diff --git a/modules/cefwebgui/shaders/gui_vs.glsl b/modules/cefwebgui/shaders/gui_vs.glsl index 2488aa7924..2323d505d3 100644 --- a/modules/cefwebgui/shaders/gui_vs.glsl +++ b/modules/cefwebgui/shaders/gui_vs.glsl @@ -31,8 +31,7 @@ uniform mat4 ortho; out vec2 Texcoord; void main() { - Texcoord = vec2(position.x + 1.0f, position.y - 1.0f) * 0.5; - Texcoord.y *= -1.0f; + Texcoord = vec2(position.x + 1.0f, position.y + 1.0f) * 0.5; gl_Position = vec4(position, 0.0, 1.0); } diff --git a/modules/webbrowser/include/eventhandler.h b/modules/webbrowser/include/eventhandler.h index 1596a02cb0..3ef6bdce06 100644 --- a/modules/webbrowser/include/eventhandler.h +++ b/modules/webbrowser/include/eventhandler.h @@ -57,9 +57,9 @@ class BrowserInstance; class EventHandler { public: void initialize(); - void setBrowser(const CefRefPtr& browser); void setBrowserInstance(BrowserInstance* browserInstance); - void detachBrowser(); + void resetBrowserInstance(); + void touchPressCallback(const double x, const double y); void touchReleaseCallback(const double x, const double y); bool hasContentCallback(const double, const double); diff --git a/modules/webbrowser/include/screenspacebrowser.h b/modules/webbrowser/include/screenspacebrowser.h index 41b4a2eb0b..fbfc5073d3 100644 --- a/modules/webbrowser/include/screenspacebrowser.h +++ b/modules/webbrowser/include/screenspacebrowser.h @@ -30,6 +30,7 @@ #include #include #include +#include #ifdef _MSC_VER #pragma warning (push) @@ -72,14 +73,18 @@ public: private: class ScreenSpaceRenderHandler : public WebRenderHandler { public: - void draw(); - void render(); + void draw() override; + void render() override; void setTexture(GLuint t); }; + void bindTexture() override; + properties::StringProperty _url; properties::Vec2Property _dimensions; + properties::TriggerProperty _reload; + CefRefPtr _renderHandler; CefRefPtr _keyboardHandler; std::unique_ptr _browserInstance; diff --git a/modules/webbrowser/src/eventhandler.cpp b/modules/webbrowser/src/eventhandler.cpp index 8cd3c96b3f..1231178231 100644 --- a/modules/webbrowser/src/eventhandler.cpp +++ b/modules/webbrowser/src/eventhandler.cpp @@ -361,7 +361,7 @@ void EventHandler::setBrowserInstance(BrowserInstance* browserInstance) { _browserInstance = browserInstance; } -void EventHandler::detachBrowser() { +void EventHandler::resetBrowserInstance() { _browserInstance = nullptr; } diff --git a/modules/webbrowser/src/screenspacebrowser.cpp b/modules/webbrowser/src/screenspacebrowser.cpp index 21c4e622bf..075c375f5c 100644 --- a/modules/webbrowser/src/screenspacebrowser.cpp +++ b/modules/webbrowser/src/screenspacebrowser.cpp @@ -35,7 +35,6 @@ namespace { constexpr const char* KeyIdentifier = "Indentifier"; - constexpr const char* KeyUrl = "URL"; constexpr const char* _loggerCat = "ScreenSpaceBrowser"; const openspace::properties::Property::PropertyInfo DimensionsInfo = { @@ -44,11 +43,17 @@ namespace { "Set the dimensions of the web browser windows." }; const openspace::properties::Property::PropertyInfo UrlInfo = { + "Url", "URL", - "url", "The URL to load" }; + const openspace::properties::Property::PropertyInfo ReloadInfo = { + "Reload", + "Reload", + "Reload the web browser" + }; + } // namespace namespace openspace { @@ -65,6 +70,7 @@ ScreenSpaceBrowser::ScreenSpaceBrowser(const ghoul::Dictionary &dictionary) : ScreenSpaceRenderable(dictionary) , _url(UrlInfo) , _dimensions(DimensionsInfo, glm::vec2(0.f), glm::vec2(0.f), glm::vec2(3000.f)) + , _reload(ReloadInfo) { if (dictionary.hasKey(KeyIdentifier)) { setIdentifier(dictionary.value(KeyIdentifier)); @@ -74,8 +80,8 @@ ScreenSpaceBrowser::ScreenSpaceBrowser(const ghoul::Dictionary &dictionary) ++id; } - if (dictionary.hasKeyAndValue(KeyUrl)) { - _url = dictionary.value(KeyUrl); + if (dictionary.hasKeyAndValue(UrlInfo.identifier)) { + _url = dictionary.value(UrlInfo.identifier); } glm::vec2 windowDimensions = global::windowDelegate.currentSubwindowSize(); @@ -94,9 +100,11 @@ ScreenSpaceBrowser::ScreenSpaceBrowser(const ghoul::Dictionary &dictionary) _url.onChange([this]() { _isUrlDirty = true; }); _dimensions.onChange([this]() { _isDimensionsDirty = true; }); + _reload.onChange([this]() { _browserInstance->reloadBrowser(); }); addProperty(_url); addProperty(_dimensions); + addProperty(_reload); WebBrowserModule* webBrowser = global::moduleEngine.module(); if (webBrowser) { @@ -110,6 +118,7 @@ bool ScreenSpaceBrowser::initialize() { createShaders(); + _browserInstance->initialize(); _browserInstance->loadUrl(_url); return isReady(); } @@ -146,6 +155,8 @@ void ScreenSpaceBrowser::render() { } void ScreenSpaceBrowser::update() { + _objectSize = _texture->dimensions(); + if (_isUrlDirty) { _browserInstance->loadUrl(_url); _isUrlDirty = false; @@ -162,4 +173,8 @@ bool ScreenSpaceBrowser::isReady() const { return _shader && _texture; } +void ScreenSpaceBrowser::bindTexture() { + _texture->bind(); +} + } // namespace openspace diff --git a/modules/webbrowser/src/webbrowserapp.cpp b/modules/webbrowser/src/webbrowserapp.cpp index 6ccfaefaf5..dc49bd8fa9 100644 --- a/modules/webbrowser/src/webbrowserapp.cpp +++ b/modules/webbrowser/src/webbrowserapp.cpp @@ -41,10 +41,11 @@ void WebBrowserApp::OnContextCreated(CefRefPtr, CefRefPtr, } void WebBrowserApp::OnBeforeCommandLineProcessing(const CefString&, - CefRefPtr) + CefRefPtr commandLine) { // command_line->AppendSwitch("disable-gpu"); // command_line->AppendSwitch("disable-gpu-compositing"); + commandLine->AppendSwitchWithValue("autoplay-policy", "no-user-gesture-required"); } } // namespace openspace diff --git a/modules/webbrowser/src/webrenderhandler.cpp b/modules/webbrowser/src/webrenderhandler.cpp index 555e88d721..364855bd2e 100644 --- a/modules/webbrowser/src/webrenderhandler.cpp +++ b/modules/webbrowser/src/webrenderhandler.cpp @@ -78,11 +78,13 @@ void WebRenderHandler::OnPaint(CefRefPtr, CefRenderHandler::PaintEle // Copy the updated rectangle line by line. for (int y = lowerUpdatingRectBound.y; y < upperUpdatingRectBound.y; ++y) { int lineOffset = y * w + lowerUpdatingRectBound.x; + // Chromium stores image upside down compared to OpenGL, so we flip it: + int invLineOffset = (h - y - 1) * w + lowerUpdatingRectBound.x; int rectWidth = upperUpdatingRectBound.x - lowerUpdatingRectBound.x; std::copy( reinterpret_cast(buffer) + lineOffset, reinterpret_cast(buffer) + lineOffset + rectWidth, - _browserBuffer.data() + lineOffset + _browserBuffer.data() + invLineOffset ); } @@ -123,14 +125,15 @@ void WebRenderHandler::updateTexture() { GL_TEXTURE_2D, 0, _lowerDirtyRectBound.x, - _lowerDirtyRectBound.y, + _browserBufferSize.y - _upperDirtyRectBound.y, _upperDirtyRectBound.x - _lowerDirtyRectBound.x, _upperDirtyRectBound.y - _lowerDirtyRectBound.y, GL_BGRA_EXT, GL_UNSIGNED_BYTE, reinterpret_cast( _browserBuffer.data() + - _lowerDirtyRectBound.y * _browserBufferSize.x + _lowerDirtyRectBound.x + (_browserBufferSize.y - _upperDirtyRectBound.y) * + _browserBufferSize.x + _lowerDirtyRectBound.x ) ); diff --git a/modules/webbrowser/webbrowsermodule.cpp b/modules/webbrowser/webbrowsermodule.cpp index c9181fa28c..bf11e5eb34 100644 --- a/modules/webbrowser/webbrowsermodule.cpp +++ b/modules/webbrowser/webbrowsermodule.cpp @@ -98,7 +98,7 @@ void WebBrowserModule::internalDeinitialize() { return; } - _eventHandler.detachBrowser(); + _eventHandler.resetBrowserInstance(); bool forceBrowserShutdown = true; for (BrowserInstance* browser : _browsers) { diff --git a/src/rendering/dashboard_lua.inl b/src/rendering/dashboard_lua.inl index a6544c6af6..3157fa3d01 100644 --- a/src/rendering/dashboard_lua.inl +++ b/src/rendering/dashboard_lua.inl @@ -48,7 +48,13 @@ int addDashboardItem(lua_State* L) { } lua_settop(L, 0); - global::dashboard.addDashboardItem(DashboardItem::createFromDictionary(d)); + try { + global::dashboard.addDashboardItem(DashboardItem::createFromDictionary(d)); + } + catch (const ghoul::RuntimeError& e) { + LERRORC("addDashboardItem", e.what()); + return ghoul::lua::luaError(L, "Error adding dashboard item"); + } ghoul_assert(lua_gettop(L) == 0, "Incorrect number of items left on stack"); return 0; diff --git a/src/rendering/screenspacerenderable.cpp b/src/rendering/screenspacerenderable.cpp index 98a2c4519f..10c1b6726b 100644 --- a/src/rendering/screenspacerenderable.cpp +++ b/src/rendering/screenspacerenderable.cpp @@ -614,9 +614,8 @@ void ScreenSpaceRenderable::draw(glm::mat4 modelTransform) { unbindTexture(); } -void ScreenSpaceRenderable::bindTexture() {} - -void ScreenSpaceRenderable::unbindTexture() {} +void ScreenSpaceRenderable::unbindTexture() { +} } // namespace openspace