📄 arcball.h
字号:
/** KempoApi: The Turloc Toolkit *****************************/
/** * * **/
/** ** ** Filename: ArcBall.h **/
/** ** Version: Common **/
/** ** **/
/** **/
/** Arcball class for mouse manipulation. **/
/** **/
/** **/
/** **/
/** **/
/** (C) 1999-2003 Tatewake.com **/
/** History: **/
/** 08/17/2003 - (TJG) - Creation **/
/** 09/23/2003 - (TJG) - Bug fix and optimization **/
/** 09/25/2003 - (TJG) - Version for NeHe Basecode users **/
/** **/
/*************************************************************/
#ifndef _ArcBall_h
#define _ArcBall_h
// 8<--Snip here if you have your own math types/funcs-->8
//Only support assertions in debug builds
#ifdef _DEBUG
# include "assert.h"
#else
# define assert(x) { }
#endif
#include <cmath>
//Math types derived from the KempoApi tMath library
typedef union Tuple2f_t
{
struct
{
GLfloat X, Y;
} s;
GLfloat T[2];
} Tuple2fT; //A generic 2-element tuple that is represented by single-precision floating point x,y coordinates.
typedef union Tuple3f_t
{
struct
{
GLfloat X, Y, Z;
} s;
GLfloat T[3];
} Tuple3fT; //A generic 3-element tuple that is represented by single precision-floating point x,y,z coordinates.
typedef union Tuple4f_t
{
struct
{
GLfloat X, Y, Z, W;
} s;
GLfloat T[4];
} Tuple4fT; //A 4-element tuple represented by single-precision floating point x,y,z,w coordinates.
typedef union Matrix3f_t
{
struct
{
//column major
union { GLfloat M00; GLfloat XX; GLfloat SX; }; //XAxis.X and Scale X
union { GLfloat M10; GLfloat XY; }; //XAxis.Y
union { GLfloat M20; GLfloat XZ; }; //XAxis.Z
union { GLfloat M01; GLfloat YX; }; //YAxis.X
union { GLfloat M11; GLfloat YY; GLfloat SY; }; //YAxis.Y and Scale Y
union { GLfloat M21; GLfloat YZ; }; //YAxis.Z
union { GLfloat M02; GLfloat ZX; }; //ZAxis.X
union { GLfloat M12; GLfloat ZY; }; //ZAxis.Y
union { GLfloat M22; GLfloat ZZ; GLfloat SZ; }; //ZAxis.Z and Scale Z
} s;
GLfloat M[9];
} Matrix3fT; //A single precision floating point 3 by 3 matrix.
typedef union Matrix4f_t
{
struct
{
//column major
union { GLfloat M00; GLfloat XX; GLfloat SX; }; //XAxis.X and Scale X
union { GLfloat M10; GLfloat XY; }; //XAxis.Y
union { GLfloat M20; GLfloat XZ; }; //XAxis.Z
union { GLfloat M30; GLfloat XW; }; //XAxis.W
union { GLfloat M01; GLfloat YX; }; //YAxis.X
union { GLfloat M11; GLfloat YY; GLfloat SY; }; //YAxis.Y and Scale Y
union { GLfloat M21; GLfloat YZ; }; //YAxis.Z
union { GLfloat M31; GLfloat YW; }; //YAxis.W
union { GLfloat M02; GLfloat ZX; }; //ZAxis.X
union { GLfloat M12; GLfloat ZY; }; //ZAxis.Y
union { GLfloat M22; GLfloat ZZ; GLfloat SZ; }; //ZAxis.Z and Scale Z
union { GLfloat M32; GLfloat ZW; }; //ZAxis.W
union { GLfloat M03; GLfloat TX; }; //Trans.X
union { GLfloat M13; GLfloat TY; }; //Trans.Y
union { GLfloat M23; GLfloat TZ; }; //Trans.Z
union { GLfloat M33; GLfloat TW; GLfloat SW; }; //Trans.W and Scale W
} s;
GLfloat M[16];
} Matrix4fT; //A single precision floating point 4 by 4 matrix.
//"Inherited" types
#define Point2fT Tuple2fT //A 2 element point that is represented by single precision floating point x,y coordinates.
#define Quat4fT Tuple4fT //A 4 element unit quaternion represented by single precision floating point x,y,z,w coordinates.
#define Vector2fT Tuple2fT //A 2-element vector that is represented by single-precision floating point x,y coordinates.
#define Vector3fT Tuple3fT //A 3-element vector that is represented by single-precision floating point x,y,z coordinates.
//Custom math, or speed overrides
#define FuncSqrt sqrtf
//utility macros
//assuming IEEE-754(GLfloat), which i believe has max precision of 7 bits
# define Epsilon 1.0e-5
//Math functions
/**
* Sets the value of this tuple to the vector sum of itself and tuple t1.
* @param t1 the other tuple
*/
inline
static void Point2fAdd(Point2fT* NewObj, const Tuple2fT* t1)
{
assert(NewObj && t1);
NewObj->s.X += t1->s.X;
NewObj->s.Y += t1->s.Y;
}
/**
* Sets the value of this tuple to the vector difference of itself and tuple t1 (this = this - t1).
* @param t1 the other tuple
*/
inline
static void Point2fSub(Point2fT* NewObj, const Tuple2fT* t1)
{
assert(NewObj && t1);
NewObj->s.X -= t1->s.X;
NewObj->s.Y -= t1->s.Y;
}
/**
* Sets this vector to be the vector cross product of vectors v1 and v2.
* @param v1 the first vector
* @param v2 the second vector
*/
inline
static void Vector3fCross(Vector3fT* NewObj, const Vector3fT* v1, const Vector3fT* v2)
{
Vector3fT Result; //safe not to initialize
assert(NewObj && v1 && v2);
// store on stack once for aliasing-safty
// i.e. safe when a.cross(a, b)
Result.s.X = (v1->s.Y * v2->s.Z) - (v1->s.Z * v2->s.Y);
Result.s.Y = (v1->s.Z * v2->s.X) - (v1->s.X * v2->s.Z);
Result.s.Z = (v1->s.X * v2->s.Y) - (v1->s.Y * v2->s.X);
//copy result back
*NewObj = Result;
}
/**
* Computes the dot product of the this vector and vector v1.
* @param v1 the other vector
*/
inline
static GLfloat Vector3fDot(const Vector3fT* NewObj, const Vector3fT* v1)
{
assert(NewObj && v1);
return (NewObj->s.X * v1->s.X) +
(NewObj->s.Y * v1->s.Y) +
(NewObj->s.Z * v1->s.Z);
}
/**
* Returns the squared length of this vector.
* @return the squared length of this vector
*/
inline
static GLfloat Vector3fLengthSquared(const Vector3fT* NewObj)
{
assert(NewObj);
return (NewObj->s.X * NewObj->s.X) +
(NewObj->s.Y * NewObj->s.Y) +
(NewObj->s.Z * NewObj->s.Z);
}
/**
* Returns the length of this vector.
* @return the length of this vector
*/
inline
static GLfloat Vector3fLength(const Vector3fT* NewObj)
{
assert(NewObj);
return FuncSqrt(Vector3fLengthSquared(NewObj));
}
inline
static void Matrix3fSetZero(Matrix3fT* NewObj)
{
NewObj->s.M00 = NewObj->s.M01 = NewObj->s.M02 =
NewObj->s.M10 = NewObj->s.M11 = NewObj->s.M12 =
NewObj->s.M20 = NewObj->s.M21 = NewObj->s.M22 = 0.0f;
}
/**
* Sets this Matrix3 to identity.
*/
inline
static void Matrix3fSetIdentity(Matrix3fT* NewObj)
{
Matrix3fSetZero(NewObj);
//then set diagonal as 1
NewObj->s.M00 =
NewObj->s.M11 =
NewObj->s.M22 = 1.0f;
}
/**
* Sets the value of this matrix to the matrix conversion of the
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -