2018-03-28 15:42:56 -07:00
//
// Matrix2x3.h
2018-04-22 23:11:50 -07:00
// Kraken Engine / Hydra
2018-03-28 15:42:56 -07:00
//
2022-04-03 21:53:41 -07:00
// Copyright 2022 Kearwood Gilbert. All rights reserved.
2018-03-28 15:42:56 -07:00
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
// of conditions and the following disclaimer in the documentation and/or other materials
// provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY KEARWOOD GILBERT ''AS IS'' AND ANY EXPRESS OR IMPLIED
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KEARWOOD GILBERT OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// The views and conclusions contained in the software and documentation are those of the
// authors and should not be interpreted as representing official policies, either expressed
// or implied, of Kearwood Gilbert.
//
# include "vector2.h"
# include "vector3.h"
# ifndef KRAKEN_MATRIX2X3_H
# define KRAKEN_MATRIX2X3_H
namespace kraken {
2022-08-08 00:20:45 -07:00
class Matrix2x3
{
2018-03-28 15:42:56 -07:00
public :
2022-08-08 00:20:45 -07:00
union
{
struct
{
2018-03-28 15:42:56 -07:00
Vector2 axis_x , axis_y , transform ;
} ;
// Matrix components, in column-major order
float c [ 6 ] ;
} ;
2022-08-08 00:20:45 -07:00
2018-03-28 15:42:56 -07:00
// Default initializer - Creates an identity matrix
void init ( ) ;
2022-08-08 00:20:45 -07:00
void init ( float * pMat ) ;
void init ( const Vector2 & new_axis_x , const Vector2 & new_axis_y , const Vector2 & new_transform ) ;
void init ( const Matrix2x3 & m ) ;
2018-03-28 15:42:56 -07:00
// Overload comparison operator
2022-08-08 00:20:45 -07:00
bool operator = = ( const Matrix2x3 & m ) const ;
2018-03-28 15:42:56 -07:00
// Overload compound multiply operator
2022-08-08 00:20:45 -07:00
Matrix2x3 & operator * = ( const Matrix2x3 & m ) ;
2018-03-28 15:42:56 -07:00
float & operator [ ] ( unsigned i ) ;
float operator [ ] ( unsigned i ) const ;
2022-08-08 00:20:45 -07:00
2018-03-28 15:42:56 -07:00
// Overload multiply operator
2022-08-08 00:20:45 -07:00
Matrix2x3 operator * ( const Matrix2x3 & m ) const ;
float * getPointer ( ) ;
2018-03-28 15:42:56 -07:00
void translate ( float x , float y ) ;
2022-08-08 00:20:45 -07:00
void translate ( const Vector2 & v ) ;
2018-03-28 15:42:56 -07:00
void scale ( float x , float y ) ;
2022-08-08 00:20:45 -07:00
void scale ( const Vector2 & v ) ;
2018-03-28 15:42:56 -07:00
void scale ( float s ) ;
void rotate ( float angle ) ;
bool invert ( ) ;
2022-08-08 00:20:45 -07:00
static Vector2 DotNoTranslate ( const Matrix2x3 & m , const Vector2 & v ) ; // Dot product without including translation; useful for transforming normals and tangents
static Matrix2x3 Invert ( const Matrix2x3 & m ) ;
static Vector2 Dot ( const Matrix2x3 & m , const Vector2 & v ) ;
static Matrix2x3 Translation ( const Vector2 & v ) ;
2018-03-28 15:42:56 -07:00
static Matrix2x3 Rotation ( float angle ) ;
2022-08-08 00:20:45 -07:00
static Matrix2x3 Scaling ( const Vector2 & v ) ;
2018-03-28 15:42:56 -07:00
static Matrix2x3 Identity ( ) ;
} ;
static_assert ( std : : is_pod < Matrix2x3 > : : value , " kraken::Matrix2x3 must be a POD type. " ) ;
} // namespace kraken
namespace std {
2022-08-08 00:20:45 -07:00
template < >
struct hash < kraken : : Matrix2x3 >
{
public :
size_t operator ( ) ( const kraken : : Matrix2x3 & s ) const
{
size_t h1 = hash < kraken : : Vector2 > ( ) ( s . axis_x ) ;
size_t h2 = hash < kraken : : Vector2 > ( ) ( s . axis_y ) ;
size_t h3 = hash < kraken : : Vector2 > ( ) ( s . transform ) ;
return h1 ^ ( h2 < < 1 ) ^ ( h3 < < 2 ) ;
}
} ;
2018-03-28 15:42:56 -07:00
} // namespace std
# endif // KRAKEN_MATRIX2X3_H