void Painter::renderRaster(RasterBucket& bucket,
                           const RasterLayer& layer,
                           const UnwrappedTileID&,
                           const mat4& matrix) {
    if (pass != RenderPass::Translucent) return;

    const RasterPaintProperties& properties = layer.impl->paint;

    if (bucket.hasData()) {
        config.program = rasterShader->getID();
        rasterShader->u_matrix = matrix;
        rasterShader->u_buffer = 0;
        rasterShader->u_opacity = properties.rasterOpacity;
        rasterShader->u_brightness_low = properties.rasterBrightnessMin;
        rasterShader->u_brightness_high = properties.rasterBrightnessMax;
        rasterShader->u_saturation_factor = saturationFactor(properties.rasterSaturation);
        rasterShader->u_contrast_factor = contrastFactor(properties.rasterContrast);
        rasterShader->u_spin_weights = spinWeights(properties.rasterHueRotate);

        config.stencilTest = GL_FALSE;

        rasterShader->u_image = 0;
        config.activeTexture = GL_TEXTURE0;

        config.depthFunc.reset();
        config.depthTest = GL_TRUE;
        config.depthMask = GL_FALSE;
        setDepthSublayer(0);
        bucket.drawRaster(*rasterShader, tileStencilBuffer, coveringRasterArray, store);
    }
}
void Painter::renderRaster(RasterBucket& bucket, const StyleLayer &layer_desc, const TileID&, const mat4 &matrix) {
    if (pass != RenderPass::Translucent) return;

    const RasterProperties &properties = layer_desc.getProperties<RasterProperties>();

    if (bucket.hasData()) {
        useProgram(rasterShader->program);
        rasterShader->u_matrix = matrix;
        rasterShader->u_buffer = 0;
        rasterShader->u_opacity = properties.opacity;
        rasterShader->u_brightness_low = properties.brightness[0];
        rasterShader->u_brightness_high = properties.brightness[1];
        rasterShader->u_saturation_factor = saturationFactor(properties.saturation);
        rasterShader->u_contrast_factor = contrastFactor(properties.contrast);
        rasterShader->u_spin_weights = spinWeights(properties.hue_rotate);

        config.stencilTest = true;
        config.depthTest = true;
        setDepthSublayer(0);
        bucket.drawRaster(*rasterShader, tileStencilBuffer, coveringRasterArray);
    }
}
void Painter::renderRaster(RasterBucket& bucket, const RasterLayer& layer, const TileID&, const mat4& matrix) {
    if (pass != RenderPass::Translucent) return;

    const RasterPaintProperties& properties = layer.paint;

    if (bucket.hasData()) {
        config.program = rasterShader->program;
        rasterShader->u_matrix = matrix;
        rasterShader->u_buffer = 0;
        rasterShader->u_opacity = properties.opacity;
        rasterShader->u_brightness_low = properties.brightnessMin;
        rasterShader->u_brightness_high = properties.brightnessMax;
        rasterShader->u_saturation_factor = saturationFactor(properties.saturation);
        rasterShader->u_contrast_factor = contrastFactor(properties.contrast);
        rasterShader->u_spin_weights = spinWeights(properties.hueRotate);

        config.stencilOp.reset();
        config.stencilTest = GL_TRUE;
        config.depthFunc.reset();
        config.depthTest = GL_TRUE;
        setDepthSublayer(0);
        bucket.drawRaster(*rasterShader, tileStencilBuffer, coveringRasterArray);
    }
}
Esempio n. 4
0
TEST(Buckets, RasterBucket) {
    HeadlessBackend backend({ 512, 256 });
    BackendScope scope { backend };

    gl::Context context;
    PremultipliedImage rgba({ 1, 1 });

    // RasterBucket::hasData() is always true.
    RasterBucket bucket = { std::move(rgba) };
    ASSERT_TRUE(bucket.hasData());
    ASSERT_TRUE(bucket.needsUpload());

    bucket.upload(context);
    ASSERT_FALSE(bucket.needsUpload());

    bucket.clear();
    ASSERT_TRUE(bucket.needsUpload());
}
void Painter::renderRaster(RasterBucket& bucket, util::ptr<StyleLayer> layer_desc, const Tile::ID& id, const mat4 &matrix) {
    if (pass != RenderPass::Translucent) return;

    const RasterProperties &properties = layer_desc->getProperties<RasterProperties>();

    if (layer_desc->layers) {

        if (!bucket.texture.getTexture()) {

            bucket.texture.bindFramebuffer();

            preparePrerender(bucket);

            const int buffer = bucket.properties.buffer * 4096.0f;

            const mat4 preMatrix = [&]{
                mat4 vtxMatrix;
                matrix::ortho(vtxMatrix, -buffer, 4096 + buffer, -4096 - buffer, buffer, 0, 1);
                matrix::translate(vtxMatrix, vtxMatrix, 0, -4096, 0);
                return vtxMatrix;
            }();

            for (const util::ptr<StyleLayer> &layer : layer_desc->layers->layers) {
                setOpaque();
                renderLayer(layer, &id, &preMatrix);
                setTranslucent();
                renderLayer(layer, &id, &preMatrix);
            }

            if (bucket.properties.blur > 0) {
                bucket.texture.blur(*this, bucket.properties.blur);
            }

            bucket.texture.unbindFramebuffer();

            glEnable(GL_DEPTH_TEST);
            glEnable(GL_STENCIL_TEST);

            glViewport(0, 0, gl_viewport[0], gl_viewport[1]);

        }

        renderPrerenderedTexture(bucket, matrix, properties);

    }

    // Only draw non-prerendered raster here
    if (bucket.hasData()) {
        depthMask(false);

        useProgram(rasterShader->program);
        rasterShader->u_matrix = matrix;
        rasterShader->u_buffer = 0;
        rasterShader->u_opacity = properties.opacity;
        rasterShader->u_brightness_low = properties.brightness[0];
        rasterShader->u_brightness_high = properties.brightness[1];
        rasterShader->u_saturation_factor = saturationFactor(properties.saturation);
        rasterShader->u_contrast_factor = contrastFactor(properties.contrast);
        rasterShader->u_spin_weights = spinWeights(properties.hue_rotate);

        depthRange(strata + strata_epsilon, 1.0f);

        bucket.drawRaster(*rasterShader, tileStencilBuffer, coveringRasterArray);

        depthMask(true);
    }

}