From b97cc980e079552219e95130b14a9aa906cd0aea Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Fri, 23 Jun 2017 16:05:20 -0700 Subject: [node] rendering interface changes --- platform/node/src/node_map.cpp | 34 +++++++++++++------ platform/node/src/node_map.hpp | 3 ++ platform/node/src/node_renderer_frontend.cpp | 50 ++++++++++++++++++++++++++++ platform/node/src/node_renderer_frontend.hpp | 46 +++++++++++++++++++++++++ 4 files changed, 123 insertions(+), 10 deletions(-) create mode 100644 platform/node/src/node_renderer_frontend.cpp create mode 100644 platform/node/src/node_renderer_frontend.hpp (limited to 'platform') diff --git a/platform/node/src/node_map.cpp b/platform/node/src/node_map.cpp index 2599996f7c..bb0080271e 100644 --- a/platform/node/src/node_map.cpp +++ b/platform/node/src/node_map.cpp @@ -3,15 +3,18 @@ #include "node_feature.hpp" #include "node_conversion.hpp" #include "node_geojson.hpp" +#include "node_renderer_frontend.hpp" #include #include +#include #include #include #include #include #include #include +#include #include #include @@ -396,7 +399,7 @@ void NodeMap::startRender(NodeMap::RenderOptions options) { map->setDebug(options.debugOptions); } - map->renderStill(*view, [this](const std::exception_ptr eptr) { + map->renderStill([this](const std::exception_ptr eptr) { if (eptr) { error = std::move(eptr); uv_async_send(async); @@ -501,7 +504,7 @@ void NodeMap::release() { uv_close(reinterpret_cast(async), [] (uv_handle_t *h) { delete reinterpret_cast(h); }); - + map.reset(); } @@ -528,9 +531,14 @@ void NodeMap::Cancel(const Nan::FunctionCallbackInfo& info) { void NodeMap::cancel() { auto style = map->getStyle().getJSON(); + + // Reset map explicitly as it resets the renderer frontend + map.reset(); - map = std::make_unique(backend, mapObserver, mbgl::Size{ 256, 256 }, - pixelRatio, *this, threadpool, mbgl::MapMode::Still); + auto renderer = std::make_unique(backend, pixelRatio, *this, threadpool); + rendererFrontend = std::make_unique(std::move(renderer), [this] { return view.get(); }); + map = std::make_unique(*rendererFrontend, mapObserver, mbgl::Size{ 256, 256 }, pixelRatio, + *this, threadpool, mbgl::MapMode::Still); // FIXME: Reload the style after recreating the map. We need to find // a better way of canceling an ongoing rendering on the core level @@ -884,6 +892,11 @@ void NodeMap::DumpDebugLogs(const Nan::FunctionCallbackInfo& info) { if (!nodeMap->map) return Nan::ThrowError(releasedMessage()); nodeMap->map->dumpDebugLogs(); + + if (nodeMap->rendererFrontend) { + nodeMap->rendererFrontend->dumpDebugLogs(); + } + info.GetReturnValue().SetUndefined(); } @@ -945,7 +958,7 @@ void NodeMap::QueryRenderedFeatures(const Nan::FunctionCallbackInfo& auto pos0 = Nan::Get(posOrBox, 0).ToLocalChecked().As(); auto pos1 = Nan::Get(posOrBox, 1).ToLocalChecked().As(); - optional = nodeMap->map->queryRenderedFeatures(mbgl::ScreenBox { + optional = nodeMap->rendererFrontend->queryRenderedFeatures(mbgl::ScreenBox { { Nan::Get(pos0, 0).ToLocalChecked()->NumberValue(), Nan::Get(pos0, 1).ToLocalChecked()->NumberValue() @@ -956,7 +969,7 @@ void NodeMap::QueryRenderedFeatures(const Nan::FunctionCallbackInfo& }, queryOptions); } else { - optional = nodeMap->map->queryRenderedFeatures(mbgl::ScreenCoordinate { + optional = nodeMap->rendererFrontend->queryRenderedFeatures(mbgl::ScreenCoordinate { Nan::Get(posOrBox, 0).ToLocalChecked()->NumberValue(), Nan::Get(posOrBox, 1).ToLocalChecked()->NumberValue() }, queryOptions); @@ -980,11 +993,12 @@ NodeMap::NodeMap(v8::Local options) .ToLocalChecked() ->NumberValue() : 1.0; - }()), - mapObserver(NodeMapObserver()), - map(std::make_unique(backend, + }()) + , mapObserver(NodeMapObserver()) + , rendererFrontend(std::make_unique(std::make_unique(backend, pixelRatio, *this, threadpool), [this] { return view.get(); })) + , map(std::make_unique(*rendererFrontend, mapObserver, - mbgl::Size{ 256, 256 }, + mbgl::Size { 256, 256 }, pixelRatio, *this, threadpool, diff --git a/platform/node/src/node_map.hpp b/platform/node/src/node_map.hpp index b8645e8d11..08a3dcaa79 100644 --- a/platform/node/src/node_map.hpp +++ b/platform/node/src/node_map.hpp @@ -16,6 +16,8 @@ #pragma GCC diagnostic pop namespace node_mbgl { + +class NodeRendererFrontend; class NodeBackend : public mbgl::HeadlessBackend { public: @@ -75,6 +77,7 @@ public: std::unique_ptr view; NodeThreadPool threadpool; NodeMapObserver mapObserver; + std::unique_ptr rendererFrontend; std::unique_ptr map; std::exception_ptr error; diff --git a/platform/node/src/node_renderer_frontend.cpp b/platform/node/src/node_renderer_frontend.cpp new file mode 100644 index 0000000000..4722b45351 --- /dev/null +++ b/platform/node/src/node_renderer_frontend.cpp @@ -0,0 +1,50 @@ +#include "node_renderer_frontend.hpp" +#include +#include + +namespace node_mbgl { + +NodeRendererFrontend::NodeRendererFrontend(std::unique_ptr renderer_, ViewAccessorFunction getView) + : renderer(std::move(renderer_)) + , asyncInvalidate([&, this, getView] { + if (renderer && updateParameters) { + renderer->render(*getView(), *updateParameters); + } + }) { +} + +NodeRendererFrontend::~NodeRendererFrontend() = default; + +void NodeRendererFrontend::reset() { + assert(renderer); + renderer.reset(); +} + +void NodeRendererFrontend::setObserver(mbgl::RendererObserver& observer_) { + assert(renderer); + renderer->setObserver(&observer_); +} + +void NodeRendererFrontend::update(std::shared_ptr updateParameters_) { + updateParameters = updateParameters_; + asyncInvalidate.send(); +} + +std::vector NodeRendererFrontend::queryRenderedFeatures(const mbgl::ScreenBox& box, + const mbgl::RenderedQueryOptions& options) const { + assert(renderer); + return renderer->queryRenderedFeatures(box, options); +} + +std::vector NodeRendererFrontend::queryRenderedFeatures(const mbgl::ScreenCoordinate& point, + const mbgl::RenderedQueryOptions& options) const { + assert(renderer); + return renderer->queryRenderedFeatures(point, options); +} + +void NodeRendererFrontend::dumpDebugLogs() { + assert(renderer); + return renderer->dumpDebugLogs(); +} + +} // namespace node_mbgl diff --git a/platform/node/src/node_renderer_frontend.hpp b/platform/node/src/node_renderer_frontend.hpp new file mode 100644 index 0000000000..6410e3db57 --- /dev/null +++ b/platform/node/src/node_renderer_frontend.hpp @@ -0,0 +1,46 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace mbgl { + class Renderer; +} // namespace mbgl + +namespace node_mbgl { + +class NodeRendererFrontend : public mbgl::RendererFrontend { +public: + using ViewAccessorFunction = std::function; + NodeRendererFrontend(std::unique_ptr, ViewAccessorFunction); + + ~NodeRendererFrontend(); + + void reset() override; + + void setObserver(mbgl::RendererObserver&) override; + + void update(std::shared_ptr) override; + + // Feature querying + std::vector queryRenderedFeatures(const mbgl::ScreenCoordinate&, + const mbgl::RenderedQueryOptions& options = {}) const; + std::vector queryRenderedFeatures(const mbgl::ScreenBox&, + const mbgl::RenderedQueryOptions& = {}) const; + + void dumpDebugLogs(); + +private: + std::unique_ptr renderer; + std::shared_ptr updateParameters; + mbgl::util::AsyncTask asyncInvalidate; +}; + +} // namespace node_mbgl -- cgit v1.2.1