diff --git a/cmake/core-files.cmake b/cmake/core-files.cmake index efb4016ef..80e9f1615 100644 --- a/cmake/core-files.cmake +++ b/cmake/core-files.cmake @@ -212,6 +212,7 @@ set(MBGL_CORE_FILES src/mbgl/renderer/render_item.hpp src/mbgl/renderer/render_layer.cpp src/mbgl/renderer/render_layer.hpp + src/mbgl/renderer/render_light.cpp src/mbgl/renderer/render_light.hpp src/mbgl/renderer/render_line_layer.cpp src/mbgl/renderer/render_line_layer.hpp diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index bba6d50a9..52ac323df 100644 --- a/src/mbgl/map/map.cpp +++ b/src/mbgl/map/map.cpp @@ -967,7 +967,7 @@ void Map::setLight(std::unique_ptr light) { return; } - impl->style->light = std::move(light); + impl->style->setLight(std::move(light)); } style::Light* Map::getLight() { @@ -975,7 +975,7 @@ style::Light* Map::getLight() { return nullptr; } - return impl->style->light.get(); + return impl->style->getLight(); } #pragma mark - Defaults diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index 60c475789..eed3bfcd8 100644 --- a/src/mbgl/renderer/painter.cpp +++ b/src/mbgl/renderer/painter.cpp @@ -144,7 +144,7 @@ void Painter::render(const Style& style, const FrameData& frame_, View& view, Sp spriteAtlas = style.spriteAtlas.get(); lineAtlas = style.lineAtlas.get(); - evaluatedLight = style.evaluatedLight; + evaluatedLight = style.getRenderLight()->getEvaluated(); RenderData renderData = style.getRenderData(frame.debugOptions, state.getAngle()); const std::vector& order = renderData.order; diff --git a/src/mbgl/renderer/render_light.cpp b/src/mbgl/renderer/render_light.cpp new file mode 100644 index 000000000..6f154de2e --- /dev/null +++ b/src/mbgl/renderer/render_light.cpp @@ -0,0 +1,25 @@ +#include + +namespace mbgl { + +RenderLight::RenderLight(const style::Light light_) + : light(std::move(light_)) { +} + +void RenderLight::transition(const CascadeParameters& parameters) { + transitioning = TransitioningLight(light, std::move(transitioning), parameters); +} + +void RenderLight::evaluate(const PropertyEvaluationParameters& parameters) { + evaluated = EvaluatedLight(transitioning, parameters); +} + +bool RenderLight::hasTransition() const { + return transitioning.hasTransition(); +} + +const EvaluatedLight& RenderLight::getEvaluated() const { + return evaluated; +} + +} // namespace mbgl diff --git a/src/mbgl/renderer/render_light.hpp b/src/mbgl/renderer/render_light.hpp index 8f5929955..e60955044 100644 --- a/src/mbgl/renderer/render_light.hpp +++ b/src/mbgl/renderer/render_light.hpp @@ -69,4 +69,22 @@ public: using TransitioningLight = Transitioning; using EvaluatedLight = Evaluated; +class Painter; + +class RenderLight { +public: + RenderLight(const style::Light); + + void transition(const CascadeParameters&); + void evaluate(const PropertyEvaluationParameters&); + bool hasTransition() const; + + const EvaluatedLight& getEvaluated() const; + +private: + TransitioningLight transitioning; + EvaluatedLight evaluated; + style::Light light; +}; + } // namespace mbgl diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp index 63fb60261..080911b74 100644 --- a/src/mbgl/style/style.cpp +++ b/src/mbgl/style/style.cpp @@ -59,6 +59,7 @@ Style::Style(Scheduler& scheduler_, FileSource& fileSource_, float pixelRatio) spriteAtlas(std::make_unique(Size{ 1024, 1024 }, pixelRatio)), lineAtlas(std::make_unique(Size{ 256, 512 })), light(std::make_unique()), + renderLight(std::make_unique(*light)), observer(&nullObserver) { glyphAtlas->setObserver(this); spriteAtlas->setObserver(this); @@ -147,7 +148,7 @@ void Style::setJSON(const std::string& json) { defaultZoom = parser.zoom; defaultBearing = parser.bearing; defaultPitch = parser.pitch; - light = std::make_unique(parser.light); + setLight(std::make_unique(parser.light)); glyphAtlas->setURL(parser.glyphURL); spriteAtlas->load(parser.spriteURL, scheduler, fileSource); @@ -310,6 +311,19 @@ void Style::removeRenderLayer(const std::string& id) { } } +void Style::setLight(std::unique_ptr light_) { + light = std::move(light_); + renderLight = std::make_unique(*light); +} + +Light* Style::getLight() const { + return light.get(); +} + +RenderLight* Style::getRenderLight() const { + return renderLight.get(); +} + std::string Style::getName() const { return name; } @@ -364,11 +378,11 @@ void Style::update(const UpdateParameters& parameters) { const bool evaluate = cascade || zoomChanged || parameters.updateFlags & Update::RecalculateStyle; if (cascade) { - transitioningLight = TransitioningLight(*light, std::move(transitioningLight), cascadeParameters); + renderLight->transition(cascadeParameters); } - if (evaluate || transitioningLight.hasTransition()) { - evaluatedLight = EvaluatedLight(transitioningLight, evaluationParameters); + if (evaluate || renderLight->hasTransition()) { + renderLight->evaluate(evaluationParameters); } for (const auto& renderSource : renderSources) { @@ -443,7 +457,7 @@ RenderSource* Style::getRenderSource(const std::string& id) const { } bool Style::hasTransitions() const { - if (transitioningLight.hasTransition()) { + if (renderLight->hasTransition()) { return true; } diff --git a/src/mbgl/style/style.hpp b/src/mbgl/style/style.hpp index 7024927db..2756be1ed 100644 --- a/src/mbgl/style/style.hpp +++ b/src/mbgl/style/style.hpp @@ -101,6 +101,10 @@ public: bool hasClass(const std::string&) const; std::vector getClasses() const; + void setLight(std::unique_ptr); + Light* getLight() const; + RenderLight* getRenderLight() const; + RenderData getRenderData(MapDebugOptions, float angle) const; std::vector queryRenderedFeatures(const ScreenLineString& geometry, @@ -118,10 +122,6 @@ public: std::unique_ptr spriteAtlas; std::unique_ptr lineAtlas; - std::unique_ptr light; - TransitioningLight transitioningLight; - EvaluatedLight evaluatedLight; - RenderSource* getRenderSource(const std::string& id) const; private: @@ -133,6 +133,9 @@ private: std::vector classes; TransitionOptions transitionOptions; + std::unique_ptr light; + std::unique_ptr renderLight; + // Defaults std::string name; LatLng defaultLatLng;