41 float sinInc = glm::sin( aInclination );
43 return SFVEC3F( sinInc * glm::cos( aAzimuth ), sinInc * glm::sin( aAzimuth ),
44 glm::cos( aInclination ) );
67 const float Xi1 = (float) rand() / (float) RAND_MAX;
68 const float Xi2 = (float) rand() / (float) RAND_MAX;
70 const float theta = acos( sqrt( 1.0f - Xi1 ) );
71 const float phi = 2.0f * glm::pi<float>() * Xi2;
73 const float xs = sinf( theta ) * cosf( phi );
74 const float ys = cosf( theta );
75 const float zs = sinf( theta ) * sinf( phi );
77 const SFVEC3F y( n.x, n.y, n.z );
80 if( fabs( h.x ) <= fabs( h.y ) && fabs( h.x ) <= fabs( h.z ) )
82 else if( fabs( h.y ) <= fabs( h.x ) && fabs( h.y ) <= fabs( h.z ) )
88 const SFVEC3F x = glm::normalize( glm::cross( h, y ) );
89 const SFVEC3F z = glm::normalize( glm::cross( x, y ) );
91 SFVEC3F direction = xs * x + ys * y + zs * z;
92 return glm::normalize( direction );
111 float cosThetaI = -glm::dot( aNormal, aInVector );
112 float sin2ThetaI = glm::max( 0.0f, 1.0f - cosThetaI * cosThetaI );
113 float sin2ThetaT = aRin_over_Rout * aRin_over_Rout * sin2ThetaI;
116 if( sin2ThetaT >= 1.0f )
119 float cosThetaT = sqrtf( 1.0f - sin2ThetaT );
121 aOutVector = glm::normalize( aRin_over_Rout * aInVector +
122 ( aRin_over_Rout * cosThetaI - cosThetaT ) *
129inline float mapf(
float x,
float in_min,
float in_max,
float out_min,
float out_max )
131 x = glm::clamp( x, in_min, in_max );
133 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
138 return (aColor.r * 0.2126f +
146 const float luminance = glm::min(
147 ( ( (
float) ( (
unsigned int) ( 4.0f *
RGBtoGray( aDiffuseColor ) ) ) + 0.5f ) / 4.0f )
151 const float maxValue = glm::max( glm::max( glm::max( aDiffuseColor.r, aDiffuseColor.g ),
152 aDiffuseColor.b ), FLT_EPSILON );
154 return ( aDiffuseColor /
SFVEC3F( maxValue ) ) * 0.125f + luminance * 0.875f;
169 return -2.0f * ( t * t ) + 1.0f;
177 return t * t * ( 3.0f - 2.0f * t );
Defines math related functions.
float mapf(float x, float in_min, float in_max, float out_min, float out_max)
float RGBtoGray(const SFVEC3F &aColor)
SFVEC3F CosWeightedRandomHemisphereDirection(const SFVEC3F &n)
float BezierBlend(float t)
SFVEC3F MaterialDiffuseToColorCAD(const SFVEC3F &aDiffuseColor)
bool Refract(const SFVEC3F &aInVector, const SFVEC3F &aNormal, float aRin_over_Rout, SFVEC3F &aOutVector)
Based on: https://github.com/mmp/pbrt-v3/blob/master/src/core/reflection.h See also: http://www....
SFVEC3F UniformRandomHemisphereDirection()
float QuadricEasingInOut(float t)
SFVEC3F SphericalToCartesian(float aInclination, float aAzimuth)
https://en.wikipedia.org/wiki/Spherical_coordinate_system