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.

91 lines
2.4 KiB

using System.Collections.Generic;
using System;
using UnityEngine;
public class TuioBuffer
{
private int BACK = 0;
private int FRONT = 1;
private int READY = 2;
private TuioFrame[] frame = new TuioFrame[3];
private List<long> raw_available_list = new List<long>();
public TuioBuffer()
{
for (int i = 0; i < frame.Length; ++i)
frame[i] = new TuioFrame();
}
public void Add(TuioData data)
{
switch (data.phase)
{
case TouchPhase.Began:
raw_available_list.Add(data.container.SessionID);
break;
case TouchPhase.Ended:
raw_available_list.Remove(data.container.SessionID);
break;
default:
break;
}
frame[BACK].data_list.Add(data);
}
public void Refresh()
{
if (frame[BACK].data_list.Count == 0)
return;
frame[BACK].available_list.AddRange(raw_available_list);
lock (this)
{
swap(ref BACK, ref FRONT);
is_front_ok = true;
}
DateTime now = DateTime.Now;
double delta = (now - stamp).TotalSeconds;
double duration = 0.5;
smooth_delta += (delta - smooth_delta) * Math.Min(1.0, delta / duration);
FPS = 1.0 / smooth_delta;
stamp = now;
frame[BACK].data_list.Clear();
frame[BACK].available_list.Clear();
}
public void Update()
{
is_ready_ok = false;
if (is_front_ok)
{
lock (this)
{
swap(ref READY, ref FRONT);
is_front_ok = false;
}
is_ready_ok = true;
}
if (is_ready_ok)
updater.Update(frame[READY].data_list, frame[READY].available_list);
else
updater.Update();
}
private TuioUpdater updater = new TuioUpdater();
//public List<long> AvailableList { get { return frame[READY].available_list; } }
public Dictionary<long, TuioData> DataList { get { return updater.tuio_data_list; } }
public double FPS { get; private set; }
private bool is_front_ok = false;
private bool is_ready_ok = false;
private double smooth_delta;
private DateTime stamp = DateTime.Now;
private static void swap(ref int a, ref int b)
{
int tmp = a;
a = b;
b = tmp;
}
}