You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
4.1 KiB
150 lines
4.1 KiB
using Intel.RealSense;
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading;
|
|
using UnityEngine;
|
|
using UnityEngine.SceneManagement;
|
|
using UnityEngine.UI;
|
|
|
|
[System.AttributeUsage(System.AttributeTargets.Class, AllowMultiple = false)]
|
|
public sealed class ProcessingBlockDataAttribute : System.Attribute
|
|
{
|
|
// See the attribute guidelines at
|
|
// http://go.microsoft.com/fwlink/?LinkId=85236
|
|
public readonly Type blockClass;
|
|
|
|
public ProcessingBlockDataAttribute(Type blockClass)
|
|
{
|
|
this.blockClass = blockClass;
|
|
}
|
|
}
|
|
|
|
|
|
[Serializable]
|
|
public class RsProcessingPipe : RsFrameProvider
|
|
{
|
|
public RsFrameProvider Source;
|
|
public RsProcessingProfile profile;
|
|
public override event Action<PipelineProfile> OnStart;
|
|
public override event Action OnStop;
|
|
public override event Action<Frame> OnNewSample;
|
|
private CustomProcessingBlock _block;
|
|
|
|
void Awake()
|
|
{
|
|
Source.OnStart += OnSourceStart;
|
|
Source.OnStop += OnSourceStop;
|
|
|
|
_block = new CustomProcessingBlock(ProcessFrame);
|
|
_block.Start(OnFrame);
|
|
}
|
|
|
|
private void OnSourceStart(PipelineProfile activeProfile)
|
|
{
|
|
Source.OnNewSample += _block.Process;
|
|
ActiveProfile = activeProfile;
|
|
|
|
// For the L5** device, disable processing blocks in the PointCloudProcessingBlocks scene, except for Temporaral Filter
|
|
if (ActiveProfile != null)
|
|
{
|
|
string devName = ActiveProfile.Device.Info.GetInfo(CameraInfo.Name);
|
|
if (!string.IsNullOrEmpty(devName) && devName.StartsWith("Intel RealSense L5", StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
GameObject pbPanel = GameObject.Find("ProcessingBlocks/ScrollRect/Viewport/Content");
|
|
if (pbPanel != null)
|
|
{
|
|
foreach (Transform child in pbPanel.transform)
|
|
{
|
|
if (!child.name.Equals("TemporaFilter"))
|
|
{
|
|
child.gameObject.SetActive(false);
|
|
Toggle toggle = child.transform.Find("Toggle").gameObject.GetComponent<Toggle>();
|
|
if (toggle != null && toggle.isOn)
|
|
toggle.isOn = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
Streaming = true;
|
|
var h = OnStart;
|
|
if (h != null)
|
|
h.Invoke(activeProfile);
|
|
}
|
|
|
|
private void OnSourceStop()
|
|
{
|
|
if (!Streaming)
|
|
return;
|
|
if (_block != null)
|
|
Source.OnNewSample -= _block.Process;
|
|
Streaming = false;
|
|
var h = OnStop;
|
|
if (h != null)
|
|
h();
|
|
}
|
|
|
|
private void OnFrame(Frame f)
|
|
{
|
|
var onNewSample = OnNewSample;
|
|
if (onNewSample != null)
|
|
onNewSample.Invoke(f);
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
OnSourceStop();
|
|
if (_block != null)
|
|
{
|
|
_block.Dispose();
|
|
_block = null;
|
|
}
|
|
}
|
|
|
|
internal void ProcessFrame(Frame frame, FrameSource src)
|
|
{
|
|
try
|
|
{
|
|
if (!Streaming)
|
|
return;
|
|
|
|
Frame f = frame;
|
|
|
|
if (profile != null)
|
|
{
|
|
var filters = profile._processingBlocks.AsReadOnly();
|
|
|
|
foreach (var pb in filters)
|
|
{
|
|
if (pb == null || !pb.Enabled)
|
|
continue;
|
|
|
|
var r = pb.Process(f, src);
|
|
if (r != f)
|
|
{
|
|
// Prevent from disposing the original frame during post-processing
|
|
if (f != frame)
|
|
{
|
|
f.Dispose();
|
|
}
|
|
f = r;
|
|
}
|
|
}
|
|
}
|
|
|
|
src.FrameReady(f);
|
|
|
|
if (f != frame)
|
|
f.Dispose();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Debug.LogException(e);
|
|
}
|
|
}
|
|
}
|