common.glsl 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #define PI 3.14159265
  2. #define RECIPROCAL_PI 0.31830988618
  3. #define EPSILON 1e-6
  4. #define saturate(a) clamp(a, 0.0, 1.0)
  5. float intDiv(const in float a, const in float b) { return float(int(a) / int(b)); }
  6. float intMod(const in float a, const in float b) { return a - b * float(int(a) / int(b)); }
  7. float pow2(const in float x) { return x*x; }
  8. const float maxFloat = 10000.0; // NOTE constant also set in TypeScript
  9. const float floatLogFactor = log(maxFloat + 1.0);
  10. float encodeFloatLog(const in float value) { return log(value + 1.0) / floatLogFactor; }
  11. float decodeFloatLog(const in float value) { return exp(value * floatLogFactor) - 1.0; }
  12. vec3 encodeFloatRGB(in float value) {
  13. value = clamp(value, 0.0, 16777216.0 - 1.0) + 1.0;
  14. vec3 c = vec3(0.0);
  15. c.b = mod(value, 256.0);
  16. value = floor(value / 256.0);
  17. c.g = mod(value, 256.0);
  18. value = floor(value / 256.0);
  19. c.r = mod(value, 256.0);
  20. return c / 255.0;
  21. }
  22. float decodeFloatRGB(const in vec3 rgb) {
  23. return (rgb.r * 256.0 * 256.0 * 255.0 + rgb.g * 256.0 * 255.0 + rgb.b * 255.0) - 1.0;
  24. }
  25. #if __VERSION__ != 300
  26. // transpose
  27. float transpose(const in float m) {
  28. return m;
  29. }
  30. mat2 transpose(const in mat2 m) {
  31. return mat2(
  32. m[0][0], m[1][0],
  33. m[0][1], m[1][1]
  34. );
  35. }
  36. mat3 transpose(const in mat3 m) {
  37. return mat3(
  38. m[0][0], m[1][0], m[2][0],
  39. m[0][1], m[1][1], m[2][1],
  40. m[0][2], m[1][2], m[2][2]
  41. );
  42. }
  43. mat4 transpose(const in mat4 m) {
  44. return mat4(
  45. m[0][0], m[1][0], m[2][0], m[3][0],
  46. m[0][1], m[1][1], m[2][1], m[3][1],
  47. m[0][2], m[1][2], m[2][2], m[3][2],
  48. m[0][3], m[1][3], m[2][3], m[3][3]
  49. );
  50. }
  51. float inverse(const in float m) {
  52. return 1.0 / m;
  53. }
  54. // inverse
  55. mat2 inverse(const in mat2 m) {
  56. return mat2(m[1][1],-m[0][1],
  57. -m[1][0], m[0][0]) / (m[0][0]*m[1][1] - m[0][1]*m[1][0]);
  58. }
  59. mat3 inverse(const in mat3 m) {
  60. float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2];
  61. float a10 = m[1][0], a11 = m[1][1], a12 = m[1][2];
  62. float a20 = m[2][0], a21 = m[2][1], a22 = m[2][2];
  63. float b01 = a22 * a11 - a12 * a21;
  64. float b11 = -a22 * a10 + a12 * a20;
  65. float b21 = a21 * a10 - a11 * a20;
  66. float det = a00 * b01 + a01 * b11 + a02 * b21;
  67. return mat3(b01, (-a22 * a01 + a02 * a21), (a12 * a01 - a02 * a11),
  68. b11, (a22 * a00 - a02 * a20), (-a12 * a00 + a02 * a10),
  69. b21, (-a21 * a00 + a01 * a20), (a11 * a00 - a01 * a10)) / det;
  70. }
  71. mat4 inverse(const in mat4 m) {
  72. float
  73. a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],
  74. a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],
  75. a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],
  76. a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3],
  77. b00 = a00 * a11 - a01 * a10,
  78. b01 = a00 * a12 - a02 * a10,
  79. b02 = a00 * a13 - a03 * a10,
  80. b03 = a01 * a12 - a02 * a11,
  81. b04 = a01 * a13 - a03 * a11,
  82. b05 = a02 * a13 - a03 * a12,
  83. b06 = a20 * a31 - a21 * a30,
  84. b07 = a20 * a32 - a22 * a30,
  85. b08 = a20 * a33 - a23 * a30,
  86. b09 = a21 * a32 - a22 * a31,
  87. b10 = a21 * a33 - a23 * a31,
  88. b11 = a22 * a33 - a23 * a32,
  89. det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
  90. return mat4(
  91. a11 * b11 - a12 * b10 + a13 * b09,
  92. a02 * b10 - a01 * b11 - a03 * b09,
  93. a31 * b05 - a32 * b04 + a33 * b03,
  94. a22 * b04 - a21 * b05 - a23 * b03,
  95. a12 * b08 - a10 * b11 - a13 * b07,
  96. a00 * b11 - a02 * b08 + a03 * b07,
  97. a32 * b02 - a30 * b05 - a33 * b01,
  98. a20 * b05 - a22 * b02 + a23 * b01,
  99. a10 * b10 - a11 * b08 + a13 * b06,
  100. a01 * b08 - a00 * b10 - a03 * b06,
  101. a30 * b04 - a31 * b02 + a33 * b00,
  102. a21 * b02 - a20 * b04 - a23 * b00,
  103. a11 * b07 - a10 * b09 - a12 * b06,
  104. a00 * b09 - a01 * b07 + a02 * b06,
  105. a31 * b01 - a30 * b03 - a32 * b00,
  106. a20 * b03 - a21 * b01 + a22 * b00) / det;
  107. }
  108. #endif