Use the new ShaderManager API in SceneOpenGL2
This commit is contained in:
parent
05c309da67
commit
0d2b2bc8b3
2 changed files with 77 additions and 10 deletions
|
@ -951,11 +951,57 @@ SceneOpenGL2::~SceneOpenGL2()
|
|||
{
|
||||
}
|
||||
|
||||
QMatrix4x4 SceneOpenGL2::createProjectionMatrix() const
|
||||
{
|
||||
// Create a perspective projection with a 60° field-of-view,
|
||||
// and an aspect ratio of 1.0.
|
||||
const float fovY = 60.0f;
|
||||
const float aspect = 1.0f;
|
||||
const float zNear = 0.1f;
|
||||
const float zFar = 100.0f;
|
||||
|
||||
const float yMax = zNear * std::tan(fovY * M_PI / 360.0f);
|
||||
const float yMin = -yMax;
|
||||
const float xMin = yMin * aspect;
|
||||
const float xMax = yMax * aspect;
|
||||
|
||||
QMatrix4x4 projection;
|
||||
projection.frustum(xMin, xMax, yMin, yMax, zNear, zFar);
|
||||
|
||||
// Create a second matrix that transforms screen coordinates
|
||||
// to world coordinates.
|
||||
const float scaleFactor = 1.1 * std::tan(fovY * M_PI / 360.0f) / yMax;
|
||||
const QSize size = screens()->size();
|
||||
|
||||
QMatrix4x4 matrix;
|
||||
matrix.translate(xMin * scaleFactor, yMax * scaleFactor, -1.1);
|
||||
matrix.scale( (xMax - xMin) * scaleFactor / size.width(),
|
||||
-(yMax - yMin) * scaleFactor / size.height(),
|
||||
0.001);
|
||||
|
||||
// Combine the matrices
|
||||
return projection * matrix;
|
||||
}
|
||||
|
||||
void SceneOpenGL2::paintSimpleScreen(int mask, QRegion region)
|
||||
{
|
||||
m_projectionMatrix = createProjectionMatrix();
|
||||
m_screenProjectionMatrix = m_projectionMatrix;
|
||||
|
||||
Scene::paintSimpleScreen(mask, region);
|
||||
}
|
||||
|
||||
void SceneOpenGL2::paintGenericScreen(int mask, ScreenPaintData data)
|
||||
{
|
||||
ShaderBinder binder(ShaderManager::GenericShader);
|
||||
const QMatrix4x4 screenMatrix = transformation(mask, data);
|
||||
const QMatrix4x4 pMatrix = createProjectionMatrix();
|
||||
|
||||
binder.shader()->setUniform(GLShader::ScreenTransformation, transformation(mask, data));
|
||||
m_projectionMatrix = pMatrix;
|
||||
m_screenProjectionMatrix = pMatrix * screenMatrix;
|
||||
|
||||
// ### Remove the following two lines when there are no more users of the old shader API
|
||||
ShaderBinder binder(ShaderManager::GenericShader);
|
||||
binder.shader()->setUniform(GLShader::ScreenTransformation, screenMatrix);
|
||||
|
||||
Scene::paintGenericScreen(mask, data);
|
||||
}
|
||||
|
@ -1337,21 +1383,36 @@ void SceneOpenGL2Window::performPaint(int mask, QRegion region, WindowPaintData
|
|||
if (!beginRenderWindow(mask, region, data))
|
||||
return;
|
||||
|
||||
SceneOpenGL2 *scene = static_cast<SceneOpenGL2 *>(m_scene);
|
||||
|
||||
const QMatrix4x4 windowMatrix = transformation(mask, data);
|
||||
QMatrix4x4 mvpMatrix;
|
||||
|
||||
if (mask & Scene::PAINT_SCREEN_TRANSFORMED)
|
||||
mvpMatrix = scene->screenModelViewProjectionMatrix() * windowMatrix;
|
||||
else
|
||||
mvpMatrix = scene->modelViewProjectionMatrix() * windowMatrix;
|
||||
|
||||
GLShader *shader = data.shader;
|
||||
if (!shader) {
|
||||
if ((mask & Scene::PAINT_WINDOW_TRANSFORMED) || (mask & Scene::PAINT_SCREEN_TRANSFORMED)) {
|
||||
shader = ShaderManager::instance()->pushShader(ShaderManager::GenericShader);
|
||||
} else {
|
||||
shader = ShaderManager::instance()->pushShader(ShaderManager::SimpleShader);
|
||||
shader->setUniform(GLShader::Offset, QVector2D(x(), y()));
|
||||
}
|
||||
ShaderTraits traits = ShaderTrait::MapTexture;
|
||||
|
||||
if (data.opacity() != 1.0 || data.brightness() != 1.0)
|
||||
traits |= ShaderTrait::Modulate;
|
||||
|
||||
if (data.saturation() != 1.0)
|
||||
traits |= ShaderTrait::AdjustSaturation;
|
||||
|
||||
shader = ShaderManager::instance()->pushShader(traits);
|
||||
shader->setUniform(GLShader::ModelViewProjectionMatrix, mvpMatrix);
|
||||
}
|
||||
|
||||
if (ColorCorrection *cc = static_cast<SceneOpenGL2*>(m_scene)->colorCorrection()) {
|
||||
if (ColorCorrection *cc = scene->colorCorrection()) {
|
||||
cc->setupForOutput(data.screen());
|
||||
}
|
||||
|
||||
shader->setUniform(GLShader::WindowTransformation, transformation(mask, data));
|
||||
// ### Remove the following line when there are no more users of the old shader API
|
||||
shader->setUniform(GLShader::WindowTransformation, windowMatrix);
|
||||
shader->setUniform(GLShader::Saturation, data.saturation());
|
||||
|
||||
const GLenum filter = (mask & (Effect::PAINT_WINDOW_TRANSFORMED | Effect::PAINT_SCREEN_TRANSFORMED))
|
||||
|
|
|
@ -124,8 +124,11 @@ public:
|
|||
static bool supported(OpenGLBackend *backend);
|
||||
|
||||
ColorCorrection *colorCorrection();
|
||||
QMatrix4x4 projectionMatrix() const { return m_projectionMatrix; }
|
||||
QMatrix4x4 screenProjectionMatrix() const { return m_screenProjectionMatrix; }
|
||||
|
||||
protected:
|
||||
virtual void paintSimpleScreen(int mask, QRegion region);
|
||||
virtual void paintGenericScreen(int mask, ScreenPaintData data);
|
||||
virtual void doPaintBackground(const QVector< float >& vertices);
|
||||
virtual Scene::Window *createWindow(Toplevel *t);
|
||||
|
@ -138,10 +141,13 @@ private Q_SLOTS:
|
|||
|
||||
private:
|
||||
void performPaintWindow(EffectWindowImpl* w, int mask, QRegion region, WindowPaintData& data);
|
||||
QMatrix4x4 createProjectionMatrix() const;
|
||||
|
||||
private:
|
||||
LanczosFilter *m_lanczosFilter;
|
||||
QScopedPointer<ColorCorrection> m_colorCorrection;
|
||||
QMatrix4x4 m_projectionMatrix;
|
||||
QMatrix4x4 m_screenProjectionMatrix;
|
||||
GLuint vao;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue