Esempio n. 1
0
void Style::onBeginDrawFrame(RenderState& rs, const View& _view, Scene& _scene) {

    // Reset the currently used texture unit to 0
    rs.resetTextureUnit();

    // Set time uniforms style's shader programs
    m_shaderProgram->setUniformf(rs, m_uTime, _scene.time());

    m_shaderProgram->setUniformf(rs, m_uDevicePixelRatio, m_pixelScale);

    if (m_material.uniforms) {
        m_material.material->setupProgram(rs, *m_material.uniforms);
    }

    // Set up lights
    for (const auto& light : m_lights) {
        light.light->setupProgram(rs, _view, *light.uniforms);
    }

    // Set Map Position
    m_shaderProgram->setUniformf(rs, m_uResolution, _view.getWidth(), _view.getHeight());

    const auto& mapPos = _view.getPosition();
    m_shaderProgram->setUniformf(rs, m_uMapPosition, mapPos.x, mapPos.y, _view.getZoom());
    m_shaderProgram->setUniformMatrix3f(rs, m_uNormalMatrix, _view.getNormalMatrix());
    m_shaderProgram->setUniformMatrix3f(rs, m_uInverseNormalMatrix, _view.getInverseNormalMatrix());
    m_shaderProgram->setUniformf(rs, m_uMetersPerPixel, 1.0 / _view.pixelsPerMeter());
    m_shaderProgram->setUniformMatrix4f(rs, m_uView, _view.getViewMatrix());
    m_shaderProgram->setUniformMatrix4f(rs, m_uProj, _view.getProjectionMatrix());

    setupShaderUniforms(rs, _scene);

    // Configure render state
    switch (m_blend) {
        case Blending::none:
            rs.blending(GL_FALSE);
            rs.blendingFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
            rs.depthTest(GL_TRUE);
            rs.depthMask(GL_TRUE);
            break;
        case Blending::add:
            rs.blending(GL_TRUE);
            rs.blendingFunc(GL_ONE, GL_ONE);
            rs.depthTest(GL_FALSE);
            rs.depthMask(GL_TRUE);
            break;
        case Blending::multiply:
            rs.blending(GL_TRUE);
            rs.blendingFunc(GL_ZERO, GL_SRC_COLOR);
            rs.depthTest(GL_FALSE);
            rs.depthMask(GL_TRUE);
            break;
        case Blending::overlay:
            rs.blending(GL_TRUE);
            rs.blendingFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
            rs.depthTest(GL_FALSE);
            rs.depthMask(GL_FALSE);
            break;
        case Blending::inlay:
            // TODO: inlay does not behave correctly for labels because they don't have a z position
            rs.blending(GL_TRUE);
            rs.blendingFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
            rs.depthTest(GL_TRUE);
            rs.depthMask(GL_FALSE);
            break;
        default:
            break;
    }
}
Esempio n. 2
0
void Style::onBeginDrawFrame(const View& _view, Scene& _scene, int _textureUnit) {

    bool contextLost = glContextLost();

    // Setup constant uniforms
    if (contextLost) {
        m_shaderProgram->setUniformf("u_device_pixel_ratio", m_pixelScale);
    }

    m_material->setupProgram(*m_shaderProgram);

    // Set up lights
    for (const auto& light : _scene.lights()) {
        light->setupProgram(_view, *m_shaderProgram);
    }

    // Set Map Position
    if (m_dirtyViewport) {
        m_shaderProgram->setUniformf("u_resolution", _view.getWidth(), _view.getHeight());
    }

    const auto& mapPos = _view.getPosition();
    m_shaderProgram->setUniformf("u_map_position", mapPos.x, mapPos.y, _view.getZoom());
    m_shaderProgram->setUniformMatrix3f("u_normalMatrix", glm::value_ptr(_view.getNormalMatrix()));
    m_shaderProgram->setUniformMatrix3f("u_inverseNormalMatrix", glm::value_ptr(glm::inverse(_view.getNormalMatrix())));
    m_shaderProgram->setUniformf("u_meters_per_pixel", 1.0 / _view.pixelsPerMeter());
    m_shaderProgram->setUniformMatrix4f("u_view", glm::value_ptr(_view.getViewMatrix()));
    m_shaderProgram->setUniformMatrix4f("u_proj", glm::value_ptr(_view.getProjectionMatrix()));

    setupShaderUniforms(_textureUnit, contextLost, _scene);

    // Configure render state
    switch (m_blend) {
        case Blending::none:
            RenderState::blending(GL_FALSE);
            RenderState::blendingFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
            RenderState::depthTest(GL_TRUE);
            RenderState::depthWrite(GL_TRUE);
            break;
        case Blending::add:
            RenderState::blending(GL_TRUE);
            RenderState::blendingFunc(GL_ONE, GL_ONE);
            RenderState::depthTest(GL_FALSE);
            RenderState::depthWrite(GL_TRUE);
            break;
        case Blending::multiply:
            RenderState::blending(GL_TRUE);
            RenderState::blendingFunc(GL_ZERO, GL_SRC_COLOR);
            RenderState::depthTest(GL_FALSE);
            RenderState::depthWrite(GL_TRUE);
            break;
        case Blending::overlay:
            RenderState::blending(GL_TRUE);
            RenderState::blendingFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
            RenderState::depthTest(GL_FALSE);
            RenderState::depthWrite(GL_FALSE);
            break;
        case Blending::inlay:
            // TODO: inlay does not behave correctly for labels because they don't have a z position
            RenderState::blending(GL_TRUE);
            RenderState::blendingFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
            RenderState::depthTest(GL_TRUE);
            RenderState::depthWrite(GL_FALSE);
            break;
        default:
            break;
    }
}