|
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.
|