diff --git a/effects/coverswitch/coverswitch.cpp b/effects/coverswitch/coverswitch.cpp index ba79799b69..2cd730debd 100644 --- a/effects/coverswitch/coverswitch.cpp +++ b/effects/coverswitch/coverswitch.cpp @@ -461,8 +461,6 @@ void CoverSwitchEffect::paintScene(EffectWindow* frontWindow, const EffectWindow int width = area.width(); int leftWindowCount = leftWindows.count(); int rightWindowCount = rightWindows.count(); - RotationData rot; - rot.axis = RotationData::YAxis; // Problem during animation: a window which is painted after another window @@ -701,8 +699,7 @@ void CoverSwitchEffect::paintWindowCover(EffectWindow* w, bool reflectedWindow, } } data.zTranslate *= timeLine.currentValue(); - if (data.rotation) - data.rotation->angle *= timeLine.currentValue(); + data.rotation.setAngle(data.rotation.angle() * timeLine.currentValue()); } } if (stop) { @@ -732,8 +729,7 @@ void CoverSwitchEffect::paintWindowCover(EffectWindow* w, bool reflectedWindow, } } data.zTranslate *= (1.0 - timeLine.currentValue()); - if (data.rotation) - data.rotation->angle *= (1.0 - timeLine.currentValue()); + data.rotation.setAngle(data.rotation.angle() * (1.0 - timeLine.currentValue())); } } @@ -788,7 +784,6 @@ void CoverSwitchEffect::paintFrontWindow(EffectWindow* frontWindow, int width, i if (rightWindows == 0) { rightWindows = 1; } - RotationData rot; // this has to survive the if (animation) context as it's used as pointer - bug #297757 if (animation) { float distance = 0.0; if (direction == Right) { @@ -796,10 +791,9 @@ void CoverSwitchEffect::paintFrontWindow(EffectWindow* frontWindow, int width, i distance = -frontWindow->geometry().width() * 0.5f + area.width() * 0.5f + (((float)displayWidth() * 0.5 * scaleFactor) - (float)area.width() * 0.5f) / rightWindows; data.xTranslate += distance * timeLine.currentValue(); - rot.axis = RotationData::YAxis; - rot.angle = -angle * timeLine.currentValue(); - rot.xRotationPoint = frontWindow->geometry().width(); - data.rotation = &rot; + data.rotation.setAxis(Qt::YAxis); + data.rotation.setAngle(-angle * timeLine.currentValue()); + data.rotation.setOrigin(QVector3D(frontWindow->geometry().width(), 0.0, 0.0)); } else { // move to left distance = frontWindow->geometry().width() * 0.5f - area.width() * 0.5f + @@ -808,10 +802,8 @@ void CoverSwitchEffect::paintFrontWindow(EffectWindow* frontWindow, int width, i if (specialHandlingForward) factor = 2.0; data.xTranslate += distance * timeLine.currentValue() * factor; - rot.axis = RotationData::YAxis; - rot.angle = angle * timeLine.currentValue(); - rot.xRotationPoint = 0.0; - data.rotation = &rot; + data.rotation.setAxis(Qt::YAxis); + data.rotation.setAngle(angle * timeLine.currentValue()); } } if (specialHandlingForward) { @@ -838,26 +830,20 @@ void CoverSwitchEffect::paintWindows(const EffectWindowList& windows, bool left, // handling for additional window from other side // has to appear on this side after half of the time if (animation && timeLine.currentValue() >= 0.5 && additionalWindow != NULL) { - RotationData rot; - rot.axis = RotationData::YAxis; - rot.angle = angle; - rot.angle = angle * rotateFactor; WindowPaintData data(additionalWindow); + data.rotation.setAxis(Qt::YAxis); + data.rotation.setAngle(angle * rotateFactor); if (left) { data.xTranslate += -xTranslate - additionalWindow->geometry().x(); - rot.xRotationPoint = 0.0; } else { data.xTranslate += xTranslate + area.width() - additionalWindow->geometry().x() - additionalWindow->geometry().width(); - rot.xRotationPoint = additionalWindow->geometry().width(); + data.rotation.setOrigin(QVector3D(additionalWindow->geometry().width(), 0.0, 0.0)); } - data.rotation = &rot; data.opacity *= (timeLine.currentValue() - 0.5) * 2.0; paintWindowCover(additionalWindow, reflectedWindows, data); } - RotationData rot; - rot.axis = RotationData::YAxis; // normal behaviour for (int i = 0; i < windows.count(); i++) { window = windows.at(i); @@ -865,7 +851,8 @@ void CoverSwitchEffect::paintWindows(const EffectWindowList& windows, bool left, continue; } WindowPaintData data(window); - rot.angle = angle; + data.rotation.setAxis(Qt::YAxis); + data.rotation.setAngle(angle); if (left) data.xTranslate += -xTranslate + xTranslate * i / windowCount - window->geometry().x(); else @@ -876,7 +863,7 @@ void CoverSwitchEffect::paintWindows(const EffectWindowList& windows, bool left, // right most window on left side -> move to front // have to move one window distance plus half the difference between the window and the desktop size data.xTranslate += (xTranslate / windowCount + (width - window->geometry().width()) * 0.5f) * timeLine.currentValue(); - rot.angle = (angle - angle * timeLine.currentValue()); + data.rotation.setAngle(angle - angle * timeLine.currentValue()); } // right most window does not have to be moved else if (!left && (i == 0)); // do nothing @@ -888,7 +875,7 @@ void CoverSwitchEffect::paintWindows(const EffectWindowList& windows, bool left, if ((i == windowCount - 1) && !left) { // left most window on right side -> move to front data.xTranslate -= (xTranslate / windowCount + (width - window->geometry().width()) * 0.5f) * timeLine.currentValue(); - rot.angle = (angle - angle * timeLine.currentValue()); + data.rotation.setAngle(angle - angle * timeLine.currentValue()); } // left most window does not have to be moved else if (i == 0 && left); // do nothing @@ -898,12 +885,9 @@ void CoverSwitchEffect::paintWindows(const EffectWindowList& windows, bool left, } } } - if (left) - rot.xRotationPoint = 0.0; - else - rot.xRotationPoint = window->geometry().width(); - rot.angle *= rotateFactor; - data.rotation = &rot; + if (!left) + data.rotation.setOrigin(QVector3D(window->geometry().width(), 0.0, 0.0)); + data.rotation.setAngle(data.rotation.angle() * rotateFactor); // make window most to edge transparent if animation if (animation && i == 0 && ((direction == Left && left) || (direction == Right && !left))) { // only for the first half of the animation diff --git a/effects/cube/cube.cpp b/effects/cube/cube.cpp index 43bdb8d47a..1a72c8c69e 100644 --- a/effects/cube/cube.cpp +++ b/effects/cube/cube.cpp @@ -37,6 +37,7 @@ along with this program. If not, see . #include #include #include +#include #include @@ -743,12 +744,9 @@ void CubeEffect::paintCube(int mask, QRegion region, ScreenPaintData& data) painting_desktop = effects->numberOfDesktops(); } ScreenPaintData newData = data; - RotationData rot = RotationData(); - rot.axis = RotationData::YAxis; - rot.angle = internalCubeAngle * i; - rot.xRotationPoint = rect.width() / 2; - rot.zRotationPoint = -point; - newData.rotation = &rot; + newData.rotation.setAxis(Qt::YAxis); + newData.rotation.setAngle(internalCubeAngle * i); + newData.rotation.setOrigin(QVector3D(rect.width() / 2, 0.0, -point)); newData.zTranslate = -zTranslate; effects->paintScreen(mask, region, newData); } @@ -1381,11 +1379,9 @@ void CubeEffect::paintWindow(EffectWindow* w, int mask, QRegion region, WindowPa if (shader) { data.xTranslate = -rect.width(); } else { - RotationData rot = RotationData(); - rot.axis = RotationData::YAxis; - rot.xRotationPoint = rect.width() - w->x(); - rot.angle = 360.0f / effects->numberOfDesktops(); - data.rotation = &rot; + data.rotation.setAxis(Qt::YAxis); + data.rotation.setOrigin(QVector3D(rect.width() - w->x(), 0.0, 0.0)); + data.rotation.setAngle(-360.0f / effects->numberOfDesktops()); float cubeAngle = (float)((float)(effects->numberOfDesktops() - 2) / (float)effects->numberOfDesktops() * 180.0f); float point = rect.width() / 2 * tan(cubeAngle * 0.5f * M_PI / 180.0f); QMatrix4x4 matrix; @@ -1407,11 +1403,9 @@ void CubeEffect::paintWindow(EffectWindow* w, int mask, QRegion region, WindowPa if (shader) { data.xTranslate = rect.width(); } else { - RotationData rot = RotationData(); - rot.axis = RotationData::YAxis; - rot.xRotationPoint = -w->x(); - rot.angle = -360.0f / effects->numberOfDesktops(); - data.rotation = &rot; + data.rotation.setAxis(Qt::YAxis); + data.rotation.setOrigin(QVector3D(-w->x(), 0.0, 0.0)); + data.rotation.setAngle(-360.0f / effects->numberOfDesktops()); float cubeAngle = (float)((float)(effects->numberOfDesktops() - 2) / (float)effects->numberOfDesktops() * 180.0f); float point = rect.width() / 2 * tan(cubeAngle * 0.5f * M_PI / 180.0f); QMatrix4x4 matrix; diff --git a/effects/cube/cubeslide.cpp b/effects/cube/cubeslide.cpp index be9ec69a6e..ae8c94fe91 100644 --- a/effects/cube/cubeslide.cpp +++ b/effects/cube/cubeslide.cpp @@ -118,14 +118,12 @@ void CubeSlideEffect::paintSlideCube(int mask, QRegion region, ScreenPaintData& ScreenPaintData firstFaceData = data; ScreenPaintData secondFaceData = data; - RotationData firstFaceRot = RotationData(); - RotationData secondFaceRot = RotationData(); RotationDirection direction = slideRotations.head(); int secondDesktop; switch(direction) { case Left: - firstFaceRot.axis = RotationData::YAxis; - secondFaceRot.axis = RotationData::YAxis; + firstFaceData.rotation.setAxis(Qt::YAxis); + secondFaceData.rotation.setAxis(Qt::YAxis); if (usePagerLayout) secondDesktop = effects->desktopToLeft(front_desktop, true); else { @@ -133,12 +131,12 @@ void CubeSlideEffect::paintSlideCube(int mask, QRegion region, ScreenPaintData& if (secondDesktop == 0) secondDesktop = effects->numberOfDesktops(); } - firstFaceRot.angle = 90.0f * timeLine.currentValue(); - secondFaceRot.angle = -90.0f * (1.0f - timeLine.currentValue()); + firstFaceData.rotation.setAngle(90.0f * timeLine.currentValue()); + secondFaceData.rotation.setAngle(-90.0f * (1.0f - timeLine.currentValue())); break; case Right: - firstFaceRot.axis = RotationData::YAxis; - secondFaceRot.axis = RotationData::YAxis; + firstFaceData.rotation.setAxis(Qt::YAxis); + secondFaceData.rotation.setAxis(Qt::YAxis); if (usePagerLayout) secondDesktop = effects->desktopToRight(front_desktop, true); else { @@ -146,23 +144,23 @@ void CubeSlideEffect::paintSlideCube(int mask, QRegion region, ScreenPaintData& if (secondDesktop > effects->numberOfDesktops()) secondDesktop = 1; } - firstFaceRot.angle = -90.0f * timeLine.currentValue(); - secondFaceRot.angle = 90.0f * (1.0f - timeLine.currentValue()); + firstFaceData.rotation.setAngle(-90.0f * timeLine.currentValue()); + secondFaceData.rotation.setAngle(90.0f * (1.0f - timeLine.currentValue())); break; case Upwards: - firstFaceRot.axis = RotationData::XAxis; - secondFaceRot.axis = RotationData::XAxis; + firstFaceData.rotation.setAxis(Qt::XAxis); + secondFaceData.rotation.setAxis(Qt::XAxis); secondDesktop = effects->desktopAbove(front_desktop, true); - firstFaceRot.angle = -90.0f * timeLine.currentValue(); - secondFaceRot.angle = 90.0f * (1.0f - timeLine.currentValue()); + firstFaceData.rotation.setAngle(-90.0f * timeLine.currentValue()); + secondFaceData.rotation.setAngle(90.0f * (1.0f - timeLine.currentValue())); point = rect.height() / 2 * tan(45.0f * M_PI / 180.0f); break; case Downwards: - firstFaceRot.axis = RotationData::XAxis; - secondFaceRot.axis = RotationData::XAxis; + firstFaceData.rotation.setAxis(Qt::XAxis); + secondFaceData.rotation.setAxis(Qt::XAxis); secondDesktop = effects->desktopBelow(front_desktop, true); - firstFaceRot.angle = 90.0f * timeLine.currentValue(); - secondFaceRot.angle = -90.0f * (1.0f - timeLine.currentValue()); + firstFaceData.rotation.setAngle(90.0f * timeLine.currentValue()); + secondFaceData.rotation.setAngle(-90.0f * (1.0f - timeLine.currentValue())); point = rect.height() / 2 * tan(45.0f * M_PI / 180.0f); break; default: @@ -170,10 +168,7 @@ void CubeSlideEffect::paintSlideCube(int mask, QRegion region, ScreenPaintData& return; } // front desktop - firstFaceRot.xRotationPoint = rect.width() / 2; - firstFaceRot.yRotationPoint = rect.height() / 2; - firstFaceRot.zRotationPoint = -point; - firstFaceData.rotation = &firstFaceRot; + firstFaceData.rotation.setOrigin(QVector3D(rect.width() / 2, rect.height() / 2, -point)); other_desktop = secondDesktop; firstDesktop = true; effects->paintScreen(mask, region, firstFaceData); @@ -181,10 +176,7 @@ void CubeSlideEffect::paintSlideCube(int mask, QRegion region, ScreenPaintData& other_desktop = painting_desktop; painting_desktop = secondDesktop; firstDesktop = false; - secondFaceRot.xRotationPoint = rect.width() / 2; - secondFaceRot.yRotationPoint = rect.height() / 2; - secondFaceRot.zRotationPoint = -point; - secondFaceData.rotation = &secondFaceRot; + secondFaceData.rotation.setOrigin(QVector3D(rect.width() / 2, rect.height() / 2, -point)); effects->paintScreen(mask, region, secondFaceData); cube_painting = false; painting_desktop = effects->currentDesktop(); diff --git a/effects/flipswitch/flipswitch.cpp b/effects/flipswitch/flipswitch.cpp index 5037f93a82..95914b23ea 100644 --- a/effects/flipswitch/flipswitch.cpp +++ b/effects/flipswitch/flipswitch.cpp @@ -289,14 +289,13 @@ void FlipSwitchEffect::paintScreen(int mask, QRegion region, ScreenPaintData& da } int winMask = PAINT_WINDOW_TRANSFORMED | PAINT_WINDOW_TRANSLUCENT; - RotationData rot; - rot.axis = RotationData::YAxis; - rot.angle = m_angle * m_startStopTimeLine.currentValue(); // fade in/out one window at the end of the stack during animation if (m_animation && !m_scheduledDirections.isEmpty()) { EffectWindow* w = m_flipOrderedWindows.last(); if (ItemInfo *info = m_windows.value(w,0)) { WindowPaintData data(w); + data.rotation.setAxis(Qt::YAxis); + data.rotation.setAngle(m_angle * m_startStopTimeLine.currentValue()); data.opacity = info->opacity; data.brightness = info->brightness; data.saturation = info->saturation; @@ -317,7 +316,6 @@ void FlipSwitchEffect::paintScreen(int mask, QRegion region, ScreenPaintData& da if (effects->numScreens() > 1) { adjustWindowMultiScreen(w, data); } - data.rotation = &rot; effects->drawWindow(w, winMask, infiniteRegion(), data); } } @@ -327,6 +325,8 @@ void FlipSwitchEffect::paintScreen(int mask, QRegion region, ScreenPaintData& da if (!info) continue; WindowPaintData data(w); + data.rotation.setAxis(Qt::YAxis); + data.rotation.setAngle(m_angle * m_startStopTimeLine.currentValue()); data.opacity = info->opacity; data.brightness = info->brightness; data.saturation = info->saturation; @@ -378,7 +378,6 @@ void FlipSwitchEffect::paintScreen(int mask, QRegion region, ScreenPaintData& da adjustWindowMultiScreen(w, data); } - data.rotation = &rot; effects->drawWindow(w, winMask, infiniteRegion(), data); } diff --git a/effects/glide/glide.cpp b/effects/glide/glide.cpp index 2dcdfc381e..d741731652 100644 --- a/effects/glide/glide.cpp +++ b/effects/glide/glide.cpp @@ -98,10 +98,8 @@ void GlideEffect::paintWindow(EffectWindow* w, int mask, QRegion region, WindowP InfoHash::const_iterator info = windows.constFind(w); if (info != windows.constEnd()) { const double progress = info->timeLine->currentValue(); - RotationData rot; - rot.axis = RotationData::XAxis; - rot.angle = angle * (1 - progress); - data.rotation = &rot; + data.rotation.setAxis(Qt::XAxis); + data.rotation.setAngle(angle * (1 - progress)); data.opacity *= progress; switch(effect) { default: diff --git a/effects/sheet/sheet.cpp b/effects/sheet/sheet.cpp index 622403a8c5..14aef21fef 100644 --- a/effects/sheet/sheet.cpp +++ b/effects/sheet/sheet.cpp @@ -89,10 +89,9 @@ void SheetEffect::paintWindow(EffectWindow* w, int mask, QRegion region, WindowP InfoMap::const_iterator info = windows.constFind(w); if (info != windows.constEnd()) { const double progress = info->timeLine->currentValue(); - RotationData rot; - rot.axis = RotationData::XAxis; - rot.angle = 60.0 * (1.0 - progress); - data.rotation = &rot; + QGraphicsRotation rot; + data.rotation.setAxis(Qt::XAxis); + data.rotation.setAngle(60.0 * (1.0 - progress)); data.yScale *= progress; data.zScale *= progress; data.yTranslate -= (w->y() - info->parentY) * (1.0 - progress); diff --git a/libkwineffects/kwinanimationeffect.cpp b/libkwineffects/kwinanimationeffect.cpp index 363cab0815..20bd84489c 100644 --- a/libkwineffects/kwinanimationeffect.cpp +++ b/libkwineffects/kwinanimationeffect.cpp @@ -463,10 +463,9 @@ void AnimationEffect::paintWindow( EffectWindow* w, int mask, QRegion region, Wi break; } case Rotation: { - RotationData rot; - rot.axis = (RotationData::RotationAxis)metaData(Axis, anim->meta); + data.rotation.setAxis((Qt::Axis)metaData(Axis, anim->meta)); const float prgrs = progress(*anim); - rot.angle = anim->from[0] + prgrs*(anim->to[0] - anim->from[0]); + data.rotation.setAngle(anim->from[0] + prgrs*(anim->to[0] - anim->from[0])); const QRect geo = w->rect(); const uint sAnchor = metaData(SourceAnchor, anim->meta), @@ -477,10 +476,7 @@ void AnimationEffect::paintWindow( EffectWindow* w, int mask, QRegion region, Wi QPointF pt2(xCoord(geo, tAnchor), yCoord(geo, tAnchor)); pt += static_cast(prgrs)*(pt2 - pt); } - - rot.xRotationPoint = pt.x(); - rot.yRotationPoint = pt.y(); - data.rotation = &rot; + data.rotation.setOrigin(QVector3D(pt)); break; } case Generic: diff --git a/libkwineffects/kwineffects.cpp b/libkwineffects/kwineffects.cpp index 863cf9e833..11c47edcf4 100644 --- a/libkwineffects/kwineffects.cpp +++ b/libkwineffects/kwineffects.cpp @@ -73,11 +73,31 @@ WindowPaintData::WindowPaintData(EffectWindow* w) , saturation(1) , brightness(1) , shader(NULL) - , rotation(NULL) { quads = w->buildQuads(); } +WindowPaintData::WindowPaintData(const WindowPaintData &other) + : opacity(other.opacity) + , contents_opacity(other.contents_opacity) + , decoration_opacity(other.decoration_opacity) + , xScale(other.xScale) + , yScale(other.yScale) + , zScale(other.zScale) + , xTranslate(other.xTranslate) + , yTranslate(other.yTranslate) + , zTranslate(other.zTranslate) + , saturation(other.saturation) + , brightness(other.brightness) + , quads(other.quads) + , shader(other.shader) +{ + rotation.setOrigin(other.rotation.origin()); + rotation.setAxis(other.rotation.axis()); + rotation.setAngle(other.rotation.angle()); +} + + ScreenPaintData::ScreenPaintData() : xScale(1) , yScale(1) @@ -85,17 +105,34 @@ ScreenPaintData::ScreenPaintData() , xTranslate(0) , yTranslate(0) , zTranslate(0) - , rotation(NULL) { } -RotationData::RotationData() - : axis(ZAxis) - , angle(0.0) - , xRotationPoint(0.0) - , yRotationPoint(0.0) - , zRotationPoint(0.0) +ScreenPaintData::ScreenPaintData(const ScreenPaintData &other) + : xScale(other.xScale) + , yScale(other.yScale) + , zScale(other.zScale) + , xTranslate(other.xTranslate) + , yTranslate(other.yTranslate) + , zTranslate(other.zTranslate) { + rotation.setOrigin(other.rotation.origin()); + rotation.setAxis(other.rotation.axis()); + rotation.setAngle(other.rotation.angle()); +} + +ScreenPaintData &ScreenPaintData::operator=(const ScreenPaintData &rhs) +{ + this->xScale = rhs.xScale; + this->yScale = rhs.yScale; + this->zScale = rhs.zScale; + this->xTranslate = rhs.xTranslate; + this->yTranslate = rhs.yTranslate; + this->zTranslate = rhs.zTranslate; + this->rotation.setOrigin(rhs.rotation.origin()); + this->rotation.setAxis(rhs.rotation.axis()); + this->rotation.setAngle(rhs.rotation.angle()); + return *this; } //**************************************** diff --git a/libkwineffects/kwineffects.h b/libkwineffects/kwineffects.h index b952999d47..64b6c359aa 100644 --- a/libkwineffects/kwineffects.h +++ b/libkwineffects/kwineffects.h @@ -29,6 +29,7 @@ along with this program. If not, see . #include #include #include +#include #include #include @@ -60,7 +61,6 @@ class Effect; class WindowQuad; class GLShader; class XRenderPicture; -class RotationData; class WindowQuadList; class WindowPrePaintData; class WindowPaintData; @@ -1652,6 +1652,7 @@ class KWIN_EXPORT WindowPaintData { public: WindowPaintData(EffectWindow* w); + WindowPaintData(const WindowPaintData &other); /** * Window opacity, in range 0 = transparent to 1 = fully opaque * Opacity for contents is opacity*contents_opacity, the same @@ -1686,20 +1687,22 @@ public: * Shader to be used for rendering, if any. */ GLShader* shader; - RotationData* rotation; + QGraphicsRotation rotation; }; class KWIN_EXPORT ScreenPaintData { public: ScreenPaintData(); + ScreenPaintData(const ScreenPaintData &other); double xScale; double yScale; double zScale; int xTranslate; int yTranslate; double zTranslate; - RotationData* rotation; + QGraphicsRotation rotation; + ScreenPaintData& operator=(const ScreenPaintData &rhs); }; class KWIN_EXPORT ScreenPrePaintData @@ -1709,22 +1712,6 @@ public: QRegion paint; }; -class KWIN_EXPORT RotationData -{ -public: - RotationData(); - enum RotationAxis { - XAxis, - YAxis, - ZAxis - }; - RotationAxis axis; - float angle; - float xRotationPoint; - float yRotationPoint; - float zRotationPoint; -}; - /** * @short Helper class for restricting painting area only to allowed area. * diff --git a/scene_opengl.cpp b/scene_opengl.cpp index 6ca15ddb40..5d5f0a6191 100644 --- a/scene_opengl.cpp +++ b/scene_opengl.cpp @@ -136,23 +136,15 @@ QMatrix4x4 SceneOpenGL::transformation(int mask, const ScreenPaintData &data) co matrix.translate(data.xTranslate, data.yTranslate, data.zTranslate); matrix.scale(data.xScale, data.yScale, data.zScale); - if (!data.rotation) + if (data.rotation.angle() == 0.0) 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); + // cannot use data.rotation->applyTo(&matrix) as QGraphicsRotation uses projectedRotate to map back to 2D + matrix.translate(data.rotation.origin()); + const QVector3D axis = data.rotation.axis(); + matrix.rotate(data.rotation.angle(), axis.x(), axis.y(), axis.z()); + matrix.translate(-data.rotation.origin()); return matrix; } @@ -427,23 +419,15 @@ QMatrix4x4 SceneOpenGL::Window::transformation(int mask, const WindowPaintData & matrix.translate(data.xTranslate, data.yTranslate, data.zTranslate); matrix.scale(data.xScale, data.yScale, data.zScale); - if (!data.rotation) + if (data.rotation.angle() == 0.0) 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); + // cannot use data.rotation.applyTo(&matrix) as QGraphicsRotation uses projectedRotate to map back to 2D + matrix.translate(data.rotation.origin()); + const QVector3D axis = data.rotation.axis(); + matrix.rotate(data.rotation.angle(), axis.x(), axis.y(), axis.z()); + matrix.translate(-data.rotation.origin()); return matrix; }