packing.chunk 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // Copyright (c) 2017-2020 Xiamen Yaji Software Co., Ltd.
  2. // float <--> RGBA8
  3. vec4 packDepthToRGBA (float depth) {
  4. vec4 ret = vec4(1.0, 255.0, 65025.0, 16581375.0) * depth;
  5. ret = fract(ret);
  6. ret -= vec4(ret.yzw, 0.0) / 255.0;
  7. return ret;
  8. }
  9. #pragma define unpackRGBAToDepth(color) dot(color, vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0))
  10. // float <--> binary bits, max 8bits per float
  11. #define UnpackBitFromFloat(value, bit) (mod(floor(value / pow(10.0, float(bit))), 10.0) > 0.0)
  12. // highp <--> 2 * mediump
  13. #pragma define DEFINE_PACK_HIGHP_FUNC(type) \
  14. highp type unpackHighpData (type mainPart, type modPart) {\
  15. highp type data = mainPart;\
  16. return data + modPart;\
  17. }\
  18. void packHighpData (out type mainPart, out type modPart, highp type data) {\
  19. mainPart = fract(data);\
  20. modPart = data - mainPart;\
  21. }\
  22. highp type unpackHighpData (type mainPart, type modPart, const float modValue) {\
  23. highp type data = mainPart * modValue;\
  24. return data + modPart * modValue;\
  25. }\
  26. void packHighpData (out type mainPart, out type modPart, highp type data, const float modValue) {\
  27. highp type divide = data / modValue;\
  28. mainPart = floor(divide);\
  29. modPart = (data - mainPart * modValue) / modValue;\
  30. }
  31. DEFINE_PACK_HIGHP_FUNC(float)
  32. DEFINE_PACK_HIGHP_FUNC(vec2)
  33. DEFINE_PACK_HIGHP_FUNC(vec3)
  34. DEFINE_PACK_HIGHP_FUNC(vec4)
  35. // Use these macros to define and assign high precision values in fs structs, otherwise will loss precisions with android + webgl platform
  36. #pragma define HIGHP_VALUE_STRUCT_DEFINE(type, name) \
  37. #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\
  38. type name, name##_fract_part;\
  39. #else\
  40. type name;\
  41. #endif\
  42. #pragma // empty pragma trick to get rid of trailing semicolons at effect compile time
  43. // used for large range such as position
  44. #pragma define HIGHP_VALUE_FROM_STRUCT_DEFINED(value, defined) \
  45. #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\
  46. value = unpackHighpData(defined, defined##_fract_part);\
  47. #else\
  48. value = defined;\
  49. #endif\
  50. #pragma // empty pragma trick to get rid of trailing semicolons at effect compile time
  51. #pragma define HIGHP_VALUE_TO_STRUCT_DEFINED(value, defined) \
  52. #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\
  53. packHighpData(defined, defined##_fract_part, value);\
  54. #else\
  55. defined = value;\
  56. #endif\
  57. #pragma // empty pragma trick to get rid of trailing semicolons at effect compile time
  58. // used for small range such as -1-1 normalized
  59. #pragma define HIGHP_VALUE_FROM_STRUCT_DEFINED_SMALL_RANGE(value, defined) \
  60. #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\
  61. value = unpackHighpData(defined, defined##_fract_part, 1000.0);\
  62. #else\
  63. value = defined;\
  64. #endif\
  65. #pragma // empty pragma trick to get rid of trailing semicolons at effect compile time
  66. #pragma define HIGHP_VALUE_TO_STRUCT_DEFINED_SMALL_RANGE(value, defined) \
  67. #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\
  68. packHighpData(defined, defined##_fract_part, value, 1000.0);\
  69. #else\
  70. defined = value;\
  71. #endif\
  72. #pragma // empty pragma trick to get rid of trailing semicolons at effect compile time