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