Math.hpp 1.7 KB

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