Drawable Renderer (#1570), Refactor tile matrix handling to account for translations

This commit is contained in:
Tim Sylvester
2023-05-30 10:17:44 -07:00
committed by Bart Louwers
parent 411451dbf5
commit 4527d18a67
17 changed files with 86 additions and 55 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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