40 #ifndef GLS_MATRIXAFFINE_H
41 #define GLS_MATRIXAFFINE_H
113 static const unsigned int SIZE = 4 * 4;
116 for(
unsigned int i = 0; i < SIZE; ++i )
118 if( fabs( this->
_data[ i ] - b.
Data()[ i ] ) > PRECISION )
171 void Scale( Type x, Type y, Type z );
184 void Scale( Type x, Type y, Type z,
const Vector& anchor );
206 _matrix[ 0 ][ 1 ] += y * _matrix[ 0 ][ 3 ];
207 _matrix[ 0 ][ 2 ] += z * _matrix[ 0 ][ 3 ];
209 _matrix[ 1 ][ 0 ] += x * _matrix[ 1 ][ 3 ];
210 _matrix[ 1 ][ 1 ] += y * _matrix[ 1 ][ 3 ];
211 _matrix[ 1 ][ 2 ] += z * _matrix[ 1 ][ 3 ];
213 _matrix[ 2 ][ 0 ] += x * _matrix[ 2 ][ 3 ];
214 _matrix[ 2 ][ 1 ] += y * _matrix[ 2 ][ 3 ];
215 _matrix[ 2 ][ 2 ] += z * _matrix[ 2 ][ 3 ];
217 _matrix[ 3 ][ 0 ] += x * _matrix[ 3 ][ 3 ];
218 _matrix[ 3 ][ 1 ] += y * _matrix[ 3 ][ 3 ];
219 _matrix[ 3 ][ 2 ] += z * _matrix[ 3 ][ 3 ];
234 using _BaseClass::operator*;
246 float( ( M( 0, 0 ) * v.x ) + ( M( 0, 1 ) * v.y ) + ( M( 0, 2 ) * v.z ) + M( 0, 3 ) ),
247 float( ( M( 1, 0 ) * v.x ) + ( M( 1, 1 ) * v.y ) + ( M( 1, 2 ) * v.z ) + M( 1, 3 ) ),
248 float( ( M( 2, 0 ) * v.x ) + ( M( 2, 1 ) * v.y ) + ( M( 2, 2 ) * v.z ) + M( 2, 3 ) ) );
254 float( ( M( 0, 0 ) * v.x ) + ( M( 0, 1 ) * v.y ) + ( M( 0, 2 ) * v.z ) + M( 0, 3 ) ),
255 float( ( M( 1, 0 ) * v.x ) + ( M( 1, 1 ) * v.y ) + ( M( 1, 2 ) * v.z ) + M( 1, 3 ) ),
256 float( ( M( 2, 0 ) * v.x ) + ( M( 2, 1 ) * v.y ) + ( M( 2, 2 ) * v.z ) + M( 2, 3 ) ),
291 const Vector xAxis =
Vector(
float( m( 0, 0 ) ),
float( m( 1, 0 ) ),
float( m( 2, 0 ) ) );
292 const Vector yAxis =
Vector(
float( m( 0, 1 ) ),
float( m( 1, 1 ) ),
float( m( 2, 1 ) ) );
293 const Vector zAxis =
Vector(
float( m( 0, 2 ) ),
float( m( 1, 2 ) ),
float( m( 2, 2 ) ) );
314 if( 0 != scale.x && 0 != scale.y && 0 != scale.z )
316 m( 0, 0 ) /= scale.x;
317 m( 1, 0 ) /= scale.x;
318 m( 2, 0 ) /= scale.x;
319 m( 0, 1 ) /= scale.y;
320 m( 1, 1 ) /= scale.y;
321 m( 2, 1 ) /= scale.y;
322 m( 0, 2 ) /= scale.z;
323 m( 1, 2 ) /= scale.z;
324 m( 2, 2 ) /= scale.z;
343 location =
Vector(
float( matrix( 0, 3 ) ),
float( matrix( 1, 3 ) ),
float( matrix( 2, 3 ) ) );
348 typedef GlsMatrixAffine<float> GlsMatrixAffineF;
349 typedef GlsMatrixAffine<double> GlsMatrixAffineD;
392 const double a(
double( angle ) *
DEG_TO_RAD );
393 const Type sina( (Type)sin( a ) );
394 const Type cosa( (Type)cos( a ) );
411 temp = _matrix[ 0 ][ 1 ];
412 _matrix[ 0 ][ 1 ] = temp * cosa - _matrix[ 0 ][ 2 ] * sina;
413 _matrix[ 0 ][ 2 ] = temp * sina + _matrix[ 0 ][ 2 ] * cosa;
414 temp = _matrix[ 1 ][ 1 ];
415 _matrix[ 1 ][ 1 ] = temp * cosa - _matrix[ 1 ][ 2 ] * sina;
416 _matrix[ 1 ][ 2 ] = temp * sina + _matrix[ 1 ][ 2 ] * cosa;
417 temp = _matrix[ 2 ][ 1 ];
418 _matrix[ 2 ][ 1 ] = temp * cosa - _matrix[ 2 ][ 2 ] * sina;
419 _matrix[ 2 ][ 2 ] = temp * sina + _matrix[ 2 ][ 2 ] * cosa;
420 temp = _matrix[ 3 ][ 1 ];
421 _matrix[ 3 ][ 1 ] = temp * cosa - _matrix[ 3 ][ 2 ] * sina;
422 _matrix[ 3 ][ 2 ] = temp * sina + _matrix[ 3 ][ 2 ] * cosa;
437 temp = _matrix[ 0 ][ 0 ];
438 _matrix[ 0 ][ 0 ] = temp * cosa + _matrix[ 0 ][ 2 ] * sina;
439 _matrix[ 0 ][ 2 ] = _matrix[ 0 ][ 2 ] * cosa - temp * sina;
440 temp = _matrix[ 1 ][ 0 ];
441 _matrix[ 1 ][ 0 ] = temp * cosa + _matrix[ 1 ][ 2 ] * sina;
442 _matrix[ 1 ][ 2 ] = _matrix[ 1 ][ 2 ] * cosa - temp * sina;
443 temp = _matrix[ 2 ][ 0 ];
444 _matrix[ 2 ][ 0 ] = temp * cosa + _matrix[ 2 ][ 2 ] * sina;
445 _matrix[ 2 ][ 2 ] = _matrix[ 2 ][ 2 ] * cosa - temp * sina;
446 temp = _matrix[ 3 ][ 0 ];
447 _matrix[ 3 ][ 0 ] = temp * cosa + _matrix[ 3 ][ 2 ] * sina;
448 _matrix[ 3 ][ 2 ] = _matrix[ 3 ][ 2 ] * cosa - temp * sina;
463 temp = _matrix[ 0 ][ 0 ];
464 _matrix[ 0 ][ 0 ] = temp * cosa - _matrix[ 0 ][ 1 ] * sina;
465 _matrix[ 0 ][ 1 ] = temp * sina + _matrix[ 0 ][ 1 ] * cosa;
466 temp = _matrix[ 1 ][ 0 ];
467 _matrix[ 1 ][ 0 ] = temp * cosa - _matrix[ 1 ][ 1 ] * sina;
468 _matrix[ 1 ][ 1 ] = temp * sina + _matrix[ 1 ][ 1 ] * cosa;
469 temp = _matrix[ 2 ][ 0 ];
470 _matrix[ 2 ][ 0 ] = temp * cosa - _matrix[ 2 ][ 1 ] * sina;
471 _matrix[ 2 ][ 1 ] = temp * sina + _matrix[ 2 ][ 1 ] * cosa;
472 temp = _matrix[ 3 ][ 0 ];
473 _matrix[ 3 ][ 0 ] = temp * cosa - _matrix[ 3 ][ 1 ] * sina;
474 _matrix[ 3 ][ 1 ] = temp * sina + _matrix[ 3 ][ 1 ] * cosa;
483 const Vector& centerOfRotation,
492 const double a(
double( angle ) *
DEG_TO_RAD );
493 const Type sina( (Type)sin( a ) );
494 const Type cosa( (Type)cos( a ) );
513 const Type T11( cosa ), T12( -sina ), T21( sina ), T22( cosa ),
515 T13( centerOfRotation.y - ( cosa * centerOfRotation.y - sina * centerOfRotation.z ) ),
516 T23( centerOfRotation.z - ( sina * centerOfRotation.y + cosa * centerOfRotation.z ) );
520 temp = _matrix[ 0 ][ 1 ];
521 _matrix[ 0 ][ 1 ] = temp * T11 + _matrix[ 0 ][ 2 ] * T12 + _matrix[ 0 ][ 3 ] * T13;
522 _matrix[ 0 ][ 2 ] = temp * T21 + _matrix[ 0 ][ 2 ] * T22 + _matrix[ 0 ][ 3 ] * T23;
523 temp = _matrix[ 1 ][ 1 ];
524 _matrix[ 1 ][ 1 ] = temp * T11 + _matrix[ 1 ][ 2 ] * T12 + _matrix[ 1 ][ 3 ] * T13;
525 _matrix[ 1 ][ 2 ] = temp * T21 + _matrix[ 1 ][ 2 ] * T22 + _matrix[ 1 ][ 3 ] * T23;
526 temp = _matrix[ 2 ][ 1 ];
527 _matrix[ 2 ][ 1 ] = temp * T11 + _matrix[ 2 ][ 2 ] * T12 + _matrix[ 2 ][ 3 ] * T13;
528 _matrix[ 2 ][ 2 ] = temp * T21 + _matrix[ 2 ][ 2 ] * T22 + _matrix[ 2 ][ 3 ] * T23;
529 temp = _matrix[ 3 ][ 1 ];
530 _matrix[ 3 ][ 1 ] = temp * T11 + _matrix[ 3 ][ 2 ] * T12 + _matrix[ 3 ][ 3 ] * T13;
531 _matrix[ 3 ][ 2 ] = temp * T21 + _matrix[ 3 ][ 2 ] * T22 + _matrix[ 3 ][ 3 ] * T23;
548 const Type T00( cosa ), T02( sina ), T20( -sina ), T22( cosa ),
549 T03( centerOfRotation.x - ( sina * centerOfRotation.z + cosa * centerOfRotation.x ) ),
551 T23( centerOfRotation.z - ( cosa * centerOfRotation.z - sina * centerOfRotation.x ) );
555 temp = _matrix[ 0 ][ 0 ];
556 _matrix[ 0 ][ 0 ] = temp * T00 + _matrix[ 0 ][ 2 ] * T02 + _matrix[ 0 ][ 3 ] * T03;
557 _matrix[ 0 ][ 2 ] = temp * T20 + _matrix[ 0 ][ 2 ] * T22 + _matrix[ 0 ][ 3 ] * T23;
558 temp = _matrix[ 1 ][ 0 ];
559 _matrix[ 1 ][ 0 ] = temp * T00 + _matrix[ 1 ][ 2 ] * T02 + _matrix[ 1 ][ 3 ] * T03;
560 _matrix[ 1 ][ 2 ] = temp * T20 + _matrix[ 1 ][ 2 ] * T22 + _matrix[ 1 ][ 3 ] * T23;
561 temp = _matrix[ 2 ][ 0 ];
562 _matrix[ 2 ][ 0 ] = temp * T00 + _matrix[ 2 ][ 2 ] * T02 + _matrix[ 2 ][ 3 ] * T03;
563 _matrix[ 2 ][ 2 ] = temp * T20 + _matrix[ 2 ][ 2 ] * T22 + _matrix[ 2 ][ 3 ] * T23;
564 temp = _matrix[ 3 ][ 0 ];
565 _matrix[ 3 ][ 0 ] = temp * T00 + _matrix[ 3 ][ 2 ] * T02 + _matrix[ 3 ][ 3 ] * T03;
566 _matrix[ 3 ][ 2 ] = temp * T20 + _matrix[ 3 ][ 2 ] * T22 + _matrix[ 3 ][ 3 ] * T23;
583 const Type T00( cosa ), T01( -sina ), T10( sina ), T11( cosa ),
584 T03( centerOfRotation.x - ( cosa * centerOfRotation.x - sina * centerOfRotation.y ) ),
585 T13( centerOfRotation.y - ( sina * centerOfRotation.x + cosa * centerOfRotation.y ) );
590 temp = _matrix[ 0 ][ 0 ];
591 _matrix[ 0 ][ 0 ] = temp * T00 + _matrix[ 0 ][ 1 ] * T01 + _matrix[ 0 ][ 3 ] * T03;
592 _matrix[ 0 ][ 1 ] = temp * T10 + _matrix[ 0 ][ 1 ] * T11 + _matrix[ 0 ][ 3 ] * T13;
593 temp = _matrix[ 1 ][ 0 ];
594 _matrix[ 1 ][ 0 ] = temp * T00 + _matrix[ 1 ][ 1 ] * T01 + _matrix[ 1 ][ 3 ] * T03;
595 _matrix[ 1 ][ 1 ] = temp * T10 + _matrix[ 1 ][ 1 ] * T11 + _matrix[ 1 ][ 3 ] * T13;
596 temp = _matrix[ 2 ][ 0 ];
597 _matrix[ 2 ][ 0 ] = temp * T00 + _matrix[ 2 ][ 1 ] * T01 + _matrix[ 2 ][ 3 ] * T03;
598 _matrix[ 2 ][ 1 ] = temp * T10 + _matrix[ 2 ][ 1 ] * T11 + _matrix[ 2 ][ 3 ] * T13;
599 temp = _matrix[ 3 ][ 0 ];
600 _matrix[ 3 ][ 0 ] = temp * T00 + _matrix[ 3 ][ 1 ] * T01 + _matrix[ 3 ][ 3 ] * T03;
601 _matrix[ 3 ][ 1 ] = temp * T10 + _matrix[ 3 ][ 1 ] * T11 + _matrix[ 3 ][ 3 ] * T13;
610 const Vector& centerOfRotation,
647 const Type xx( Type( u.x * u.x ) );
648 const Type yy( Type( u.y * u.y ) );
649 const Type zz( Type( u.z * u.z ) );
650 const Type xy( Type( u.x * u.y ) );
651 const Type xz( Type( u.x * u.z ) );
652 const Type yz( Type( u.y * u.z ) );
656 const double a(
double( angle ) *
DEG_TO_RAD );
657 const Type sina( (Type)sin( a ) );
658 const Type cosa( (Type)cos( a ) );
668 R( 0, 0 ) = xx + ( 1 - xx ) * cosa;
669 R( 1, 0 ) = xy - xy * cosa + u.z * sina;
670 R( 2, 0 ) = xz - xz * cosa - u.y * sina;
672 R( 0, 1 ) = xy - xy * cosa - u.z * sina;
673 R( 1, 1 ) = yy + ( 1 - yy ) * cosa;
674 R( 2, 1 ) = yz - yz * cosa + u.x * sina;
676 R( 0, 2 ) = xz - xz * cosa + u.y * sina;
677 R( 1, 2 ) = yz - yz * cosa - u.x * sina;
678 R( 2, 2 ) = zz + ( 1 - zz ) * cosa;
683 this->Translate( -centerOfRotation.x, -centerOfRotation.y, -centerOfRotation.z );
685 this->Translate( centerOfRotation.x, centerOfRotation.y, centerOfRotation.z );
700 _matrix[ 0 ][ 0 ] = _matrix[ 0 ][ 0 ] * x;
701 _matrix[ 0 ][ 1 ] = _matrix[ 0 ][ 1 ] * y;
702 _matrix[ 0 ][ 2 ] = _matrix[ 0 ][ 2 ] * z;
705 _matrix[ 1 ][ 0 ] = _matrix[ 1 ][ 0 ] * x;
706 _matrix[ 1 ][ 1 ] = _matrix[ 1 ][ 1 ] * y;
707 _matrix[ 1 ][ 2 ] = _matrix[ 1 ][ 2 ] * z;
710 _matrix[ 2 ][ 0 ] = _matrix[ 2 ][ 0 ] * x;
711 _matrix[ 2 ][ 1 ] = _matrix[ 2 ][ 1 ] * y;
712 _matrix[ 2 ][ 2 ] = _matrix[ 2 ][ 2 ] * z;
715 _matrix[ 3 ][ 0 ] = _matrix[ 3 ][ 0 ] * x;
716 _matrix[ 3 ][ 1 ] = _matrix[ 3 ][ 1 ] * y;
717 _matrix[ 3 ][ 2 ] = _matrix[ 3 ][ 2 ] * z;
737 const Type T03 = anchor.x * ( 1 - x );
738 const Type T13 = anchor.y * ( 1 - y );
739 const Type T23 = anchor.z * ( 1 - z );
744 _matrix[ 0 ][ 0 ] = _matrix[ 0 ][ 0 ] * T00 + _matrix[ 0 ][ 3 ] * T03;
745 _matrix[ 0 ][ 1 ] = _matrix[ 0 ][ 1 ] * T11 + _matrix[ 0 ][ 3 ] * T13;
746 _matrix[ 0 ][ 2 ] = _matrix[ 0 ][ 2 ] * T22 + _matrix[ 0 ][ 3 ] * T23;
749 _matrix[ 1 ][ 0 ] = _matrix[ 1 ][ 0 ] * T00 + _matrix[ 1 ][ 3 ] * T03;
750 _matrix[ 1 ][ 1 ] = _matrix[ 1 ][ 1 ] * T11 + _matrix[ 1 ][ 3 ] * T13;
751 _matrix[ 1 ][ 2 ] = _matrix[ 1 ][ 2 ] * T22 + _matrix[ 1 ][ 3 ] * T23;
754 _matrix[ 2 ][ 0 ] = _matrix[ 2 ][ 0 ] * T00 + _matrix[ 2 ][ 3 ] * T03;
755 _matrix[ 2 ][ 1 ] = _matrix[ 2 ][ 1 ] * T11 + _matrix[ 2 ][ 3 ] * T13;
756 _matrix[ 2 ][ 2 ] = _matrix[ 2 ][ 2 ] * T22 + _matrix[ 2 ][ 3 ] * T23;
759 _matrix[ 3 ][ 0 ] = _matrix[ 3 ][ 0 ] * T00 + _matrix[ 3 ][ 3 ] * T03;
760 _matrix[ 3 ][ 1 ] = _matrix[ 3 ][ 1 ] * T11 + _matrix[ 3 ][ 3 ] * T13;
761 _matrix[ 3 ][ 2 ] = _matrix[ 3 ][ 2 ] * T22 + _matrix[ 3 ][ 3 ] * T23;
767 #ifdef MATRIX_TYPE_FLOAT
768 typedef float GlsMatrixElementType;
770 # define GLS_glLoadMatrix_TYPE glLoadMatrixf
771 # define GLS_glMultMatrix_TYPE glMultMatrixf
773 typedef double GlsMatrixElementType;
774 typedef GlsMatrixAffineD GlsMatrixType;
775 # define GLS_glLoadMatrix_TYPE glLoadMatrixd
776 # define GLS_glMultMatrix_TYPE glMultMatrixd
RotationAxis
Definition: vertex.h:72
unsigned char R(void) const
Definition: gls_color.h:208
Definition: gls_matrix.h:61
float MagnitudeSquared() const
Definition: vertex.h:334
unsigned char B(void) const
Definition: gls_color.h:214
void Normalize(void)
Definition: vertex.h:307
static const double PRECISION
Definition: gls_matrix.h:313
Type * _matrix[DIM]
Definition: gls_matrix.h:334
void Translate(const Vector &v)
Definition: gls_matrix_affine.h:231
GlsMatrix< Type, 4 > DecomposeRotationMatrix(const GlsMatrix< Type, 4 > &matrix, const Vector &scale)
Definition: gls_matrix_affine.h:304
void Transform(Vector &v) const
Definition: gls_matrix_affine.h:269
VertexNoColor Vector
Definition: gls_font_base.h:66
Type _data[DIM *DIM]
Definition: gls_matrix.h:322
The disti::Vertex class. A class for manipulating 3D vertices.
unsigned char G(void) const
Definition: gls_color.h:211
Type * Data()
Definition: gls_matrix.h:131
void Translate(Type x, Type y, Type z)
Definition: gls_matrix_affine.h:196
void DecomposeMatrix(const GlsMatrix< Type, 4 > &matrix, Vector &scale, Vector &location, GlsQuaternion< Type > &rotation)
Definition: gls_matrix_affine.h:338
~GlsMatrixAffine()
Definition: gls_matrix_affine.h:382
void Rotate(Type angle, RotationAxis axis)
Definition: gls_matrix_affine.h:388
Vector DecomposeScale(const GlsMatrix< Type, 4 > &m)
Definition: gls_matrix_affine.h:289
Definition: gls_quaternion.h:53
The disti::GlsQuaternion class.
float Magnitude() const
Definition: vertex.h:326
unsigned char A(void) const
Definition: gls_color.h:217
bool IsVeryClose(const GlsMatrix< Type, 4 > &b) const
Definition: gls_matrix_affine.h:111
Definition: bmpimage.h:46
void Scale(Type x, Type y, Type z)
Definition: gls_matrix_affine.h:690
Vector operator*(const Vector &v) const
Definition: gls_matrix_affine.h:242
Definition: gls_matrix_affine.h:60
GlsMatrixAffine()
Definition: gls_matrix_affine.h:359
#define DEG_TO_RAD
Definition: util.h:116