PackUtils.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using System;
  2. namespace PF
  3. {
  4. internal static class PackUtils
  5. {
  6. private static double ClampAndRound(float value, float min, float max)
  7. {
  8. if (float.IsNaN(value))
  9. return 0.0;
  10. if (float.IsInfinity(value))
  11. {
  12. if (!float.IsNegativeInfinity(value))
  13. return (double) max;
  14. return (double) min;
  15. }
  16. if ((double) value < (double) min)
  17. return (double) min;
  18. if ((double) value > (double) max)
  19. return (double) max;
  20. return Math.Round((double) value);
  21. }
  22. public static uint PackSigned(uint bitmask, float value)
  23. {
  24. float max = (float) (bitmask >> 1);
  25. float min = (float) (-(double) max - 1.0);
  26. return (uint) (int) PackUtils.ClampAndRound(value, min, max) & bitmask;
  27. }
  28. public static uint PackSNorm(uint bitmask, float value)
  29. {
  30. float max = (float) (bitmask >> 1);
  31. value *= max;
  32. return (uint) (int) PackUtils.ClampAndRound(value, -max, max) & bitmask;
  33. }
  34. public static uint PackUNorm(float bitmask, float value)
  35. {
  36. value *= bitmask;
  37. return (uint) PackUtils.ClampAndRound(value, 0.0f, bitmask);
  38. }
  39. public static uint PackUnsigned(float bitmask, float value)
  40. {
  41. return (uint) PackUtils.ClampAndRound(value, 0.0f, bitmask);
  42. }
  43. public static float UnpackSNorm(uint bitmask, uint value)
  44. {
  45. uint num1 = bitmask + 1U >> 1;
  46. if (((int) value & (int) num1) != 0)
  47. {
  48. if (((int) value & (int) bitmask) == (int) num1)
  49. return -1f;
  50. value |= ~bitmask;
  51. }
  52. else
  53. value &= bitmask;
  54. float num2 = (float) (bitmask >> 1);
  55. return (float) value / num2;
  56. }
  57. public static float UnpackUNorm(uint bitmask, uint value)
  58. {
  59. value &= bitmask;
  60. return (float) value / (float) bitmask;
  61. }
  62. }
  63. }