123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- //======= Copyright (c) Stereolabs Corporation, All rights reserved. ===============
- #if !defined(ZED_UTILS)
- #define ZED_UTILS
- #define MAX_DEPTH 0.9999f
- #if UNITY_REVERSED_Z
- #define NEAR_DEPTH MAX_DEPTH
- #define FAR_DEPTH 1 - MAX_DEPTH
- #else
- #define NEAR_DEPTH 1 - MAX_DEPTH
- #define FAR_DEPTH MAX_DEPTH
- #endif
- #define MAX_ZED_DEPTH 40
- #define MIN_ZED_DEPTH 0.1f
- #define ZED_CLAMP(name) name = clamp(name,MIN_ZED_DEPTH, MAX_ZED_DEPTH);
- #if UNITY_REVERSED_Z
- #define ZED_DEPTH_CLAMP(name) clamp(name,FAR_DEPTH, NEAR_DEPTH)
- #else
- #define ZED_DEPTH_CLAMP(name) clamp(name,NEAR_DEPTH, FAR_DEPTH)
- #endif
- #define ZED_PI 3.14159265359
- //Compute the depth of ZED to the Unity scale
- float computeDepthXYZ(float3 colorXYZ) {
- float d = FAR_DEPTH;
- //Unity BUG, (isinf(colorXYZ.z) && colorXYZ.z > 0 and isinf(colorXYZ.z) && colorXYZ.z < 0 pass together, and it's not a nan
- if (isinf(colorXYZ.z) && colorXYZ.z > 0) d = FAR_DEPTH;
- if (isinf(colorXYZ.z) && colorXYZ.z < 0) d += NEAR_DEPTH;
- if (d == FAR_DEPTH) return FAR_DEPTH;
- else if (d == (FAR_DEPTH + NEAR_DEPTH)) return NEAR_DEPTH;
- colorXYZ = clamp(colorXYZ, 0.01, 20);
- //reverse Y and Z axes
- colorXYZ.b = -colorXYZ.b;
- #if SHADER_API_D3D11
- colorXYZ.g = -colorXYZ.g;
- #elif SHADER_API_GLCORE
- colorXYZ.g = -colorXYZ.g * 2 + 1;
- #endif
- float4 v = float4(colorXYZ, 1);
- //Project to unity's coordinate
- float4 depthXYZVector = mul(UNITY_MATRIX_P, v);
- if (depthXYZVector.w != depthXYZVector.w) return FAR_DEPTH;
- depthXYZVector.b /= (depthXYZVector.w);
- float depthReal = depthXYZVector.b;
-
- return ZED_DEPTH_CLAMP(depthReal);
- }
- float3 applyQuatToVec3(float4 q, float3 v)
- {
- float3 t = 2 * cross(q.xyz, v);
- return v + q.w * t + cross(q.xyz, t);
- }
- //Compute the depth of ZED to the Unity scale
- float computeDepthXYZ(float colorXYZ) {
- if (isinf(colorXYZ) && colorXYZ > 0) return FAR_DEPTH;
- if (isinf(colorXYZ) && colorXYZ < 0) return NEAR_DEPTH;
- if (!isinf(colorXYZ) && !isfinite(colorXYZ)) return FAR_DEPTH;
- //if (colorXYZ != colorXYZ) return FAR_DEPTH; //Doesn't correctly check for a NaN, and neither does isnan().
- //colorXYZ = clamp(colorXYZ, 0.01, 20);
- #if SHADER_API_D3D11
- colorXYZ = -colorXYZ;
- #elif SHADER_API_GLCORE
- //colorXYZ = -colorXYZ * 2 + 1;
- colorXYZ = -colorXYZ * 2;
- #endif
- float4 v = float4(0,0, colorXYZ, 1);
- //Project to unity's coordinate
- float4 depthXYZVector = mul(UNITY_MATRIX_P, v);
- if (depthXYZVector.w != depthXYZVector.w) return FAR_DEPTH;
- depthXYZVector.b /= (depthXYZVector.w);
- float depthReal = depthXYZVector.b;
- return ZED_DEPTH_CLAMP(depthReal);
- }
- //Remove the optical center of the projection matrix for a specific object
- float4 GetPosWithoutOpticalCenter(float4 vertex) {
- float4x4 copy_projection = UNITY_MATRIX_P;
- copy_projection[0][2] = 0;
- copy_projection[1][2] = 0;
- return mul(mul(mul(copy_projection, UNITY_MATRIX_V), UNITY_MATRIX_M), vertex);
- }
- //Converts RGB to YUV
- float3 RGBtoYUV(float3 rgb)
- {
- float4x4 RGB2YUV = { 0.182586, 0.614231, 0.062007, 0.062745,
- -0.100644, -0.338572, 0.439216, 0.501961,
- 0.439216, -0.398942, -0.040274, 0.501961,
- 0.000000, 0.000000, 0.000000, 1.000000 };
- return mul(RGB2YUV, float4(rgb,1)).rgb;
- }
- //Algorithm to compute the alpha of a frag depending of the similarity of a color.
- //ColorCamera is the color from a texture given by the camera
- float computeAlphaYUVFromYUV(float3 colorCamera, in float3 keyColor) {
- return distance(keyColor.yz, colorCamera.yz);
- }
- // Decode uint32 into RGBA
- float4 PCDecodeColor(uint data)
- {
- float b = (data) & 0xff;
- float g = (data >> 8) & 0xff;
- float r = (data >> 16) & 0xff;
- float a = (data >> 24) & 0xff;
- return float4(r / 255.f, g / 255.f, b / 255.f, a / 255.f);
- }
- #endif
|