LMQT/Assets/TouchScript/Scripts/Debugging/Loggers/PointerLogger.cs
2024-12-10 09:03:45 +08:00

136 lines
3.6 KiB
C#

/*
* @author Valentin Simonov / http://va.lent.in/
*/
#if TOUCHSCRIPT_DEBUG
using System;
using System.Collections.Generic;
using TouchScript.Debugging.Filters;
using TouchScript.Pointers;
using TouchScript.Utils;
namespace TouchScript.Debugging.Loggers
{
/// <summary>
/// A default implementation of <see cref="IPointerLogger"/> used in editor.
/// </summary>
/// <seealso cref="TouchScript.Debugging.Loggers.IPointerLogger" />
public class PointerLogger : IPointerLogger
{
#region Consts
public const int MIN_POINTER_LIST_SIZE = 1000;
#endregion
#region Public properties
/// <inheritdoc />
public int PointerCount
{
get { return pointerCount; }
}
#endregion
#region Private variables
private int pointerCount = 0;
private int eventCount = 0;
protected List<PointerData> data = new List<PointerData>(1);
protected List<List<PointerLog>> events = new List<List<PointerLog>>(1);
#endregion
#region Public methods
/// <inheritdoc />
public virtual void Log(Pointer pointer, PointerEvent evt)
{
var id = checkId(pointer);
var list = getPointerList(id);
var log = new PointerLog()
{
Id = eventCount,
Tick = DateTime.Now.Ticks,
PointerId = id,
Event = evt,
State = new PointerState()
{
Buttons = pointer.Buttons,
Position = pointer.Position,
PreviousPosition = pointer.PreviousPosition,
Flags = pointer.Flags,
Target = pointer.GetPressData().Target,
TargetPath = TransformUtils.GetHeirarchyPath(pointer.GetPressData().Target),
}
};
list.Add(log);
eventCount++;
}
/// <inheritdoc />
public virtual List<PointerData> GetFilteredPointerData(IPointerDataFilter filter = null)
{
//if (filter == null)
return new List<PointerData>(data);
}
/// <inheritdoc />
public virtual List<PointerLog> GetFilteredLogsForPointer(int id, IPointerLogFilter filter = null)
{
if (id < 0 || id >= pointerCount)
return new List<PointerLog>();
List<PointerLog> list = events[id];
if (filter == null)
return new List<PointerLog>(list);
var count = list.Count;
List<PointerLog> filtered = new List<PointerLog>(count);
for (var i = 0; i < count; i++)
{
var item = list[i];
if (filter.Applies(ref item)) filtered.Add(item);
}
return filtered;
}
/// <inheritdoc />
public virtual void Dispose() {}
#endregion
#region Private functions
private IList<PointerLog> getPointerList(int id)
{
return events[id];
}
private int checkId(Pointer pointer)
{
var id = pointer.Id;
if (id > pointerCount) throw new InvalidOperationException("Pointer id desync!");
if (id != pointerCount) return id;
var list = new List<PointerLog>(MIN_POINTER_LIST_SIZE);
events.Add(list);
data.Add(new PointerData()
{
Id = id,
Type = pointer.Type,
});
pointerCount++;
return id;
}
#endregion
}
}
#endif