Split math functions; beginning of common structures
parent
449cc186d5
commit
d57258ae1c
|
@ -0,0 +1,150 @@
|
||||||
|
// * This file is part of the COLOBOT source code
|
||||||
|
// * Copyright (C) 2012, Polish Portal of Colobot (PPC)
|
||||||
|
// *
|
||||||
|
// * This program is free software: you can redistribute it and/or modify
|
||||||
|
// * it under the terms of the GNU General Public License as published by
|
||||||
|
// * the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// * (at your option) any later version.
|
||||||
|
// *
|
||||||
|
// * This program is distributed in the hope that it will be useful,
|
||||||
|
// * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// * GNU General Public License for more details.
|
||||||
|
// *
|
||||||
|
// * You should have received a copy of the GNU General Public License
|
||||||
|
// * along with this program. If not, see http://www.gnu.org/licenses/.
|
||||||
|
|
||||||
|
// color.cpp
|
||||||
|
|
||||||
|
#include "color.h"
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
|
||||||
|
|
||||||
|
// Returns the color corresponding D3DCOLOR.
|
||||||
|
|
||||||
|
D3DCOLOR RetColor(float intensity)
|
||||||
|
{
|
||||||
|
D3DCOLOR color;
|
||||||
|
|
||||||
|
if ( intensity <= 0.0f ) return 0x00000000;
|
||||||
|
if ( intensity >= 1.0f ) return 0xffffffff;
|
||||||
|
|
||||||
|
color = (int)(intensity*255.0f)<<24;
|
||||||
|
color |= (int)(intensity*255.0f)<<16;
|
||||||
|
color |= (int)(intensity*255.0f)<<8;
|
||||||
|
color |= (int)(intensity*255.0f);
|
||||||
|
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns the color corresponding D3DCOLOR.
|
||||||
|
|
||||||
|
D3DCOLOR RetColor(D3DCOLORVALUE intensity)
|
||||||
|
{
|
||||||
|
D3DCOLOR color;
|
||||||
|
|
||||||
|
color = (int)(intensity.a*255.0f)<<24;
|
||||||
|
color |= (int)(intensity.r*255.0f)<<16;
|
||||||
|
color |= (int)(intensity.g*255.0f)<<8;
|
||||||
|
color |= (int)(intensity.b*255.0f);
|
||||||
|
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns the color corresponding D3DCOLORVALUE.
|
||||||
|
|
||||||
|
D3DCOLORVALUE RetColor(D3DCOLOR intensity)
|
||||||
|
{
|
||||||
|
D3DCOLORVALUE color;
|
||||||
|
|
||||||
|
color.r = (float)((intensity>>16)&0xff)/256.0f;
|
||||||
|
color.g = (float)((intensity>>8 )&0xff)/256.0f;
|
||||||
|
color.b = (float)((intensity>>0 )&0xff)/256.0f;
|
||||||
|
color.a = (float)((intensity>>24)&0xff)/256.0f;
|
||||||
|
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// RGB to HSV conversion.
|
||||||
|
|
||||||
|
void RGB2HSV(D3DCOLORVALUE src, ColorHSV &dest)
|
||||||
|
{
|
||||||
|
float min, max, delta;
|
||||||
|
|
||||||
|
min = Min(src.r, src.g, src.b);
|
||||||
|
max = Max(src.r, src.g, src.b);
|
||||||
|
|
||||||
|
dest.v = max; // intensity
|
||||||
|
|
||||||
|
if ( max == 0.0f )
|
||||||
|
{
|
||||||
|
dest.s = 0.0f; // saturation
|
||||||
|
dest.h = 0.0f; // undefined color!
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
delta = max-min;
|
||||||
|
dest.s = delta/max; // saturation
|
||||||
|
|
||||||
|
if ( src.r == max ) // between yellow & magenta
|
||||||
|
{
|
||||||
|
dest.h = (src.g-src.b)/delta;
|
||||||
|
}
|
||||||
|
else if ( src.g == max ) // between cyan & yellow
|
||||||
|
{
|
||||||
|
dest.h = 2.0f+(src.b-src.r)/delta;
|
||||||
|
}
|
||||||
|
else // between magenta & cyan
|
||||||
|
{
|
||||||
|
dest.h = 4.0f+(src.r-src.g)/delta;
|
||||||
|
}
|
||||||
|
|
||||||
|
dest.h *= 60.0f; // in degrees
|
||||||
|
if ( dest.h < 0.0f ) dest.h += 360.0f;
|
||||||
|
dest.h /= 360.0f; // 0..1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// HSV to RGB conversion.
|
||||||
|
|
||||||
|
void HSV2RGB(ColorHSV src, D3DCOLORVALUE &dest)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
float f,v,p,q,t;
|
||||||
|
|
||||||
|
src.h = Norm(src.h)*360.0f;
|
||||||
|
src.s = Norm(src.s);
|
||||||
|
src.v = Norm(src.v);
|
||||||
|
|
||||||
|
if ( src.s == 0.0f ) // zero saturation?
|
||||||
|
{
|
||||||
|
dest.r = src.v;
|
||||||
|
dest.g = src.v;
|
||||||
|
dest.b = src.v; // gray
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( src.h == 360.0f ) src.h = 0.0f;
|
||||||
|
src.h /= 60.0f;
|
||||||
|
i = (int)src.h; // integer part (0 .. 5)
|
||||||
|
f = src.h-i; // fractional part
|
||||||
|
|
||||||
|
v = src.v;
|
||||||
|
p = src.v*(1.0f-src.s);
|
||||||
|
q = src.v*(1.0f-(src.s*f));
|
||||||
|
t = src.v*(1.0f-(src.s*(1.0f-f)));
|
||||||
|
|
||||||
|
switch (i)
|
||||||
|
{
|
||||||
|
case 0: dest.r=v; dest.g=t; dest.b=p; break;
|
||||||
|
case 1: dest.r=q; dest.g=v; dest.b=p; break;
|
||||||
|
case 2: dest.r=p; dest.g=v; dest.b=t; break;
|
||||||
|
case 3: dest.r=p; dest.g=q; dest.b=v; break;
|
||||||
|
case 4: dest.r=t; dest.g=p; dest.b=v; break;
|
||||||
|
case 5: dest.r=v; dest.g=p; dest.b=q; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
// * This file is part of the COLOBOT source code
|
||||||
|
// * Copyright (C) 2012, Polish Portal of Colobot (PPC)
|
||||||
|
// *
|
||||||
|
// * This program is free software: you can redistribute it and/or modify
|
||||||
|
// * it under the terms of the GNU General Public License as published by
|
||||||
|
// * the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// * (at your option) any later version.
|
||||||
|
// *
|
||||||
|
// * This program is distributed in the hope that it will be useful,
|
||||||
|
// * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// * GNU General Public License for more details.
|
||||||
|
// *
|
||||||
|
// * You should have received a copy of the GNU General Public License
|
||||||
|
// * along with this program. If not, see http://www.gnu.org/licenses/.
|
||||||
|
|
||||||
|
// color.h
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
struct Color
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
D3DCOLOR RetColor(float intensity);
|
||||||
|
D3DCOLOR RetColor(D3DCOLORVALUE intensity);
|
||||||
|
D3DCOLORVALUE RetColor(D3DCOLOR intensity);
|
||||||
|
|
||||||
|
void RGB2HSV(D3DCOLORVALUE src, ColorHSV &dest);
|
||||||
|
void HSV2RGB(ColorHSV src, D3DCOLORVALUE &dest);
|
|
@ -0,0 +1,28 @@
|
||||||
|
// math/const.h
|
||||||
|
|
||||||
|
/* Math constants */
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// Math module namespace
|
||||||
|
namespace Math
|
||||||
|
{
|
||||||
|
//! Tolerance level -- minimum accepted float value
|
||||||
|
const float TOLERANCE = 1e-6f;
|
||||||
|
|
||||||
|
//! PI
|
||||||
|
const float PI = 3.14159265358979323846f;
|
||||||
|
//! 2 * PI
|
||||||
|
const float PI_MUL_2 = 6.28318530717958623200f;
|
||||||
|
//! PI / 2
|
||||||
|
const float PI_DIV_2 = 1.57079632679489655800f;
|
||||||
|
//! PI / 4
|
||||||
|
const float PI_DIV_4 = 0.78539816339744827900f;
|
||||||
|
//! 1 / PI
|
||||||
|
const float INV_PI = 0.31830988618379069122f;
|
||||||
|
|
||||||
|
//! Degrees to radians multiplier
|
||||||
|
const float DEG_TO_RAD = 0.01745329251994329547f;
|
||||||
|
//! Radians to degrees multiplier
|
||||||
|
const FLOAT RAD_TO_DEG = 57.29577951308232286465f;
|
||||||
|
};
|
|
@ -0,0 +1,238 @@
|
||||||
|
// math/func.h
|
||||||
|
|
||||||
|
/* Common math functions */
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "const.h"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstdlib>
|
||||||
|
|
||||||
|
namespace Math
|
||||||
|
{
|
||||||
|
|
||||||
|
//! Compares a and b within TOLERANCE
|
||||||
|
bool IsEqual(float a, float b)
|
||||||
|
{
|
||||||
|
return Abs(a - b) < TOLERANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Minimum
|
||||||
|
inline float Min(float a, float b)
|
||||||
|
{
|
||||||
|
if ( a <= b ) return a;
|
||||||
|
else return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline float Min(float a, float b, float c)
|
||||||
|
{
|
||||||
|
return Min( Min(a, b), c );
|
||||||
|
}
|
||||||
|
|
||||||
|
inline float Min(float a, float b, float c, float d)
|
||||||
|
{
|
||||||
|
return Min( Min(a, b), Min(c, d) );
|
||||||
|
}
|
||||||
|
|
||||||
|
inline float Min(float a, float b, float c, float d, float e)
|
||||||
|
{
|
||||||
|
return Min( Min(a, b), Min(c, d), e );
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Maximum
|
||||||
|
inline float Max(float a, float b)
|
||||||
|
{
|
||||||
|
if ( a >= b ) return a;
|
||||||
|
else return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline float Max(float a, float b, float c)
|
||||||
|
{
|
||||||
|
return Max( Max(a, b), c );
|
||||||
|
}
|
||||||
|
|
||||||
|
inline float Max(float a, float b, float c, float d)
|
||||||
|
{
|
||||||
|
return Max( Max(a, b), Max(c, d) );
|
||||||
|
}
|
||||||
|
|
||||||
|
inline float Max(float a, float b, float c, float d, float e)
|
||||||
|
{
|
||||||
|
return Max( Max(a, b), Max(c, d), e );
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Returns the normalized value (0 .. 1)
|
||||||
|
inline float Norm(float a)
|
||||||
|
{
|
||||||
|
if ( a < 0.0f ) return 0.0f;
|
||||||
|
if ( a > 1.0f ) return 1.0f;
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Returns the absolute value
|
||||||
|
inline float Abs(float a)
|
||||||
|
{
|
||||||
|
return (float)fabs(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Swaps two integers
|
||||||
|
inline void Swap(int &a, int &b)
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
|
||||||
|
c = a;
|
||||||
|
a = b;
|
||||||
|
b = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Swaps two real numbers
|
||||||
|
inline void Swap(float &a, float &b)
|
||||||
|
{
|
||||||
|
float c;
|
||||||
|
|
||||||
|
c = a;
|
||||||
|
a = b;
|
||||||
|
b = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Permutes two points
|
||||||
|
inline void Swap(Point &a, Point &b)
|
||||||
|
{
|
||||||
|
Point c;
|
||||||
|
|
||||||
|
c = a;
|
||||||
|
a = b;
|
||||||
|
b = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Returns the modulo of a floating point number
|
||||||
|
/** Mod(8.1, 4) = 0.1
|
||||||
|
Mod(n, 1) = fractional part of n */
|
||||||
|
inline float Mod(float a, float m)
|
||||||
|
{
|
||||||
|
return a - ((int)(a/m))*m;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Returns a normalized angle, that is in other words between 0 and 2 * PI
|
||||||
|
inline float NormAngle(float angle)
|
||||||
|
{
|
||||||
|
angle = Mod(angle, PI_MUL_2);
|
||||||
|
if ( angle < 0.0f )
|
||||||
|
return PI_MUL_2 + angle;
|
||||||
|
|
||||||
|
return angle;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Test if a angle is between two terminals
|
||||||
|
inline bool TestAngle(float angle, float min, float max)
|
||||||
|
{
|
||||||
|
angle = NormAngle(angle);
|
||||||
|
min = NormAngle(min);
|
||||||
|
max = NormAngle(max);
|
||||||
|
|
||||||
|
if ( min > max )
|
||||||
|
return ( angle <= max || angle >= min );
|
||||||
|
|
||||||
|
return ( angle >= min && angle <= max );
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Calculates the angle to rotate the angle \a a to the angle \a g
|
||||||
|
/** A positive angle is counterclockwise (CCW). */
|
||||||
|
inline float Direction(float a, float g)
|
||||||
|
{
|
||||||
|
a = NormAngle(a);
|
||||||
|
g = NormAngle(g);
|
||||||
|
|
||||||
|
if ( a < g )
|
||||||
|
{
|
||||||
|
if ( a+PI*2.0f-g < g-a ) a += PI*2.0f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( g+PI*2.0f-a < a-g ) g += PI*2.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
return g-a;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Returns a random value between 0 and 1.
|
||||||
|
inline float Rand()
|
||||||
|
{
|
||||||
|
return (float)rand()/RAND_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//! Managing the dead zone of a joystick.
|
||||||
|
/**
|
||||||
|
in: -1 0 1
|
||||||
|
--|-------|----o----|-------|-->
|
||||||
|
<---->
|
||||||
|
dead
|
||||||
|
out: -1 0 0 1 */
|
||||||
|
float Neutral(float value, float dead)
|
||||||
|
{
|
||||||
|
if ( Abs(value) <= dead )
|
||||||
|
{
|
||||||
|
return 0.0f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( value > 0.0f ) return (value-dead)/(1.0f-dead);
|
||||||
|
else return (value+dead)/(1.0f-dead);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//! Calculates a value (radians) proportional between a and b (degrees)
|
||||||
|
float Prop(int a, int b, float p)
|
||||||
|
{
|
||||||
|
float aa = (float)a * DEG_TO_RAD;
|
||||||
|
float bb = (float)b * DEG_TO_RAD;
|
||||||
|
|
||||||
|
return aa+p*(bb-aa);
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Gently advances a desired value from its current value
|
||||||
|
/** Over time, the progression is more rapid. */
|
||||||
|
float Smooth(float actual, float hope, float time)
|
||||||
|
{
|
||||||
|
float future = actual + (hope-actual)*time;
|
||||||
|
|
||||||
|
if ( hope > actual )
|
||||||
|
{
|
||||||
|
if ( future > hope ) future = hope;
|
||||||
|
}
|
||||||
|
if ( hope < actual )
|
||||||
|
{
|
||||||
|
if ( future < hope ) future = hope;
|
||||||
|
}
|
||||||
|
|
||||||
|
return future;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//! Bounces any movement
|
||||||
|
/** out
|
||||||
|
|
|
||||||
|
1+------o-------o---
|
||||||
|
| o | o o | | bounce
|
||||||
|
| o | o---|---
|
||||||
|
| o | |
|
||||||
|
| o | |
|
||||||
|
-o------|-------+----> progress
|
||||||
|
0| | 1
|
||||||
|
|<---->|middle */
|
||||||
|
inline float Bounce(float progress, float middle, float bounce)
|
||||||
|
{
|
||||||
|
if ( progress < middle )
|
||||||
|
{
|
||||||
|
progress = progress/middle; // 0..1
|
||||||
|
return 0.5f+sinf(progress*PI-PI/2.0f)/2.0f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
progress = (progress-middle)/(1.0f-middle); // 0..1
|
||||||
|
return (1.0f-bounce/2.0f)+sinf((0.5f+progress*2.0f)*PI)*(bounce/2.0f);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,178 @@
|
||||||
|
// math/matrix.h
|
||||||
|
|
||||||
|
/* Matrix struct and functions */
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "const.h"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
/* TODO
|
||||||
|
|
||||||
|
void MatRotateXZY(D3DMATRIX &mat, D3DVECTOR angle);
|
||||||
|
void MatRotateZXY(D3DMATRIX &mat, D3DVECTOR angle);
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Math module namespace
|
||||||
|
namespace Math
|
||||||
|
{
|
||||||
|
|
||||||
|
/** 4x4 matrix
|
||||||
|
|
||||||
|
Represents an universal 4x4 matrix that can be used in OpenGL and DirectX engines.
|
||||||
|
Contains the required methods for operating on matrices (inverting, multiplying, etc.).
|
||||||
|
|
||||||
|
All methods are made inline to maximize optimization.
|
||||||
|
|
||||||
|
**/
|
||||||
|
struct Matrix
|
||||||
|
{
|
||||||
|
//! Matrix values in row-major format
|
||||||
|
float m[16];
|
||||||
|
|
||||||
|
//! Creates the indentity matrix
|
||||||
|
inline Matrix()
|
||||||
|
{
|
||||||
|
LoadIdentity();
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Creates the matrix from given values
|
||||||
|
/** \a m values in row-major format */
|
||||||
|
inline Matrix(float m[16])
|
||||||
|
{
|
||||||
|
this->m = m;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Loads the zero matrix
|
||||||
|
inline void LoadZero()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 16; ++i)
|
||||||
|
m[i] = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Loads the identity matrix
|
||||||
|
inline void LoadIdentity()
|
||||||
|
{
|
||||||
|
LoadZero();
|
||||||
|
m[0] = m[1][1] = m[2][2] = m[3][3] = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Calculates the determinant of the matrix
|
||||||
|
/** \returns the determinant */
|
||||||
|
float Det() const
|
||||||
|
{
|
||||||
|
float result = 0.0f;
|
||||||
|
for (int i = 0; i < 4; ++i)
|
||||||
|
{
|
||||||
|
result += m[0][i] * Cofactor(0, i);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Transposes the matrix
|
||||||
|
void Transpose()
|
||||||
|
{
|
||||||
|
Matrix temp = *this;
|
||||||
|
for (int r = 0; r < 4; ++r)
|
||||||
|
{
|
||||||
|
for (int c = 0; c < 4; ++c)
|
||||||
|
{
|
||||||
|
m[r][c] = temp.m[c][r];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Calculates the cofactor of the matrix
|
||||||
|
/** \a r row (0 to 3)
|
||||||
|
\a c column (0 to 3)
|
||||||
|
\returns the cofactor or 0.0f if invalid r, c given*/
|
||||||
|
float Cofactor(int r, int c) const
|
||||||
|
{
|
||||||
|
if ((r < 0) || (r > 3) || (c < 0) || (c > 3))
|
||||||
|
return 0.0f;
|
||||||
|
|
||||||
|
float tab[3][3];
|
||||||
|
int tabR = 0;
|
||||||
|
for (int r = 0; r < 4; ++r)
|
||||||
|
{
|
||||||
|
if (r == i) continue;
|
||||||
|
int tabC = 0;
|
||||||
|
for (int c = 0; c < 4; ++c)
|
||||||
|
{
|
||||||
|
if (c == j) continue;
|
||||||
|
tab[tabR][tabC] = m[r][c];
|
||||||
|
++tabC;
|
||||||
|
}
|
||||||
|
++tabR;
|
||||||
|
}
|
||||||
|
|
||||||
|
float result = tab[0][0] * (tab[1][1] * tab[2][2] - tab[1][2] * tab[2][1])
|
||||||
|
- tab[0][1] * (tab[1][0] * tab[2][2] - tab[1][2] * tab[2][0])
|
||||||
|
+ tab[0][2] * (tab[1][0] * tab[2][1] - tab[1][1] * tab[2][0]);
|
||||||
|
|
||||||
|
if ((i + j) % 2 == 0)
|
||||||
|
result = -result;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Inverts the matrix
|
||||||
|
inline void Invert()
|
||||||
|
{
|
||||||
|
float d = Det();
|
||||||
|
if (fabs(d) <= Math::TOLERANCE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Matrix temp = *this;
|
||||||
|
for (int r = 0; r < 4; ++r)
|
||||||
|
{
|
||||||
|
for (int c = 0; c < 4; ++c)
|
||||||
|
{
|
||||||
|
m[r][c] = (1.0f / d) * temp.Cofactor(r, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Tranpose();
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Multiplies the matrix with the given matrix
|
||||||
|
/** \a right right-hand matrix */
|
||||||
|
inline void Multiply(const Matrix &right)
|
||||||
|
{
|
||||||
|
Matrix left = *this;
|
||||||
|
for (int r = 0; r < 4; ++r)
|
||||||
|
{
|
||||||
|
for (int c = 0; c < 4; ++c)
|
||||||
|
{
|
||||||
|
m[r][c] = 0.0;
|
||||||
|
for (int i = 0; i < 4; ++i)
|
||||||
|
{
|
||||||
|
m[r][c] += left.m[r][i] * right.m[i][c];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//! Convenience function for inverting a matrix
|
||||||
|
/** \a m input matrix
|
||||||
|
\a result result -- inverted matrix */
|
||||||
|
void InvertMatrix(const Matrix &m, Matrix &result)
|
||||||
|
{
|
||||||
|
result = m;
|
||||||
|
result.Invert();
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Convenience function for multiplying a matrix
|
||||||
|
/** \a left left-hand matrix
|
||||||
|
\a right right-hand matrix
|
||||||
|
\a result result -- multiplied matrices */*
|
||||||
|
void MultiplyMatrices(const Matrix &left, const Matrix &right, Matrix &result)
|
||||||
|
{
|
||||||
|
result = left;
|
||||||
|
result.Multiply(right);
|
||||||
|
}
|
||||||
|
|
||||||
|
}; // namespace Math
|
|
@ -0,0 +1,19 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/* TODO
|
||||||
|
FPOINT RotatePoint(FPOINT center, float angle, FPOINT p);
|
||||||
|
FPOINT RotatePoint(float angle, FPOINT p);
|
||||||
|
FPOINT RotatePoint(float angle, float dist);
|
||||||
|
void RotatePoint(float cx, float cy, float angle, float &px, float &py);
|
||||||
|
void RotatePoint(D3DVECTOR center, float angleH, float angleV, D3DVECTOR &p);
|
||||||
|
void RotatePoint2(D3DVECTOR center, float angleH, float angleV, D3DVECTOR &p);
|
||||||
|
float Length(FPOINT a, FPOINT b);
|
||||||
|
|
||||||
|
float RotateAngle(float x, float y);
|
||||||
|
float RotateAngle(FPOINT center, FPOINT p1, FPOINT p2);
|
||||||
|
float MidPoint(FPOINT a, FPOINT b, float px);
|
||||||
|
BOOL IsInsideTriangle(FPOINT a, FPOINT b, FPOINT c, FPOINT p);
|
||||||
|
|
||||||
|
BOOL LineFunction(FPOINT p1, FPOINT p2, float &a, float &b);
|
||||||
|
|
||||||
|
*/
|
|
@ -0,0 +1,119 @@
|
||||||
|
// math/vector.h
|
||||||
|
|
||||||
|
/* Vector struct and functions */
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "const.h"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
/*
|
||||||
|
TODO
|
||||||
|
|
||||||
|
HRESULT D3DMath_VectorMatrixMultiply( D3DVECTOR& vDest, D3DVECTOR& vSrc, D3DMATRIX& mat)
|
||||||
|
|
||||||
|
float Length(const D3DVECTOR &a, const D3DVECTOR &b);
|
||||||
|
float Length2d(const D3DVECTOR &a, const D3DVECTOR &b);
|
||||||
|
float Angle( D3DVECTOR u, D3DVECTOR v );
|
||||||
|
D3DVECTOR Cross( D3DVECTOR u, D3DVECTOR v );
|
||||||
|
D3DVECTOR ComputeNormal( D3DVECTOR p1, D3DVECTOR p2, D3DVECTOR p3 );
|
||||||
|
D3DVECTOR Transform(const D3DMATRIX &m, D3DVECTOR p);
|
||||||
|
D3DVECTOR Projection(const D3DVECTOR &a, const D3DVECTOR &b, const D3DVECTOR &p);
|
||||||
|
|
||||||
|
D3DVECTOR SegmentDist(const D3DVECTOR &p1, const D3DVECTOR &p2, float dist);
|
||||||
|
|
||||||
|
BOOL Intersect(D3DVECTOR a, D3DVECTOR b, D3DVECTOR c, D3DVECTOR d, D3DVECTOR e, D3DVECTOR &i);
|
||||||
|
BOOL IntersectY(D3DVECTOR a, D3DVECTOR b, D3DVECTOR c, D3DVECTOR &p);
|
||||||
|
|
||||||
|
|
||||||
|
D3DVECTOR RotateView(D3DVECTOR center, float angleH, float angleV, float dist);
|
||||||
|
D3DVECTOR LookatPoint( D3DVECTOR eye, float angleH, float angleV, float length );
|
||||||
|
|
||||||
|
void MappingObject( D3DVERTEX2* pVertices, int nb, float scale );
|
||||||
|
void SmoothObject( D3DVERTEX2* pVertices, int nb );
|
||||||
|
|
||||||
|
float DistancePlanPoint(const D3DVECTOR &a, const D3DVECTOR &b, const D3DVECTOR &c, const D3DVECTOR &p);
|
||||||
|
BOOL IsSamePlane(D3DVECTOR *plan1, D3DVECTOR *plan2);
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Math module namespace
|
||||||
|
namespace Math
|
||||||
|
{
|
||||||
|
|
||||||
|
/** 4x1 Vector
|
||||||
|
|
||||||
|
Represents an universal 4x1 vector that can be used in OpenGL and DirectX engines.
|
||||||
|
Contains the required methods for operating on vectors.
|
||||||
|
|
||||||
|
All methods are made inline to maximize optimization.
|
||||||
|
|
||||||
|
*/
|
||||||
|
struct Vector
|
||||||
|
{
|
||||||
|
//! X - 1st coord
|
||||||
|
float x;
|
||||||
|
//! Y - 2nd coord
|
||||||
|
float y;
|
||||||
|
//! Z - 3rd coord
|
||||||
|
float z;
|
||||||
|
//! W - 4th coord
|
||||||
|
float w;
|
||||||
|
|
||||||
|
//! Creates an identity vector (0, 0, 0, 1)
|
||||||
|
Vector()
|
||||||
|
{
|
||||||
|
LoadIdentity();
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Creates a vector from given values
|
||||||
|
Vector(float x, float y, float z, float w = 1.0f)
|
||||||
|
{
|
||||||
|
this->x = x;
|
||||||
|
this->y = y;
|
||||||
|
this->z = z;
|
||||||
|
this->w = w;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Loads the identity vector (0, 0, 0, 1)
|
||||||
|
void LoadIdentity()
|
||||||
|
{
|
||||||
|
x = y = z = 0.0f;
|
||||||
|
w = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Loads the zero vector (0, 0, 0, 0)
|
||||||
|
void LoadZero()
|
||||||
|
{
|
||||||
|
x = y = z = w = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Returns the vector length
|
||||||
|
float Length() const
|
||||||
|
{
|
||||||
|
return sqrt(x*x + y*y + z*z + w*w);
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Normalizes the vector
|
||||||
|
void Normalize()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
const Vector3D& operator-();
|
||||||
|
const Vector3D& operator+=(const Vector3D &vector);
|
||||||
|
const Vector3D& operator-=(const Vector3D &vector);
|
||||||
|
const Vector3D& operator*=(double value);
|
||||||
|
const Vector3D& operator/=(double value);
|
||||||
|
|
||||||
|
friend Vector3D operator+(const Vector3D &left, const Vector3D &right);
|
||||||
|
friend Vector3D operator-(const Vector3D &left, const Vector3D &right);
|
||||||
|
friend Vector3D operator*(double left, const Vector3D &right);
|
||||||
|
friend Vector3D operator*(const Vector3D &left, double right);
|
||||||
|
friend Vector3D operator/(const Vector3D &left, double right);
|
||||||
|
|
||||||
|
friend Vector3D crossProduct(const Vector3D &left, const Vector3D &right);
|
||||||
|
friend double dotProduct(const Vector3D &left, const Vector3D &right);
|
||||||
|
friend double cosAngle(const Vector3D &vector1, const Vector3D &vector2);
|
||||||
|
friend double angle(const Vector3D &vector1, const Vector3D &vector2);
|
||||||
|
};
|
Loading…
Reference in New Issue