kwin: Refactor the screen transformation code
Move the code that computes the transformation matrix to its own method, and rewrite it to improve readability.
This commit is contained in:
parent
90f6cbfa5e
commit
d2078d4b9b
2 changed files with 49 additions and 45 deletions
|
@ -143,55 +143,56 @@ bool SceneOpenGL::selfCheck()
|
|||
return ok;
|
||||
}
|
||||
|
||||
QMatrix4x4 SceneOpenGL::transformation(int mask, const ScreenPaintData &data) const
|
||||
{
|
||||
QMatrix4x4 matrix;
|
||||
|
||||
if (!(mask & PAINT_SCREEN_TRANSFORMED))
|
||||
return matrix;
|
||||
|
||||
matrix.translate(data.xTranslate, data.yTranslate, data.zTranslate);
|
||||
matrix.scale(data.xScale, data.yScale, data.zScale);
|
||||
|
||||
if (!data.rotation)
|
||||
return matrix;
|
||||
|
||||
// Apply the rotation
|
||||
const qreal xAxis = (data.rotation->axis == RotationData::XAxis ? 1.0 : 0.0);
|
||||
const qreal yAxis = (data.rotation->axis == RotationData::YAxis ? 1.0 : 0.0);
|
||||
const qreal zAxis = (data.rotation->axis == RotationData::ZAxis ? 1.0 : 0.0);
|
||||
|
||||
matrix.translate(data.rotation->xRotationPoint,
|
||||
data.rotation->yRotationPoint,
|
||||
data.rotation->zRotationPoint);
|
||||
|
||||
matrix.rotate(data.rotation->angle, xAxis, yAxis, zAxis);
|
||||
|
||||
matrix.translate(-data.rotation->xRotationPoint,
|
||||
-data.rotation->yRotationPoint,
|
||||
-data.rotation->zRotationPoint);
|
||||
|
||||
return matrix;
|
||||
}
|
||||
|
||||
void SceneOpenGL::paintGenericScreen(int mask, ScreenPaintData data)
|
||||
{
|
||||
const bool useShader = ShaderManager::instance()->isValid();
|
||||
if (mask & PAINT_SCREEN_TRANSFORMED) {
|
||||
// apply screen transformations
|
||||
QMatrix4x4 screenTransformation;
|
||||
screenTransformation.translate(data.xTranslate, data.yTranslate, data.zTranslate);
|
||||
if (data.rotation) {
|
||||
screenTransformation.translate(data.rotation->xRotationPoint, data.rotation->yRotationPoint, data.rotation->zRotationPoint);
|
||||
// translate to rotation point, rotate, translate back
|
||||
qreal xAxis = 0.0;
|
||||
qreal yAxis = 0.0;
|
||||
qreal zAxis = 0.0;
|
||||
switch(data.rotation->axis) {
|
||||
case RotationData::XAxis:
|
||||
xAxis = 1.0;
|
||||
break;
|
||||
case RotationData::YAxis:
|
||||
yAxis = 1.0;
|
||||
break;
|
||||
case RotationData::ZAxis:
|
||||
zAxis = 1.0;
|
||||
break;
|
||||
}
|
||||
screenTransformation.rotate(data.rotation->angle, xAxis, yAxis, zAxis);
|
||||
screenTransformation.translate(-data.rotation->xRotationPoint, -data.rotation->yRotationPoint, -data.rotation->zRotationPoint);
|
||||
}
|
||||
screenTransformation.scale(data.xScale, data.yScale, data.zScale);
|
||||
if (useShader) {
|
||||
GLShader *shader = ShaderManager::instance()->pushShader(ShaderManager::GenericShader);
|
||||
shader->setUniform(GLShader::ScreenTransformation, screenTransformation);
|
||||
} else {
|
||||
pushMatrix(screenTransformation);
|
||||
}
|
||||
} else if (useShader && ((mask & PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS) || (mask & PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_WITHOUT_FULL_REPAINTS))) {
|
||||
GLShader *shader = ShaderManager::instance()->pushShader(ShaderManager::GenericShader);
|
||||
shader->setUniform(GLShader::ScreenTransformation, QMatrix4x4());
|
||||
ShaderManager *shaderManager = ShaderManager::instance();
|
||||
const bool useShader = shaderManager->isValid();
|
||||
const QMatrix4x4 matrix = transformation(mask, data);
|
||||
|
||||
if (useShader) {
|
||||
GLShader *shader = shaderManager->pushShader(ShaderManager::GenericShader);
|
||||
shader->setUniform(GLShader::ScreenTransformation, matrix);
|
||||
} else {
|
||||
pushMatrix(matrix);
|
||||
}
|
||||
|
||||
Scene::paintGenericScreen(mask, data);
|
||||
if (mask & PAINT_SCREEN_TRANSFORMED) {
|
||||
if (useShader) {
|
||||
ShaderManager::instance()->popShader();
|
||||
} else {
|
||||
popMatrix();
|
||||
}
|
||||
} else if (useShader && ((mask & PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS) ||
|
||||
(mask & PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_WITHOUT_FULL_REPAINTS))) {
|
||||
ShaderManager::instance()->popShader();
|
||||
}
|
||||
|
||||
if (useShader)
|
||||
shaderManager->popShader();
|
||||
else
|
||||
popMatrix();
|
||||
}
|
||||
|
||||
void SceneOpenGL::paintBackground(QRegion region)
|
||||
|
|
|
@ -53,9 +53,12 @@ public:
|
|||
virtual void windowAdded(Toplevel*);
|
||||
virtual void windowClosed(Toplevel*, Deleted*);
|
||||
virtual void windowDeleted(Deleted*);
|
||||
|
||||
protected:
|
||||
virtual void paintGenericScreen(int mask, ScreenPaintData data);
|
||||
virtual void paintBackground(QRegion region);
|
||||
QMatrix4x4 transformation(int mask, const ScreenPaintData &data) const;
|
||||
|
||||
private:
|
||||
bool selectMode();
|
||||
bool initTfp();
|
||||
|
|
Loading…
Reference in a new issue