Packer.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public static class Packer
  5. {
  6. /// <summary>
  7. /// Pack 4 low-precision [0-1] floats values to a float.
  8. /// Each value [0-1] has 64 steps(6 bits).
  9. /// </summary>
  10. public static float ToFloat(float x, float y, float z, float w)
  11. {
  12. x = x < 0 ? 0 : 1 < x ? 1 : x;
  13. y = y < 0 ? 0 : 1 < y ? 1 : y;
  14. z = z < 0 ? 0 : 1 < z ? 1 : z;
  15. w = w < 0 ? 0 : 1 < w ? 1 : w;
  16. const int PRECISION = (1 << 6) - 1;
  17. return (Mathf.FloorToInt(w * PRECISION) << 18)
  18. + (Mathf.FloorToInt(z * PRECISION) << 12)
  19. + (Mathf.FloorToInt(y * PRECISION) << 6)
  20. + Mathf.FloorToInt(x * PRECISION);
  21. }
  22. /// <summary>
  23. /// Pack 4 low-precision [0-1] floats values to a float.
  24. /// Each value [0-1] has 64 steps(6 bits).
  25. /// </summary>
  26. public static float ToFloat(Vector4 factor)
  27. {
  28. return ToFloat(Mathf.Clamp01(factor.x), Mathf.Clamp01(factor.y), Mathf.Clamp01(factor.z),
  29. Mathf.Clamp01(factor.w));
  30. }
  31. /// <summary>
  32. /// Pack 1 middle-precision & 2 low-precision [0-1] floats values to a float.
  33. /// z value [0-1] has 4096 steps(12 bits) and xy value [0-1] has 64 steps(6 bits).
  34. /// </summary>
  35. public static float ToFloat(float x, float y, float z)
  36. {
  37. x = x < 0 ? 0 : 1 < x ? 1 : x;
  38. y = y < 0 ? 0 : 1 < y ? 1 : y;
  39. z = z < 0 ? 0 : 1 < z ? 1 : z;
  40. const int PRECISION = (1 << 8) - 1;
  41. return (Mathf.FloorToInt(z * PRECISION) << 16)
  42. + (Mathf.FloorToInt(y * PRECISION) << 8)
  43. + Mathf.FloorToInt(x * PRECISION);
  44. }
  45. /// <summary>
  46. /// Pack 2 low-precision [0-1] floats values to a float.
  47. /// Each value [0-1] has 4096 steps(12 bits).
  48. /// </summary>
  49. public static float ToFloat(float x, float y)
  50. {
  51. x = x < 0 ? 0 : 1 < x ? 1 : x;
  52. y = y < 0 ? 0 : 1 < y ? 1 : y;
  53. const int PRECISION = (1 << 12) - 1;
  54. return (Mathf.FloorToInt(y * PRECISION) << 12)
  55. + Mathf.FloorToInt(x * PRECISION);
  56. }
  57. }