| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- // Copyright (c) 2017-2020 Xiamen Yaji Software Co., Ltd.
- // float <--> RGBA8
- vec4 packDepthToRGBA (float depth) {
- vec4 ret = vec4(1.0, 255.0, 65025.0, 16581375.0) * depth;
- ret = fract(ret);
- ret -= vec4(ret.yzw, 0.0) / 255.0;
- return ret;
- }
- #pragma define unpackRGBAToDepth(color) dot(color, vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0))
- // float <--> binary bits, max 8bits per float
- #define UnpackBitFromFloat(value, bit) (mod(floor(value / pow(10.0, float(bit))), 10.0) > 0.0)
- // highp <--> 2 * mediump
- #pragma define DEFINE_PACK_HIGHP_FUNC(type) \
- highp type unpackHighpData (type mainPart, type modPart) {\
- highp type data = mainPart;\
- return data + modPart;\
- }\
- void packHighpData (out type mainPart, out type modPart, highp type data) {\
- mainPart = fract(data);\
- modPart = data - mainPart;\
- }\
- highp type unpackHighpData (type mainPart, type modPart, const float modValue) {\
- highp type data = mainPart * modValue;\
- return data + modPart * modValue;\
- }\
- void packHighpData (out type mainPart, out type modPart, highp type data, const float modValue) {\
- highp type divide = data / modValue;\
- mainPart = floor(divide);\
- modPart = (data - mainPart * modValue) / modValue;\
- }
- DEFINE_PACK_HIGHP_FUNC(float)
- DEFINE_PACK_HIGHP_FUNC(vec2)
- DEFINE_PACK_HIGHP_FUNC(vec3)
- DEFINE_PACK_HIGHP_FUNC(vec4)
- // Use these macros to define and assign high precision values in fs structs, otherwise will loss precisions with android + webgl platform
- #pragma define HIGHP_VALUE_STRUCT_DEFINE(type, name) \
- #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\
- type name, name##_fract_part;\
- #else\
- type name;\
- #endif\
- #pragma // empty pragma trick to get rid of trailing semicolons at effect compile time
- // used for large range such as position
- #pragma define HIGHP_VALUE_FROM_STRUCT_DEFINED(value, defined) \
- #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\
- value = unpackHighpData(defined, defined##_fract_part);\
- #else\
- value = defined;\
- #endif\
- #pragma // empty pragma trick to get rid of trailing semicolons at effect compile time
- #pragma define HIGHP_VALUE_TO_STRUCT_DEFINED(value, defined) \
- #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\
- packHighpData(defined, defined##_fract_part, value);\
- #else\
- defined = value;\
- #endif\
- #pragma // empty pragma trick to get rid of trailing semicolons at effect compile time
- // used for small range such as -1-1 normalized
- #pragma define HIGHP_VALUE_FROM_STRUCT_DEFINED_SMALL_RANGE(value, defined) \
- #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\
- value = unpackHighpData(defined, defined##_fract_part, 1000.0);\
- #else\
- value = defined;\
- #endif\
- #pragma // empty pragma trick to get rid of trailing semicolons at effect compile time
- #pragma define HIGHP_VALUE_TO_STRUCT_DEFINED_SMALL_RANGE(value, defined) \
- #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\
- packHighpData(defined, defined##_fract_part, value, 1000.0);\
- #else\
- defined = value;\
- #endif\
- #pragma // empty pragma trick to get rid of trailing semicolons at effect compile time
|