Work in progress. Experiment with lightmap compression.
This commit is contained in:
@ -30,7 +30,7 @@ static inline Vector3 firstEigenVector_PowerMethod(const float *__restrict matri
|
||||
{
|
||||
if (matrix[0] == 0 && matrix[3] == 0 && matrix[5] == 0)
|
||||
{
|
||||
return Vector3(zero);
|
||||
return Vector3(0.0f);
|
||||
}
|
||||
|
||||
Vector3 v = estimatePrincipleComponent(matrix);
|
||||
@ -53,7 +53,7 @@ static inline Vector3 firstEigenVector_PowerMethod(const float *__restrict matri
|
||||
|
||||
Vector3 nv::Fit::computeCentroid(int n, const Vector3 *__restrict points)
|
||||
{
|
||||
Vector3 centroid(zero);
|
||||
Vector3 centroid(0.0f);
|
||||
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
@ -66,7 +66,7 @@ Vector3 nv::Fit::computeCentroid(int n, const Vector3 *__restrict points)
|
||||
|
||||
Vector3 nv::Fit::computeCentroid(int n, const Vector3 *__restrict points, const float *__restrict weights, Vector3::Arg metric)
|
||||
{
|
||||
Vector3 centroid(zero);
|
||||
Vector3 centroid(0.0f );
|
||||
float total = 0.0f;
|
||||
|
||||
for (int i = 0; i < n; i++)
|
||||
@ -210,7 +210,7 @@ int nv::Fit::compute4Means(int n, const Vector3 *__restrict points, const float
|
||||
// Now we have to iteratively refine the clusters.
|
||||
while (true)
|
||||
{
|
||||
Vector3 newCluster[4] = { Vector3(zero), Vector3(zero), Vector3(zero), Vector3(zero) };
|
||||
Vector3 newCluster[4] = { Vector3(0.0f), Vector3(0.0f), Vector3(0.0f), Vector3(0.0f) };
|
||||
float total[4] = {0, 0, 0, 0};
|
||||
|
||||
for (int i = 0; i < n; ++i)
|
||||
|
@ -9,6 +9,8 @@
|
||||
|
||||
namespace nv
|
||||
{
|
||||
enum zero_t { zero };
|
||||
enum identity_t { identity };
|
||||
|
||||
class NVMATH_CLASS Matrix3
|
||||
{
|
||||
|
@ -26,6 +26,8 @@
|
||||
#ifndef NV_SIMD_VECTOR_SSE_H
|
||||
#define NV_SIMD_VECTOR_SSE_H
|
||||
|
||||
#include "nvcore/Memory.h"
|
||||
|
||||
#include <xmmintrin.h>
|
||||
#if (NV_USE_SSE > 1)
|
||||
#include <emmintrin.h>
|
||||
@ -35,6 +37,7 @@ namespace nv {
|
||||
|
||||
class SimdVector
|
||||
{
|
||||
public:
|
||||
__m128 vec;
|
||||
|
||||
typedef SimdVector const& Arg;
|
||||
@ -42,15 +45,13 @@ namespace nv {
|
||||
SimdVector() {}
|
||||
explicit SimdVector(float f) : vec(_mm_set1_ps(f)) {}
|
||||
explicit SimdVector(__m128 v) : vec(v) {}
|
||||
SimdVector(const SimdVector & arg) : vec(arg.vec) {}
|
||||
|
||||
SimdVector & operator=(const SimdVector & arg)
|
||||
explicit SimdVector(Vector4::Arg v)
|
||||
{
|
||||
vec = arg.vec;
|
||||
return *this;
|
||||
vec = _mm_load_ps( v.component );
|
||||
}
|
||||
|
||||
SimdVector(const float * v)
|
||||
explicit SimdVector(const float * v)
|
||||
{
|
||||
vec = _mm_load_ps( v );
|
||||
}
|
||||
@ -60,6 +61,16 @@ namespace nv {
|
||||
vec = _mm_setr_ps( x, y, z, w );
|
||||
}
|
||||
|
||||
SimdVector(const SimdVector & arg) : vec(arg.vec) {}
|
||||
|
||||
SimdVector & operator=(const SimdVector & arg)
|
||||
{
|
||||
vec = arg.vec;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
|
||||
float toFloat() const
|
||||
{
|
||||
NV_ALIGN_16 float f;
|
||||
@ -77,7 +88,7 @@ namespace nv {
|
||||
Vector4 toVector4() const
|
||||
{
|
||||
NV_ALIGN_16 float c[4];
|
||||
_mm_store_ps( v.components, vec );
|
||||
_mm_store_ps( c, vec );
|
||||
return Vector4( c[0], c[1], c[2], c[3] );
|
||||
}
|
||||
|
||||
@ -108,34 +119,34 @@ namespace nv {
|
||||
};
|
||||
|
||||
|
||||
SimdVector operator+( SimdVector::Arg left, SimdVector::Arg right )
|
||||
inline SimdVector operator+( SimdVector::Arg left, SimdVector::Arg right )
|
||||
{
|
||||
return SimdVector( _mm_add_ps( left.vec, right.vec ) );
|
||||
}
|
||||
|
||||
SimdVector operator-( SimdVector::Arg left, SimdVector::Arg right )
|
||||
inline SimdVector operator-( SimdVector::Arg left, SimdVector::Arg right )
|
||||
{
|
||||
return SimdVector( _mm_sub_ps( left.vec, right.vec ) );
|
||||
}
|
||||
|
||||
SimdVector operator*( SimdVector::Arg left, SimdVector::Arg right )
|
||||
inline SimdVector operator*( SimdVector::Arg left, SimdVector::Arg right )
|
||||
{
|
||||
return SimdVector( _mm_mul_ps( left.vec, right.vec ) );
|
||||
}
|
||||
|
||||
// Returns a*b + c
|
||||
SimdVector multiplyAdd( SimdVector::Arg a, SimdVector::Arg b, SimdVector::Arg c )
|
||||
inline SimdVector multiplyAdd( SimdVector::Arg a, SimdVector::Arg b, SimdVector::Arg c )
|
||||
{
|
||||
return SimdVector( _mm_add_ps( _mm_mul_ps( a.vec, b.vec ), c.vec ) );
|
||||
}
|
||||
|
||||
// Returns -( a*b - c )
|
||||
SimdVector negativeMultiplySubtract( SimdVector::Arg a, SimdVector::Arg b, SimdVector::Arg c )
|
||||
inline SimdVector negativeMultiplySubtract( SimdVector::Arg a, SimdVector::Arg b, SimdVector::Arg c )
|
||||
{
|
||||
return SimdVector( _mm_sub_ps( c.vec, _mm_mul_ps( a.vec, b.vec ) ) );
|
||||
}
|
||||
|
||||
SimdVector reciprocal( SimdVector::Arg v )
|
||||
inline SimdVector reciprocal( SimdVector::Arg v )
|
||||
{
|
||||
// get the reciprocal estimate
|
||||
__m128 estimate = _mm_rcp_ps( v.vec );
|
||||
@ -145,17 +156,17 @@ namespace nv {
|
||||
return SimdVector( _mm_add_ps( _mm_mul_ps( diff, estimate ), estimate ) );
|
||||
}
|
||||
|
||||
SimdVector min( SimdVector::Arg left, SimdVector::Arg right )
|
||||
inline SimdVector min( SimdVector::Arg left, SimdVector::Arg right )
|
||||
{
|
||||
return SimdVector( _mm_min_ps( left.vec, right.vec ) );
|
||||
}
|
||||
|
||||
SimdVector max( SimdVector::Arg left, SimdVector::Arg right )
|
||||
inline SimdVector max( SimdVector::Arg left, SimdVector::Arg right )
|
||||
{
|
||||
return SimdVector( _mm_max_ps( left.vec, right.vec ) );
|
||||
}
|
||||
|
||||
SimdVector truncate( SimdVector::Arg v )
|
||||
inline SimdVector truncate( SimdVector::Arg v )
|
||||
{
|
||||
#if (NV_USE_SSE == 1)
|
||||
// convert to ints
|
||||
@ -176,12 +187,12 @@ namespace nv {
|
||||
#endif
|
||||
}
|
||||
|
||||
SimdVector compareEqual( SimdVector::Arg left, SimdVector::Arg right )
|
||||
inline SimdVector compareEqual( SimdVector::Arg left, SimdVector::Arg right )
|
||||
{
|
||||
return SimdVector( _mm_cmpeq_ps( left.vec, right.vec ) );
|
||||
}
|
||||
|
||||
SimdVector select( SimdVector::Arg off, SimdVector::Arg on, SimdVector::Arg bits )
|
||||
inline SimdVector select( SimdVector::Arg off, SimdVector::Arg on, SimdVector::Arg bits )
|
||||
{
|
||||
__m128 a = _mm_andnot_ps( bits.vec, off.vec );
|
||||
__m128 b = _mm_and_ps( bits.vec, on.vec );
|
||||
@ -189,7 +200,7 @@ namespace nv {
|
||||
return SimdVector( _mm_or_ps( a, b ) );
|
||||
}
|
||||
|
||||
bool compareAnyLessThan( SimdVector::Arg left, SimdVector::Arg right )
|
||||
inline bool compareAnyLessThan( SimdVector::Arg left, SimdVector::Arg right )
|
||||
{
|
||||
__m128 bits = _mm_cmplt_ps( left.vec, right.vec );
|
||||
int value = _mm_movemask_ps( bits );
|
||||
|
@ -10,9 +10,6 @@
|
||||
namespace nv
|
||||
{
|
||||
|
||||
enum zero_t { zero };
|
||||
enum identity_t { identity };
|
||||
|
||||
// I should probably use templates.
|
||||
typedef float scalar;
|
||||
|
||||
@ -22,7 +19,6 @@ namespace nv
|
||||
typedef Vector2 const & Arg;
|
||||
|
||||
Vector2();
|
||||
explicit Vector2(zero_t);
|
||||
explicit Vector2(scalar f);
|
||||
Vector2(scalar x, scalar y);
|
||||
Vector2(Vector2::Arg v);
|
||||
@ -57,7 +53,7 @@ namespace nv
|
||||
typedef Vector3 const & Arg;
|
||||
|
||||
Vector3();
|
||||
explicit Vector3(zero_t);
|
||||
explicit Vector3(scalar x);
|
||||
Vector3(scalar x, scalar y, scalar z);
|
||||
Vector3(Vector2::Arg v, scalar z);
|
||||
Vector3(Vector3::Arg v);
|
||||
@ -99,7 +95,7 @@ namespace nv
|
||||
typedef Vector4 const & Arg;
|
||||
|
||||
Vector4();
|
||||
explicit Vector4(zero_t);
|
||||
explicit Vector4(scalar x);
|
||||
Vector4(scalar x, scalar y, scalar z, scalar w);
|
||||
Vector4(Vector2::Arg v, scalar z, scalar w);
|
||||
Vector4(Vector3::Arg v, scalar w);
|
||||
@ -136,7 +132,6 @@ namespace nv
|
||||
// Vector2
|
||||
|
||||
inline Vector2::Vector2() {}
|
||||
inline Vector2::Vector2(zero_t) : x(0.0f), y(0.0f) {}
|
||||
inline Vector2::Vector2(scalar f) : x(f), y(f) {}
|
||||
inline Vector2::Vector2(scalar x, scalar y) : x(x), y(y) {}
|
||||
inline Vector2::Vector2(Vector2::Arg v) : x(v.x), y(v.y) {}
|
||||
@ -201,7 +196,7 @@ namespace nv
|
||||
// Vector3
|
||||
|
||||
inline Vector3::Vector3() {}
|
||||
inline Vector3::Vector3(zero_t) : x(0.0f), y(0.0f), z(0.0f) {}
|
||||
inline Vector3::Vector3(scalar f) : x(f), y(f), z(f) {}
|
||||
inline Vector3::Vector3(scalar x, scalar y, scalar z) : x(x), y(y), z(z) {}
|
||||
inline Vector3::Vector3(Vector2::Arg v, scalar z) : x(v.x), y(v.y), z(z) {}
|
||||
inline Vector3::Vector3(Vector3::Arg v) : x(v.x), y(v.y), z(v.z) {}
|
||||
@ -286,7 +281,7 @@ namespace nv
|
||||
// Vector4
|
||||
|
||||
inline Vector4::Vector4() {}
|
||||
inline Vector4::Vector4(zero_t) : x(0.0f), y(0.0f), z(0.0f), w(0.0f) {}
|
||||
inline Vector4::Vector4(scalar f) : x(f), y(f), z(f), w(f) {}
|
||||
inline Vector4::Vector4(scalar x, scalar y, scalar z, scalar w) : x(x), y(y), z(z), w(w) {}
|
||||
inline Vector4::Vector4(Vector2::Arg v, scalar z, scalar w) : x(v.x), y(v.y), z(z), w(w) {}
|
||||
inline Vector4::Vector4(Vector3::Arg v, scalar w) : x(v.x), y(v.y), z(v.z), w(w) {}
|
||||
@ -640,6 +635,15 @@ namespace nv
|
||||
return isFinite(v.x) && isFinite(v.y) && isFinite(v.z);
|
||||
}
|
||||
|
||||
inline Vector3 floor(Vector3::Arg v)
|
||||
{
|
||||
return Vector3(floorf(v.x), floorf(v.y), floorf(v.z));
|
||||
}
|
||||
|
||||
inline Vector3 ceil(Vector3::Arg v)
|
||||
{
|
||||
return Vector3(ceilf(v.x), ceilf(v.y), ceilf(v.z));
|
||||
}
|
||||
|
||||
// Vector4
|
||||
|
||||
|
Reference in New Issue
Block a user