Structs continued
parent
1c275dbd78
commit
b5b9fdb680
|
@ -89,7 +89,7 @@ inline float Norm(float a)
|
||||||
//! Returns the absolute value
|
//! Returns the absolute value
|
||||||
inline float Abs(float a)
|
inline float Abs(float a)
|
||||||
{
|
{
|
||||||
return (float)fabs(a);
|
return (float)std::fabs(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Swaps two integers
|
//! Swaps two integers
|
||||||
|
|
|
@ -35,6 +35,8 @@ namespace Math
|
||||||
|
|
||||||
All methods are made inline to maximize optimization.
|
All methods are made inline to maximize optimization.
|
||||||
|
|
||||||
|
TODO test
|
||||||
|
|
||||||
**/
|
**/
|
||||||
struct Matrix
|
struct Matrix
|
||||||
{
|
{
|
||||||
|
@ -164,43 +166,97 @@ struct Matrix
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void LoadViewMatrix(const Vector &from, const Vector &at, const Vector &up)
|
//! Loads view matrix from the given vectors
|
||||||
|
/** \a from origin
|
||||||
|
\a at direction
|
||||||
|
\a up up vector */
|
||||||
|
inline void LoadView(const Vector &from, const Vector &at, const Vector &up)
|
||||||
|
{
|
||||||
|
// Get the z basis vector, which points straight ahead. This is the
|
||||||
|
// difference from the eyepoint to the lookat point.
|
||||||
|
Vector view = at - from;
|
||||||
|
|
||||||
|
FLOAT length = view.Length();
|
||||||
|
if( IsZero(length) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Normalize the z basis vector
|
||||||
|
view /= length;
|
||||||
|
|
||||||
|
// Get the dot product, and calculate the projection of the z basis
|
||||||
|
// vector onto the up vector. The projection is the y basis vector.
|
||||||
|
float dotProduct = DotProduct(worldUp, view);
|
||||||
|
|
||||||
|
Vector up = worldUp - dotProduct * view;
|
||||||
|
|
||||||
|
// If this vector has near-zero length because the input specified a
|
||||||
|
// bogus up vector, let's try a default up vector
|
||||||
|
if ( IsZero(length = up.Length()) )
|
||||||
|
{
|
||||||
|
up = Vector(0.0f, 1.0f, 0.0f) - view.y * view;
|
||||||
|
|
||||||
|
// If we still have near-zero length, resort to a different axis.
|
||||||
|
if ( IsZero(length = up.Length()) )
|
||||||
|
{
|
||||||
|
up = Vector(0.0f, 0.0f, 1.0f) - view.z * view;
|
||||||
|
|
||||||
|
if ( IsZero(up.Length()) )
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Normalize the y basis vector
|
||||||
|
up /= length;
|
||||||
|
|
||||||
|
// The x basis vector is found simply with the cross product of the y
|
||||||
|
// and z basis vectors
|
||||||
|
Vector right = CrossProduct(up, view);
|
||||||
|
|
||||||
|
// Start building the matrix. The first three rows contains the basis
|
||||||
|
// vectors used to rotate the view to point at the lookat point
|
||||||
|
LoadIdentity();
|
||||||
|
m[0 ] = right.x; m[1 ] = up.x; m[2 ] = view.x;
|
||||||
|
m[4 ] = right.y; m[5 ] = up.y; m[6 ] = view.y;
|
||||||
|
m[8 ] = right.z; m[9 ] = up.z; m[10] = view.z;
|
||||||
|
|
||||||
|
// Do the translation values (rotations are still about the eyepoint)
|
||||||
|
m[3 ] = - DotProduct(from, right);
|
||||||
|
m[7 ] = - DotProduct(from, up);
|
||||||
|
m[11] = - DotProduct(from, view);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void LoadProjection(float fov = 1.570795f, float aspect = 1.0f,
|
||||||
|
float nearPlane = 1.0f, float farPlane = 1000.0f)
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void LoadProjectionMatrix(float fov = 1.570795f, float aspect = 1.0f,
|
inline void LoadTranslation(const Vector &trans)
|
||||||
float nearPlane = 1.0f, float farPlane = 1000.0f)
|
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void LoadTranslateMatrix(const Vector &trans)
|
inline void LoadScale(const Vector &scale)
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void LoadScaleMatrix(const Vector &scale)
|
inline void LoadRotationX(float angle)
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void LoadRotateXMatrix(float angle)
|
inline void LoadRotationY(float angle)
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void LoadRotateYMatrix(float angle)
|
inline void LoadRotationZ(float angle)
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void LoadRotateZMatrix(float angle)
|
inline void LoadRotation(const Vector &dir, float angle)
|
||||||
{
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void LoadRotationMatrix(const Vector &dir, float angle)
|
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
@ -217,7 +273,7 @@ struct Matrix
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Calculates the matrix to make three rotations in the order Z, X and Y
|
//! Calculates the matrix to make three rotations in the order Z, X and Y
|
||||||
inline void MatRotateZXY(const Vector &angle)
|
inline void RotateZXY(const Vector &angle)
|
||||||
{
|
{
|
||||||
Matrix temp;
|
Matrix temp;
|
||||||
temp.SetRotateZMatrix(angle.z);
|
temp.SetRotateZMatrix(angle.z);
|
||||||
|
|
|
@ -20,6 +20,49 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
namespace Math
|
||||||
|
{
|
||||||
|
|
||||||
|
/** 2D Point
|
||||||
|
|
||||||
|
Represents a 2D point (x, y).
|
||||||
|
Contains the required methods for operating on points.
|
||||||
|
|
||||||
|
All methods are made inline to maximize optimization.
|
||||||
|
|
||||||
|
TODO test
|
||||||
|
|
||||||
|
*/
|
||||||
|
struct Point
|
||||||
|
{
|
||||||
|
//! X coord
|
||||||
|
float x;
|
||||||
|
//! Y coord
|
||||||
|
float y;
|
||||||
|
|
||||||
|
inline Point()
|
||||||
|
{
|
||||||
|
LoadZero();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Point(float x, float y)
|
||||||
|
{
|
||||||
|
this->x = x;
|
||||||
|
this->y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void LoadZero()
|
||||||
|
{
|
||||||
|
x = y = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline float Length()
|
||||||
|
{
|
||||||
|
return std::sqrt(x*x + y*y);
|
||||||
|
}
|
||||||
|
};
|
||||||
/* TODO
|
/* TODO
|
||||||
FPOINT RotatePoint(FPOINT center, float angle, FPOINT p);
|
FPOINT RotatePoint(FPOINT center, float angle, FPOINT p);
|
||||||
FPOINT RotatePoint(float angle, FPOINT p);
|
FPOINT RotatePoint(float angle, FPOINT p);
|
||||||
|
@ -36,4 +79,6 @@ BOOL IsInsideTriangle(FPOINT a, FPOINT b, FPOINT c, FPOINT p);
|
||||||
|
|
||||||
BOOL LineFunction(FPOINT p1, FPOINT p2, float &a, float &b);
|
BOOL LineFunction(FPOINT p1, FPOINT p2, float &a, float &b);
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
};
|
||||||
|
|
|
@ -59,6 +59,8 @@ namespace Math
|
||||||
|
|
||||||
All methods are made inline to maximize optimization.
|
All methods are made inline to maximize optimization.
|
||||||
|
|
||||||
|
TODO test
|
||||||
|
|
||||||
*/
|
*/
|
||||||
struct Vector
|
struct Vector
|
||||||
{
|
{
|
||||||
|
@ -150,4 +152,18 @@ struct Vector
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//! Convenience function for calculating dot product
|
||||||
|
float DotProduct(const Vector &left, const Vector &right)
|
||||||
|
{
|
||||||
|
return left.DotProduct(right);
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Convenience function for calculating cross product
|
||||||
|
Vector CrossProduct(const Vector &left, const Vector &right)
|
||||||
|
{
|
||||||
|
Vector result = left;
|
||||||
|
result.CrossProduct(right);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
}; // namespace Math
|
}; // namespace Math
|
||||||
|
|
Loading…
Reference in New Issue