#pragma kernel EstimatePointCloudPosOfs

uint2 PointCloudRes;
//float2 SpaceScale;
float3 ImuUpVector;

uint MinDepth;
uint MaxDepth;

StructuredBuffer<float> SpaceTable;
StructuredBuffer<uint> DepthMap;

RWStructuredBuffer<float3> PointCloudPos;
RWStructuredBuffer<float> PointCloudOfs;
RWStructuredBuffer<bool> PointCloudMask;


[numthreads(8, 8, 1)]
void EstimatePointCloudPosOfs(uint3 id : SV_DispatchThreadID)
{
    uint i = id.x + id.y * PointCloudRes.x;

	uint depth2 = DepthMap[i >> 1];
	uint depth = i & 1 != 0 ? depth2 >> 16 : depth2 & 0xffff;
	depth = (depth >= MinDepth && depth <= MaxDepth) * depth;

	float fDepth = (float)depth / 1000.0;
	bool mask = depth != 0;

    float3 pos = float3(SpaceTable[i * 3] * fDepth, SpaceTable[i * 3 + 1] * fDepth, fDepth);
	float ofs = dot(ImuUpVector, pos) * mask;

	PointCloudPos[i] = pos;
	PointCloudOfs[i] = ofs;
	PointCloudMask[i] = mask;
}