summaryrefslogtreecommitdiff
path: root/public/panorama/transformations.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/panorama/transformations.h')
-rw-r--r--public/panorama/transformations.h246
1 files changed, 246 insertions, 0 deletions
diff --git a/public/panorama/transformations.h b/public/panorama/transformations.h
new file mode 100644
index 0000000..b2da1d1
--- /dev/null
+++ b/public/panorama/transformations.h
@@ -0,0 +1,246 @@
+//=========== Copyright Valve Corporation, All rights reserved. ===============//
+//
+// Purpose:
+//=============================================================================//
+
+#ifndef TRANSFORMATIONS_H
+#define TRANSFORMATIONS_H
+
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "mathlib/mathlib.h"
+#include "mathlib/vmatrix.h"
+#include "tier1/utlbuffer.h"
+#include "panorama.h"
+#include "panoramatypes.h"
+#include "layout/uilength.h"
+
+namespace panorama
+{
+
+class CTransform3D
+{
+public:
+ virtual ~CTransform3D() {}
+
+ virtual ETransform3DType GetType() const = 0;
+ virtual VMatrix GetTransformMatrix( float flParentWidth, float flParentHeight ) const = 0;
+ virtual CTransform3D *Clone() const = 0;
+ virtual void ScaleLengthValues( float flScaleFactor ) = 0;
+ virtual bool BOnlyImpacts2DValues() = 0;
+
+ virtual bool operator==( const CTransform3D &rhs ) const = 0;
+ bool operator!=( const CTransform3D &rhs ) const { return !(*this == rhs); }
+};
+
+// Helpers for interpolating 3d transform matrixes
+struct DecomposedMatrix_t
+{
+ DecomposedMatrix_t()
+ {
+ m_flTranslationXYZ[0] = 0.0f;
+ m_flTranslationXYZ[1] = 0.0f;
+ m_flTranslationXYZ[2] = 0.0f;
+ m_flScaleXYZ[0] = 1.0;
+ m_flScaleXYZ[1] = 1.0;
+ m_flScaleXYZ[2] = 1.0;
+ m_flSkewXY = 0.0f;
+ m_flSkewXZ = 0.0f;
+ m_flSkewYZ = 0.0f;
+
+ m_quatTransform.Init();
+ }
+ float m_flTranslationXYZ[3];
+ float m_flScaleXYZ[3];
+ float m_flSkewXY;
+ float m_flSkewXZ;
+ float m_flSkewYZ;
+ Quaternion m_quatTransform;
+
+
+};
+DecomposedMatrix_t DecomposeTransformMatrix( VMatrix matrix );
+VMatrix RecomposeTransformMatrix( const DecomposedMatrix_t &decomposed );
+VMatrix InterpolateTransformMatrix( VMatrix from, VMatrix to, float flTimeProgress );
+
+class CTransformRotate3D : public CTransform3D
+{
+public:
+ // Transform in 3D space:
+ // PITCH: Clockwise rotation around the Y axis.
+ // YAW: Counterclockwise rotation around the Z axis.
+ // ROLL: Counterclockwise rotation around the X axis.
+ CTransformRotate3D( float flDegreesPitch, float flDegreesYaw, float flDegreesRoll )
+ {
+ QAngle angle( flDegreesPitch, flDegreesYaw, flDegreesRoll );
+ AngleQuaternion( angle, m_quatTransform );
+ }
+
+ ETransform3DType GetType() const { return k_ETransform3DRotate; }
+
+ VMatrix GetTransformMatrix( float flParentWidth, float flParentHeight ) const
+ {
+ matrix3x4_t mat;
+ QuaternionMatrix( m_quatTransform, mat );
+ return VMatrix( mat );
+ }
+
+ bool BOnlyImpacts2DValues()
+ {
+ return false;
+ }
+
+ virtual CTransform3D *Clone() const
+ {
+ CTransformRotate3D *pRet = new CTransformRotate3D();
+ pRet->m_quatTransform = m_quatTransform;
+
+ return pRet;
+ }
+
+ QAngle GetAngles() const
+ {
+ QAngle angle;
+ QuaternionAngles( m_quatTransform, angle );
+
+ return angle;
+ }
+
+ virtual void ScaleLengthValues( float flScaleFactor ) { }
+
+ virtual bool operator==( const CTransform3D &other ) const
+ {
+ if ( other.GetType() != k_ETransform3DRotate )
+ return false;
+
+ const CTransformRotate3D &rhs = (const CTransformRotate3D &)other;
+ return (m_quatTransform == rhs.m_quatTransform);
+ }
+
+protected:
+ CTransformRotate3D() {}
+
+private:
+
+ Quaternion m_quatTransform;
+};
+
+class CTransformTranslate3D : public CTransform3D
+{
+public:
+ // Translate in 3D space
+ CTransformTranslate3D( float x, float y, float z )
+ {
+ m_x.SetLength( x );
+ m_y.SetLength( y );
+ m_z.SetLength( z );
+ }
+
+ CTransformTranslate3D( const CUILength &x, const CUILength &y, const CUILength &z )
+ {
+ m_x = x;
+ m_y = y;
+ m_z = z;
+ }
+
+ bool BOnlyImpacts2DValues()
+ {
+ if( fabs( m_z.GetValueAsLength( 100 ) - 0.0f ) < 0.0001f )
+ return true;
+
+ return false;
+ }
+
+ ETransform3DType GetType() const { return k_ETransform3DTranslate; }
+
+ VMatrix GetTransformMatrix( float flParentWidth, float flParentHeight ) const
+ {
+
+ VMatrix mat = VMatrix::GetIdentityMatrix();
+ mat.SetTranslation( Vector( m_x.GetValueAsLength( flParentWidth ), m_y.GetValueAsLength( flParentHeight ), m_z.GetValueAsLength( 0 ) ) );
+ return mat;
+ }
+
+ virtual CTransform3D *Clone() const
+ {
+ return new CTransformTranslate3D( m_x, m_y, m_z );
+ }
+
+ virtual void ScaleLengthValues( float flScaleFactor )
+ {
+ m_x.ScaleLengthValue( flScaleFactor );
+ m_y.ScaleLengthValue( flScaleFactor );
+ m_z.ScaleLengthValue( flScaleFactor );
+ }
+
+ CUILength GetX() const { return m_x; }
+ CUILength GetY() const { return m_y; }
+ CUILength GetZ() const { return m_z; }
+
+ virtual bool operator==( const CTransform3D &other ) const
+ {
+ if ( other.GetType() != k_ETransform3DTranslate )
+ return false;
+
+ const CTransformTranslate3D &rhs = (const CTransformTranslate3D &)other;
+ return ( m_x == rhs.m_x && m_y == rhs.m_y && m_z == rhs.m_z );
+ }
+
+private:
+ CUILength m_x;
+ CUILength m_y;
+ CUILength m_z;
+};
+
+
+class CTransformScale3D : public CTransform3D
+{
+public:
+ // Scale in 3D space
+ CTransformScale3D( float x, float y, float z ) : m_VecScale( x, y, z )
+ {
+ }
+
+ ETransform3DType GetType() const { return k_ETransform3DScale; }
+
+ bool BOnlyImpacts2DValues()
+ {
+ return false;
+ }
+
+ VMatrix GetTransformMatrix( float flParentWidth, float flParentHeight ) const
+ {
+ VMatrix mat;
+ MatrixBuildScale( mat, m_VecScale.x, m_VecScale.y, m_VecScale.z );
+ return mat;
+ }
+
+ virtual CTransform3D *Clone() const
+ {
+ return new CTransformScale3D( m_VecScale.x, m_VecScale.y, m_VecScale.z );
+ }
+
+ virtual void ScaleLengthValues( float flScaleFactor ) { }
+
+ float GetX() const { return m_VecScale.x; }
+ float GetY() const { return m_VecScale.y; }
+ float GetZ() const { return m_VecScale.z; }
+
+ virtual bool operator==( const CTransform3D &other ) const
+ {
+ if ( other.GetType() != k_ETransform3DScale )
+ return false;
+
+ const CTransformScale3D &rhs = (const CTransformScale3D &)other;
+ return ( m_VecScale == rhs.m_VecScale );
+ }
+
+private:
+ Vector m_VecScale;
+};
+
+} // namespace panorama
+
+#endif // TRANSFORMATIONS_H \ No newline at end of file