Commit 2a9ae4be authored by hybrid's avatar hybrid

Fixed the missing Windows API check for _WIN32 and _WIN64, both in trunk and...

Fixed the missing Windows API check for _WIN32 and _WIN64, both in trunk and 1.4. Finished the API enhancements in quaternion and vector classes. All methods now return the object where necessary.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1297 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 11d12d34
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
//! WIN32 for Windows32 //! WIN32 for Windows32
//! WIN64 for Windows64 //! WIN64 for Windows64
// The windows platform and API support SDL and WINDOW device // The windows platform and API support SDL and WINDOW device
#if defined(WIN32) || defined(WIN64) || defined(_WIN32_WCE) #if defined(_WIN32) || defined(_WIN64) || defined(WIN32) || defined(WIN64) || defined(_WIN32_WCE)
#define _IRR_WINDOWS_ #define _IRR_WINDOWS_
#define _IRR_WINDOWS_API_ #define _IRR_WINDOWS_API_
#ifndef _IRR_USE_SDL_DEVICE_ #ifndef _IRR_USE_SDL_DEVICE_
......
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
#define sqrtf(X) (f32)sqrt((f64)(X)) #define sqrtf(X) (f32)sqrt((f64)(X))
#define sinf(X) (f32)sin((f64)(X)) #define sinf(X) (f32)sin((f64)(X))
#define cosf(X) (f32)cos((f64)(X)) #define cosf(X) (f32)cos((f64)(X))
#define asinf(X) (f32)asin((f64)(X))
#define acosf(X) (f32)acos((f64)(X))
#define ceilf(X) (f32)ceil((f64)(X)) #define ceilf(X) (f32)ceil((f64)(X))
#define floorf(X) (f32)floor((f64)(X)) #define floorf(X) (f32)floor((f64)(X))
#define powf(X,Y) (f32)pow((f64)(X),(f64)(Y)) #define powf(X,Y) (f32)pow((f64)(X),(f64)(Y))
......
...@@ -50,13 +50,13 @@ class quaternion ...@@ -50,13 +50,13 @@ class quaternion
//! multiplication operator //! multiplication operator
quaternion operator*(const quaternion& other) const; quaternion operator*(const quaternion& other) const;
//! multiplication operator //! scalar multiplication operator
quaternion operator*(f32 s) const; quaternion operator*(f32 s) const;
//! multiplication operator //! scalar multiplication operator
quaternion& operator*=(f32 s); quaternion& operator*=(f32 s);
//! multiplication operator //! vector multiplication operator
vector3df operator* (const vector3df& v) const; vector3df operator* (const vector3df& v) const;
//! multiplication operator //! multiplication operator
...@@ -90,13 +90,13 @@ class quaternion ...@@ -90,13 +90,13 @@ class quaternion
quaternion& makeInverse(); quaternion& makeInverse();
//! set this quaternion to the result of the interpolation between two quaternions //! set this quaternion to the result of the interpolation between two quaternions
void slerp( quaternion q1, quaternion q2, f32 interpolate ); quaternion& slerp( quaternion q1, quaternion q2, f32 interpolate );
//! axis must be unit length
//! The quaternion representing the rotation is //! The quaternion representing the rotation is
//! q = cos(A/2)+sin(A/2)*(x*i+y*j+z*k) //! q = cos(A/2)+sin(A/2)*(x*i+y*j+z*k)
//! axis must be unit length
//! angle in radians //! angle in radians
void fromAngleAxis (f32 angle, const vector3df& axis); quaternion& fromAngleAxis (f32 angle, const vector3df& axis);
//! Fills an angle (radians) around an axis (unit vector) //! Fills an angle (radians) around an axis (unit vector)
void toAngleAxis (f32 &angle, vector3df& axis) const; void toAngleAxis (f32 &angle, vector3df& axis) const;
...@@ -165,12 +165,11 @@ inline quaternion& quaternion::operator=(const quaternion& other) ...@@ -165,12 +165,11 @@ inline quaternion& quaternion::operator=(const quaternion& other)
//! matrix assignment operator //! matrix assignment operator
inline quaternion& quaternion::operator=(const matrix4& m) inline quaternion& quaternion::operator=(const matrix4& m)
{ {
f32 diag = m(0,0) + m(1,1) + m(2,2) + 1; const f32 diag = m(0,0) + m(1,1) + m(2,2) + 1;
f32 scale = 0.0f;
if( diag > 0.0f ) if( diag > 0.0f )
{ {
scale = sqrtf(diag) * 2.0f; // get scale from diagonal const f32 scale = sqrtf(diag) * 2.0f; // get scale from diagonal
// TODO: speed this up // TODO: speed this up
X = ( m(2,1) - m(1,2)) / scale; X = ( m(2,1) - m(1,2)) / scale;
...@@ -184,7 +183,7 @@ inline quaternion& quaternion::operator=(const matrix4& m) ...@@ -184,7 +183,7 @@ inline quaternion& quaternion::operator=(const matrix4& m)
{ {
// 1st element of diag is greatest value // 1st element of diag is greatest value
// find scale according to 1st element, and double it // find scale according to 1st element, and double it
scale = sqrtf( 1.0f + m(0,0) - m(1,1) - m(2,2)) * 2.0f; const f32 scale = sqrtf( 1.0f + m(0,0) - m(1,1) - m(2,2)) * 2.0f;
// TODO: speed this up // TODO: speed this up
X = 0.25f * scale; X = 0.25f * scale;
...@@ -196,7 +195,7 @@ inline quaternion& quaternion::operator=(const matrix4& m) ...@@ -196,7 +195,7 @@ inline quaternion& quaternion::operator=(const matrix4& m)
{ {
// 2nd element of diag is greatest value // 2nd element of diag is greatest value
// find scale according to 2nd element, and double it // find scale according to 2nd element, and double it
scale = sqrtf( 1.0f + m(1,1) - m(0,0) - m(2,2)) * 2.0f; const f32 scale = sqrtf( 1.0f + m(1,1) - m(0,0) - m(2,2)) * 2.0f;
// TODO: speed this up // TODO: speed this up
X = (m(0,1) + m(1,0) ) / scale; X = (m(0,1) + m(1,0) ) / scale;
...@@ -208,7 +207,7 @@ inline quaternion& quaternion::operator=(const matrix4& m) ...@@ -208,7 +207,7 @@ inline quaternion& quaternion::operator=(const matrix4& m)
{ {
// 3rd element of diag is greatest value // 3rd element of diag is greatest value
// find scale according to 3rd element, and double it // find scale according to 3rd element, and double it
scale = sqrtf( 1.0f + m(2,2) - m(0,0) - m(1,1)) * 2.0f; const f32 scale = sqrtf( 1.0f + m(2,2) - m(0,0) - m(1,1)) * 2.0f;
// TODO: speed this up // TODO: speed this up
X = (m(0,2) + m(2,0)) / scale; X = (m(0,2) + m(2,0)) / scale;
...@@ -245,7 +244,10 @@ inline quaternion quaternion::operator*(f32 s) const ...@@ -245,7 +244,10 @@ inline quaternion quaternion::operator*(f32 s) const
//! multiplication operator //! multiplication operator
inline quaternion& quaternion::operator*=(f32 s) inline quaternion& quaternion::operator*=(f32 s)
{ {
X *= s; Y*=s; Z*=s; W*=s; X*=s;
Y*=s;
Z*=s;
W*=s;
return *this; return *this;
} }
...@@ -346,21 +348,21 @@ inline quaternion& quaternion::set(f32 x, f32 y, f32 z) ...@@ -346,21 +348,21 @@ inline quaternion& quaternion::set(f32 x, f32 y, f32 z)
f64 angle; f64 angle;
angle = x * 0.5; angle = x * 0.5;
f64 sr = (f32)sin(angle); const f64 sr = sin(angle);
f64 cr = (f32)cos(angle); const f64 cr = cos(angle);
angle = y * 0.5; angle = y * 0.5;
f64 sp = (f32)sin(angle); const f64 sp = sin(angle);
f64 cp = (f32)cos(angle); const f64 cp = cos(angle);
angle = z * 0.5; angle = z * 0.5;
f64 sy = (f32)sin(angle); const f64 sy = sin(angle);
f64 cy = (f32)cos(angle); const f64 cy = cos(angle);
f64 cpcy = cp * cy; const f64 cpcy = cp * cy;
f64 spcy = sp * cy; const f64 spcy = sp * cy;
f64 cpsy = cp * sy; const f64 cpsy = cp * sy;
f64 spsy = sp * sy; const f64 spsy = sp * sy;
X = (f32)(sr * cpcy - cr * spsy); X = (f32)(sr * cpcy - cr * spsy);
Y = (f32)(cr * spcy + sr * cpsy); Y = (f32)(cr * spcy + sr * cpsy);
...@@ -396,7 +398,7 @@ inline quaternion& quaternion::normalize() ...@@ -396,7 +398,7 @@ inline quaternion& quaternion::normalize()
// set this quaternion to the result of the interpolation between two quaternions // set this quaternion to the result of the interpolation between two quaternions
inline void quaternion::slerp( quaternion q1, quaternion q2, f32 time) inline quaternion& quaternion::slerp(quaternion q1, quaternion q2, f32 time)
{ {
f32 angle = q1.dotProduct(q2); f32 angle = q1.dotProduct(q2);
...@@ -413,10 +415,10 @@ inline void quaternion::slerp( quaternion q1, quaternion q2, f32 time) ...@@ -413,10 +415,10 @@ inline void quaternion::slerp( quaternion q1, quaternion q2, f32 time)
{ {
if ((1.0f - angle) >= 0.05f) // spherical interpolation if ((1.0f - angle) >= 0.05f) // spherical interpolation
{ {
f32 theta = (f32)acos(angle); const f32 theta = acosf(angle);
f32 invsintheta = 1.0f / (f32)sin(theta); const f32 invsintheta = reciprocal(sinf(theta));
scale = (f32)sin(theta * (1.0f-time)) * invsintheta; scale = sinf(theta * (1.0f-time)) * invsintheta;
invscale = (f32)sin(theta * time) * invsintheta; invscale = sinf(theta * time) * invsintheta;
} }
else // linear interploation else // linear interploation
{ {
...@@ -427,11 +429,11 @@ inline void quaternion::slerp( quaternion q1, quaternion q2, f32 time) ...@@ -427,11 +429,11 @@ inline void quaternion::slerp( quaternion q1, quaternion q2, f32 time)
else else
{ {
q2.set(-q1.Y, q1.X, -q1.W, q1.Z); q2.set(-q1.Y, q1.X, -q1.W, q1.Z);
scale = (f32)sin(PI * (0.5f - time)); scale = sinf(PI * (0.5f - time));
invscale = (f32)sin(PI * time); invscale = sinf(PI * time);
} }
*this = (q1*scale) + (q2*invscale); return (*this = (q1*scale) + (q2*invscale));
} }
...@@ -442,7 +444,9 @@ inline f32 quaternion::dotProduct(const quaternion& q2) const ...@@ -442,7 +444,9 @@ inline f32 quaternion::dotProduct(const quaternion& q2) const
} }
inline void quaternion::fromAngleAxis(f32 angle, const vector3df& axis) //! axis must be unit length
//! angle in radians
inline quaternion& quaternion::fromAngleAxis(f32 angle, const vector3df& axis)
{ {
const f32 fHalfAngle = 0.5f*angle; const f32 fHalfAngle = 0.5f*angle;
const f32 fSin = sinf(fHalfAngle); const f32 fSin = sinf(fHalfAngle);
...@@ -450,12 +454,13 @@ inline void quaternion::fromAngleAxis(f32 angle, const vector3df& axis) ...@@ -450,12 +454,13 @@ inline void quaternion::fromAngleAxis(f32 angle, const vector3df& axis)
X = fSin*axis.X; X = fSin*axis.X;
Y = fSin*axis.Y; Y = fSin*axis.Y;
Z = fSin*axis.Z; Z = fSin*axis.Z;
return *this;
} }
inline void quaternion::toAngleAxis(f32 &angle, core::vector3df &axis) const inline void quaternion::toAngleAxis(f32 &angle, core::vector3df &axis) const
{ {
f32 scale = sqrtf(X*X + Y*Y + Z*Z); const f32 scale = sqrtf(X*X + Y*Y + Z*Z);
if (core::iszero(scale) || W > 1.0f || W < -1.0f) if (core::iszero(scale) || W > 1.0f || W < -1.0f)
{ {
...@@ -466,19 +471,20 @@ inline void quaternion::toAngleAxis(f32 &angle, core::vector3df &axis) const ...@@ -466,19 +471,20 @@ inline void quaternion::toAngleAxis(f32 &angle, core::vector3df &axis) const
} }
else else
{ {
angle = 2.0f * (f32) acos(W); const f32 invscale = reciprocal(scale);
axis.X = X / scale; angle = 2.0f * acosf(W);
axis.Y = Y / scale; axis.X = X * invscale;
axis.Z = Z / scale; axis.Y = Y * invscale;
axis.Z = Z * invscale;
} }
} }
inline void quaternion::toEuler(vector3df& euler) const inline void quaternion::toEuler(vector3df& euler) const
{ {
double sqw = W*W; const f64 sqw = W*W;
double sqx = X*X; const f64 sqx = X*X;
double sqy = Y*Y; const f64 sqy = Y*Y;
double sqz = Z*Z; const f64 sqz = Z*Z;
// heading = rotation about z-axis // heading = rotation about z-axis
euler.Z = (f32) (atan2(2.0 * (X*Y +Z*W),(sqx - sqy - sqz + sqw))); euler.Z = (f32) (atan2(2.0 * (X*Y +Z*W),(sqx - sqy - sqz + sqw)));
...@@ -487,9 +493,10 @@ inline void quaternion::toEuler(vector3df& euler) const ...@@ -487,9 +493,10 @@ inline void quaternion::toEuler(vector3df& euler) const
euler.X = (f32) (atan2(2.0 * (Y*Z +X*W),(-sqx - sqy + sqz + sqw))); euler.X = (f32) (atan2(2.0 * (Y*Z +X*W),(-sqx - sqy + sqz + sqw)));
// attitude = rotation about y-axis // attitude = rotation about y-axis
euler.Y = (f32) (asin( clamp(-2.0 * (X*Z - Y*W), -1.0, 1.0) )); euler.Y = asinf( clamp(-2.0 * (X*Z - Y*W), -1.0, 1.0) );
} }
inline vector3df quaternion::operator* (const vector3df& v) const inline vector3df quaternion::operator* (const vector3df& v) const
{ {
// nVidia SDK implementation // nVidia SDK implementation
......
...@@ -39,14 +39,14 @@ public: ...@@ -39,14 +39,14 @@ public:
vector2d<T> operator-(const T v) const { return vector2d<T>(X - v, Y - v); } vector2d<T> operator-(const T v) const { return vector2d<T>(X - v, Y - v); }
vector2d<T>& operator-=(const T v) { X-=v; Y-=v; return *this; } vector2d<T>& operator-=(const T v) { X-=v; Y-=v; return *this; }
vector2d<T> operator*(const vector2d<T>& other) const { return vector2d<T>(X * other.X, Y * other.Y); } vector2d<T> operator*(const vector2d<T>& other) const { return vector2d<T>(X * other.X, Y * other.Y); }
vector2d<T>& operator*=(const vector2d<T>& other) { X*=other.X; Y*=other.Y; return *this; } vector2d<T>& operator*=(const vector2d<T>& other) { X*=other.X; Y*=other.Y; return *this; }
vector2d<T> operator*(const T v) const { return vector2d<T>(X * v, Y * v); } vector2d<T> operator*(const T v) const { return vector2d<T>(X * v, Y * v); }
vector2d<T>& operator*=(const T v) { X*=v; Y*=v; return *this; } vector2d<T>& operator*=(const T v) { X*=v; Y*=v; return *this; }
vector2d<T> operator/(const vector2d<T>& other) const { return vector2d<T>(X / other.X, Y / other.Y); } vector2d<T> operator/(const vector2d<T>& other) const { return vector2d<T>(X / other.X, Y / other.Y); }
vector2d<T>& operator/=(const vector2d<T>& other) { X/=other.X; Y/=other.Y; return *this; } vector2d<T>& operator/=(const vector2d<T>& other) { X/=other.X; Y/=other.Y; return *this; }
vector2d<T> operator/(const T v) const { return vector2d<T>(X / v, Y / v); } vector2d<T> operator/(const T v) const { return vector2d<T>(X / v, Y / v); }
vector2d<T>& operator/=(const T v) { X/=v; Y/=v; return *this; } vector2d<T>& operator/=(const T v) { X/=v; Y/=v; return *this; }
bool operator<=(const vector2d<T>&other) const { return X<=other.X && Y<=other.Y; } bool operator<=(const vector2d<T>&other) const { return X<=other.X && Y<=other.Y; }
...@@ -66,8 +66,8 @@ public: ...@@ -66,8 +66,8 @@ public:
return core::equals(X, other.X) && core::equals(Y, other.Y); return core::equals(X, other.X) && core::equals(Y, other.Y);
} }
void set(T nx, T ny) {X=nx; Y=ny; } vector2d<T>& set(T nx, T ny) {X=nx; Y=ny; return *this; }
void set(const vector2d<T>& p) { X=p.X; Y=p.Y;} vector2d<T>& set(const vector2d<T>& p) { X=p.X; Y=p.Y; return *this; }
//! Returns the length of the vector //! Returns the length of the vector
//! \return Returns the length of the vector. //! \return Returns the length of the vector.
...@@ -98,11 +98,11 @@ public: ...@@ -98,11 +98,11 @@ public:
} }
//! rotates the point around a center by an amount of degrees. //! rotates the point around a center by an amount of degrees.
void rotateBy(f64 degrees, const vector2d<T>& center) vector2d<T>& rotateBy(f64 degrees, const vector2d<T>& center=vector2d<T>())
{ {
degrees *= DEGTORAD64; degrees *= DEGTORAD64;
T cs = (T)cos(degrees); const T cs = (T)cos(degrees);
T sn = (T)sin(degrees); const T sn = (T)sin(degrees);
X -= center.X; X -= center.X;
Y -= center.Y; Y -= center.Y;
...@@ -111,6 +111,7 @@ public: ...@@ -111,6 +111,7 @@ public:
X += center.X; X += center.X;
Y += center.Y; Y += center.Y;
return *this;
} }
//! normalizes the vector. //! normalizes the vector.
...@@ -232,10 +233,11 @@ public: ...@@ -232,10 +233,11 @@ public:
/** \param a: first vector to interpolate with /** \param a: first vector to interpolate with
\param b: second vector to interpolate with \param b: second vector to interpolate with
\param t: value between 0.0f and 1.0f. */ \param t: value between 0.0f and 1.0f. */
void interpolate(const vector2d<T>& a, const vector2d<T>& b, const f32 t) vector2d<T>& interpolate(const vector2d<T>& a, const vector2d<T>& b, const f32 t)
{ {
X = b.X + ( ( a.X - b.X ) * t ); X = b.X + ( ( a.X - b.X ) * t );
Y = b.Y + ( ( a.Y - b.Y ) * t ); Y = b.Y + ( ( a.Y - b.Y ) * t );
return *this;
} }
// member variables // member variables
......
...@@ -73,8 +73,8 @@ namespace core ...@@ -73,8 +73,8 @@ namespace core
core::equals(Z, other.Z, tolerance); core::equals(Z, other.Z, tolerance);
} }
void set(const T nx, const T ny, const T nz) {X=nx; Y=ny; Z=nz; } vector3d<T>& set(const T nx, const T ny, const T nz) {X=nx; Y=ny; Z=nz; return *this;}
void set(const vector3d<T>& p) { X=p.X; Y=p.Y; Z=p.Z;} vector3d<T>& set(const vector3d<T>& p) {X=p.X; Y=p.Y; Z=p.Z;return *this;}
//! Returns length of the vector. //! Returns length of the vector.
T getLength() const { return (T) sqrt((f64)(X*X + Y*Y + Z*Z)); } T getLength() const { return (T) sqrt((f64)(X*X + Y*Y + Z*Z)); }
...@@ -140,25 +140,26 @@ namespace core ...@@ -140,25 +140,26 @@ namespace core
} }
//! Sets the length of the vector to a new value //! Sets the length of the vector to a new value
void setLength(T newlength) vector3d<T>& setLength(T newlength)
{ {
normalize(); normalize();
*this *= newlength; return (*this *= newlength);
} }
//! Inverts the vector. //! Inverts the vector.
void invert() vector3d<T>& invert()
{ {
X *= -1.0f; X *= -1.0f;
Y *= -1.0f; Y *= -1.0f;
Z *= -1.0f; Z *= -1.0f;
return *this;
} }
//! Rotates the vector by a specified number of degrees around the Y //! Rotates the vector by a specified number of degrees around the Y
//! axis and the specified center. //! axis and the specified center.
//! \param degrees: Number of degrees to rotate around the Y axis. //! \param degrees: Number of degrees to rotate around the Y axis.
//! \param center: The center of the rotation. //! \param center: The center of the rotation.
void rotateXZBy(f64 degrees, const vector3d<T>& center) void rotateXZBy(f64 degrees, const vector3d<T>& center=vector3d<T>())
{ {
degrees *= DEGTORAD64; degrees *= DEGTORAD64;
T cs = (T)cos(degrees); T cs = (T)cos(degrees);
...@@ -174,7 +175,7 @@ namespace core ...@@ -174,7 +175,7 @@ namespace core
//! axis and the specified center. //! axis and the specified center.
//! \param degrees: Number of degrees to rotate around the Z axis. //! \param degrees: Number of degrees to rotate around the Z axis.
//! \param center: The center of the rotation. //! \param center: The center of the rotation.
void rotateXYBy(f64 degrees, const vector3d<T>& center) void rotateXYBy(f64 degrees, const vector3d<T>& center=vector3d<T>())
{ {
degrees *= DEGTORAD64; degrees *= DEGTORAD64;
T cs = (T)cos(degrees); T cs = (T)cos(degrees);
...@@ -190,7 +191,7 @@ namespace core ...@@ -190,7 +191,7 @@ namespace core
//! axis and the specified center. //! axis and the specified center.
//! \param degrees: Number of degrees to rotate around the X axis. //! \param degrees: Number of degrees to rotate around the X axis.
//! \param center: The center of the rotation. //! \param center: The center of the rotation.
void rotateYZBy(f64 degrees, const vector3d<T>& center) void rotateYZBy(f64 degrees, const vector3d<T>& center=vector3d<T>())
{ {
degrees *= DEGTORAD64; degrees *= DEGTORAD64;
T cs = (T)cos(degrees); T cs = (T)cos(degrees);
...@@ -265,7 +266,6 @@ namespace core ...@@ -265,7 +266,6 @@ namespace core
array[3] = 0; array[3] = 0;
} }
// member variables // member variables
T X, Y, Z; T X, Y, Z;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment