Math.hpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #ifndef __DARKRL__MATH_HPP__
  2. #define __DARKRL__MATH_HPP__
  3. #include <algorithm>
  4. #include <math.h>
  5. #include "Types.hpp"
  6. template<typename T>
  7. inline T AlignPOT( T val )
  8. {
  9. if( val == 0 ) return 1;
  10. val--;
  11. for( unsigned int i=1; i<sizeof( T ) * 8; i <<= 1 )
  12. {
  13. val |= val >> i;
  14. }
  15. return val + 1;
  16. }
  17. inline int CountSetBits( uint32 val )
  18. {
  19. val -= ( val >> 1 ) & 0x55555555;
  20. val = ( ( val >> 2 ) & 0x33333333 ) + ( val & 0x33333333 );
  21. val = ( ( val >> 4 ) + val ) & 0x0f0f0f0f;
  22. val += val >> 8;
  23. val += val >> 16;
  24. return val & 0x0000003f;
  25. }
  26. inline int CountLeadingZeros( uint32 val )
  27. {
  28. val |= val >> 1;
  29. val |= val >> 2;
  30. val |= val >> 4;
  31. val |= val >> 8;
  32. val |= val >> 16;
  33. return 32 - CountSetBits( val );
  34. }
  35. inline float sRGB2linear( float v )
  36. {
  37. const float a = 0.055f;
  38. if( v <= 0.04045f )
  39. {
  40. return v / 12.92f;
  41. }
  42. else
  43. {
  44. return powf( ( v + a ) / ( 1 + a ), 2.4f );
  45. }
  46. }
  47. inline float linear2sRGB( float v )
  48. {
  49. const float a = 0.055f;
  50. if( v <= 0.0031308f )
  51. {
  52. return 12.92f * v;
  53. }
  54. else
  55. {
  56. return ( 1 + a ) * pow( v, 1/2.4f ) - a;
  57. }
  58. }
  59. template<class T>
  60. inline T SmoothStep( T x )
  61. {
  62. return x*x*(3-2*x);
  63. }
  64. inline uint8 clampu8( int32 val )
  65. {
  66. return std::min( std::max( 0, val ), 255 );
  67. }
  68. template<class T>
  69. inline T sq( T val )
  70. {
  71. return val * val;
  72. }
  73. static inline int mul8bit( int a, int b )
  74. {
  75. int t = a*b + 128;
  76. return ( t + ( t >> 8 ) ) >> 8;
  77. }
  78. #endif