number.chunk 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #if __VERSION__ <= 100
  2. bool isnan(float val) {
  3. return (val < 0.0 || 0.0 < val || val == 0.0) ? false : true;
  4. }
  5. bool isinf(float x) {
  6. return x == x * 2.0 && x != 0.0;
  7. }
  8. #endif
  9. bool isnans(vec2 val) {
  10. return isnan(val.x) || isnan(val.y);
  11. }
  12. bool isnans(vec3 val) {
  13. return isnan(val.x) || isnan(val.y) || isnan(val.z);
  14. }
  15. bool isnans(vec4 val) {
  16. return isnan(val.x) || isnan(val.y) || isnan(val.z) || isnan(val.w);
  17. }
  18. bool isinfs(vec2 val) {
  19. return isinf(val.x) || isinf(val.y);
  20. }
  21. bool isinfs(vec3 val) {
  22. return isinf(val.x) || isinf(val.y) || isinf(val.z);
  23. }
  24. bool isinfs(vec4 val) {
  25. return isinf(val.x) || isinf(val.y) || isinf(val.z) || isinf(val.w);
  26. }
  27. // intrinsic functions
  28. #if __VERSION__ < 300
  29. float round(float value) {
  30. float f = fract(value);
  31. return value - f + (f < 0.5 ? 0.0 : 1.0);
  32. }
  33. vec2 round(vec2 value) { return vec2(round(value.x), round(value.y)); }
  34. vec3 round(vec3 value) { return vec3(round(value.x), round(value.y), round(value.z)); }
  35. vec4 round(vec4 value) { return vec4(round(value.x), round(value.y), round(value.z), round(value.w)); }
  36. #endif
  37. float rsqrt(float value) { return 1.0 / sqrt(value); }
  38. vec2 rsqrt(vec2 value) { return vec2(1.0) / sqrt(value); }
  39. vec3 rsqrt(vec3 value) { return vec3(1.0) / sqrt(value); }
  40. vec4 rsqrt(vec4 value) { return vec4(1.0) / sqrt(value); }
  41. // random number
  42. // seeds value must be between zero to one, otherwise get 0
  43. // such as fract(cc_time.z * FSInput_texcoord)
  44. float rand(vec2 seeds_zero_to_one) {
  45. return fract(sin(dot(seeds_zero_to_one.xy, vec2(12.9898, 78.233))) * 43758.5453);
  46. }
  47. // like smoothstep, but it's linear interpolation
  48. float linearstep(float minValue, float maxValue, float value) { return saturate((value - minValue) / (maxValue - minValue)); }
  49. vec2 linearstep(vec2 minValue, vec2 maxValue, vec2 value) { return saturate((value - minValue) / (maxValue - minValue)); }
  50. vec3 linearstep(vec3 minValue, vec3 maxValue, vec3 value) { return saturate((value - minValue) / (maxValue - minValue)); }
  51. vec4 linearstep(vec4 minValue, vec4 maxValue, vec4 value) { return saturate((value - minValue) / (maxValue - minValue)); }
  52. #if __VERSION__ <= 100
  53. mat4 transpose(mat4 v) {
  54. mat4 tmp;
  55. tmp[0] = vec4(v[0].x, v[1].x, v[2].x, v[3].x);
  56. tmp[1] = vec4(v[0].y, v[1].y, v[2].y, v[3].y);
  57. tmp[2] = vec4(v[0].z, v[1].z, v[2].z, v[3].z);
  58. tmp[3] = vec4(v[0].w, v[1].w, v[2].w, v[3].w);
  59. return tmp;
  60. }
  61. #endif