Drawable Renderer (#1570), Refactor tile matrix handling to account for translations
This commit is contained in:
committed by
Bart Louwers
parent
411451dbf5
commit
4527d18a67
@@ -120,9 +120,6 @@ public:
|
||||
std::optional<OverscaledTileID> getTileID() const { return tileID; }
|
||||
void setTileID(OverscaledTileID value) { tileID = value; }
|
||||
|
||||
mat4 getMatrix() const { return matrix; }
|
||||
void setMatrix(mat4 value) { matrix = value; }
|
||||
|
||||
DepthMaskType getDepthType() const { return depthType; }
|
||||
void setDepthType(DepthMaskType value) { depthType = value; }
|
||||
|
||||
@@ -162,7 +159,6 @@ protected:
|
||||
util::SimpleIdentity uniqueID;
|
||||
gfx::ShaderProgramBasePtr shader;
|
||||
mbgl::RenderPass renderPass;
|
||||
mat4 matrix; //= matrix::identity4();
|
||||
std::optional<OverscaledTileID> tileID;
|
||||
DrawPriority drawPriority = 0;
|
||||
int32_t lineWidth = 1;
|
||||
|
||||
@@ -113,9 +113,6 @@ public:
|
||||
/// @param location A sampler location in the shader being used.
|
||||
void setTexture(const std::shared_ptr<gfx::Texture2D>& texture, int32_t location);
|
||||
|
||||
/// Set the matrix applied to new drawables
|
||||
void setMatrix(mat4 value) { matrix = value; }
|
||||
|
||||
/// Add a triangle
|
||||
void addTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2);
|
||||
/// Add another triangle based on the previous two points
|
||||
@@ -169,7 +166,6 @@ protected:
|
||||
int32_t subLayerIndex = 0;
|
||||
DepthMaskType depthType = DepthMaskType::ReadOnly;
|
||||
gfx::ShaderProgramBasePtr shader;
|
||||
mat4 matrix;
|
||||
UniqueDrawable currentDrawable;
|
||||
std::vector<UniqueDrawable> drawables;
|
||||
ColorAttrMode colorAttrMode = ColorAttrMode::PerVertex;
|
||||
|
||||
@@ -2,16 +2,21 @@
|
||||
|
||||
#include <mbgl/util/immutable.hpp>
|
||||
|
||||
#include <array>
|
||||
#include <memory>
|
||||
|
||||
namespace mbgl {
|
||||
|
||||
namespace style {
|
||||
class LayerProperties;
|
||||
enum class TranslateAnchorType : bool;
|
||||
} // namespace style
|
||||
|
||||
class PaintParameters;
|
||||
class TransformState;
|
||||
class LayerGroup;
|
||||
class PaintParameters;
|
||||
class RenderTree;
|
||||
class UnwrappedTileID;
|
||||
|
||||
using mat4 = std::array<double, 16>;
|
||||
|
||||
/**
|
||||
Base class for layer tweakers, which manipulate layer group per frame
|
||||
@@ -24,7 +29,15 @@ public:
|
||||
LayerTweaker() = delete;
|
||||
virtual ~LayerTweaker() = default;
|
||||
|
||||
virtual void execute(LayerGroup&, const PaintParameters&) = 0;
|
||||
virtual void execute(LayerGroup&, const RenderTree&, const PaintParameters&) = 0;
|
||||
|
||||
protected:
|
||||
static mat4 getTileMatrix(const UnwrappedTileID&,
|
||||
const RenderTree&,
|
||||
const TransformState&,
|
||||
const std::array<float, 2>& translation,
|
||||
style::TranslateAnchorType,
|
||||
bool inViewportPixelUnits);
|
||||
|
||||
protected:
|
||||
Immutable<style::LayerProperties> evaluatedProperties;
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
#include <mbgl/gfx/cull_face_mode.hpp>
|
||||
#include <mbgl/gfx/types.hpp>
|
||||
#include <mbgl/renderer/render_pass.hpp>
|
||||
#include <mbgl/util/mat4.hpp>
|
||||
|
||||
namespace mbgl {
|
||||
namespace gfx {
|
||||
@@ -15,7 +14,6 @@ struct Drawable::Impl {
|
||||
Drawable::Drawable(std::string name_)
|
||||
: name(name_),
|
||||
renderPass(RenderPass::Opaque),
|
||||
matrix(matrix::identity4()),
|
||||
depthType(DepthMaskType::ReadOnly),
|
||||
impl(std::make_unique<Impl>()) {}
|
||||
|
||||
|
||||
@@ -49,7 +49,6 @@ void DrawableBuilder::flush() {
|
||||
draw->setDepthType(depthType);
|
||||
draw->setCullFaceMode(impl->cullFaceMode);
|
||||
draw->setShader(shader);
|
||||
draw->setMatrix(matrix);
|
||||
draw->setTextures(textures);
|
||||
|
||||
if (auto drawAttrs = getVertexAttributes().clone()) {
|
||||
|
||||
@@ -1,9 +1,30 @@
|
||||
#include <mbgl/renderer/layer_tweaker.hpp>
|
||||
|
||||
#include <mbgl/map/transform_state.hpp>
|
||||
#include <mbgl/style/layer_properties.hpp>
|
||||
#include <mbgl/renderer/render_tree.hpp>
|
||||
#include <mbgl/renderer/render_tile.hpp>
|
||||
#include <mbgl/util/mat4.hpp>
|
||||
|
||||
namespace mbgl {
|
||||
|
||||
LayerTweaker::LayerTweaker(Immutable<style::LayerProperties> properties)
|
||||
: evaluatedProperties(std::move(properties)){};
|
||||
: evaluatedProperties(std::move(properties)){}
|
||||
|
||||
mat4 LayerTweaker::getTileMatrix(const UnwrappedTileID& tileID,
|
||||
const RenderTree& renderTree,
|
||||
const TransformState& state,
|
||||
const std::array<float, 2>& translation,
|
||||
style::TranslateAnchorType anchor,
|
||||
bool inViewportPixelUnits) {
|
||||
// from RenderTile::prepare
|
||||
mat4 tileMatrix;
|
||||
state.matrixFor(tileMatrix, tileID);
|
||||
|
||||
const auto& projMatrix = renderTree.getParameters().transformParams.projMatrix;
|
||||
matrix::multiply(tileMatrix, projMatrix, tileMatrix);
|
||||
|
||||
return RenderTile::translateVtxMatrix(tileID, tileMatrix, translation, anchor, state, inViewportPixelUnits);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ struct alignas(16) BackgroundPatternLayerUBO {
|
||||
};
|
||||
static_assert(sizeof(BackgroundPatternLayerUBO) % 16 == 0);
|
||||
|
||||
void BackgroundLayerTweaker::execute(LayerGroup& layerGroup, const PaintParameters& parameters) {
|
||||
void BackgroundLayerTweaker::execute(LayerGroup& layerGroup, const RenderTree&, const PaintParameters& parameters) {
|
||||
const auto& evaluated = static_cast<const BackgroundLayerProperties&>(*evaluatedProperties).evaluated;
|
||||
|
||||
if (!layerUniformBuffer) {
|
||||
@@ -56,11 +56,8 @@ void BackgroundLayerTweaker::execute(LayerGroup& layerGroup, const PaintParamete
|
||||
if (!drawable.getTileID()) {
|
||||
return;
|
||||
}
|
||||
mat4 matrix = drawable.getMatrix();
|
||||
const UnwrappedTileID tileID = drawable.getTileID()->toUnwrapped();
|
||||
const auto tileMat = parameters.matrixForTile(tileID);
|
||||
matrix::multiply(matrix, drawable.getMatrix(), tileMat);
|
||||
matrix = tileMat;
|
||||
const auto matrix = parameters.matrixForTile(tileID);
|
||||
|
||||
BackgroundDrawableUBO drawableUBO;
|
||||
drawableUBO.matrix = util::cast<float>(matrix);
|
||||
|
||||
@@ -20,7 +20,7 @@ public:
|
||||
public:
|
||||
~BackgroundLayerTweaker() override = default;
|
||||
|
||||
void execute(LayerGroup&, const PaintParameters&) override;
|
||||
void execute(LayerGroup&, const RenderTree&, const PaintParameters&) override;
|
||||
|
||||
protected:
|
||||
gfx::UniformBufferPtr layerUniformBuffer = nullptr;
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
#include <mbgl/renderer/layers/circle_layer_tweaker.hpp>
|
||||
#include <mbgl/renderer/layer_group.hpp>
|
||||
#include <mbgl/renderer/paint_parameters.hpp>
|
||||
#include <mbgl/style/layers/circle_layer_properties.hpp>
|
||||
|
||||
#include <mbgl/gfx/context.hpp>
|
||||
#include <mbgl/gfx/drawable.hpp>
|
||||
#include <mbgl/renderer/layer_group.hpp>
|
||||
#include <mbgl/renderer/paint_parameters.hpp>
|
||||
#include <mbgl/renderer/render_tree.hpp>
|
||||
#include <mbgl/style/layers/circle_layer_properties.hpp>
|
||||
#include <mbgl/util/convert.hpp>
|
||||
|
||||
namespace mbgl {
|
||||
@@ -50,7 +52,7 @@ struct alignas(16) CircleInterpolateUBO {
|
||||
};
|
||||
static_assert(sizeof(CircleInterpolateUBO) % 16 == 0);
|
||||
|
||||
void CircleLayerTweaker::execute(LayerGroup& layerGroup, const PaintParameters& parameters) {
|
||||
void CircleLayerTweaker::execute(LayerGroup& layerGroup, const RenderTree& renderTree, const PaintParameters& parameters) {
|
||||
const auto& evaluated = static_cast<const CircleLayerProperties&>(*evaluatedProperties).evaluated;
|
||||
|
||||
CirclePaintParamsUBO paintParamsUBO;
|
||||
@@ -93,11 +95,12 @@ void CircleLayerTweaker::execute(LayerGroup& layerGroup, const PaintParameters&
|
||||
if (!drawable.getTileID()) {
|
||||
return;
|
||||
}
|
||||
mat4 matrix = drawable.getMatrix();
|
||||
const UnwrappedTileID tileID = drawable.getTileID()->toUnwrapped();
|
||||
const auto tileMat = parameters.matrixForTile(tileID);
|
||||
matrix::multiply(matrix, drawable.getMatrix(), tileMat);
|
||||
matrix = tileMat;
|
||||
|
||||
const auto& translation = evaluated.get<CircleTranslate>();
|
||||
const auto anchor = evaluated.get<CircleTranslateAnchor>();
|
||||
constexpr bool inViewportPixelUnits = false; // from RenderTile::translatedMatrix
|
||||
const auto matrix = getTileMatrix(tileID, renderTree, parameters.state, translation, anchor, inViewportPixelUnits);
|
||||
|
||||
CircleDrawableUBO drawableUBO;
|
||||
drawableUBO.matrix = util::cast<float>(matrix);
|
||||
|
||||
@@ -20,7 +20,7 @@ public:
|
||||
public:
|
||||
~CircleLayerTweaker() override = default;
|
||||
|
||||
void execute(LayerGroup&, const PaintParameters&) override;
|
||||
void execute(LayerGroup&, const RenderTree&, const PaintParameters&) override;
|
||||
|
||||
protected:
|
||||
gfx::UniformBufferPtr evaluatedPropsUniformBuffer = nullptr;
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
#include <mbgl/renderer/layers/fill_layer_tweaker.hpp>
|
||||
#include <mbgl/renderer/layer_group.hpp>
|
||||
#include <mbgl/renderer/paint_parameters.hpp>
|
||||
#include <mbgl/style/layers/fill_layer_properties.hpp>
|
||||
|
||||
#include <mbgl/gfx/context.hpp>
|
||||
#include <mbgl/gfx/drawable.hpp>
|
||||
#include <mbgl/gfx/renderable.hpp>
|
||||
#include <mbgl/gfx/renderer_backend.hpp>
|
||||
#include <mbgl/renderer/layer_group.hpp>
|
||||
#include <mbgl/renderer/render_tree.hpp>
|
||||
#include <mbgl/renderer/paint_parameters.hpp>
|
||||
#include <mbgl/renderer/render_tile.cpp>
|
||||
#include <mbgl/style/layers/fill_layer_properties.hpp>
|
||||
#include <mbgl/util/convert.hpp>
|
||||
|
||||
namespace mbgl {
|
||||
@@ -44,9 +47,9 @@ struct alignas(16) FillDrawableUBO {
|
||||
};
|
||||
static_assert(sizeof(FillDrawableUBO) == 208);
|
||||
|
||||
void FillLayerTweaker::execute(LayerGroup& layerGroup, const PaintParameters& parameters) {
|
||||
void FillLayerTweaker::execute(LayerGroup& layerGroup, const RenderTree& renderTree, const PaintParameters& parameters) {
|
||||
const auto& props = static_cast<const FillLayerProperties&>(*evaluatedProperties);
|
||||
// const auto& evaluated = props.evaluated;
|
||||
const auto& evaluated = props.evaluated;
|
||||
const auto& crossfade = props.crossfade;
|
||||
|
||||
layerGroup.observeDrawables([&](gfx::Drawable& drawable) {
|
||||
@@ -69,14 +72,12 @@ void FillLayerTweaker::execute(LayerGroup& layerGroup, const PaintParameters& pa
|
||||
auto uniformBuffer = context.createUniformBuffer(&drawableUBO, sizeof(drawableUBO));
|
||||
drawable.mutableUniformBuffers().addOrReplace("DrawableUBO", uniformBuffer);*/
|
||||
|
||||
mat4 matrix = drawable.getMatrix();
|
||||
const UnwrappedTileID tileID = drawable.getTileID()->toUnwrapped();
|
||||
const auto tileMat = parameters.matrixForTile(tileID);
|
||||
matrix::multiply(matrix, drawable.getMatrix(), tileMat);
|
||||
matrix = tileMat;
|
||||
|
||||
// matrix = tile.translatedMatrix(evaluated.get<FillTranslate>(), evaluated.get<FillTranslateAnchor>(),
|
||||
// parameters.state),
|
||||
const auto& translation = evaluated.get<FillTranslate>();
|
||||
const auto anchor = evaluated.get<FillTranslateAnchor>();
|
||||
constexpr bool inViewportPixelUnits = false; // from RenderTile::translatedMatrix
|
||||
const auto matrix = getTileMatrix(tileID, renderTree, parameters.state, translation, anchor, inViewportPixelUnits);
|
||||
|
||||
// from FillPatternProgram::layoutUniformValues
|
||||
const auto renderableSize = parameters.backend.getDefaultRenderable().getSize();
|
||||
|
||||
@@ -15,7 +15,7 @@ public:
|
||||
public:
|
||||
~FillLayerTweaker() override = default;
|
||||
|
||||
void execute(LayerGroup&, const PaintParameters&) override;
|
||||
void execute(LayerGroup&, const RenderTree&, const PaintParameters&) override;
|
||||
};
|
||||
|
||||
} // namespace mbgl
|
||||
|
||||
@@ -315,9 +315,6 @@ void RenderBackgroundLayer::update(gfx::ShaderRegistry& shaders,
|
||||
// Tile coordinates are fixed...
|
||||
builder->addQuad(0, 0, util::EXTENT, util::EXTENT);
|
||||
|
||||
// ... they're placed with the matrix in the uniforms, which changes with the view
|
||||
builder->setMatrix(/*parameters.matrixForTile(tileID.toUnwrapped())*/ matrix::identity4());
|
||||
|
||||
builder->flush();
|
||||
|
||||
auto newDrawables = builder->clearDrawables();
|
||||
|
||||
@@ -492,9 +492,6 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders,
|
||||
// FillOutlineProgram::TextureBindings{});
|
||||
// }
|
||||
|
||||
// tile.translatedMatrix(evaluated.get<FillTranslate>(), evaluated.get<FillTranslateAnchor>(),
|
||||
// parameters.state)
|
||||
|
||||
if (fillBuilder) {
|
||||
fillBuilder->setRenderPass(renderPass);
|
||||
fillBuilder->setVertexAttributes(fillVertexAttrs);
|
||||
@@ -600,9 +597,6 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders,
|
||||
//
|
||||
// const auto allUniformValues = programInstance.computeAllUniformValues(
|
||||
// FillPatternProgram::layoutUniformValues(
|
||||
// tile.translatedMatrix(
|
||||
// evaluated.get<FillTranslate>(), evaluated.get<FillTranslateAnchor>(),
|
||||
// parameters.state),
|
||||
// parameters.backend.getDefaultRenderable().getSize(),
|
||||
// tile.getIconAtlasTexture().size,
|
||||
// crossfade,
|
||||
|
||||
@@ -22,11 +22,12 @@ RenderTile::RenderTile(UnwrappedTileID id_, Tile& tile_)
|
||||
|
||||
RenderTile::~RenderTile() = default;
|
||||
|
||||
mat4 RenderTile::translateVtxMatrix(const mat4& tileMatrix,
|
||||
mat4 RenderTile::translateVtxMatrix(const UnwrappedTileID& id,
|
||||
const mat4& tileMatrix,
|
||||
const std::array<float, 2>& translation,
|
||||
TranslateAnchorType anchor,
|
||||
const TransformState& state,
|
||||
const bool inViewportPixelUnits) const {
|
||||
const bool inViewportPixelUnits) {
|
||||
if (translation[0] == 0 && translation[1] == 0) {
|
||||
return tileMatrix;
|
||||
}
|
||||
@@ -53,6 +54,14 @@ mat4 RenderTile::translateVtxMatrix(const mat4& tileMatrix,
|
||||
return vtxMatrix;
|
||||
}
|
||||
|
||||
mat4 RenderTile::translateVtxMatrix(const mat4& tileMatrix,
|
||||
const std::array<float, 2>& translation,
|
||||
TranslateAnchorType anchor,
|
||||
const TransformState& state,
|
||||
const bool inViewportPixelUnits) const {
|
||||
return translateVtxMatrix(id, tileMatrix, translation, anchor, state, inViewportPixelUnits);
|
||||
}
|
||||
|
||||
mat4 RenderTile::translatedMatrix(const std::array<float, 2>& translation,
|
||||
TranslateAnchorType anchor,
|
||||
const TransformState& state) const {
|
||||
|
||||
@@ -62,6 +62,13 @@ public:
|
||||
void prepare(const SourcePrepareParameters&);
|
||||
void finishRender(PaintParameters&) const;
|
||||
|
||||
static mat4 translateVtxMatrix(const UnwrappedTileID& id,
|
||||
const mat4& tileMatrix,
|
||||
const std::array<float, 2>& translation,
|
||||
style::TranslateAnchorType anchor,
|
||||
const TransformState& state,
|
||||
bool inViewportPixelUnits);
|
||||
|
||||
mat4 translateVtxMatrix(const mat4& tileMatrix,
|
||||
const std::array<float, 2>& translation,
|
||||
style::TranslateAnchorType anchor,
|
||||
|
||||
@@ -120,7 +120,7 @@ void Renderer::Impl::render(const RenderTree& renderTree) {
|
||||
// Run layer tweakers to update any dynamic elements
|
||||
orchestrator.observeLayerGroups([&](LayerGroup& layerGroup) {
|
||||
if (layerGroup.getLayerTweaker()) {
|
||||
layerGroup.getLayerTweaker()->execute(layerGroup, parameters);
|
||||
layerGroup.getLayerTweaker()->execute(layerGroup, renderTree, parameters);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user