Revive screen space browser and add example (#932)

* Revive screen space browser and add example
* Add reload triggerproperty and change autoplay policy
This commit is contained in:
Emil Axelsson
2019-07-16 13:29:21 +02:00
committed by Alexander Bock
parent f43bcadee3
commit 6d725a7d50
14 changed files with 85 additions and 23 deletions

View File

@@ -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 })

View File

@@ -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)

View File

@@ -82,7 +82,7 @@ protected:
void draw(glm::mat4 modelTransform);
virtual void bindTexture();
virtual void bindTexture() = 0;
virtual void unbindTexture();
properties::BoolProperty _enabled;

View File

@@ -39,8 +39,8 @@ public:
GUIRenderHandler();
virtual ~GUIRenderHandler();
void draw();
void render();
void draw() override;
void render() override;
private:
std::unique_ptr<ghoul::opengl::ProgramObject> _programObject;

View File

@@ -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);
}

View File

@@ -57,9 +57,9 @@ class BrowserInstance;
class EventHandler {
public:
void initialize();
void setBrowser(const CefRefPtr<CefBrowser>& 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);

View File

@@ -30,6 +30,7 @@
#include <modules/webbrowser/include/webrenderhandler.h>
#include <openspace/properties/stringproperty.h>
#include <openspace/properties/vector/vec2property.h>
#include <openspace/properties/triggerproperty.h>
#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<ScreenSpaceRenderHandler> _renderHandler;
CefRefPtr<WebKeyboardHandler> _keyboardHandler;
std::unique_ptr<BrowserInstance> _browserInstance;

View File

@@ -361,7 +361,7 @@ void EventHandler::setBrowserInstance(BrowserInstance* browserInstance) {
_browserInstance = browserInstance;
}
void EventHandler::detachBrowser() {
void EventHandler::resetBrowserInstance() {
_browserInstance = nullptr;
}

View File

@@ -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<std::string>(KeyIdentifier));
@@ -74,8 +80,8 @@ ScreenSpaceBrowser::ScreenSpaceBrowser(const ghoul::Dictionary &dictionary)
++id;
}
if (dictionary.hasKeyAndValue<std::string>(KeyUrl)) {
_url = dictionary.value<std::string>(KeyUrl);
if (dictionary.hasKeyAndValue<std::string>(UrlInfo.identifier)) {
_url = dictionary.value<std::string>(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<WebBrowserModule>();
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

View File

@@ -41,10 +41,11 @@ void WebBrowserApp::OnContextCreated(CefRefPtr<CefBrowser>, CefRefPtr<CefFrame>,
}
void WebBrowserApp::OnBeforeCommandLineProcessing(const CefString&,
CefRefPtr<CefCommandLine>)
CefRefPtr<CefCommandLine> commandLine)
{
// command_line->AppendSwitch("disable-gpu");
// command_line->AppendSwitch("disable-gpu-compositing");
commandLine->AppendSwitchWithValue("autoplay-policy", "no-user-gesture-required");
}
} // namespace openspace

View File

@@ -78,11 +78,13 @@ void WebRenderHandler::OnPaint(CefRefPtr<CefBrowser>, 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<const Pixel*>(buffer) + lineOffset,
reinterpret_cast<const Pixel*>(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<char*>(
_browserBuffer.data() +
_lowerDirtyRectBound.y * _browserBufferSize.x + _lowerDirtyRectBound.x
(_browserBufferSize.y - _upperDirtyRectBound.y) *
_browserBufferSize.x + _lowerDirtyRectBound.x
)
);

View File

@@ -98,7 +98,7 @@ void WebBrowserModule::internalDeinitialize() {
return;
}
_eventHandler.detachBrowser();
_eventHandler.resetBrowserInstance();
bool forceBrowserShutdown = true;
for (BrowserInstance* browser : _browsers) {

View File

@@ -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;

View File

@@ -614,9 +614,8 @@ void ScreenSpaceRenderable::draw(glm::mat4 modelTransform) {
unbindTexture();
}
void ScreenSpaceRenderable::bindTexture() {}
void ScreenSpaceRenderable::unbindTexture() {}
void ScreenSpaceRenderable::unbindTexture() {
}
} // namespace openspace