3d_math.h File Reference

Defines math related functions. More...

`#include <plugins/3dapi/xv3d_types.h>`
`#include "3d_fastmath.h"`

Go to the source code of this file.

## Functions

SFVEC3F SphericalToCartesian (float aInclination, float aAzimuth)
SphericalToCartesian. More...

SFVEC3F UniformRandomHemisphereDirection ()

SFVEC3F CosWeightedRandomHemisphereDirection (const SFVEC3F &n)

bool Refract (const SFVEC3F &aInVector, const SFVEC3F &aNormal, float aRin_over_Rout, SFVEC3F &aOutVector)

float mapf (float x, float in_min, float in_max, float out_min, float out_max)

float RGBtoGray (const SFVEC3F &aColor)

float BezierBlend (float t)

## Detailed Description

Defines math related functions.

Definition in file 3d_math.h.

## ◆ BezierBlend()

 float BezierBlend ( float t )
inline

Definition at line 188 of file 3d_math.h.

189 {
190  return t * t * ( 3.0f - 2.0f * t );
191 }

Referenced by CTRACK_BALL::Interpolate().

## ◆ CosWeightedRandomHemisphereDirection()

 SFVEC3F CosWeightedRandomHemisphereDirection ( const SFVEC3F & n )
inline

Definition at line 70 of file 3d_math.h.

71 {
72  const float Xi1 = (float)rand() / (float)RAND_MAX;
73  const float Xi2 = (float)rand() / (float)RAND_MAX;
74
75  const float theta = acos( sqrt( 1.0f - Xi1 ) );
76  const float phi = 2.0f * glm::pi<float>() * Xi2;
77
78  const float xs = sinf( theta ) * cosf( phi );
79  const float ys = cosf( theta );
80  const float zs = sinf( theta ) * sinf( phi );
81
82  const SFVEC3F y( n.x, n.y, n.z );
83  SFVEC3F h = y;
84
85  if( fabs( h.x ) <= fabs( h.y ) && fabs( h.x ) <= fabs( h.z ) )
86  h.x= 1.0f;
87  else if( fabs( h.y ) <= fabs( h.x ) && fabs( h.y ) <= fabs( h.z ) )
88  h.y= 1.0f;
89  else
90  h.z= 1.0f;
91
92
93  const SFVEC3F x = glm::normalize( glm::cross( h, y ) );
94  const SFVEC3F z = glm::normalize( glm::cross( x, y ) );
95
96  SFVEC3F direction = xs * x + ys * y + zs * z;
97  return glm::normalize( direction );
98 }
glm::vec3 SFVEC3F
Definition: xv3d_types.h:47

## ◆ mapf()

 float mapf ( float x, float in_min, float in_max, float out_min, float out_max )
inline

Definition at line 136 of file 3d_math.h.

141 {
142  x = glm::clamp( x, in_min, in_max );
143
144  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
145 }

Referenced by C3D_RENDER_OGL_LEGACY::setupMaterials().

inline

Definition at line 154 of file 3d_math.h.

155 {
156  // convert to a discret scale of grays
157  const float luminance = glm::min( (((float)((unsigned int) ( 4.0f *
158  RGBtoGray( aDiffuseColor ) ) ) + 0.5f) /
159  4.0f) * 1.0f,
160  1.0f );
161
162  const float maxValue = glm::max( glm::max( glm::max( aDiffuseColor.r,
165  FLT_EPSILON );
166
167  return (aDiffuseColor / SFVEC3F(maxValue) ) * 0.125f + luminance* 0.875f;
168 }
float RGBtoGray(const SFVEC3F &aColor)
Definition: 3d_math.h:147
glm::vec3 SFVEC3F
Definition: xv3d_types.h:47

References RGBtoGray().

 float QuadricEasingInOut ( float t )
inline

Definition at line 172 of file 3d_math.h.

173 {
174  if( t <= 0.5f )
175  {
176  return t * t * 2.0f;
177  }
178  else
179  {
180  t = t - 1.0f;
181
182  return -2.0f * (t * t) + 1.0f;
183  }
184 }

Referenced by CTRACK_BALL::Interpolate().

## ◆ Refract()

 bool Refract ( const SFVEC3F & aInVector, const SFVEC3F & aNormal, float aRin_over_Rout, SFVEC3F & aOutVector )
inline
Parameters
 aInVector incoming vector aNormal normal in the intersection point aRin_over_Rout incoming refraction index / out refraction index aOutVector the refracted vector
Returns
true

Definition at line 113 of file 3d_math.h.

117 {
118  float cosThetaI = -glm::dot( aNormal, aInVector );
119  float sin2ThetaI = glm::max( 0.0f, 1.0f - cosThetaI * cosThetaI );
120  float sin2ThetaT = aRin_over_Rout * aRin_over_Rout * sin2ThetaI;
121
122  // Handle total internal reflection for transmission
123  if( sin2ThetaT >= 1.0f )
124  return false;
125
126  float cosThetaT = sqrtf( 1.0f - sin2ThetaT );
127
128  aOutVector = glm::normalize( aRin_over_Rout * aInVector +
129  ( aRin_over_Rout * cosThetaI - cosThetaT ) *
130  aNormal );
131
132  return true;
133 }

## ◆ RGBtoGray()

 float RGBtoGray ( const SFVEC3F & aColor )
inline

Definition at line 147 of file 3d_math.h.

148 {
149  return (aColor.r * 0.2126f +
150  aColor.g * 0.7152f +
151  aColor.b * 0.0722f);
152 }

## ◆ SphericalToCartesian()

 SFVEC3F SphericalToCartesian ( float aInclination, float aAzimuth )
inline

SphericalToCartesian.

Parameters
 aInclination θ ∈ [0, π] aAzimuth φ ∈ [0, 2π]
Returns
Cartesian cordinates

Definition at line 43 of file 3d_math.h.

44 {
45  float sinInc = glm::sin( aInclination );
46  return SFVEC3F( sinInc * glm::cos( aAzimuth ),
47  sinInc * glm::sin( aAzimuth ),
48  glm::cos( aInclination ) );
49 }
glm::vec3 SFVEC3F
Definition: xv3d_types.h:47

## ◆ UniformRandomHemisphereDirection()

 SFVEC3F UniformRandomHemisphereDirection ( )
inline

Definition at line 54 of file 3d_math.h.

55 {
56  // It was experienced that this function is slow! do not use it :/
57  // SFVEC3F b( (rand()/(float)RAND_MAX) - 0.5f,
58  // (rand()/(float)RAND_MAX) - 0.5f,
59  // (rand()/(float)RAND_MAX) - 0.5f );
60
61  SFVEC3F b( Fast_RandFloat() * 0.5f,
62  Fast_RandFloat() * 0.5f,
63  Fast_RandFloat() * 0.5f );
64
65  return b;
66 }
float Fast_RandFloat()
Definition: 3d_fastmath.cpp:45
glm::vec3 SFVEC3F
Definition: xv3d_types.h:47

References Fast_RandFloat().