using System; using System.Collections; using System.Collections.Generic; using System.Runtime.InteropServices; using Intel.RealSense; using UnityEngine; [ProcessingBlockData(typeof(DepthCutoff))] public class DepthCutoff : RsProcessingBlock { public ushort Distance = 1000; ushort[] depthData; void OnDisable() { depthData = null; } Frame ApplyFilter(DepthFrame depth, FrameSource frameSource) { using (var p = depth.Profile) { var count = depth.Width * depth.Height; if (depthData == null || depthData.Length != count) depthData = new ushort[count]; depth.CopyTo(depthData); for (int i = 0; i < count; i++) { if (depthData[i] > Distance) depthData[i] = 0; } var v = frameSource.AllocateVideoFrame(p, depth, depth.BitsPerPixel, depth.Width, depth.Height, depth.Stride, Extension.DepthFrame); v.CopyFrom(depthData); return v; } } public override Frame Process(Frame frame, FrameSource frameSource) { if (frame.IsComposite) { using (var fs = FrameSet.FromFrame(frame)) using (var depth = fs.DepthFrame) { var v = ApplyFilter(depth, frameSource); // return v; // find and remove the original depth frame var frames = new List(); foreach (var f in fs) { using (var p1 = f.Profile) if (p1.Stream == Stream.Depth && p1.Format == Format.Z16) { f.Dispose(); continue; } frames.Add(f); } frames.Add(v); var res = frameSource.AllocateCompositeFrame(frames); frames.ForEach(f => f.Dispose()); using (res) return res.AsFrame(); } } if (frame is DepthFrame) return ApplyFilter(frame as DepthFrame, frameSource); return frame; } }