diff options
Diffstat (limited to 'guilib/TransformMatrix.h')
-rw-r--r-- | guilib/TransformMatrix.h | 240 |
1 files changed, 0 insertions, 240 deletions
diff --git a/guilib/TransformMatrix.h b/guilib/TransformMatrix.h deleted file mode 100644 index cc9c19bae6..0000000000 --- a/guilib/TransformMatrix.h +++ /dev/null @@ -1,240 +0,0 @@ -#pragma once - -/* - * Copyright (C) 2005-2008 Team XBMC - * http://www.xbmc.org - * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This Program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with XBMC; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * http://www.gnu.org/copyleft/gpl.html - * - */ - -#include <math.h> -#include <memory> -#include <string.h> -#include <stdint.h> - -#ifdef __GNUC__ -// under gcc, inline will only take place if optimizations are applied (-O). this will force inline even whith optimizations. -#define XBMC_FORCE_INLINE __attribute__((always_inline)) -#else -#define XBMC_FORCE_INLINE -#endif - -typedef uint32_t color_t; - -class TransformMatrix -{ -public: - TransformMatrix() - { - Reset(); - }; - void Reset() - { - m[0][0] = 1.0f; m[0][1] = m[0][2] = m[0][3] = 0.0f; - m[1][0] = m[1][2] = m[1][3] = 0.0f; m[1][1] = 1.0f; - m[2][0] = m[2][1] = m[2][3] = 0.0f; m[2][2] = 1.0f; - alpha = 1.0f; - }; - static TransformMatrix CreateTranslation(float transX, float transY, float transZ = 0) - { - TransformMatrix translation; - translation.m[0][3] = transX; - translation.m[1][3] = transY; - translation.m[2][3] = transZ; - return translation; - } - void SetTranslation(float transX, float transY, float transZ) - { - m[0][1] = m[0][2] = 0.0f; m[0][0] = 1.0f; m[0][3] = transX; - m[1][0] = m[1][2] = 0.0f; m[1][1] = 1.0f; m[1][3] = transY; - m[2][0] = m[2][1] = 0.0f; m[2][2] = 1.0f; m[2][3] = transZ; - alpha = 1.0f; - } - static TransformMatrix CreateScaler(float scaleX, float scaleY, float scaleZ = 1.0f) - { - TransformMatrix scaler; - scaler.m[0][0] = scaleX; - scaler.m[1][1] = scaleY; - scaler.m[2][2] = scaleZ; - return scaler; - }; - void SetScaler(float scaleX, float scaleY, float centerX, float centerY) - { - // Trans(centerX,centerY,centerZ)*Scale(scaleX,scaleY,scaleZ)*Trans(-centerX,-centerY,-centerZ) - float centerZ = 0.0f, scaleZ = 1.0f; - m[0][0] = scaleX; m[0][1] = 0.0f; m[0][2] = 0.0f; m[0][3] = centerX*(1-scaleX); - m[1][0] = 0.0f; m[1][1] = scaleY; m[1][2] = 0.0f; m[1][3] = centerY*(1-scaleY); - m[2][0] = 0.0f; m[2][1] = 0.0f; m[2][2] = scaleZ; m[2][3] = centerZ*(1-scaleZ); - alpha = 1.0f; - }; - void SetXRotation(float angle, float y, float z, float ar = 1.0f) - { // angle about the X axis, centered at y,z where our coordinate system has aspect ratio ar. - // Trans(0,y,z)*Scale(1,1/ar,1)*RotateX(angle)*Scale(ar,1,1)*Trans(0,-y,-z); - float c = cos(angle); float s = sin(angle); - m[0][0] = ar; m[0][1] = 0.0f; m[0][2] = 0.0f; m[0][3] = 0.0f; - m[1][0] = 0.0f; m[1][1] = c/ar; m[1][2] = -s/ar; m[1][3] = (-y*c+s*z)/ar + y; - m[2][0] = 0.0f; m[2][1] = s; m[2][2] = c; m[2][3] = (-y*s-c*z) + z; - angle = 1.0f; - } - void SetYRotation(float angle, float x, float z, float ar = 1.0f) - { // angle about the Y axis, centered at x,z where our coordinate system has aspect ratio ar. - // Trans(x,0,z)*Scale(1/ar,1,1)*RotateY(angle)*Scale(ar,1,1)*Trans(-x,0,-z); - float c = cos(angle); float s = sin(angle); - m[0][0] = c; m[0][1] = 0.0f; m[0][2] = -s/ar; m[0][3] = -x*c + s*z/ar + x; - m[1][0] = 0.0f; m[1][1] = 1.0f; m[1][2] = 0.0f; m[1][3] = 0.0f; - m[2][0] = ar*s; m[2][1] = 0.0f; m[2][2] = c; m[2][3] = -ar*x*s - c*z + z; - angle = 1.0f; - } - static TransformMatrix CreateZRotation(float angle, float x, float y, float ar = 1.0f) - { // angle about the Z axis, centered at x,y where our coordinate system has aspect ratio ar. - // Trans(x,y,0)*Scale(1/ar,1,1)*RotateZ(angle)*Scale(ar,1,1)*Trans(-x,-y,0) - float c = cos(angle); float s = sin(angle); - TransformMatrix rot; - rot.m[0][0] = c; rot.m[0][1] = -s/ar; rot.m[0][3] = -x*c + s*y/ar + x; - rot.m[1][0] = s*ar; rot.m[1][1] = c; rot.m[1][3] = -ar*x*s - c*y + y; - return rot; - } - void SetZRotation(float angle, float x, float y, float ar = 1.0f) - { // angle about the Z axis, centered at x,y where our coordinate system has aspect ratio ar. - // Trans(x,y,0)*Scale(1/ar,1,1)*RotateZ(angle)*Scale(ar,1,1)*Trans(-x,-y,0) - float c = cos(angle); float s = sin(angle); - m[0][0] = c; m[0][1] = -s/ar; m[0][2] = 0.0f; m[0][3] = -x*c + s*y/ar + x; - m[1][0] = s*ar; m[1][1] = c; m[1][2] = 0.0f; m[1][3] = -ar*x*s - c*y + y; - m[2][0] = 0.0f; m[2][1] = 0.0f; m[2][2] = 1.0f; m[2][3] = 0.0f; - angle = 1.0f; - } - static TransformMatrix CreateFader(float a) - { - TransformMatrix fader; - fader.alpha = a; - return fader; - } - void SetFader(float a) - { - m[0][0] = 1.0f; m[0][1] = 0.0f; m[0][2] = 0.0f; m[0][3] = 0.0f; - m[1][0] = 0.0f; m[1][1] = 1.0f; m[1][2] = 0.0f; m[1][3] = 0.0f; - m[2][0] = 0.0f; m[2][1] = 0.0f; m[2][2] = 1.0f; m[2][3] = 0.0f; - alpha = a; - } - // assignment operator - const TransformMatrix &operator =(const TransformMatrix &right) - { - if (this != &right) - { - memcpy(m, right.m, 12*sizeof(float)); - alpha = right.alpha; - } - return *this; - } - - // multiplication operators - const TransformMatrix &operator *=(const TransformMatrix &right) - { - float t00 = m[0][0] * right.m[0][0] + m[0][1] * right.m[1][0] + m[0][2] * right.m[2][0]; - float t01 = m[0][0] * right.m[0][1] + m[0][1] * right.m[1][1] + m[0][2] * right.m[2][1]; - float t02 = m[0][0] * right.m[0][2] + m[0][1] * right.m[1][2] + m[0][2] * right.m[2][2]; - m[0][3] = m[0][0] * right.m[0][3] + m[0][1] * right.m[1][3] + m[0][2] * right.m[2][3] + m[0][3]; - m[0][0] = t00; m[0][1] = t01; m[0][2] = t02; - t00 = m[1][0] * right.m[0][0] + m[1][1] * right.m[1][0] + m[1][2] * right.m[2][0]; - t01 = m[1][0] * right.m[0][1] + m[1][1] * right.m[1][1] + m[1][2] * right.m[2][1]; - t02 = m[1][0] * right.m[0][2] + m[1][1] * right.m[1][2] + m[1][2] * right.m[2][2]; - m[1][3] = m[1][0] * right.m[0][3] + m[1][1] * right.m[1][3] + m[1][2] * right.m[2][3] + m[1][3]; - m[1][0] = t00; m[1][1] = t01; m[1][2] = t02; - t00 = m[2][0] * right.m[0][0] + m[2][1] * right.m[1][0] + m[2][2] * right.m[2][0]; - t01 = m[2][0] * right.m[0][1] + m[2][1] * right.m[1][1] + m[2][2] * right.m[2][1]; - t02 = m[2][0] * right.m[0][2] + m[2][1] * right.m[1][2] + m[2][2] * right.m[2][2]; - m[2][3] = m[2][0] * right.m[0][3] + m[2][1] * right.m[1][3] + m[2][2] * right.m[2][3] + m[2][3]; - m[2][0] = t00; m[2][1] = t01; m[2][2] = t02; - alpha *= right.alpha; - return *this; - } - - TransformMatrix operator *(const TransformMatrix &right) const - { - TransformMatrix result; - result.m[0][0] = m[0][0] * right.m[0][0] + m[0][1] * right.m[1][0] + m[0][2] * right.m[2][0]; - result.m[0][1] = m[0][0] * right.m[0][1] + m[0][1] * right.m[1][1] + m[0][2] * right.m[2][1]; - result.m[0][2] = m[0][0] * right.m[0][2] + m[0][1] * right.m[1][2] + m[0][2] * right.m[2][2]; - result.m[0][3] = m[0][0] * right.m[0][3] + m[0][1] * right.m[1][3] + m[0][2] * right.m[2][3] + m[0][3]; - result.m[1][0] = m[1][0] * right.m[0][0] + m[1][1] * right.m[1][0] + m[1][2] * right.m[2][0]; - result.m[1][1] = m[1][0] * right.m[0][1] + m[1][1] * right.m[1][1] + m[1][2] * right.m[2][1]; - result.m[1][2] = m[1][0] * right.m[0][2] + m[1][1] * right.m[1][2] + m[1][2] * right.m[2][2]; - result.m[1][3] = m[1][0] * right.m[0][3] + m[1][1] * right.m[1][3] + m[1][2] * right.m[2][3] + m[1][3]; - result.m[2][0] = m[2][0] * right.m[0][0] + m[2][1] * right.m[1][0] + m[2][2] * right.m[2][0]; - result.m[2][1] = m[2][0] * right.m[0][1] + m[2][1] * right.m[1][1] + m[2][2] * right.m[2][1]; - result.m[2][2] = m[2][0] * right.m[0][2] + m[2][1] * right.m[1][2] + m[2][2] * right.m[2][2]; - result.m[2][3] = m[2][0] * right.m[0][3] + m[2][1] * right.m[1][3] + m[2][2] * right.m[2][3] + m[2][3]; - result.alpha = alpha * right.alpha; - return result; - } - - inline void TransformPosition(float &x, float &y, float &z) const XBMC_FORCE_INLINE - { - float newX = m[0][0] * x + m[0][1] * y + m[0][2] * z + m[0][3]; - float newY = m[1][0] * x + m[1][1] * y + m[1][2] * z + m[1][3]; - z = m[2][0] * x + m[2][1] * y + m[2][2] * z + m[2][3]; - y = newY; - x = newX; - } - - inline void TransformPositionUnscaled(float &x, float &y, float &z) const XBMC_FORCE_INLINE - { - float n; - // calculate the norm of the transformed (but not translated) vectors involved - n = sqrt(m[0][0]*m[0][0] + m[0][1]*m[0][1] + m[0][2]*m[0][2]); - float newX = (m[0][0] * x + m[0][1] * y + m[0][2] * z)/n + m[0][3]; - n = sqrt(m[1][0]*m[1][0] + m[1][1]*m[1][1] + m[1][2]*m[1][2]); - float newY = (m[1][0] * x + m[1][1] * y + m[1][2] * z)/n + m[1][3]; - n = sqrt(m[2][0]*m[2][0] + m[2][1]*m[2][1] + m[2][2]*m[2][2]); - float newZ = (m[2][0] * x + m[2][1] * y + m[2][2] * z)/n + m[2][3]; - z = newZ; - y = newY; - x = newX; - } - - inline void InverseTransformPosition(float &x, float &y) const XBMC_FORCE_INLINE - { // used for mouse - no way to find z - x -= m[0][3]; y -= m[1][3]; - float detM = m[0][0]*m[1][1] - m[0][1]*m[1][0]; - float newX = (m[1][1] * x - m[0][1] * y)/detM; - y = (-m[1][0] * x + m[0][0] * y)/detM; - x = newX; - } - - inline float TransformXCoord(float x, float y, float z) const XBMC_FORCE_INLINE - { - return m[0][0] * x + m[0][1] * y + m[0][2] * z + m[0][3]; - } - - inline float TransformYCoord(float x, float y, float z) const XBMC_FORCE_INLINE - { - return m[1][0] * x + m[1][1] * y + m[1][2] * z + m[1][3]; - } - - inline float TransformZCoord(float x, float y, float z) const XBMC_FORCE_INLINE - { - return m[2][0] * x + m[2][1] * y + m[2][2] * z + m[2][3]; - } - - inline color_t TransformAlpha(color_t colour) const XBMC_FORCE_INLINE - { - return (color_t)(colour * alpha); - } - - float m[3][4]; - float alpha; -}; |