mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-02-22 04:49:12 -06:00
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:
committed by
Alexander Bock
parent
f43bcadee3
commit
6d725a7d50
10
data/assets/examples/screenspacebrowser.asset
Normal file
10
data/assets/examples/screenspacebrowser.asset
Normal 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 })
|
||||
@@ -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)
|
||||
|
||||
@@ -82,7 +82,7 @@ protected:
|
||||
|
||||
void draw(glm::mat4 modelTransform);
|
||||
|
||||
virtual void bindTexture();
|
||||
virtual void bindTexture() = 0;
|
||||
virtual void unbindTexture();
|
||||
|
||||
properties::BoolProperty _enabled;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -361,7 +361,7 @@ void EventHandler::setBrowserInstance(BrowserInstance* browserInstance) {
|
||||
_browserInstance = browserInstance;
|
||||
}
|
||||
|
||||
void EventHandler::detachBrowser() {
|
||||
void EventHandler::resetBrowserInstance() {
|
||||
_browserInstance = nullptr;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
@@ -98,7 +98,7 @@ void WebBrowserModule::internalDeinitialize() {
|
||||
return;
|
||||
}
|
||||
|
||||
_eventHandler.detachBrowser();
|
||||
_eventHandler.resetBrowserInstance();
|
||||
|
||||
bool forceBrowserShutdown = true;
|
||||
for (BrowserInstance* browser : _browsers) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -614,9 +614,8 @@ void ScreenSpaceRenderable::draw(glm::mat4 modelTransform) {
|
||||
unbindTexture();
|
||||
}
|
||||
|
||||
void ScreenSpaceRenderable::bindTexture() {}
|
||||
|
||||
void ScreenSpaceRenderable::unbindTexture() {}
|
||||
void ScreenSpaceRenderable::unbindTexture() {
|
||||
}
|
||||
|
||||
|
||||
} // namespace openspace
|
||||
|
||||
Reference in New Issue
Block a user