using Intel.RealSense;

[ProcessingBlockDataAttribute(typeof(PointCloud))]
public class RsPointCloud : RsProcessingBlock
{
    public enum OcclusionRemoval
    {
        Off = 1,
        On = 2
    }

    public Stream TextureStream = Stream.Color;
    public Format TextureFormat = Format.Any;
    public OcclusionRemoval _occlusionRemoval = OcclusionRemoval.Off;

    PointCloud _pb;
    private IOption filterMag;
    private IOption streamFilter;
    private IOption formatFilter;

    private readonly object _lock = new object();

    public void Init()
    {
        lock (_lock)
        {
            _pb = new PointCloud();
            filterMag = _pb.Options[Option.FilterMagnitude];
            streamFilter = _pb.Options[Option.StreamFilter];
            formatFilter = _pb.Options[Option.StreamFormatFilter];
        }
    }

    void OnDisable()
    {
        lock (_lock)
        {
            if (_pb != null)
            {
                _pb.Dispose();
                _pb = null;
            }
        }
    }

    public override Frame Process(Frame frame, FrameSource frameSource)
    {
        lock (_lock)
        {
            if (_pb == null)
            {
                Init();
            }
        }

        UpdateOptions(frame.IsComposite);

        return _pb.Process(frame);
    }

    private void UpdateOptions(bool isComposite)
    {
        filterMag.Value = (float)_occlusionRemoval;
        if (isComposite)
        {
            streamFilter.Value = (float)TextureStream;
            formatFilter.Value = (float)TextureFormat;
        }
    }
}