13# include <tbb/parallel_for.h>
23# define M_PI_F (3.1415926535897932f)
26# define M_PI_2_F (1.5707963267948966f)
29# define M_2PI_F (6.2831853071795864f)
32# define M_1_PI_F (0.3183098861837067f)
35# define M_4PI_F (12.566370614359172f)
38# define M_1_4PI_F (0.0795774715459476f)
51 explicit float2(
float value) :
x(value),
y(value) {}
53 explicit float2(
int value) :
x(value),
y(value) {}
57 operator const float *()
const
69 return {a.
x *
b, a.
y *
b};
74 return {a.
x *
b, a.
y *
b};
79 return {a.
x /
b, a.
y /
b};
84 return {a.
x /
b, a.
y /
b};
89 return {a.
x /
b.x, a.
y /
b.y};
94 return {a.
x -
b.x, a.
y -
b.y};
104 return x *
x +
y *
y;
114 return (a -
b).length();
119 return {a.
x +
b.x, a.
y +
b.y};
130 return {a.
x *
b.x, a.
y *
b.y};
144 explicit float3(
float value) :
x(value),
y(value),
z(value) {}
146 explicit float3(
int value) :
x(value),
y(value),
z(value) {}
150 operator const float *()
const
162 return {a.
x *
b, a.
y *
b, a.
z *
b};
167 return {a.
x *
b, a.
y *
b, a.
z *
b};
172 return {a.
x /
b, a.
y /
b, a.
z /
b};
177 return {a.
x /
b, a.
y /
b, a.
z /
b};
182 return {a.
x -
b.x, a.
y -
b.y, a.
z -
b.z};
187 return {-a.
x, -a.
y, -a.
z};
192 return x *
x +
y *
y +
z *
z;
202 return (a -
b).length();
207 return {a.
x +
b.x, a.
y +
b.y, a.
z +
b.z};
219 return {a.
x *
b.x, a.
y *
b.y, a.
z *
b.z};
233 explicit float4(
float value) :
x(value),
y(value),
z(value),
w(value) {}
235 explicit float4(
int value) :
x(value),
y(value),
z(value),
w(value) {}
239 operator const float *()
const
251 return {a.
x *
b, a.
y *
b, a.
z *
b, a.
w *
b};
256 return {a.
x *
b, a.
y *
b, a.
z *
b, a.
w *
b};
261 return {a.
x /
b, a.
y /
b, a.
z /
b, a.
w /
b};
266 return {a.
x /
b, a.
y /
b, a.
z /
b, a.
w /
b};
271 return {a.
x *
b.x, a.
y *
b.y, a.
z *
b.z, a.
w *
b.w};
276 return {a.
x /
b.x, a.
y /
b.y, a.
z /
b.z, a.
w /
b.w};
281 return {a.
x -
b.x, a.
y -
b.y, a.
z -
b.z, a.
w -
b.w};
286 return {-a.
x, -a.
y, -a.
z, -a.
w};
291 return x *
x +
y *
y +
z *
z +
w *
w;
301 return (a -
b).length();
306 return {a.
x +
b.x, a.
y +
b.y, a.
z +
b.z, a.
w +
b.w};
333 return sqrt(fmax(f, 0.0f));
343 return a.
x *
b.x + a.
y *
b.y;
348 return float2::distance(a,
b);
373 return a.
x *
b.x + a.
y *
b.y + a.
z *
b.z;
378 return float3::distance(a,
b);
393 return f.
x + f.
y + f.
z;
403 return a.
x *
b.x + a.
y *
b.y + a.
z *
b.z + a.
w *
b.w;
408 return float4::distance(a,
b);
423 return f.
x + f.
y + f.
z + f.
w;
449 return clamp(a, 0.0f, 1.0f);
452template<
typename T>
inline T mix(
T x,
T y,
float a)
454 return x + a * (
y -
x);
459 return make_float3(-
sqrtf(1.0f - sun_cos_theta * sun_cos_theta), 0.0f, sun_cos_theta);
465 float c =
dot(
pos,
pos) - radius * radius;
466 if (c > 0.0f &&
b > 0.0f) {
481template<
typename Function>
484 const size_t grainsize,
485 const Function &function)
489 tbb::blocked_range<size_t>(
begin, end, grainsize),
490 [function](
const tbb::blocked_range<size_t> &r) { function(r.begin(), r.end()); });
492 for (
size_t i =
begin;
i < end;
i += grainsize) {
493 function(
i, std::min(
i + grainsize, end));
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
VecBase< float, 2 > float2
VecBase< float, 4 > float4
VecBase< float, 3 > float3
float distance(const float2 &a, const float2 &b)
float safe_sqrtf(const float f)
float3 make_float3(float x, float y, float z)
float reduce_add(float2 f)
void SKY_parallel_for(const size_t begin, const size_t end, const size_t grainsize, const Function &function)
float ray_sphere_intersection(float3 pos, float3 dir, float radius)
float3 sun_direction(float sun_cos_theta)
float clamp(float x, float min, float max)
float len_squared(float2 f)
float dot(const float2 &a, const float2 &b)
friend float2 operator-(const float2 &a)
friend float2 operator-(const float2 &a, const float2 &b)
float2(const float(*ptr)[2])
friend float2 operator*(const float2 &a, float b)
friend float2 operator+(const float2 &a, const float2 &b)
friend float2 operator/(float b, const float2 &a)
friend float2 operator*(const float2 &a, const float2 &b)
void operator+=(const float2 &b)
friend float2 operator*(float b, const float2 &a)
friend float2 operator/(const float2 &a, float b)
static float distance(const float2 &a, const float2 &b)
friend float2 operator/(const float2 &a, const float2 &b)
float length_squared() const
friend float3 operator*(const float3 &a, float b)
friend float3 operator-(const float3 &a, const float3 &b)
float3(float x, float y, float z)
void operator+=(const float3 &b)
float length_squared() const
friend float3 operator+(const float3 &a, const float3 &b)
float3(const float(*ptr)[3])
friend float3 operator/(const float3 &a, float b)
friend float3 operator/(float b, const float3 &a)
static float distance(const float3 &a, const float3 &b)
friend float3 operator*(const float3 &a, const float3 &b)
friend float3 operator-(const float3 &a)
friend float3 operator*(float b, const float3 &a)
void operator+=(const float4 &b)
friend float4 operator-(const float4 &a)
friend float4 operator/(const float4 &a, float b)
friend float4 operator/(const float4 &a, const float4 &b)
void operator*=(const float4 &b)
static float distance(const float4 &a, const float4 &b)
friend float4 operator-(const float4 &a, const float4 &b)
friend float4 operator/(float b, const float4 &a)
float length_squared() const
friend float4 operator*(const float4 &a, const float4 &b)
float4(float x, float y, float z, float w)
friend float4 operator+(const float4 &a, const float4 &b)
friend float4 operator*(float b, const float4 &a)
float4(const float(*ptr)[4])
friend float4 operator*(const float4 &a, float b)