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 raw_available_list = new List(); 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 AvailableList { get { return frame[READY].available_list; } } public Dictionary 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; } }