From: <axl...@us...> - 2009-03-03 13:37:34
|
Revision: 171 http://hgengine.svn.sourceforge.net/hgengine/?rev=171&view=rev Author: axlecrusher Date: 2009-03-03 13:37:30 +0000 (Tue, 03 Mar 2009) Log Message: ----------- Make mercury math a little safer to use Modified Paths: -------------- Mercury2/src/MercuryMath.cpp Mercury2/src/MercuryMath.h Mercury2/src/MercuryMatrix.cpp Modified: Mercury2/src/MercuryMath.cpp =================================================================== --- Mercury2/src/MercuryMath.cpp 2009-03-03 13:33:16 UTC (rev 170) +++ Mercury2/src/MercuryMath.cpp 2009-03-03 13:37:30 UTC (rev 171) @@ -1,3 +1,4 @@ +#include <stdint.h> #include "MercuryMath.h" //the SSE version of this was really slow, this is quicker @@ -38,80 +39,46 @@ Copy4f(&r, &gfrZero ); } -void Mul4f(const FloatRow* first, const FloatRow* second, FloatRow* out) +void Mul4f(const FloatRow& first, const FloatRow& second, FloatRow& out) { - (*out)[0] = (*first)[0] * (*second)[0]; - (*out)[1] = (*first)[1] * (*second)[1]; - (*out)[2] = (*first)[2] * (*second)[2]; - (*out)[3] = (*first)[3] * (*second)[3]; + for (uint8_t i = 0; i < 4; ++i) + out[i] = first[i] * second[i]; } -void Div4f(const FloatRow* first, const FloatRow* second, FloatRow* out) +void Div4f(const FloatRow& first, const FloatRow& second, FloatRow& out) { - (*out)[0] = (*first)[0] / (*second)[0]; - (*out)[1] = (*first)[1] / (*second)[1]; - (*out)[2] = (*first)[2] / (*second)[2]; - (*out)[3] = (*first)[3] / (*second)[3]; + for (uint8_t i = 0; i < 4; ++i) + out[i] = first[i] / second[i]; } -void Add4f(const FloatRow* first, const FloatRow* second, FloatRow* out) +void Add4f(const FloatRow& first, const FloatRow& second, FloatRow& out) { - (*out)[0] = (*first)[0] + (*second)[0]; - (*out)[1] = (*first)[1] + (*second)[1]; - (*out)[2] = (*first)[2] + (*second)[2]; - (*out)[3] = (*first)[3] + (*second)[3]; + for (uint8_t i = 0; i < 4; ++i) + out[i] = first[i] + second[i]; } -void Sub4f(const FloatRow* first, const FloatRow* second, FloatRow* out) +void Sub4f(const FloatRow& first, const FloatRow& second, FloatRow& out) { - (*out)[0] = (*first)[0] - (*second)[0]; - (*out)[1] = (*first)[1] - (*second)[1]; - (*out)[2] = (*first)[2] - (*second)[2]; - (*out)[3] = (*first)[3] - (*second)[3]; + for (uint8_t i = 0; i < 4; ++i) + out[i] = first[i] - second[i]; } void Copy4f( void * dest, const void * source ) { - ((float*)dest)[0] = ((float*)source)[0]; - ((float*)dest)[1] = ((float*)source)[1]; - ((float*)dest)[2] = ((float*)source)[2]; - ((float*)dest)[3] = ((float*)source)[3]; + for (uint8_t i = 0; i < 4; ++i) + ((float*)dest)[i] = ((float*)source)[i]; } void Copy8f( void * dest, const void * source ) { - ((float*)dest)[0] = ((float*)source)[0]; - ((float*)dest)[1] = ((float*)source)[1]; - ((float*)dest)[2] = ((float*)source)[2]; - ((float*)dest)[3] = ((float*)source)[3]; - - ((float*)dest)[4] = ((float*)source)[4]; - ((float*)dest)[5] = ((float*)source)[5]; - ((float*)dest)[6] = ((float*)source)[6]; - ((float*)dest)[7] = ((float*)source)[7]; + for (uint8_t i = 0; i < 8; ++i) + ((float*)dest)[i] = ((float*)source)[i]; } void Copy16f( void * dest, const void * source ) { - ((float*)dest)[0] = ((float*)source)[0]; - ((float*)dest)[1] = ((float*)source)[1]; - ((float*)dest)[2] = ((float*)source)[2]; - ((float*)dest)[3] = ((float*)source)[3]; - - ((float*)dest)[4] = ((float*)source)[4]; - ((float*)dest)[5] = ((float*)source)[5]; - ((float*)dest)[6] = ((float*)source)[6]; - ((float*)dest)[7] = ((float*)source)[7]; - - ((float*)dest)[8] = ((float*)source)[8]; - ((float*)dest)[9] = ((float*)source)[9]; - ((float*)dest)[10] = ((float*)source)[10]; - ((float*)dest)[11] = ((float*)source)[11]; - - ((float*)dest)[12] = ((float*)source)[12]; - ((float*)dest)[13] = ((float*)source)[13]; - ((float*)dest)[14] = ((float*)source)[14]; - ((float*)dest)[15] = ((float*)source)[15]; + for (uint8_t i = 0; i < 16; ++i) + ((float*)dest)[i] = ((float*)source)[i]; } void MatrixMultiply4f ( const FloatRow* in1a, const FloatRow* in2a, FloatRow* outa) @@ -168,21 +135,16 @@ out[3] = p[0] * m[12] + p[1] * m[13] + p[2] * m[14] + p[3] * m[15]; } -void Float2FloatRow(const float* f, FloatRow* r) +void Float2FloatRow(const float* f, FloatRow& r) { - float* row = *r; - row[0] = f[0]; - row[1] = f[1]; - row[2] = f[2]; - row[3] = f[3]; + for (uint8_t i = 0; i < 4; ++i) + r[i] = f[i]; } -void FloatRow2Float( const FloatRow* fr, float* f) +void FloatRow2Float( const FloatRow& r, float* f) { - f[0] = (*fr)[0]; - f[1] = (*fr)[1]; - f[2] = (*fr)[2]; - f[3] = (*fr)[3]; + for (uint8_t i = 0; i < 4; ++i) + f[i] = r[i]; } #else @@ -196,24 +158,24 @@ return _mm_add_ps( x, _mm_shuffle_ps(x, x, _MM_SHUFFLE(1,1,1,1)) ); } -void Mul4f(const FloatRow* first, const FloatRow* second, FloatRow* out) +void Mul4f(const FloatRow& first, const FloatRow& second, FloatRow& out) { - *out = _mm_mul_ps( *first, *second ); + out = _mm_mul_ps( first, second ); } -void Div4f(const FloatRow* first, const FloatRow* second, FloatRow* out) +void Div4f(const FloatRow& first, const FloatRow& second, FloatRow& out) { - *out = _mm_div_ps( *first, *second ); + out = _mm_div_ps( first, second ); } -void Add4f(const FloatRow* first, const FloatRow* second, FloatRow* out) +void Add4f(const FloatRow& first, const FloatRow& second, FloatRow& out) { - *out = _mm_add_ps( *first, *second ); + out = _mm_add_ps( first, second ); } -void Sub4f(const FloatRow* first, const FloatRow* second, FloatRow* out) +void Sub4f(const FloatRow& first, const FloatRow& second, FloatRow& out) { - *out = _mm_sub_ps( *first, *second ); + out = _mm_sub_ps( first, second ); } void Copy4f( void * dest, const void * source ) @@ -302,14 +264,14 @@ r = (FloatRow)_mm_setzero_ps(); } -void Float2FloatRow(const float* f, FloatRow* r) +void Float2FloatRow(const float* f, FloatRow& r) { - *r = _mm_load_ps( f ); + r = _mm_load_ps( f ); } -void FloatRow2Float( const FloatRow* fr, float* f) +void FloatRow2Float( const FloatRow& r, float* f) { - _mm_store_ps( f, *fr ); + _mm_store_ps( f, r ); } #endif Modified: Mercury2/src/MercuryMath.h =================================================================== --- Mercury2/src/MercuryMath.h 2009-03-03 13:33:16 UTC (rev 170) +++ Mercury2/src/MercuryMath.h 2009-03-03 13:37:30 UTC (rev 171) @@ -44,10 +44,10 @@ //#define DotProduct(x,y) ((x)[0]*(y)[0]+(x)[1]*(y)[1]+(x)[2]*(y)[2]) -void Mul4f(const FloatRow* first, const FloatRow* second, FloatRow* out); -void Div4f(const FloatRow* first, const FloatRow* second, FloatRow* out); -void Add4f(const FloatRow* first, const FloatRow* second, FloatRow* out); -void Sub4f(const FloatRow* first, const FloatRow* second, FloatRow* out); +void Mul4f(const FloatRow& first, const FloatRow& second, FloatRow& out); +void Div4f(const FloatRow& first, const FloatRow& second, FloatRow& out); +void Add4f(const FloatRow& first, const FloatRow& second, FloatRow& out); +void Sub4f(const FloatRow& first, const FloatRow& second, FloatRow& out); void Copy4f( void * dest, const void * source ); void Copy8f( void * dest, const void * source ); void Copy16f( void * dest, const void * source ); @@ -55,8 +55,8 @@ void VectorMultiply4f(const FloatRow* matrix, const FloatRow& p, FloatRow& out ); void TransposeMatrix( FloatRow* m ); -void Float2FloatRow(const float* f, FloatRow* r); -void FloatRow2Float( const FloatRow* fr, float* f); +void Float2FloatRow(const float* f, FloatRow& r); +void FloatRow2Float(const FloatRow& fr, float* f); const FloatRow gfrZero = { 0.f, 0.f, 0.f, 0.f }; Modified: Mercury2/src/MercuryMatrix.cpp =================================================================== --- Mercury2/src/MercuryMatrix.cpp 2009-03-03 13:33:16 UTC (rev 170) +++ Mercury2/src/MercuryMatrix.cpp 2009-03-03 13:37:30 UTC (rev 171) @@ -200,12 +200,11 @@ float tmp[4]; FloatRow r, tvo; - v.ConvertToVector4( tmp ); - tmp[3] = 1; - Float2FloatRow( tmp, &r ); + v.ConvertToVector4( tmp, 1 ); + Float2FloatRow( tmp, r ); VectorMultiply4f( m_matrix, r, tvo); - FloatRow2Float( &tvo, tmp ); - printf("%f %f %f %f\n", tmp[0], tmp[1], tmp[2], tmp[3]); + FloatRow2Float( tvo, tmp ); +// printf("%f %f %f %f\n", tmp[0], tmp[1], tmp[2], tmp[3]); return MercuryVertex(tmp); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |