[DEV] rework stk::Matrix4 and add etk::Matrix2

This commit is contained in:
Edouard DUPIN 2015-11-17 21:22:28 +01:00
parent 78e237d281
commit 1606228ec2
6 changed files with 242 additions and 196 deletions

View File

@ -69,13 +69,13 @@ before_script:
fi
script:
- lutin -w -j4 -C -P $TARGET -c $BUILDER $COMPILATOR_OPTION -m $CONF $GCOV -p etk-test
- lutin -w -j4 -C -P $TARGET -c $BUILDER $COMPILATOR_OPTION -m $CONF $GCOV etk-test
after_script:
- if [ "$GCOV" != "" ]; then
python ./warning_send.py --find-path ./out/Linux_x86_64/$CONF/build/$BUILDER/etk/;
fi
- ./out/Linux_x86_64/$CONF/staging/$BUILDER/etk-test/usr/bin/etk-test -l6 | tee out_test.txt
- ./out/Linux_x86_64/$CONF/staging/$BUILDER/etk-test/etk-test.app/bin/etk-test -l6 | tee out_test.txt
- if [ "$GCOV" != "" ]; then
python ./test_send.py --file=out_test.txt;
lutin -C -P -c $TARGET $BUILDER $COMPILATOR_OPTION -m $CONF -p etk?gcov;

View File

@ -31,7 +31,7 @@ etk::Color<uint8_t, 4> etk::parseStringStartWithSharp(const std::string& _input)
size_t len = _input.size();
etk::Color<uint8_t, 4> outputValue(0,0,0,0);
if(len == 3) {
int32_t red=0, green=0, blue=0;
uint32_t red=0, green=0, blue=0;
if (sscanf(_input.c_str(), "%1x%1x%1x", &red, &green, &blue) == 3) {
outputValue.setR(red | red << 4);
outputValue.setG(green | green << 4);
@ -41,7 +41,7 @@ etk::Color<uint8_t, 4> etk::parseStringStartWithSharp(const std::string& _input)
TK_ERROR(" pb in parsing the color : '" << _input << "'");
}
} else if (len==4) {
int32_t red=0, green=0, blue=0, alpha=0;
uint32_t red=0, green=0, blue=0, alpha=0;
if (sscanf(_input.c_str(), "%1x%1x%1x%1x", &red, &green, &blue, &alpha) == 4) {
outputValue.setR(red | red << 4);
outputValue.setG(green | green << 4);
@ -51,7 +51,7 @@ etk::Color<uint8_t, 4> etk::parseStringStartWithSharp(const std::string& _input)
TK_ERROR(" pb in parsing the color : '" << _input << "'");
}
} else if (len == 6) {
int32_t red=0, green=0, blue=0;
uint32_t red=0, green=0, blue=0;
if (sscanf(_input.c_str(), "%2x%2x%2x", &red, &green, &blue) == 3) {
outputValue.setR(red);
outputValue.setG(green);
@ -61,7 +61,7 @@ etk::Color<uint8_t, 4> etk::parseStringStartWithSharp(const std::string& _input)
TK_ERROR(" pb in parsing the color : '" << _input << "'");
}
} else if (len == 8) {
int32_t red=0, green=0, blue=0, alpha=0;
uint32_t red=0, green=0, blue=0, alpha=0;
if (sscanf(_input.c_str(), "%2x%2x%2x%2x", &red, &green, &blue, &alpha) == 4) {
outputValue.setR(red);
outputValue.setG(green);
@ -73,6 +73,7 @@ etk::Color<uint8_t, 4> etk::parseStringStartWithSharp(const std::string& _input)
} else {
TK_ERROR(" pb in parsing the color : '" << _input << "' ==> unknown methode ...");
}
TK_VERBOSE(" result: '" << outputValue << "'");
return outputValue;
}

View File

@ -253,7 +253,7 @@ namespace etk {
*/
void setR(MY_TYPE _r) {
if (MY_TYPE_SIZE >= 1) {
m_element[0] = _r;
m_element[0] = MY_TYPE(_r);
}
};
/**
@ -262,7 +262,7 @@ namespace etk {
*/
void setG(MY_TYPE _g) {
if (MY_TYPE_SIZE >= 2) {
m_element[1] = _g;
m_element[1] = MY_TYPE(_g);
}
};
/**
@ -271,7 +271,7 @@ namespace etk {
*/
void setB(MY_TYPE _b) {
if (MY_TYPE_SIZE >= 3) {
m_element[2] = _b;
m_element[2] = MY_TYPE(_b);
}
};
/**
@ -280,7 +280,7 @@ namespace etk {
*/
void setA(MY_TYPE _a) {
if (MY_TYPE_SIZE >= 4) {
m_element[3] = _a;
m_element[3] = MY_TYPE(_a);
}
};
};
@ -356,15 +356,15 @@ namespace etk {
std::ostringstream oss;
if (MY_TYPE_SIZE >= 3) {
_os << "#";
oss << std::setw(2) << std::setfill('0') << std::hex << _obj.r();
oss << std::setw(2) << std::setfill('0') << std::hex << uint32_t(_obj.r());
if (MY_TYPE_SIZE >= 2) {
oss << std::setw(2) << std::setfill('0') << std::hex << _obj.g();
oss << std::setw(2) << std::setfill('0') << std::hex << uint32_t(_obj.g());
}
if (MY_TYPE_SIZE >= 3) {
oss << std::setw(2) << std::setfill('0') << std::hex << _obj.b();
oss << std::setw(2) << std::setfill('0') << std::hex << uint32_t(_obj.b());
}
if (MY_TYPE_SIZE >= 4) {
oss << std::setw(2) << std::setfill('0') << std::hex << _obj.a();
oss << std::setw(2) << std::setfill('0') << std::hex << uint32_t(_obj.a());
}
_os << oss.str();
} else {
@ -374,10 +374,10 @@ namespace etk {
_os << "Mono";
}
_os << "[U8](";
oss << "0x" << std::setw(2) << std::setfill('0') << std::hex << _obj.r();
oss << "0x" << std::setw(2) << std::setfill('0') << std::hex << uint32_t(_obj.r());
if (MY_TYPE_SIZE >= 2) {
_os << ",";
oss << "0x" << std::setw(2) << std::setfill('0') << std::hex << _obj.g();
oss << "0x" << std::setw(2) << std::setfill('0') << std::hex << uint32_t(_obj.g());
}
_os << oss.str();
_os << ")";

View File

@ -12,6 +12,186 @@
#include <math.h>
#if 1
void etk::Matrix4::identity() {
for(int32_t iii=0; iii<4*4 ; iii++) {
m_mat[iii] = 0;
}
m_mat[0] = 1.0;
m_mat[5] = 1.0;
m_mat[10] = 1.0;
m_mat[15] = 1.0;
}
etk::Matrix4::Matrix4() {
identity();
}
etk::Matrix4::Matrix4(const Matrix4& _obj) {
for(int32_t iii=0; iii<4*4 ; iii++) {
m_mat[iii] = _obj.m_mat[iii];
}
}
etk::Matrix4::Matrix4(float _a1, float _b1, float _c1, float _d1,
float _a2, float _b2, float _c2, float _d2,
float _a3, float _b3, float _c3, float _d3,
float _a4, float _b4, float _c4, float _d4) {
m_mat[0] = _a1;
m_mat[1] = _b1;
m_mat[2] = _c1;
m_mat[3] = _d1;
m_mat[4] = _a2;
m_mat[5] = _b2;
m_mat[6] = _c2;
m_mat[7] = _d2;
m_mat[8] = _a3;
m_mat[9] = _b3;
m_mat[10] = _c3;
m_mat[11] = _d3;
m_mat[12] = _a4;
m_mat[13] = _b4;
m_mat[14] = _c4;
m_mat[15] = _d4;
}
etk::Matrix4::Matrix4(float* _obj) {
if (_obj == nullptr) {
identity();
return;
}
for(int32_t iii=0; iii<4*4 ; ++iii) {
m_mat[iii] = _obj[iii];
}
}
etk::Matrix4::~Matrix4() {
}
const etk::Matrix4& etk::Matrix4::operator= (const etk::Matrix4& _obj ) {
for(int32_t iii=0; iii<4*4 ; ++iii) {
m_mat[iii] = _obj.m_mat[iii];
}
return *this;
}
bool etk::Matrix4::operator== (const etk::Matrix4& _obj) const {
for(int32_t iii=0; iii<4*4 ; ++iii) {
if(m_mat[iii] != _obj.m_mat[iii]) {
return false;
}
}
return true;
}
bool etk::Matrix4::operator!= (const etk::Matrix4& _obj) const {
for(int32_t iii=0; iii<4*4 ; ++iii) {
if(m_mat[iii] != _obj.m_mat[iii]) {
return true;
}
}
return false;
}
const etk::Matrix4& etk::Matrix4::operator+= (const etk::Matrix4& _obj) {
for(int32_t iii=0; iii<4*4 ; ++iii) {
m_mat[iii] += _obj.m_mat[iii];
}
return *this;
}
etk::Matrix4 etk::Matrix4::operator+ (const etk::Matrix4& _obj) const {
etk::Matrix4 tmpp(*this);
tmpp += _obj;
return tmpp;
}
const etk::Matrix4& etk::Matrix4::operator-= (const etk::Matrix4& _obj) {
for(int32_t iii=0; iii<4*4 ; ++iii) {
m_mat[iii] -= _obj.m_mat[iii];
}
return *this;
}
etk::Matrix4 etk::Matrix4::operator- (const etk::Matrix4& _obj) const {
etk::Matrix4 tmpp(*this);
tmpp += _obj;
return tmpp;
}
const etk::Matrix4& etk::Matrix4::operator*= (const etk::Matrix4& _obj) {
// output Matrix
float matrixOut[4*4];
for(int32_t jjj=0; jjj<4 ; jjj++) {
float* tmpLeft = m_mat + jjj*4;
for(int32_t iii=0; iii<4 ; iii++) {
const float* tmpUpper = _obj.m_mat+iii;
float* tmpLeft2 = tmpLeft;
float tmpElement = 0;
for(int32_t kkk=0; kkk<4 ; kkk++) {
tmpElement += *tmpUpper * *tmpLeft2;
tmpUpper += 4;
tmpLeft2++;
}
matrixOut[jjj*4+iii] = tmpElement;
}
}
// set it at the output
for(int32_t iii=0; iii<4*4 ; iii++) {
m_mat[iii] = matrixOut[iii];
}
return *this;
}
etk::Matrix4 etk::Matrix4::operator* (const etk::Matrix4& _obj) const {
etk::Matrix4 tmpp(*this);
tmpp *= _obj;
return tmpp;
}
vec3 etk::Matrix4::operator*(const vec3& _point) const {
return vec3( m_mat[0]*_point.x() + m_mat[1]*_point.y() + m_mat[2]*_point.z() + m_mat[3],
m_mat[4]*_point.x() + m_mat[5]*_point.y() + m_mat[6]*_point.z() + m_mat[7],
m_mat[8]*_point.x() + m_mat[9]*_point.y() + m_mat[10]*_point.z() + m_mat[11] );
}
void etk::Matrix4::transpose() {
float tmpVal = m_mat[1];
m_mat[1] = m_mat[4];
m_mat[4] = tmpVal;
tmpVal = m_mat[2];
m_mat[2] = m_mat[8];
m_mat[8] = tmpVal;
tmpVal = m_mat[6];
m_mat[6] = m_mat[9];
m_mat[9] = tmpVal;
tmpVal = m_mat[3];
m_mat[3] = m_mat[12];
m_mat[12] = tmpVal;
tmpVal = m_mat[7];
m_mat[7] = m_mat[13];
m_mat[13] = tmpVal;
tmpVal = m_mat[11];
m_mat[11] = m_mat[14];
m_mat[14] = tmpVal;
}
void etk::Matrix4::scale(const vec3& _vect) {
scale(_vect.x(), _vect.y(), _vect.z());
}
void etk::Matrix4::scale(float _sx, float _sy, float _sz) {
m_mat[0] *= _sx; m_mat[1] *= _sy; m_mat[2] *= _sz;
m_mat[4] *= _sx; m_mat[5] *= _sy; m_mat[6] *= _sz;
m_mat[8] *= _sx; m_mat[9] *= _sy; m_mat[10] *= _sz;
}
void etk::Matrix4::rotate(const vec3& vect, float angleRad)
{
etk::Matrix4 tmpMat = etk::matRotate(vect, angleRad);

View File

@ -23,224 +23,87 @@ namespace etk {
class Matrix4 {
public:
float m_mat[4*4];
void identity() {
for(int32_t iii=0; iii<4*4 ; iii++) {
m_mat[iii] = 0;
}
m_mat[0] = 1.0;
m_mat[5] = 1.0;
m_mat[10] = 1.0;
m_mat[15] = 1.0;
}
void identity();
/*****************************************************
* Constructor
*****************************************************/
Matrix4() {
identity();
}
Matrix4(const Matrix4& obj) {
for(int32_t iii=0; iii<4*4 ; iii++) {
m_mat[iii] = obj.m_mat[iii];
}
}
Matrix4(float a1, float b1, float c1, float d1,
float a2, float b2, float c2, float d2,
float a3, float b3, float c3, float d3,
float a4, float b4, float c4, float d4) {
m_mat[0] = a1;
m_mat[1] = b1;
m_mat[2] = c1;
m_mat[3] = d1;
m_mat[4] = a2;
m_mat[5] = b2;
m_mat[6] = c2;
m_mat[7] = d2;
m_mat[8] = a3;
m_mat[9] = b3;
m_mat[10] = c3;
m_mat[11] = d3;
m_mat[12] = a4;
m_mat[13] = b4;
m_mat[14] = c4;
m_mat[15] = d4;
}
Matrix4(float * obj) {
if (NULL == obj) {
identity();
return;
}
for(int32_t iii=0; iii<4*4 ; iii++) {
m_mat[iii] = obj[iii];
}
}
Matrix4();
Matrix4(const Matrix4& _obj);
Matrix4(float _a1, float _b1, float _c1, float _d1,
float _a2, float _b2, float _c2, float _d2,
float _a3, float _b3, float _c3, float _d3,
float _a4, float _b4, float _c4, float _d4);
Matrix4(float* _obj);
/*****************************************************
* Destructor
*****************************************************/
virtual ~Matrix4() {
}
~Matrix4();
/*****************************************************
* = assigment
*****************************************************/
const Matrix4& operator= (const Matrix4& obj ) {
for(int32_t iii=0; iii<4*4 ; iii++) {
m_mat[iii] = obj.m_mat[iii];
}
return *this;
}
const Matrix4& operator= (const Matrix4& _obj );
/*****************************************************
* == operator
*****************************************************/
bool operator== (const Matrix4& obj) const {
for(int32_t iii=0; iii<4*4 ; iii++) {
if(m_mat[iii] != obj.m_mat[iii]) {
return false;
}
}
return true;
}
bool operator== (const Matrix4& _obj) const;
/*****************************************************
* != operator
*****************************************************/
bool operator!= (const Matrix4& obj) const {
for(int32_t iii=0; iii<4*4 ; iii++) {
if(m_mat[iii] != obj.m_mat[iii]) {
return true;
}
}
return false;
}
bool operator!= (const Matrix4& _obj) const;
/*****************************************************
* += operator
*****************************************************/
const Matrix4& operator+= (const Matrix4& obj) {
for(int32_t iii=0; iii<4*4 ; iii++) {
m_mat[iii] += obj.m_mat[iii];
}
return *this;
}
const Matrix4& operator+= (const Matrix4& _obj);
/*****************************************************
* + operator
*****************************************************/
Matrix4 operator+ (const Matrix4& obj) const {
Matrix4 tmpp(*this);
tmpp += obj;
return tmpp;
}
Matrix4 operator+ (const Matrix4& _obj) const;
/*****************************************************
* -= operator
*****************************************************/
const Matrix4& operator-= (const Matrix4& obj) {
for(int32_t iii=0; iii<4*4 ; iii++) {
m_mat[iii] -= obj.m_mat[iii];
}
return *this;
}
const Matrix4& operator-= (const Matrix4& _obj);
/*****************************************************
* - operator
*****************************************************/
Matrix4 operator- (const Matrix4& obj) const {
Matrix4 tmpp(*this);
tmpp += obj;
return tmpp;
}
Matrix4 operator- (const Matrix4& _obj) const;
/*****************************************************
* *= operator
*****************************************************/
const Matrix4& operator*= (const Matrix4& obj) {
// output Matrix
float matrixOut[4*4];
for(int32_t jjj=0; jjj<4 ; jjj++) {
float* tmpLeft = m_mat + jjj*4;
for(int32_t iii=0; iii<4 ; iii++) {
const float* tmpUpper = obj.m_mat+iii;
float* tmpLeft2 = tmpLeft;
float tmpElement = 0;
for(int32_t kkk=0; kkk<4 ; kkk++) {
tmpElement += *tmpUpper * *tmpLeft2;
tmpUpper += 4;
tmpLeft2++;
}
matrixOut[jjj*4+iii] = tmpElement;
}
}
// set it at the output
for(int32_t iii=0; iii<4*4 ; iii++) {
m_mat[iii] = matrixOut[iii];
}
return *this;
}
const Matrix4& operator*= (const Matrix4& _obj);
/*****************************************************
* * operator
*****************************************************/
Matrix4 operator* (const Matrix4& obj) const {
Matrix4 tmpp(*this);
tmpp *= obj;
return tmpp;
}
vec3 operator*(const vec3& point) const
{
return vec3( m_mat[0]*point.x() + m_mat[1]*point.y() + m_mat[2]*point.z() + m_mat[3],
m_mat[4]*point.x() + m_mat[5]*point.y() + m_mat[6]*point.z() + m_mat[7],
m_mat[8]*point.x() + m_mat[9]*point.y() + m_mat[10]*point.z() + m_mat[11] );
}
Matrix4 operator* (const Matrix4& _obj) const;
vec3 operator*(const vec3& _point) const;
/*****************************************************
* other basic function :
*****************************************************/
void transpose()
{
float tmpVal = m_mat[1];
m_mat[1] = m_mat[4];
m_mat[4] = tmpVal;
tmpVal = m_mat[2];
m_mat[2] = m_mat[8];
m_mat[8] = tmpVal;
tmpVal = m_mat[6];
m_mat[6] = m_mat[9];
m_mat[9] = tmpVal;
tmpVal = m_mat[3];
m_mat[3] = m_mat[12];
m_mat[12] = tmpVal;
tmpVal = m_mat[7];
m_mat[7] = m_mat[13];
m_mat[13] = tmpVal;
tmpVal = m_mat[11];
m_mat[11] = m_mat[14];
m_mat[14] = tmpVal;
}
void scale(const vec3& p)
{
scale(p.x(), p.y(), p.z());
}
void scale(float sx, float sy, float sz)
{
m_mat[0] *= sx; m_mat[1] *= sy; m_mat[2] *= sz;
m_mat[4] *= sx; m_mat[5] *= sy; m_mat[6] *= sz;
m_mat[8] *= sx; m_mat[9] *= sy; m_mat[10] *= sz;
}
void transpose();
/**
* @brief Scale the current Matrix.
* @param[in] _vect Scale vector to apply.
*/
void scale(const vec3& _vect);
//! @previous
void scale(float _sx, float _sy, float _sz);
/**
* @brief Makes a rotation matrix about an arbitrary axis.
* @param[in] vect vector to apply the angle.
* @param[in] angleRad angle to apply.
* @param[in] _vect vector to apply the angle.
* @param[in] _angleRad angle to apply.
*/
void rotate(const vec3& vect, float angleRad=0.0);
void rotate(const vec3& _vect, float _angleRad=0.0);
/**
* @brief Makes a translation of the matrix
* @param[in] vect Translation to apply.
* @param[in] _vect Translation to apply.
*/
void translate(const vec3& vect);
void translate(const vec3& _vect);
/**
* @brief Computes a cofactor. Used for matrix inversion.
* @param[in] row Id of raw.
* @param[in] col Id of colomn.
* @param[in] _row Id of raw.
* @param[in] _col Id of colomn.
* @return the coFactorValue.
*/
float coFactor(int32_t row, int32_t col) const;
float coFactor(int32_t _row, int32_t _col) const;
/**
* @brief Computes the determinant of the matrix.
* @return The determinent Value.
@ -253,13 +116,13 @@ namespace etk {
*/
Matrix4 invert();
};
Matrix4 matFrustum(float xmin, float xmax, float ymin, float ymax, float zNear, float zFar);
Matrix4 matPerspective(float foxy, float aspect, float zNear, float zFar);
Matrix4 matOrtho(float left, float right, float bottom, float top, float nearVal, float farVal);
Matrix4 matTranslate(vec3 vect);
Matrix4 matScale(vec3 vect);
Matrix4 matRotate(vec3 vect, float angleRad=0.0);
Matrix4 matRotate2(vec3 vect);
Matrix4 matFrustum(float _xmin, float _xmax, float _ymin, float _ymax, float _zNear, float _zFar);
Matrix4 matPerspective(float _foxy, float _aspect, float _zNear, float _zFar);
Matrix4 matOrtho(float _left, float _right, float _bottom, float _top, float _nearVal, float _farVal);
Matrix4 matTranslate(vec3 _vect);
Matrix4 matScale(vec3 _vect);
Matrix4 matRotate(vec3 _vect, float _angleRad=0.0);
Matrix4 matRotate2(vec3 _vect);
Matrix4 matLookAt(const vec3& _eye,
const vec3& _target,
const vec3& _up);
@ -271,7 +134,7 @@ namespace etk {
// To siplify the writing of the code ==> this permit to have the same name with the glsl language...
typedef etk::Matrix4 mat4;
typedef etk::Matrix4 mat4;
#else
// include matrix from bulletlib mat4 interface:
#include <vectormath/scalar/vectormath_aos.h>

View File

@ -37,6 +37,7 @@ def create(target, module_name):
'etk/Noise.cpp',
'etk/Color.cpp',
'etk/thread/tools.cpp',
'etk/math/Matrix2.cpp',
'etk/math/Matrix4.cpp',
'etk/math/Vector2D.cpp',
'etk/math/Vector3D.cpp',
@ -59,6 +60,7 @@ def create(target, module_name):
'etk/Color.h',
'etk/Hash.h',
'etk/thread/tools.h',
'etk/math/Matrix2.h',
'etk/math/Matrix4.h',
'etk/math/Vector2D.h',
'etk/math/Vector3D.h',