Files
plugin-library/Assets/99.imdk_unity/Runtime/Scripts/XR/DataProcessing/DataProcessingChain.cs
2025-06-19 10:56:43 +08:00

109 lines
3.0 KiB
C#

/*===============================================================================
Copyright (C) 2024 Immersal - Part of Hexagon. All Rights Reserved.
This file is part of the Immersal SDK.
The Immersal SDK cannot be copied, distributed, or made available to
third-parties for commercial purposes without written permission of Immersal Ltd.
Contact sales@immersal.com for licensing requests.
===============================================================================*/
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
namespace Immersal.XR
{
public class DataProcessingChain<T> : IDataProcessingChain<T> where T : class
{
//private IDataProcessor<T>[] m_DataProcessors;
private List<IDataProcessor<T>> m_DataProcessors;
private T m_CurrentDataInChain = null;
private bool m_IsProcessing = false;
public DataProcessingChain()
{
m_DataProcessors = new List<IDataProcessor<T>>();
}
public DataProcessingChain(IDataProcessor<T>[] dataProcessors)
{
//m_DataProcessors = dataProcessors;
m_DataProcessors = new List<IDataProcessor<T>>(dataProcessors);
}
public void AddProcessor(IDataProcessor<T> processor)
{
m_DataProcessors.Add(processor);
}
public void RemoveProcessor(IDataProcessor<T> processor)
{
m_DataProcessors.Remove(processor);
}
public async Task ProcessNewData(T inputData)
{
await ProcessChain(inputData, DataProcessorTrigger.NewData);
}
public async Task UpdateChain()
{
if (m_CurrentDataInChain == null)
{
return;
}
await ProcessChain(m_CurrentDataInChain, DataProcessorTrigger.Update);
}
private async Task ProcessChain(T inputData, DataProcessorTrigger trigger)
{
if (m_IsProcessing)
return;
if (inputData == null)
return;
m_IsProcessing = true;
T dataBeingProcessed = inputData;
foreach (IDataProcessor<T> processor in m_DataProcessors)
{
dataBeingProcessed = await processor.ProcessData(dataBeingProcessed, trigger);
}
m_CurrentDataInChain = dataBeingProcessed;
m_IsProcessing = false;
}
public T GetCurrentData()
{
return m_CurrentDataInChain;
}
public async Task ResetProcessors()
{
foreach (IDataProcessor<T> processor in m_DataProcessors)
{
await processor.ResetProcessor();
}
}
}
public interface IDataProcessor<T>
{
Task<T> ProcessData(T data, DataProcessorTrigger trigger);
Task ResetProcessor();
}
public enum DataProcessorTrigger
{
NewData,
Update
}
}