Move part of the input module to Cryville.Input.
This commit is contained in:
@@ -1,92 +0,0 @@
|
|||||||
using System;
|
|
||||||
using UnityEngine;
|
|
||||||
|
|
||||||
namespace Cryville.Common.Unity.Input {
|
|
||||||
public class AndroidTouchHandler : InputHandler {
|
|
||||||
readonly AndroidTouchListener _listener;
|
|
||||||
readonly AndroidJavaClass _systemClock;
|
|
||||||
|
|
||||||
public AndroidTouchHandler() {
|
|
||||||
if (Environment.OSVersion.Platform != PlatformID.Unix)
|
|
||||||
throw new NotSupportedException("Android touch is not supported on this device");
|
|
||||||
_systemClock = new AndroidJavaClass("android.os.SystemClock");
|
|
||||||
new AndroidJavaClass("com.unity3d.player.UnityPlayer")
|
|
||||||
.GetStatic<AndroidJavaObject>("currentActivity")
|
|
||||||
.Get<AndroidJavaObject>("mUnityPlayer")
|
|
||||||
.Call("setOnTouchListener", _listener = new AndroidTouchListener(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void Activate() {
|
|
||||||
_listener.Activated = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void Deactivate() {
|
|
||||||
_listener.Activated = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Dispose(bool disposing) {
|
|
||||||
if (disposing) {
|
|
||||||
Deactivate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool IsNullable(int type) {
|
|
||||||
if (type != 0) throw new ArgumentOutOfRangeException("type");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override byte GetDimension(int type) {
|
|
||||||
if (type != 0) throw new ArgumentOutOfRangeException("type");
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string GetTypeName(int type) {
|
|
||||||
switch (type) {
|
|
||||||
case 0: return "Android Touch";
|
|
||||||
default: throw new ArgumentOutOfRangeException("type");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override double GetCurrentTimestamp() {
|
|
||||||
return _systemClock.CallStatic<long>("uptimeMillis") / 1000.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
class AndroidTouchListener : AndroidJavaProxy {
|
|
||||||
public bool Activated { get; set; }
|
|
||||||
|
|
||||||
readonly AndroidTouchHandler _handler;
|
|
||||||
|
|
||||||
public AndroidTouchListener(AndroidTouchHandler handler) : base("android.view.View$OnTouchListener") {
|
|
||||||
_handler = handler;
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma warning disable IDE1006
|
|
||||||
#pragma warning disable IDE0060
|
|
||||||
public bool onTouch(AndroidJavaObject v, AndroidJavaObject e) {
|
|
||||||
if (!Activated) return false;
|
|
||||||
try {
|
|
||||||
int pointerCount = e.Call<int>("getPointerCount");
|
|
||||||
for (int i = 0; i < pointerCount; i++) {
|
|
||||||
int id = e.Call<int>("getPointerId", i);
|
|
||||||
double time = e.Call<long>("getEventTime") / 1000.0;
|
|
||||||
int action = e.Call<int>("getActionMasked");
|
|
||||||
Vector2 pos = UnityCameraUtils.ScreenToWorldPoint(new Vector2(
|
|
||||||
e.Call<float>("getX", i),
|
|
||||||
e.Call<float>("getY", i)
|
|
||||||
));
|
|
||||||
_handler.Feed(0, id, new InputVector(time, pos));
|
|
||||||
if (action == 1 /*ACTION_UP*/ || action == 3 /*ACTION_CANCEL*/ || (action == 6 /*ACTION_POINTER_UP*/ && e.Call<int>("getActionIndex") == i)) {
|
|
||||||
_handler.Feed(0, id, new InputVector(time));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex) {
|
|
||||||
Logger.Log("main", 4, "Input", "An error occured while handling an Android touch event: {0}", ex);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#pragma warning restore IDE0060
|
|
||||||
#pragma warning restore IDE1006
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,110 +0,0 @@
|
|||||||
using Cryville.Common.Reflection;
|
|
||||||
using System;
|
|
||||||
using UnityEngine;
|
|
||||||
|
|
||||||
namespace Cryville.Common.Unity.Input {
|
|
||||||
public delegate void InputEventDelegate(InputIdentifier id, InputVector vec);
|
|
||||||
public abstract class InputHandler : IDisposable {
|
|
||||||
InputEventDelegate m_onInput;
|
|
||||||
public event InputEventDelegate OnInput {
|
|
||||||
add {
|
|
||||||
if (m_onInput == null) Activate();
|
|
||||||
m_onInput -= value;
|
|
||||||
m_onInput += value;
|
|
||||||
}
|
|
||||||
remove {
|
|
||||||
if (m_onInput == null) return;
|
|
||||||
m_onInput -= value;
|
|
||||||
if (m_onInput == null) Deactivate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
~InputHandler() {
|
|
||||||
Dispose(false);
|
|
||||||
}
|
|
||||||
public void Dispose() {
|
|
||||||
Dispose(true);
|
|
||||||
GC.SuppressFinalize(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract void Activate();
|
|
||||||
protected abstract void Deactivate();
|
|
||||||
public abstract void Dispose(bool disposing);
|
|
||||||
public abstract bool IsNullable(int type);
|
|
||||||
public abstract byte GetDimension(int type);
|
|
||||||
public abstract string GetTypeName(int type);
|
|
||||||
public abstract double GetCurrentTimestamp();
|
|
||||||
protected void Feed(int type, int id, InputVector vec) {
|
|
||||||
var del = m_onInput;
|
|
||||||
if (del != null) del(new InputIdentifier { Source = new InputSource { Handler = this, Type = type }, Id = id }, vec);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public struct InputSource : IEquatable<InputSource> {
|
|
||||||
public InputHandler Handler { get; set; }
|
|
||||||
public int Type { get; set; }
|
|
||||||
public override bool Equals(object obj) {
|
|
||||||
if (obj == null || !(obj is InputSource)) return false;
|
|
||||||
return Equals((InputSource)obj);
|
|
||||||
}
|
|
||||||
public bool Equals(InputSource other) {
|
|
||||||
return Handler == other.Handler && Type == other.Type;
|
|
||||||
}
|
|
||||||
public override int GetHashCode() {
|
|
||||||
return Handler.GetHashCode() ^ Type;
|
|
||||||
}
|
|
||||||
public override string ToString() {
|
|
||||||
return string.Format("{0}:{1}", TypeNameHelper.GetSimpleName(Handler.GetType()), Handler.GetTypeName(Type));
|
|
||||||
}
|
|
||||||
public static bool operator ==(InputSource lhs, InputSource rhs) {
|
|
||||||
return lhs.Equals(rhs);
|
|
||||||
}
|
|
||||||
public static bool operator !=(InputSource lhs, InputSource rhs) {
|
|
||||||
return !lhs.Equals(rhs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public struct InputIdentifier : IEquatable<InputIdentifier> {
|
|
||||||
public InputSource Source { get; set; }
|
|
||||||
public int Id { get; set; }
|
|
||||||
public override bool Equals(object obj) {
|
|
||||||
if (obj == null || !(obj is InputIdentifier)) return false;
|
|
||||||
return Equals((InputIdentifier)obj);
|
|
||||||
}
|
|
||||||
public bool Equals(InputIdentifier other) {
|
|
||||||
return Source == other.Source && Id == other.Id;
|
|
||||||
}
|
|
||||||
public override int GetHashCode() {
|
|
||||||
return Source.GetHashCode() ^ ((Id << 16) | (Id >> 16));
|
|
||||||
}
|
|
||||||
public override string ToString() {
|
|
||||||
return string.Format("{0},{1}", Source, Id);
|
|
||||||
}
|
|
||||||
public static bool operator ==(InputIdentifier lhs, InputIdentifier rhs) {
|
|
||||||
return lhs.Equals(rhs);
|
|
||||||
}
|
|
||||||
public static bool operator !=(InputIdentifier lhs, InputIdentifier rhs) {
|
|
||||||
return !lhs.Equals(rhs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public struct InputVector {
|
|
||||||
public double Time { get; set; }
|
|
||||||
public bool IsNull { get; set; }
|
|
||||||
public Vector3 Vector { get; set; }
|
|
||||||
public InputVector(double time) {
|
|
||||||
Time = time;
|
|
||||||
IsNull = true;
|
|
||||||
Vector = default(Vector3);
|
|
||||||
}
|
|
||||||
public InputVector(double time, Vector3 vector) {
|
|
||||||
Time = time;
|
|
||||||
IsNull = false;
|
|
||||||
Vector = vector;
|
|
||||||
}
|
|
||||||
public override string ToString() {
|
|
||||||
if (IsNull) return string.Format("null@{0}", Time);
|
|
||||||
else return string.Format("{0}@{1}", Vector.ToString("G9"), Time);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,49 +0,0 @@
|
|||||||
using Cryville.Common.Logging;
|
|
||||||
using Cryville.Common.Reflection;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Reflection;
|
|
||||||
|
|
||||||
namespace Cryville.Common.Unity.Input {
|
|
||||||
public class InputManager {
|
|
||||||
static readonly HashSet<Type> HandlerRegistries = new HashSet<Type> {
|
|
||||||
typeof(WindowsPointerHandler),
|
|
||||||
typeof(AndroidTouchHandler),
|
|
||||||
typeof(UnityKeyHandler<UnityKeyboardReceiver>),
|
|
||||||
typeof(UnityKeyHandler<UnityMouseButtonReceiver>),
|
|
||||||
typeof(UnityMouseHandler),
|
|
||||||
typeof(UnityTouchHandler),
|
|
||||||
};
|
|
||||||
readonly HashSet<InputHandler> _handlers = new HashSet<InputHandler>();
|
|
||||||
readonly Dictionary<Type, InputHandler> _typemap = new Dictionary<Type, InputHandler>();
|
|
||||||
public InputManager() {
|
|
||||||
foreach (var t in HandlerRegistries) {
|
|
||||||
try {
|
|
||||||
if (!typeof(InputHandler).IsAssignableFrom(t)) continue;
|
|
||||||
var h = (InputHandler)Activator.CreateInstance(t);
|
|
||||||
_typemap.Add(t, h);
|
|
||||||
_handlers.Add(h);
|
|
||||||
Logger.Log("main", 1, "Input", "Initialized {0}", TypeNameHelper.GetSimpleName(t));
|
|
||||||
}
|
|
||||||
catch (TargetInvocationException ex) {
|
|
||||||
Logger.Log("main", 1, "Input", "Cannot initialize {0}: {1}", TypeNameHelper.GetSimpleName(t), ex.InnerException.Message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public InputHandler GetHandler(string name) {
|
|
||||||
return _typemap[Type.GetType(name)];
|
|
||||||
}
|
|
||||||
public void EnumerateHandlers(Action<InputHandler> cb) {
|
|
||||||
foreach (var h in _handlers) cb(h);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public struct InputEvent {
|
|
||||||
public InputIdentifier Id { get; set; }
|
|
||||||
public InputVector From { get; set; }
|
|
||||||
public InputVector To { get; set; }
|
|
||||||
public override string ToString() {
|
|
||||||
return string.Format("[{0}] {1} -> {2}", Id, From, To);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,12 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: aaf7daeaf7afb3146b3eea2a07f88055
|
|
||||||
timeCreated: 1611035810
|
|
||||||
licenseType: Free
|
|
||||||
MonoImporter:
|
|
||||||
serializedVersion: 2
|
|
||||||
defaultReferences: []
|
|
||||||
executionOrder: 0
|
|
||||||
icon: {instanceID: 0}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
@@ -1,528 +0,0 @@
|
|||||||
namespace Cryville.Common.Unity.Input {
|
|
||||||
public enum WindowMessages : uint {
|
|
||||||
WM_NULL = 0x0000,
|
|
||||||
WM_CREATE = 0x0001,
|
|
||||||
WM_DESTROY = 0x0002,
|
|
||||||
WM_MOVE = 0x0003,
|
|
||||||
WM_SIZE = 0x0005,
|
|
||||||
|
|
||||||
WM_ACTIVATE = 0x0006,
|
|
||||||
/*
|
|
||||||
* WM_ACTIVATE state values
|
|
||||||
*/
|
|
||||||
WA_INACTIVE = 0,
|
|
||||||
WA_ACTIVE = 1,
|
|
||||||
WA_CLICKACTIVE = 2,
|
|
||||||
|
|
||||||
WM_SETFOCUS = 0x0007,
|
|
||||||
WM_KILLFOCUS = 0x0008,
|
|
||||||
WM_ENABLE = 0x000A,
|
|
||||||
WM_SETREDRAW = 0x000B,
|
|
||||||
WM_SETTEXT = 0x000C,
|
|
||||||
WM_GETTEXT = 0x000D,
|
|
||||||
WM_GETTEXTLENGTH = 0x000E,
|
|
||||||
WM_PAINT = 0x000F,
|
|
||||||
WM_CLOSE = 0x0010,
|
|
||||||
//#ifndef _WIN32_WCE
|
|
||||||
WM_QUERYENDSESSION = 0x0011,
|
|
||||||
WM_QUERYOPEN = 0x0013,
|
|
||||||
WM_ENDSESSION = 0x0016,
|
|
||||||
//#endif
|
|
||||||
WM_QUIT = 0x0012,
|
|
||||||
WM_ERASEBKGND = 0x0014,
|
|
||||||
WM_SYSCOLORCHANGE = 0x0015,
|
|
||||||
WM_SHOWWINDOW = 0x0018,
|
|
||||||
WM_WININICHANGE = 0x001A,
|
|
||||||
//#if(WINVER >= 0x0400)
|
|
||||||
WM_SETTINGCHANGE = WM_WININICHANGE,
|
|
||||||
//#endif /* WINVER >= 0x0400 */
|
|
||||||
|
|
||||||
|
|
||||||
WM_DEVMODECHANGE = 0x001B,
|
|
||||||
WM_ACTIVATEAPP = 0x001C,
|
|
||||||
WM_FONTCHANGE = 0x001D,
|
|
||||||
WM_TIMECHANGE = 0x001E,
|
|
||||||
WM_CANCELMODE = 0x001F,
|
|
||||||
WM_SETCURSOR = 0x0020,
|
|
||||||
WM_MOUSEACTIVATE = 0x0021,
|
|
||||||
WM_CHILDACTIVATE = 0x0022,
|
|
||||||
WM_QUEUESYNC = 0x0023,
|
|
||||||
|
|
||||||
WM_GETMINMAXINFO = 0x0024,
|
|
||||||
WM_PAINTICON = 0x0026,
|
|
||||||
WM_ICONERASEBKGND = 0x0027,
|
|
||||||
WM_NEXTDLGCTL = 0x0028,
|
|
||||||
WM_SPOOLERSTATUS = 0x002A,
|
|
||||||
WM_DRAWITEM = 0x002B,
|
|
||||||
WM_MEASUREITEM = 0x002C,
|
|
||||||
WM_DELETEITEM = 0x002D,
|
|
||||||
WM_VKEYTOITEM = 0x002E,
|
|
||||||
WM_CHARTOITEM = 0x002F,
|
|
||||||
WM_SETFONT = 0x0030,
|
|
||||||
WM_GETFONT = 0x0031,
|
|
||||||
WM_SETHOTKEY = 0x0032,
|
|
||||||
WM_GETHOTKEY = 0x0033,
|
|
||||||
WM_QUERYDRAGICON = 0x0037,
|
|
||||||
WM_COMPAREITEM = 0x0039,
|
|
||||||
//#if(WINVER >= 0x0500)
|
|
||||||
//#ifndef _WIN32_WCE
|
|
||||||
WM_GETOBJECT = 0x003D,
|
|
||||||
//#endif
|
|
||||||
//#endif /* WINVER >= 0x0500 */
|
|
||||||
WM_COMPACTING = 0x0041,
|
|
||||||
WM_COMMNOTIFY = 0x0044, /* no longer suported */
|
|
||||||
WM_WINDOWPOSCHANGING = 0x0046,
|
|
||||||
WM_WINDOWPOSCHANGED = 0x0047,
|
|
||||||
|
|
||||||
WM_POWER = 0x0048,
|
|
||||||
/*
|
|
||||||
* wParam for WM_POWER window message and DRV_POWER driver notification
|
|
||||||
*/
|
|
||||||
/*PWR_OK = 1,
|
|
||||||
PWR_FAIL = (-1),
|
|
||||||
PWR_SUSPENDREQUEST = 1,
|
|
||||||
PWR_SUSPENDRESUME = 2,
|
|
||||||
PWR_CRITICALRESUME = 3,*/
|
|
||||||
|
|
||||||
WM_COPYDATA = 0x004A,
|
|
||||||
WM_CANCELJOURNAL = 0x004B,
|
|
||||||
|
|
||||||
|
|
||||||
//#if(WINVER >= 0x0400)
|
|
||||||
WM_NOTIFY = 0x004E,
|
|
||||||
WM_INPUTLANGCHANGEREQUEST = 0x0050,
|
|
||||||
WM_INPUTLANGCHANGE = 0x0051,
|
|
||||||
WM_TCARD = 0x0052,
|
|
||||||
WM_HELP = 0x0053,
|
|
||||||
WM_USERCHANGED = 0x0054,
|
|
||||||
WM_NOTIFYFORMAT = 0x0055,
|
|
||||||
|
|
||||||
NFR_ANSI = 1,
|
|
||||||
NFR_UNICODE = 2,
|
|
||||||
NF_QUERY = 3,
|
|
||||||
NF_REQUERY = 4,
|
|
||||||
|
|
||||||
WM_CONTEXTMENU = 0x007B,
|
|
||||||
WM_STYLECHANGING = 0x007C,
|
|
||||||
WM_STYLECHANGED = 0x007D,
|
|
||||||
WM_DISPLAYCHANGE = 0x007E,
|
|
||||||
WM_GETICON = 0x007F,
|
|
||||||
WM_SETICON = 0x0080,
|
|
||||||
//#endif /* WINVER >= 0x0400 */
|
|
||||||
|
|
||||||
WM_NCCREATE = 0x0081,
|
|
||||||
WM_NCDESTROY = 0x0082,
|
|
||||||
WM_NCCALCSIZE = 0x0083,
|
|
||||||
WM_NCHITTEST = 0x0084,
|
|
||||||
WM_NCPAINT = 0x0085,
|
|
||||||
WM_NCACTIVATE = 0x0086,
|
|
||||||
WM_GETDLGCODE = 0x0087,
|
|
||||||
//#ifndef _WIN32_WCE
|
|
||||||
WM_SYNCPAINT = 0x0088,
|
|
||||||
//#endif
|
|
||||||
WM_NCMOUSEMOVE = 0x00A0,
|
|
||||||
WM_NCLBUTTONDOWN = 0x00A1,
|
|
||||||
WM_NCLBUTTONUP = 0x00A2,
|
|
||||||
WM_NCLBUTTONDBLCLK = 0x00A3,
|
|
||||||
WM_NCRBUTTONDOWN = 0x00A4,
|
|
||||||
WM_NCRBUTTONUP = 0x00A5,
|
|
||||||
WM_NCRBUTTONDBLCLK = 0x00A6,
|
|
||||||
WM_NCMBUTTONDOWN = 0x00A7,
|
|
||||||
WM_NCMBUTTONUP = 0x00A8,
|
|
||||||
WM_NCMBUTTONDBLCLK = 0x00A9,
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//#if(_WIN32_WINNT >= 0x0500)
|
|
||||||
WM_NCXBUTTONDOWN = 0x00AB,
|
|
||||||
WM_NCXBUTTONUP = 0x00AC,
|
|
||||||
WM_NCXBUTTONDBLCLK = 0x00AD,
|
|
||||||
//#endif /* _WIN32_WINNT >= 0x0500 */
|
|
||||||
|
|
||||||
|
|
||||||
//#if(_WIN32_WINNT >= 0x0501)
|
|
||||||
WM_INPUT_DEVICE_CHANGE = 0x00FE,
|
|
||||||
//#endif /* _WIN32_WINNT >= 0x0501 */
|
|
||||||
|
|
||||||
//#if(_WIN32_WINNT >= 0x0501)
|
|
||||||
WM_INPUT = 0x00FF,
|
|
||||||
//#endif /* _WIN32_WINNT >= 0x0501 */
|
|
||||||
|
|
||||||
WM_KEYFIRST = 0x0100,
|
|
||||||
WM_KEYDOWN = 0x0100,
|
|
||||||
WM_KEYUP = 0x0101,
|
|
||||||
WM_CHAR = 0x0102,
|
|
||||||
WM_DEADCHAR = 0x0103,
|
|
||||||
WM_SYSKEYDOWN = 0x0104,
|
|
||||||
WM_SYSKEYUP = 0x0105,
|
|
||||||
WM_SYSCHAR = 0x0106,
|
|
||||||
WM_SYSDEADCHAR = 0x0107,
|
|
||||||
//#if(_WIN32_WINNT >= 0x0501)
|
|
||||||
WM_UNICHAR = 0x0109,
|
|
||||||
WM_KEYLAST = 0x0109,
|
|
||||||
UNICODE_NOCHAR = 0xFFFF,
|
|
||||||
//#else
|
|
||||||
WM_KEYLAST__WIN2000 = 0x0108,
|
|
||||||
//#endif /* _WIN32_WINNT >= 0x0501 */
|
|
||||||
|
|
||||||
//#if(WINVER >= 0x0400)
|
|
||||||
WM_IME_STARTCOMPOSITION = 0x010D,
|
|
||||||
WM_IME_ENDCOMPOSITION = 0x010E,
|
|
||||||
WM_IME_COMPOSITION = 0x010F,
|
|
||||||
WM_IME_KEYLAST = 0x010F,
|
|
||||||
//#endif /* WINVER >= 0x0400 */
|
|
||||||
|
|
||||||
WM_INITDIALOG = 0x0110,
|
|
||||||
WM_COMMAND = 0x0111,
|
|
||||||
WM_SYSCOMMAND = 0x0112,
|
|
||||||
WM_TIMER = 0x0113,
|
|
||||||
WM_HSCROLL = 0x0114,
|
|
||||||
WM_VSCROLL = 0x0115,
|
|
||||||
WM_INITMENU = 0x0116,
|
|
||||||
WM_INITMENUPOPUP = 0x0117,
|
|
||||||
//#if(WINVER >= 0x0601)
|
|
||||||
WM_GESTURE = 0x0119,
|
|
||||||
WM_GESTURENOTIFY = 0x011A,
|
|
||||||
//#endif /* WINVER >= 0x0601 */
|
|
||||||
WM_MENUSELECT = 0x011F,
|
|
||||||
WM_MENUCHAR = 0x0120,
|
|
||||||
WM_ENTERIDLE = 0x0121,
|
|
||||||
//#if(WINVER >= 0x0500)
|
|
||||||
//#ifndef _WIN32_WCE
|
|
||||||
WM_MENURBUTTONUP = 0x0122,
|
|
||||||
WM_MENUDRAG = 0x0123,
|
|
||||||
WM_MENUGETOBJECT = 0x0124,
|
|
||||||
WM_UNINITMENUPOPUP = 0x0125,
|
|
||||||
WM_MENUCOMMAND = 0x0126,
|
|
||||||
|
|
||||||
//#ifndef _WIN32_WCE
|
|
||||||
//#if(_WIN32_WINNT >= 0x0500)
|
|
||||||
WM_CHANGEUISTATE = 0x0127,
|
|
||||||
WM_UPDATEUISTATE = 0x0128,
|
|
||||||
WM_QUERYUISTATE = 0x0129,
|
|
||||||
|
|
||||||
/*
|
|
||||||
* LOWORD(wParam) values in WM_*UISTATE*
|
|
||||||
*/
|
|
||||||
UIS_SET = 1,
|
|
||||||
UIS_CLEAR = 2,
|
|
||||||
UIS_INITIALIZE = 3,
|
|
||||||
|
|
||||||
/*
|
|
||||||
* HIWORD(wParam) values in WM_*UISTATE*
|
|
||||||
*/
|
|
||||||
UISF_HIDEFOCUS = 0x1,
|
|
||||||
UISF_HIDEACCEL = 0x2,
|
|
||||||
//#if(_WIN32_WINNT >= 0x0501)
|
|
||||||
UISF_ACTIVE = 0x4,
|
|
||||||
//#endif /* _WIN32_WINNT >= 0x0501 */
|
|
||||||
//#endif /* _WIN32_WINNT >= 0x0500 */
|
|
||||||
//#endif
|
|
||||||
|
|
||||||
//#endif
|
|
||||||
//#endif /* WINVER >= 0x0500 */
|
|
||||||
|
|
||||||
WM_CTLCOLORMSGBOX = 0x0132,
|
|
||||||
WM_CTLCOLOREDIT = 0x0133,
|
|
||||||
WM_CTLCOLORLISTBOX = 0x0134,
|
|
||||||
WM_CTLCOLORBTN = 0x0135,
|
|
||||||
WM_CTLCOLORDLG = 0x0136,
|
|
||||||
WM_CTLCOLORSCROLLBAR = 0x0137,
|
|
||||||
WM_CTLCOLORSTATIC = 0x0138,
|
|
||||||
MN_GETHMENU = 0x01E1,
|
|
||||||
|
|
||||||
WM_MOUSEFIRST = 0x0200,
|
|
||||||
WM_MOUSEMOVE = 0x0200,
|
|
||||||
WM_LBUTTONDOWN = 0x0201,
|
|
||||||
WM_LBUTTONUP = 0x0202,
|
|
||||||
WM_LBUTTONDBLCLK = 0x0203,
|
|
||||||
WM_RBUTTONDOWN = 0x0204,
|
|
||||||
WM_RBUTTONUP = 0x0205,
|
|
||||||
WM_RBUTTONDBLCLK = 0x0206,
|
|
||||||
WM_MBUTTONDOWN = 0x0207,
|
|
||||||
WM_MBUTTONUP = 0x0208,
|
|
||||||
WM_MBUTTONDBLCLK = 0x0209,
|
|
||||||
//#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
|
|
||||||
WM_MOUSEWHEEL = 0x020A,
|
|
||||||
//#endif
|
|
||||||
//#if (_WIN32_WINNT >= 0x0500)
|
|
||||||
WM_XBUTTONDOWN = 0x020B,
|
|
||||||
WM_XBUTTONUP = 0x020C,
|
|
||||||
WM_XBUTTONDBLCLK = 0x020D,
|
|
||||||
//#endif
|
|
||||||
//#if (_WIN32_WINNT >= 0x0600)
|
|
||||||
WM_MOUSEHWHEEL = 0x020E,
|
|
||||||
//#endif
|
|
||||||
|
|
||||||
//#if (_WIN32_WINNT >= 0x0600)
|
|
||||||
WM_MOUSELAST = 0x020E,
|
|
||||||
//#elif (_WIN32_WINNT >= 0x0500)
|
|
||||||
WM_MOUSELAST__WIN2000 = 0x020D,
|
|
||||||
//#elif (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
|
|
||||||
WM_MOUSELAST__WIN4 = 0x020A,
|
|
||||||
//#else
|
|
||||||
WM_MOUSELAST__WIN3 = 0x0209,
|
|
||||||
//#endif /* (_WIN32_WINNT >= 0x0600) */
|
|
||||||
|
|
||||||
|
|
||||||
//#if(_WIN32_WINNT >= 0x0400)
|
|
||||||
/* Value for rolling one detent */
|
|
||||||
WHEEL_DELTA = 120,
|
|
||||||
//GET_WHEEL_DELTA_WPARAM(wParam) ((short)HIWORD(wParam))
|
|
||||||
|
|
||||||
/* Setting to scroll one page for SPI_GET/SETWHEELSCROLLLINES */
|
|
||||||
WHEEL_PAGESCROLL = (uint.MaxValue),
|
|
||||||
//#endif /* _WIN32_WINNT >= 0x0400 */
|
|
||||||
|
|
||||||
//#if(_WIN32_WINNT >= 0x0500)
|
|
||||||
//GET_KEYSTATE_WPARAM(wParam) (LOWORD(wParam))
|
|
||||||
//GET_NCHITTEST_WPARAM(wParam) ((short)LOWORD(wParam))
|
|
||||||
//GET_XBUTTON_WPARAM(wParam) (HIWORD(wParam))
|
|
||||||
|
|
||||||
/* XButton values are WORD flags */
|
|
||||||
XBUTTON1 = 0x0001,
|
|
||||||
XBUTTON2 = 0x0002,
|
|
||||||
/* Were there to be an XBUTTON3, its value would be 0x0004 */
|
|
||||||
//#endif /* _WIN32_WINNT >= 0x0500 */
|
|
||||||
|
|
||||||
WM_PARENTNOTIFY = 0x0210,
|
|
||||||
WM_ENTERMENULOOP = 0x0211,
|
|
||||||
WM_EXITMENULOOP = 0x0212,
|
|
||||||
|
|
||||||
//#if(WINVER >= 0x0400)
|
|
||||||
WM_NEXTMENU = 0x0213,
|
|
||||||
WM_SIZING = 0x0214,
|
|
||||||
WM_CAPTURECHANGED = 0x0215,
|
|
||||||
WM_MOVING = 0x0216,
|
|
||||||
WM_POWERBROADCAST = 0x0218,
|
|
||||||
//#endif /* WINVER >= 0x0400 */
|
|
||||||
//#if(WINVER >= 0x0400)
|
|
||||||
WM_DEVICECHANGE = 0x0219,
|
|
||||||
//#endif /* WINVER >= 0x0400 */
|
|
||||||
|
|
||||||
WM_MDICREATE = 0x0220,
|
|
||||||
WM_MDIDESTROY = 0x0221,
|
|
||||||
WM_MDIACTIVATE = 0x0222,
|
|
||||||
WM_MDIRESTORE = 0x0223,
|
|
||||||
WM_MDINEXT = 0x0224,
|
|
||||||
WM_MDIMAXIMIZE = 0x0225,
|
|
||||||
WM_MDITILE = 0x0226,
|
|
||||||
WM_MDICASCADE = 0x0227,
|
|
||||||
WM_MDIICONARRANGE = 0x0228,
|
|
||||||
WM_MDIGETACTIVE = 0x0229,
|
|
||||||
|
|
||||||
|
|
||||||
WM_MDISETMENU = 0x0230,
|
|
||||||
WM_ENTERSIZEMOVE = 0x0231,
|
|
||||||
WM_EXITSIZEMOVE = 0x0232,
|
|
||||||
WM_DROPFILES = 0x0233,
|
|
||||||
WM_MDIREFRESHMENU = 0x0234,
|
|
||||||
|
|
||||||
//#if(WINVER >= 0x0602)
|
|
||||||
WM_POINTERDEVICECHANGE = 0x238,
|
|
||||||
WM_POINTERDEVICEINRANGE = 0x239,
|
|
||||||
WM_POINTERDEVICEOUTOFRANGE = 0x23A,
|
|
||||||
//#endif /* WINVER >= 0x0602 */
|
|
||||||
|
|
||||||
|
|
||||||
//#if(WINVER >= 0x0601)
|
|
||||||
WM_TOUCH = 0x0240,
|
|
||||||
//#endif /* WINVER >= 0x0601 */
|
|
||||||
|
|
||||||
//#if(WINVER >= 0x0602)
|
|
||||||
WM_NCPOINTERUPDATE = 0x0241,
|
|
||||||
WM_NCPOINTERDOWN = 0x0242,
|
|
||||||
WM_NCPOINTERUP = 0x0243,
|
|
||||||
WM_POINTERUPDATE = 0x0245,
|
|
||||||
WM_POINTERDOWN = 0x0246,
|
|
||||||
WM_POINTERUP = 0x0247,
|
|
||||||
WM_POINTERENTER = 0x0249,
|
|
||||||
WM_POINTERLEAVE = 0x024A,
|
|
||||||
WM_POINTERACTIVATE = 0x024B,
|
|
||||||
WM_POINTERCAPTURECHANGED = 0x024C,
|
|
||||||
WM_TOUCHHITTESTING = 0x024D,
|
|
||||||
WM_POINTERWHEEL = 0x024E,
|
|
||||||
WM_POINTERHWHEEL = 0x024F,
|
|
||||||
DM_POINTERHITTEST = 0x0250,
|
|
||||||
WM_POINTERROUTEDTO = 0x0251,
|
|
||||||
WM_POINTERROUTEDAWAY = 0x0252,
|
|
||||||
WM_POINTERROUTEDRELEASED = 0x0253,
|
|
||||||
//#endif /* WINVER >= 0x0602 */
|
|
||||||
|
|
||||||
|
|
||||||
//#if(WINVER >= 0x0400)
|
|
||||||
WM_IME_SETCONTEXT = 0x0281,
|
|
||||||
WM_IME_NOTIFY = 0x0282,
|
|
||||||
WM_IME_CONTROL = 0x0283,
|
|
||||||
WM_IME_COMPOSITIONFULL = 0x0284,
|
|
||||||
WM_IME_SELECT = 0x0285,
|
|
||||||
WM_IME_CHAR = 0x0286,
|
|
||||||
//#endif /* WINVER >= 0x0400 */
|
|
||||||
//#if(WINVER >= 0x0500)
|
|
||||||
WM_IME_REQUEST = 0x0288,
|
|
||||||
//#endif /* WINVER >= 0x0500 */
|
|
||||||
//#if(WINVER >= 0x0400)
|
|
||||||
WM_IME_KEYDOWN = 0x0290,
|
|
||||||
WM_IME_KEYUP = 0x0291,
|
|
||||||
//#endif /* WINVER >= 0x0400 */
|
|
||||||
|
|
||||||
//#if((_WIN32_WINNT >= 0x0400) || (WINVER >= 0x0500))
|
|
||||||
WM_MOUSEHOVER = 0x02A1,
|
|
||||||
WM_MOUSELEAVE = 0x02A3,
|
|
||||||
//#endif
|
|
||||||
//#if(WINVER >= 0x0500)
|
|
||||||
WM_NCMOUSEHOVER = 0x02A0,
|
|
||||||
WM_NCMOUSELEAVE = 0x02A2,
|
|
||||||
//#endif /* WINVER >= 0x0500 */
|
|
||||||
|
|
||||||
//#if(_WIN32_WINNT >= 0x0501)
|
|
||||||
WM_WTSSESSION_CHANGE = 0x02B1,
|
|
||||||
|
|
||||||
WM_TABLET_FIRST = 0x02c0,
|
|
||||||
WM_TABLET_LAST = 0x02df,
|
|
||||||
//#endif /* _WIN32_WINNT >= 0x0501 */
|
|
||||||
|
|
||||||
//#if(WINVER >= 0x0601)
|
|
||||||
WM_DPICHANGED = 0x02E0,
|
|
||||||
//#endif /* WINVER >= 0x0601 */
|
|
||||||
//#if(WINVER >= 0x0605)
|
|
||||||
WM_DPICHANGED_BEFOREPARENT = 0x02E2,
|
|
||||||
WM_DPICHANGED_AFTERPARENT = 0x02E3,
|
|
||||||
WM_GETDPISCALEDSIZE = 0x02E4,
|
|
||||||
//#endif /* WINVER >= 0x0605 */
|
|
||||||
|
|
||||||
|
|
||||||
WM_CUT = 0x0300,
|
|
||||||
WM_COPY = 0x0301,
|
|
||||||
WM_PASTE = 0x0302,
|
|
||||||
WM_CLEAR = 0x0303,
|
|
||||||
WM_UNDO = 0x0304,
|
|
||||||
WM_RENDERFORMAT = 0x0305,
|
|
||||||
WM_RENDERALLFORMATS = 0x0306,
|
|
||||||
WM_DESTROYCLIPBOARD = 0x0307,
|
|
||||||
WM_DRAWCLIPBOARD = 0x0308,
|
|
||||||
WM_PAINTCLIPBOARD = 0x0309,
|
|
||||||
WM_VSCROLLCLIPBOARD = 0x030A,
|
|
||||||
WM_SIZECLIPBOARD = 0x030B,
|
|
||||||
WM_ASKCBFORMATNAME = 0x030C,
|
|
||||||
WM_CHANGECBCHAIN = 0x030D,
|
|
||||||
WM_HSCROLLCLIPBOARD = 0x030E,
|
|
||||||
WM_QUERYNEWPALETTE = 0x030F,
|
|
||||||
WM_PALETTEISCHANGING = 0x0310,
|
|
||||||
WM_PALETTECHANGED = 0x0311,
|
|
||||||
WM_HOTKEY = 0x0312,
|
|
||||||
|
|
||||||
//#if(WINVER >= 0x0400)
|
|
||||||
WM_PRINT = 0x0317,
|
|
||||||
WM_PRINTCLIENT = 0x0318,
|
|
||||||
//#endif /* WINVER >= 0x0400 */
|
|
||||||
|
|
||||||
//#if(_WIN32_WINNT >= 0x0500)
|
|
||||||
WM_APPCOMMAND = 0x0319,
|
|
||||||
//#endif /* _WIN32_WINNT >= 0x0500 */
|
|
||||||
|
|
||||||
//#if(_WIN32_WINNT >= 0x0501)
|
|
||||||
WM_THEMECHANGED = 0x031A,
|
|
||||||
//#endif /* _WIN32_WINNT >= 0x0501 */
|
|
||||||
|
|
||||||
|
|
||||||
//#if(_WIN32_WINNT >= 0x0501)
|
|
||||||
WM_CLIPBOARDUPDATE = 0x031D,
|
|
||||||
//#endif /* _WIN32_WINNT >= 0x0501 */
|
|
||||||
|
|
||||||
//#if(_WIN32_WINNT >= 0x0600)
|
|
||||||
WM_DWMCOMPOSITIONCHANGED = 0x031E,
|
|
||||||
WM_DWMNCRENDERINGCHANGED = 0x031F,
|
|
||||||
WM_DWMCOLORIZATIONCOLORCHANGED= 0x0320,
|
|
||||||
WM_DWMWINDOWMAXIMIZEDCHANGE = 0x0321,
|
|
||||||
//#endif /* _WIN32_WINNT >= 0x0600 */
|
|
||||||
|
|
||||||
//#if(_WIN32_WINNT >= 0x0601)
|
|
||||||
WM_DWMSENDICONICTHUMBNAIL = 0x0323,
|
|
||||||
WM_DWMSENDICONICLIVEPREVIEWBITMAP = 0x0326,
|
|
||||||
//#endif /* _WIN32_WINNT >= 0x0601 */
|
|
||||||
|
|
||||||
|
|
||||||
//#if(WINVER >= 0x0600)
|
|
||||||
WM_GETTITLEBARINFOEX = 0x033F,
|
|
||||||
//#endif /* WINVER >= 0x0600 */
|
|
||||||
|
|
||||||
//#if(WINVER >= 0x0400)
|
|
||||||
//#endif /* WINVER >= 0x0400 */
|
|
||||||
|
|
||||||
|
|
||||||
//#if(WINVER >= 0x0400)
|
|
||||||
WM_HANDHELDFIRST = 0x0358,
|
|
||||||
WM_HANDHELDLAST = 0x035F,
|
|
||||||
|
|
||||||
WM_AFXFIRST = 0x0360,
|
|
||||||
WM_AFXLAST = 0x037F,
|
|
||||||
//#endif /* WINVER >= 0x0400 */
|
|
||||||
|
|
||||||
WM_PENWINFIRST = 0x0380,
|
|
||||||
WM_PENWINLAST = 0x038F,
|
|
||||||
|
|
||||||
|
|
||||||
//#if(WINVER >= 0x0400)
|
|
||||||
WM_APP = 0x8000,
|
|
||||||
//#endif /* WINVER >= 0x0400 */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* NOTE: All Message Numbers below 0x0400 are RESERVED.
|
|
||||||
*
|
|
||||||
* Private Window Messages Start Here:
|
|
||||||
*/
|
|
||||||
WM_USER = 0x0400,
|
|
||||||
|
|
||||||
//#if(WINVER >= 0x0400)
|
|
||||||
|
|
||||||
/* wParam for WM_SIZING message */
|
|
||||||
WMSZ_LEFT = 1,
|
|
||||||
WMSZ_RIGHT = 2,
|
|
||||||
WMSZ_TOP = 3,
|
|
||||||
WMSZ_TOPLEFT = 4,
|
|
||||||
WMSZ_TOPRIGHT = 5,
|
|
||||||
WMSZ_BOTTOM = 6,
|
|
||||||
WMSZ_BOTTOMLEFT = 7,
|
|
||||||
WMSZ_BOTTOMRIGHT = 8,
|
|
||||||
//#endif /* WINVER >= 0x0400 */
|
|
||||||
|
|
||||||
//#ifndef NONCMESSAGES
|
|
||||||
|
|
||||||
/*
|
|
||||||
* WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes
|
|
||||||
*/
|
|
||||||
/*HTERROR = (-2),
|
|
||||||
HTTRANSPARENT = (-1),
|
|
||||||
HTNOWHERE = 0,
|
|
||||||
HTCLIENT = 1,
|
|
||||||
HTCAPTION = 2,
|
|
||||||
HTSYSMENU = 3,
|
|
||||||
HTGROWBOX = 4,
|
|
||||||
HTSIZE = HTGROWBOX,
|
|
||||||
HTMENU = 5,
|
|
||||||
HTHSCROLL = 6,
|
|
||||||
HTVSCROLL = 7,
|
|
||||||
HTMINBUTTON = 8,
|
|
||||||
HTMAXBUTTON = 9,
|
|
||||||
HTLEFT = 10,
|
|
||||||
HTRIGHT = 11,
|
|
||||||
HTTOP = 12,
|
|
||||||
HTTOPLEFT = 13,
|
|
||||||
HTTOPRIGHT = 14,
|
|
||||||
HTBOTTOM = 15,
|
|
||||||
HTBOTTOMLEFT = 16,
|
|
||||||
HTBOTTOMRIGHT = 17,
|
|
||||||
HTBORDER = 18,
|
|
||||||
HTREDUCE = HTMINBUTTON,
|
|
||||||
HTZOOM = HTMAXBUTTON,
|
|
||||||
HTSIZEFIRST = HTLEFT,
|
|
||||||
HTSIZELAST = HTBOTTOMRIGHT,
|
|
||||||
//#if(WINVER >= 0x0400)
|
|
||||||
HTOBJECT = 19,
|
|
||||||
HTCLOSE = 20,
|
|
||||||
HTHELP = 21,
|
|
||||||
//#endif /* WINVER >= 0x0400 */
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,12 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 466300df0840ba54d95240e3a800a642
|
|
||||||
timeCreated: 1611373988
|
|
||||||
licenseType: Free
|
|
||||||
MonoImporter:
|
|
||||||
serializedVersion: 2
|
|
||||||
defaultReferences: []
|
|
||||||
executionOrder: 0
|
|
||||||
icon: {instanceID: 0}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
@@ -1,252 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace Cryville.Common.Unity.Input {
|
|
||||||
static class NativeMethods {
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
|
||||||
public struct MONITORINFO {
|
|
||||||
public int cbSize;
|
|
||||||
public RECT rcMonitor;
|
|
||||||
public RECT rcWork;
|
|
||||||
public uint dwFlags;
|
|
||||||
}
|
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
|
||||||
public struct RECT {
|
|
||||||
public int Left, Top, Right, Bottom;
|
|
||||||
|
|
||||||
public RECT(int left, int top, int right, int bottom) {
|
|
||||||
Left = left;
|
|
||||||
Top = top;
|
|
||||||
Right = right;
|
|
||||||
Bottom = bottom;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int X {
|
|
||||||
get { return Left; }
|
|
||||||
set {
|
|
||||||
Right -= (Left - value);
|
|
||||||
Left = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public int Y {
|
|
||||||
get { return Top; }
|
|
||||||
set {
|
|
||||||
Bottom -= (Top - value);
|
|
||||||
Top = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public int Height {
|
|
||||||
get { return Bottom - Top; }
|
|
||||||
set { Bottom = value + Top; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public int Width {
|
|
||||||
get { return Right - Left; }
|
|
||||||
set { Right = value + Left; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[DllImport("user32.dll")]
|
|
||||||
[return: MarshalAs(UnmanagedType.Bool)]
|
|
||||||
public static extern bool GetTouchInputInfo(IntPtr hTouchInput, int cInputs, [Out] TOUCHINPUT[] pInputs, int cbSize);
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
|
||||||
public struct TOUCHINPUT {
|
|
||||||
public int x;
|
|
||||||
public int y;
|
|
||||||
public IntPtr hSource;
|
|
||||||
public int dwID;
|
|
||||||
public TOUCHINPUT_Flags dwFlags;
|
|
||||||
public TOUCHINPUT_Mask dwMask;
|
|
||||||
public int dwTime;
|
|
||||||
public IntPtr dwExtraInfo;
|
|
||||||
public int cxContact;
|
|
||||||
public int cyContact;
|
|
||||||
}
|
|
||||||
[Flags]
|
|
||||||
public enum TOUCHINPUT_Flags : int {
|
|
||||||
TOUCHEVENTF_MOVE = 0x0001,
|
|
||||||
TOUCHEVENTF_DOWN = 0x0002,
|
|
||||||
TOUCHEVENTF_UP = 0x0004,
|
|
||||||
TOUCHEVENTF_INRANGE = 0x0008,
|
|
||||||
TOUCHEVENTF_PRIMARY = 0x0010,
|
|
||||||
TOUCHEVENTF_NOCOALESCE = 0x0020,
|
|
||||||
TOUCHEVENTF_PEN = 0x0040,
|
|
||||||
TOUCHEVENTF_PALM = 0x0080,
|
|
||||||
}
|
|
||||||
[Flags]
|
|
||||||
public enum TOUCHINPUT_Mask : int {
|
|
||||||
TOUCHINPUTMASKF_CONTACTAREA = 0x0004,
|
|
||||||
TOUCHINPUTMASKF_EXTRAINFO = 0x0002,
|
|
||||||
TOUCHINPUTMASKF_TIMEFROMSYSTEM = 0x0001,
|
|
||||||
}
|
|
||||||
|
|
||||||
[DllImport("user32.dll")]
|
|
||||||
[return: MarshalAs(UnmanagedType.Bool)]
|
|
||||||
public static extern bool GetPointerInfo(int pointerID, ref POINTER_INFO pPointerInfo);
|
|
||||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
|
||||||
public struct POINTER_INFO {
|
|
||||||
public POINTER_INPUT_TYPE pointerType;
|
|
||||||
public UInt32 pointerId;
|
|
||||||
public UInt32 frameId;
|
|
||||||
public POINTER_FLAGS pointerFlags;
|
|
||||||
public IntPtr sourceDevice;
|
|
||||||
public IntPtr hwndTarget;
|
|
||||||
public POINT ptPixelLocation;
|
|
||||||
public POINT ptHimetricLocation;
|
|
||||||
public POINT ptPixelLocationRaw;
|
|
||||||
public POINT ptHimetricLocationRaw;
|
|
||||||
public UInt32 dwTime;
|
|
||||||
public UInt32 historyCount;
|
|
||||||
public Int32 inputData;
|
|
||||||
public UInt32 dwKeyStates;
|
|
||||||
public UInt64 PerformanceCount;
|
|
||||||
public POINTER_BUTTON_CHANGE_TYPE ButtonChangeType;
|
|
||||||
}
|
|
||||||
public enum POINTER_INPUT_TYPE {
|
|
||||||
PT_POINTER = 0x00000001,
|
|
||||||
PT_TOUCH = 0x00000002,
|
|
||||||
PT_PEN = 0x00000003,
|
|
||||||
PT_MOUSE = 0x00000004,
|
|
||||||
PT_TOUCHPAD = 0x00000005,
|
|
||||||
}
|
|
||||||
[Flags]
|
|
||||||
public enum POINTER_FLAGS {
|
|
||||||
POINTER_FLAG_NONE = 0x00000000,
|
|
||||||
POINTER_FLAG_NEW = 0x00000001,
|
|
||||||
POINTER_FLAG_INRANGE = 0x00000002,
|
|
||||||
POINTER_FLAG_INCONTACT = 0x00000004,
|
|
||||||
POINTER_FLAG_FIRSTBUTTON = 0x00000010,
|
|
||||||
POINTER_FLAG_SECONDBUTTON = 0x00000020,
|
|
||||||
POINTER_FLAG_THIRDBUTTON = 0x00000040,
|
|
||||||
POINTER_FLAG_FOURTHBUTTON = 0x00000080,
|
|
||||||
POINTER_FLAG_FIFTHBUTTON = 0x00000100,
|
|
||||||
POINTER_FLAG_PRIMARY = 0x00002000,
|
|
||||||
POINTER_FLAG_CONFIDENCE = 0x00004000,
|
|
||||||
POINTER_FLAG_CANCELED = 0x00008000,
|
|
||||||
POINTER_FLAG_DOWN = 0x00010000,
|
|
||||||
POINTER_FLAG_UPDATE = 0x00020000,
|
|
||||||
POINTER_FLAG_UP = 0x00040000,
|
|
||||||
POINTER_FLAG_WHEEL = 0x00080000,
|
|
||||||
POINTER_FLAG_HWHEEL = 0x00100000,
|
|
||||||
POINTER_FLAG_CAPTURECHANGED = 0x00200000,
|
|
||||||
POINTER_FLAG_HASTRANSFORM = 0x00400000,
|
|
||||||
}
|
|
||||||
public enum POINTER_BUTTON_CHANGE_TYPE {
|
|
||||||
POINTER_CHANGE_NONE,
|
|
||||||
POINTER_CHANGE_FIRSTBUTTON_DOWN,
|
|
||||||
POINTER_CHANGE_FIRSTBUTTON_UP,
|
|
||||||
POINTER_CHANGE_SECONDBUTTON_DOWN,
|
|
||||||
POINTER_CHANGE_SECONDBUTTON_UP,
|
|
||||||
POINTER_CHANGE_THIRDBUTTON_DOWN,
|
|
||||||
POINTER_CHANGE_THIRDBUTTON_UP,
|
|
||||||
POINTER_CHANGE_FOURTHBUTTON_DOWN,
|
|
||||||
POINTER_CHANGE_FOURTHBUTTON_UP,
|
|
||||||
POINTER_CHANGE_FIFTHBUTTON_DOWN,
|
|
||||||
POINTER_CHANGE_FIFTHBUTTON_UP,
|
|
||||||
}
|
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
|
||||||
public struct POINT {
|
|
||||||
public int X;
|
|
||||||
public int Y;
|
|
||||||
}
|
|
||||||
|
|
||||||
[DllImport("user32.dll")]
|
|
||||||
[return: MarshalAs(UnmanagedType.Bool)]
|
|
||||||
public static extern bool GetPointerTouchInfo(int pointerId, ref POINTER_TOUCH_INFO touchInfo);
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
|
||||||
public struct POINTER_TOUCH_INFO {
|
|
||||||
public POINTER_INFO pointerInfo;
|
|
||||||
public TOUCH_FLAGS touchFlags;
|
|
||||||
public TOUCH_MASK touchMask;
|
|
||||||
public RECT rcContact;
|
|
||||||
public RECT rcContactRaw;
|
|
||||||
public uint orientation;
|
|
||||||
public uint pressure;
|
|
||||||
}
|
|
||||||
[Flags]
|
|
||||||
public enum TOUCH_FLAGS {
|
|
||||||
TOUCH_FLAG_NONE = 0x00000000,
|
|
||||||
}
|
|
||||||
[Flags]
|
|
||||||
public enum TOUCH_MASK {
|
|
||||||
TOUCH_MASK_NONE = 0x00000000,
|
|
||||||
TOUCH_MASK_CONTACTAREA = 0x00000001,
|
|
||||||
TOUCH_MASK_ORIENTATION = 0x00000002,
|
|
||||||
TOUCH_MASK_PRESSURE = 0x00000004,
|
|
||||||
}
|
|
||||||
|
|
||||||
[DllImport("user32.dll")]
|
|
||||||
public static extern IntPtr EnableMouseInPointer(bool value);
|
|
||||||
|
|
||||||
[DllImport("kernel32.dll")]
|
|
||||||
public static extern uint GetCurrentThreadId();
|
|
||||||
[DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
|
|
||||||
public static extern int GetClassName(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
|
|
||||||
public delegate bool EnumWindowsProc(IntPtr hWnd,IntPtr lParam);
|
|
||||||
[DllImport("user32.dll")]
|
|
||||||
[return: MarshalAs(UnmanagedType.Bool)]
|
|
||||||
public static extern bool EnumThreadWindows(uint dwThreadId, EnumWindowsProc lpEnumFunc, IntPtr lParam);
|
|
||||||
|
|
||||||
[DllImport("user32.dll")]
|
|
||||||
public static extern IntPtr MonitorFromWindow(IntPtr hwnd, uint dwFlags);
|
|
||||||
|
|
||||||
[DllImport("user32.dll")]
|
|
||||||
public static extern bool GetMonitorInfo(IntPtr hMonitor, ref MONITORINFO lpmi);
|
|
||||||
|
|
||||||
[DllImport("user32.dll", EntryPoint = "SetWindowLong")]
|
|
||||||
public static extern int SetWindowLong32(IntPtr hWnd, int nIndex, int dwNewLong);
|
|
||||||
|
|
||||||
[DllImport("user32.dll", EntryPoint = "SetWindowLongPtr")]
|
|
||||||
public static extern IntPtr SetWindowLongPtr64(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
|
|
||||||
|
|
||||||
[DllImport("user32.dll")]
|
|
||||||
public static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, uint msg, IntPtr wParam,
|
|
||||||
IntPtr lParam);
|
|
||||||
|
|
||||||
[DllImport("user32.dll")]
|
|
||||||
[return: MarshalAs(UnmanagedType.Bool)]
|
|
||||||
public static extern bool RegisterTouchWindow(IntPtr hWnd, TOUCH_WINDOW_FLAGS ulFlags);
|
|
||||||
[Flags]
|
|
||||||
public enum TOUCH_WINDOW_FLAGS {
|
|
||||||
TWF_FINETOUCH = 1,
|
|
||||||
TWF_WANTPALM = 2,
|
|
||||||
}
|
|
||||||
|
|
||||||
[DllImport("user32.dll")]
|
|
||||||
[return: MarshalAs(UnmanagedType.Bool)]
|
|
||||||
public static extern bool UnregisterTouchWindow(IntPtr hWnd);
|
|
||||||
|
|
||||||
[DllImport("user32.dll")]
|
|
||||||
[return: MarshalAs(UnmanagedType.Bool)]
|
|
||||||
public static extern void CloseTouchInputHandle(IntPtr lParam);
|
|
||||||
|
|
||||||
[DllImport("user32.dll")]
|
|
||||||
public static extern bool ScreenToClient(IntPtr hWnd, ref POINT lpPoint);
|
|
||||||
|
|
||||||
[DllImport("Kernel32.dll", CharSet = CharSet.Unicode)]
|
|
||||||
public static extern ushort GlobalAddAtom(string lpString);
|
|
||||||
|
|
||||||
[DllImport("Kernel32.dll")]
|
|
||||||
public static extern ushort GlobalDeleteAtom(ushort nAtom);
|
|
||||||
|
|
||||||
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
|
||||||
public static extern int SetProp(IntPtr hWnd, string lpString, int hData);
|
|
||||||
|
|
||||||
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
|
||||||
public static extern int RemoveProp(IntPtr hWnd, string lpString);
|
|
||||||
|
|
||||||
[DllImport("user32.dll", CharSet = CharSet.Auto)]
|
|
||||||
public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
|
|
||||||
|
|
||||||
[DllImport("kernel32.dll")]
|
|
||||||
public static extern uint QueryPerformanceFrequency(out Int64 lpFrequency);
|
|
||||||
|
|
||||||
[DllImport("kernel32.dll")]
|
|
||||||
public static extern uint QueryPerformanceCounter(out Int64 lpPerformanceCount);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,12 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: a6ff72ea2b7f71345aa19940faf026e8
|
|
||||||
timeCreated: 1622589747
|
|
||||||
licenseType: Free
|
|
||||||
MonoImporter:
|
|
||||||
serializedVersion: 2
|
|
||||||
defaultReferences: []
|
|
||||||
executionOrder: 0
|
|
||||||
icon: {instanceID: 0}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
@@ -1,49 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace Cryville.Common.Unity.Input {
|
|
||||||
public class SimpleInputConsumer {
|
|
||||||
readonly InputManager _manager;
|
|
||||||
readonly object _lock = new object();
|
|
||||||
readonly Dictionary<InputIdentifier, InputVector> _vectors = new Dictionary<InputIdentifier, InputVector>();
|
|
||||||
readonly List<InputEvent> _events = new List<InputEvent>();
|
|
||||||
public SimpleInputConsumer(InputManager manager) { _manager = manager; }
|
|
||||||
public void Activate() {
|
|
||||||
lock (_lock) {
|
|
||||||
_events.Clear();
|
|
||||||
}
|
|
||||||
_manager.EnumerateHandlers(h => h.OnInput += OnInput);
|
|
||||||
}
|
|
||||||
public void Deactivate() {
|
|
||||||
_manager.EnumerateHandlers(h => h.OnInput -= OnInput);
|
|
||||||
}
|
|
||||||
protected void OnInput(InputIdentifier id, InputVector vec) {
|
|
||||||
lock (_lock) {
|
|
||||||
InputVector vec0;
|
|
||||||
if (_vectors.TryGetValue(id, out vec0)) {
|
|
||||||
_events.Add(new InputEvent {
|
|
||||||
Id = id,
|
|
||||||
From = vec0,
|
|
||||||
To = vec,
|
|
||||||
});
|
|
||||||
if (vec.IsNull) _vectors.Remove(id);
|
|
||||||
else _vectors[id] = vec;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
_events.Add(new InputEvent {
|
|
||||||
Id = id,
|
|
||||||
From = new InputVector(vec.Time),
|
|
||||||
To = vec,
|
|
||||||
});
|
|
||||||
_vectors.Add(id, vec);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public void EnumerateEvents(Action<InputEvent> cb) {
|
|
||||||
lock (_lock) {
|
|
||||||
foreach (var ev in _events) cb(ev);
|
|
||||||
_events.Clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,12 +0,0 @@
|
|||||||
using UnityEngine;
|
|
||||||
|
|
||||||
namespace Cryville.Common.Unity.Input {
|
|
||||||
public static class UnityCameraUtils {
|
|
||||||
public static Vector2 ScreenToWorldPoint(Vector2 pos) {
|
|
||||||
Vector3 i = pos;
|
|
||||||
i.z = -Camera.main.transform.localPosition.z;
|
|
||||||
i = Camera.main.ScreenToWorldPoint(i);
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,12 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 93f60577ebaa5824dba5f322bbd1ad26
|
|
||||||
timeCreated: 1618910605
|
|
||||||
licenseType: Free
|
|
||||||
MonoImporter:
|
|
||||||
serializedVersion: 2
|
|
||||||
defaultReferences: []
|
|
||||||
executionOrder: 0
|
|
||||||
icon: {instanceID: 0}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
@@ -1,349 +0,0 @@
|
|||||||
/*
|
|
||||||
* @author Valentin Simonov / http://va.lent.in/
|
|
||||||
* @author Valentin Frolov
|
|
||||||
* @author Andrew David Griffiths
|
|
||||||
* @author Cryville:Lime
|
|
||||||
*/
|
|
||||||
using AOT;
|
|
||||||
using System;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Text;
|
|
||||||
using UnityEngine;
|
|
||||||
using Logger = Cryville.Common.Logging.Logger;
|
|
||||||
|
|
||||||
namespace Cryville.Common.Unity.Input {
|
|
||||||
public class WindowsPointerHandler : InputHandler {
|
|
||||||
static WindowsPointerHandler Instance;
|
|
||||||
|
|
||||||
const string PRESS_AND_HOLD_ATOM = "MicrosoftTabletPenServiceProperty";
|
|
||||||
delegate IntPtr WndProcDelegate(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
|
|
||||||
|
|
||||||
public const int MONITOR_DEFAULTTONEAREST = 2;
|
|
||||||
readonly IntPtr hMainWindow;
|
|
||||||
IntPtr oldWndProcPtr;
|
|
||||||
IntPtr newWndProcPtr;
|
|
||||||
WndProcDelegate newWndProc;
|
|
||||||
ushort pressAndHoldAtomID;
|
|
||||||
|
|
||||||
readonly int touchInputSize;
|
|
||||||
readonly long freq;
|
|
||||||
static bool usePointerMessage;
|
|
||||||
|
|
||||||
public WindowsPointerHandler() {
|
|
||||||
if (Instance != null)
|
|
||||||
throw new InvalidOperationException("WindowsPointerHandler already created");
|
|
||||||
if (Environment.OSVersion.Platform != PlatformID.Win32NT)
|
|
||||||
throw new NotSupportedException("Windows pointer is not supported on this device");
|
|
||||||
Instance = this;
|
|
||||||
usePointerMessage = true;
|
|
||||||
|
|
||||||
hMainWindow = GetUnityWindowHandle();
|
|
||||||
if (hMainWindow == IntPtr.Zero) {
|
|
||||||
throw new InvalidOperationException("Cannot find the game window");
|
|
||||||
}
|
|
||||||
NativeMethods.QueryPerformanceFrequency(out freq);
|
|
||||||
retry:
|
|
||||||
if (usePointerMessage) {
|
|
||||||
try {
|
|
||||||
NativeMethods.EnableMouseInPointer(true);
|
|
||||||
Logger.Log("main", 0, "Input", "Touch input frequency: {0}", freq);
|
|
||||||
}
|
|
||||||
catch (TypeLoadException) {
|
|
||||||
usePointerMessage = false;
|
|
||||||
Logger.Log("main", 2, "Input", "Advanced touch handling not supported");
|
|
||||||
goto retry;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
touchInputSize = Marshal.SizeOf(typeof(NativeMethods.TOUCHINPUT));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public const int TABLET_DISABLE_PRESSANDHOLD = 0x00000001;
|
|
||||||
public const int TABLET_DISABLE_PENTAPFEEDBACK = 0x00000008;
|
|
||||||
public const int TABLET_DISABLE_PENBARRELFEEDBACK = 0x00000010;
|
|
||||||
public const int TABLET_DISABLE_FLICKS = 0x00010000;
|
|
||||||
|
|
||||||
protected override void Activate() {
|
|
||||||
newWndProc = WndProc;
|
|
||||||
newWndProcPtr = Marshal.GetFunctionPointerForDelegate(newWndProc);
|
|
||||||
oldWndProcPtr = SetWindowLongPtr(hMainWindow, -4, newWndProcPtr);
|
|
||||||
if (!NativeMethods.RegisterTouchWindow(hMainWindow, NativeMethods.TOUCH_WINDOW_FLAGS.TWF_WANTPALM)) {
|
|
||||||
throw new InvalidOperationException("Failed to register touch window");
|
|
||||||
}
|
|
||||||
pressAndHoldAtomID = NativeMethods.GlobalAddAtom(PRESS_AND_HOLD_ATOM);
|
|
||||||
NativeMethods.SetProp(hMainWindow, PRESS_AND_HOLD_ATOM,
|
|
||||||
TABLET_DISABLE_PRESSANDHOLD | // disables press and hold (right-click) gesture
|
|
||||||
TABLET_DISABLE_PENTAPFEEDBACK | // disables UI feedback on pen up (waves)
|
|
||||||
TABLET_DISABLE_PENBARRELFEEDBACK | // disables UI feedback on pen button down (circle)
|
|
||||||
TABLET_DISABLE_FLICKS // disables pen flicks (back, forward, drag down, drag up);
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void Deactivate() {
|
|
||||||
if (pressAndHoldAtomID != 0) {
|
|
||||||
NativeMethods.RemoveProp(hMainWindow, PRESS_AND_HOLD_ATOM);
|
|
||||||
NativeMethods.GlobalDeleteAtom(pressAndHoldAtomID);
|
|
||||||
}
|
|
||||||
if (!NativeMethods.UnregisterTouchWindow(hMainWindow)) {
|
|
||||||
throw new InvalidOperationException("Failed to unregister touch window");
|
|
||||||
}
|
|
||||||
SetWindowLongPtr(hMainWindow, -4, oldWndProcPtr);
|
|
||||||
newWndProcPtr = IntPtr.Zero;
|
|
||||||
newWndProc = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
const string UnityWindowClassName = "UnityWndClass";
|
|
||||||
|
|
||||||
static IntPtr _windowHandle;
|
|
||||||
public static IntPtr GetUnityWindowHandle() {
|
|
||||||
uint threadId = NativeMethods.GetCurrentThreadId();
|
|
||||||
NativeMethods.EnumThreadWindows(
|
|
||||||
threadId,
|
|
||||||
UnityWindowFilter,
|
|
||||||
IntPtr.Zero
|
|
||||||
);
|
|
||||||
return _windowHandle;
|
|
||||||
}
|
|
||||||
|
|
||||||
[MonoPInvokeCallback(typeof(NativeMethods.EnumWindowsProc))]
|
|
||||||
public static bool UnityWindowFilter(IntPtr hWnd, IntPtr lParam) {
|
|
||||||
var classText = new StringBuilder(UnityWindowClassName.Length + 1);
|
|
||||||
NativeMethods.GetClassName(hWnd, classText, classText.Capacity);
|
|
||||||
if (classText.ToString() == UnityWindowClassName) {
|
|
||||||
_windowHandle = hWnd;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool IsNullable(int type) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override byte GetDimension(int type) {
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string GetTypeName(int type) {
|
|
||||||
switch (type) {
|
|
||||||
case 0: return "Windows Pointer Unknown";
|
|
||||||
case 1: return "Windows Pointer Pointer";
|
|
||||||
case 2: return "Windows Pointer Touch";
|
|
||||||
case 3: return "Windows Pointer Pen";
|
|
||||||
case 4: return "Windows Pointer Mouse";
|
|
||||||
case 5: return "Windows Pointer Touch Pad";
|
|
||||||
case 255: return "Windows Touch";
|
|
||||||
default: throw new ArgumentOutOfRangeException(nameof(type));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override double GetCurrentTimestamp() {
|
|
||||||
long tick;
|
|
||||||
NativeMethods.QueryPerformanceCounter(out tick);
|
|
||||||
return (double)tick / freq;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Dispose(bool disposing) {
|
|
||||||
if (disposing) {
|
|
||||||
Deactivate();
|
|
||||||
if (usePointerMessage)
|
|
||||||
NativeMethods.EnableMouseInPointer(false);
|
|
||||||
}
|
|
||||||
Instance = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
[MonoPInvokeCallback(typeof(WndProcDelegate))]
|
|
||||||
static IntPtr WndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam) {
|
|
||||||
try {
|
|
||||||
var m = (WindowMessages)msg;
|
|
||||||
/*if (m >= WindowMessages.WM_MOUSEFIRST && m <= WindowMessages.WM_MOUSELAST) {
|
|
||||||
if (!usePointerMessage)
|
|
||||||
Instance.handleMouseMsg(msg, wParam, lParam);
|
|
||||||
}
|
|
||||||
else*/
|
|
||||||
switch (m) {
|
|
||||||
case WindowMessages.WM_TOUCH:
|
|
||||||
if (usePointerMessage)
|
|
||||||
NativeMethods.CloseTouchInputHandle(lParam);
|
|
||||||
else
|
|
||||||
Instance.HandleTouchMsg(wParam, lParam);
|
|
||||||
break;
|
|
||||||
case WindowMessages.WM_POINTERDOWN:
|
|
||||||
case WindowMessages.WM_POINTERUP:
|
|
||||||
case WindowMessages.WM_POINTERUPDATE:
|
|
||||||
if (usePointerMessage)
|
|
||||||
Instance.HandlePointerMsg(msg, wParam, lParam);
|
|
||||||
break;
|
|
||||||
case WindowMessages.WM_CLOSE:
|
|
||||||
Instance.Dispose();
|
|
||||||
// Calling oldWndProcPtr here would crash the application
|
|
||||||
Application.Quit();
|
|
||||||
return IntPtr.Zero;
|
|
||||||
}
|
|
||||||
return NativeMethods.CallWindowProc(Instance.oldWndProcPtr, hWnd, msg, wParam, lParam);
|
|
||||||
}
|
|
||||||
catch (Exception ex) {
|
|
||||||
Logger.Log("main", 4, "Input", "An error occured while handling pointer:\n{0}", ex);
|
|
||||||
return IntPtr.Zero;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void HandlePointerMsg(uint msg, IntPtr wParam, IntPtr lParam) {
|
|
||||||
int id = LOWORD(wParam.ToInt32());
|
|
||||||
|
|
||||||
var rawpinfo = new NativeMethods.POINTER_INFO();
|
|
||||||
if (!NativeMethods.GetPointerInfo(id, ref rawpinfo))
|
|
||||||
throw new InvalidOperationException("Failed to get pointer info");
|
|
||||||
|
|
||||||
/*
|
|
||||||
Vector2? _cs = null;
|
|
||||||
uint? orientation = null;
|
|
||||||
uint? pressure = null;
|
|
||||||
if (pointerInfo.pointerType == NativeMethods.POINTER_INPUT_TYPE.PT_TOUCH) {
|
|
||||||
var pointerTouchInfo = new NativeMethods.POINTER_TOUCH_INFO();
|
|
||||||
NativeMethods.GetPointerTouchInfo(pointerId, ref pointerTouchInfo);
|
|
||||||
if (pointerTouchInfo.touchMask.HasFlag(NativeMethods.TOUCH_MASK.TOUCH_MASK_CONTACTAREA)) {
|
|
||||||
Vector2 cs;
|
|
||||||
cs.x = pointerTouchInfo.rcContact.Width;
|
|
||||||
cs.y = pointerTouchInfo.rcContact.Height;
|
|
||||||
_cs = cs;
|
|
||||||
}
|
|
||||||
if (pointerTouchInfo.touchMask.HasFlag(NativeMethods.TOUCH_MASK.TOUCH_MASK_ORIENTATION)) {
|
|
||||||
orientation = pointerTouchInfo.orientation;
|
|
||||||
}
|
|
||||||
if (pointerTouchInfo.touchMask.HasFlag(NativeMethods.TOUCH_MASK.TOUCH_MASK_PRESSURE)) {
|
|
||||||
pressure = pointerTouchInfo.pressure;
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
NativeMethods.POINT p = rawpinfo.ptPixelLocation;
|
|
||||||
NativeMethods.ScreenToClient(hMainWindow, ref p);
|
|
||||||
Vector2 _p = UnityCameraUtils.ScreenToWorldPoint(new Vector2(p.X, Screen.height - p.Y));
|
|
||||||
|
|
||||||
double time = (double)rawpinfo.PerformanceCount / freq;
|
|
||||||
|
|
||||||
int type;
|
|
||||||
switch (rawpinfo.pointerType) {
|
|
||||||
case NativeMethods.POINTER_INPUT_TYPE.PT_POINTER : type = 1; break;
|
|
||||||
case NativeMethods.POINTER_INPUT_TYPE.PT_TOUCH : type = 2; break;
|
|
||||||
case NativeMethods.POINTER_INPUT_TYPE.PT_PEN : type = 3; break;
|
|
||||||
case NativeMethods.POINTER_INPUT_TYPE.PT_MOUSE : type = 4; break;
|
|
||||||
case NativeMethods.POINTER_INPUT_TYPE.PT_TOUCHPAD: type = 5; break;
|
|
||||||
default: type = 0; break;
|
|
||||||
}
|
|
||||||
if (rawpinfo.pointerFlags.HasFlag(NativeMethods.POINTER_FLAGS.POINTER_FLAG_CANCELED)) {
|
|
||||||
Feed(type, id, new InputVector(time));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
InputVector vec = new InputVector(time, _p);
|
|
||||||
|
|
||||||
switch ((WindowMessages)msg) {
|
|
||||||
case WindowMessages.WM_POINTERDOWN:
|
|
||||||
case WindowMessages.WM_POINTERUPDATE:
|
|
||||||
Feed(type, id, vec);
|
|
||||||
break;
|
|
||||||
case WindowMessages.WM_POINTERUP:
|
|
||||||
Feed(type, id, vec);
|
|
||||||
Feed(type, id, new InputVector(time));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*void handleMouseMsg(uint msg, IntPtr wParam, IntPtr lParam) {
|
|
||||||
int id = mouseId;
|
|
||||||
double procTime = diag::Stopwatch.GetTimestamp()
|
|
||||||
/ (double)diag::Stopwatch.Frequency;
|
|
||||||
Vector2 _p;
|
|
||||||
_p.x = ((int)(short)LOWORD(lParam.ToInt32()));
|
|
||||||
_p.y = ((int)(short)HIWORD(lParam.ToInt32()));
|
|
||||||
PointerPhase phase;
|
|
||||||
switch ((WindowMessages)msg) {
|
|
||||||
case WindowMessages.WM_LBUTTONDOWN:
|
|
||||||
case WindowMessages.WM_LBUTTONDBLCLK:
|
|
||||||
phase = PointerPhase.Begin;
|
|
||||||
id = mouseId = newIdCallback();
|
|
||||||
break;
|
|
||||||
case WindowMessages.WM_MOUSEMOVE:
|
|
||||||
if (mouseId == 0)
|
|
||||||
return;
|
|
||||||
phase = PointerPhase.Update;
|
|
||||||
break;
|
|
||||||
case WindowMessages.WM_LBUTTONUP:
|
|
||||||
phase = PointerPhase.End;
|
|
||||||
mouseId = 0;
|
|
||||||
break;
|
|
||||||
case WindowMessages.WM_MOUSELEAVE:
|
|
||||||
phase = PointerPhase.Cancel;
|
|
||||||
mouseId = 0;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
callback(id, new PointerInfo() {
|
|
||||||
Id = id,
|
|
||||||
ProcessTime = procTime,
|
|
||||||
Phase = phase,
|
|
||||||
Type = PointerType.Mouse,
|
|
||||||
Position = _p,
|
|
||||||
});
|
|
||||||
}*/
|
|
||||||
|
|
||||||
void HandleTouchMsg(IntPtr wParam, IntPtr lParam) {
|
|
||||||
int inputCount = LOWORD(wParam.ToInt32());
|
|
||||||
NativeMethods.TOUCHINPUT[] inputs = new NativeMethods.TOUCHINPUT[inputCount];
|
|
||||||
|
|
||||||
if (!NativeMethods.GetTouchInputInfo(lParam, inputCount, inputs, touchInputSize))
|
|
||||||
throw new InvalidOperationException("Failed to get touch input info");
|
|
||||||
|
|
||||||
for (int i = 0; i < inputCount; i++) {
|
|
||||||
NativeMethods.TOUCHINPUT touch = inputs[i];
|
|
||||||
|
|
||||||
NativeMethods.POINT p = new NativeMethods.POINT {
|
|
||||||
X = touch.x / 100,
|
|
||||||
Y = touch.y / 100
|
|
||||||
};
|
|
||||||
NativeMethods.ScreenToClient(hMainWindow, ref p);
|
|
||||||
Vector2 _p = UnityCameraUtils.ScreenToWorldPoint(new Vector2(p.X, Screen.height - p.Y));
|
|
||||||
|
|
||||||
/*Vector2? _cs = null;
|
|
||||||
if (touch.dwMask.HasFlag(NativeMethods.TOUCHINPUT_Mask.TOUCHINPUTMASKF_CONTACTAREA)) {
|
|
||||||
Vector2 cs;
|
|
||||||
cs.x = touch.cxContact / 100;
|
|
||||||
cs.y = touch.cyContact / 100;
|
|
||||||
_cs = cs;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
int id = touch.dwID;
|
|
||||||
double time = touch.dwTime / 1000.0;
|
|
||||||
InputVector vec = new InputVector(time, _p);
|
|
||||||
|
|
||||||
if (touch.dwFlags.HasFlag(NativeMethods.TOUCHINPUT_Flags.TOUCHEVENTF_MOVE) ||
|
|
||||||
touch.dwFlags.HasFlag(NativeMethods.TOUCHINPUT_Flags.TOUCHEVENTF_DOWN)) {
|
|
||||||
Feed(255, id, vec);
|
|
||||||
}
|
|
||||||
else if (touch.dwFlags.HasFlag(NativeMethods.TOUCHINPUT_Flags.TOUCHEVENTF_UP)) {
|
|
||||||
Feed(255, id, vec);
|
|
||||||
Feed(255, id, new InputVector(time));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NativeMethods.CloseTouchInputHandle(lParam);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int LOWORD(int value) {
|
|
||||||
return value & 0xffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int HIWORD(int value) {
|
|
||||||
return (value & (0xffff << 16)) >> 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong) {
|
|
||||||
if (IntPtr.Size == 8)
|
|
||||||
return NativeMethods.SetWindowLongPtr64(hWnd, nIndex, dwNewLong);
|
|
||||||
return new IntPtr(NativeMethods.SetWindowLong32(hWnd, nIndex, dwNewLong.ToInt32()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,12 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: d1b353deb73c51b409b15e54c54a6bb1
|
|
||||||
timeCreated: 1611282071
|
|
||||||
licenseType: Free
|
|
||||||
MonoImporter:
|
|
||||||
serializedVersion: 2
|
|
||||||
defaultReferences: []
|
|
||||||
executionOrder: 0
|
|
||||||
icon: {instanceID: 0}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
@@ -623,7 +623,7 @@ namespace Cryville.Crtr {
|
|||||||
judge = new Judge(this, pruleset);
|
judge = new Judge(this, pruleset);
|
||||||
etor.ContextJudge = judge;
|
etor.ContextJudge = judge;
|
||||||
|
|
||||||
inputProxy = new InputProxy(pruleset, judge);
|
inputProxy = new InputProxy(pruleset, judge, screenSize);
|
||||||
inputProxy.LoadFrom(_rscfg.inputs);
|
inputProxy.LoadFrom(_rscfg.inputs);
|
||||||
if (!inputProxy.IsCompleted()) {
|
if (!inputProxy.IsCompleted()) {
|
||||||
throw new ArgumentException("Input config not completed\nPlease complete the input settings");
|
throw new ArgumentException("Input config not completed\nPlease complete the input settings");
|
||||||
|
@@ -56,7 +56,7 @@ namespace Cryville.Crtr.Config {
|
|||||||
|
|
||||||
m_genericConfigPanel.Target = _rscfg.generic;
|
m_genericConfigPanel.Target = _rscfg.generic;
|
||||||
|
|
||||||
var proxy = new InputProxy(ruleset.Root, null);
|
var proxy = new InputProxy(ruleset.Root, null, new Vector2(Screen.width, Screen.height));
|
||||||
proxy.LoadFrom(_rscfg.inputs);
|
proxy.LoadFrom(_rscfg.inputs);
|
||||||
m_inputConfigPanel.proxy = proxy;
|
m_inputConfigPanel.proxy = proxy;
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
using Cryville.Common;
|
using Cryville.Common;
|
||||||
using Cryville.Common.Unity;
|
using Cryville.Common.Unity;
|
||||||
using Cryville.Common.Unity.Input;
|
using Cryville.Input;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
@@ -77,7 +77,7 @@ namespace Cryville.Crtr.Config {
|
|||||||
void Update() {
|
void Update() {
|
||||||
if (m_inputDialog.activeSelf) {
|
if (m_inputDialog.activeSelf) {
|
||||||
_consumer.EnumerateEvents(ev => {
|
_consumer.EnumerateEvents(ev => {
|
||||||
AddSourceItem(ev.Id.Source);
|
AddSourceItem(ev.Identifier.Source);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -95,7 +95,7 @@ namespace Cryville.Crtr.Config {
|
|||||||
if (proxy.IsUsed(tsrc)) {
|
if (proxy.IsUsed(tsrc)) {
|
||||||
text.text += " <size=9>(Used)</size>";
|
text.text += " <size=9>(Used)</size>";
|
||||||
}
|
}
|
||||||
else if (tsrc.Handler.GetDimension(src.Value.Type) < m_configScene.ruleset.Root.inputs[_sel].dim) {
|
else if (tsrc.Handler.Dimension < m_configScene.ruleset.Root.inputs[_sel].dim) {
|
||||||
text.text += " <size=9>(Not Applicable)</size>";
|
text.text += " <size=9>(Not Applicable)</size>";
|
||||||
}
|
}
|
||||||
else flag = true;
|
else flag = true;
|
||||||
|
@@ -6,6 +6,7 @@ using UnityEngine;
|
|||||||
using UnityEngine.SceneManagement;
|
using UnityEngine.SceneManagement;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using Logger = Cryville.Common.Logging.Logger;
|
using Logger = Cryville.Common.Logging.Logger;
|
||||||
|
using unity = UnityEngine;
|
||||||
|
|
||||||
namespace Cryville.Crtr {
|
namespace Cryville.Crtr {
|
||||||
public class Console : MonoBehaviour {
|
public class Console : MonoBehaviour {
|
||||||
@@ -36,8 +37,8 @@ namespace Cryville.Crtr {
|
|||||||
|
|
||||||
void Update() {
|
void Update() {
|
||||||
if (
|
if (
|
||||||
Input.GetKeyDown(KeyCode.Return)
|
unity::Input.GetKeyDown(KeyCode.Return)
|
||||||
|| Input.GetKeyDown(KeyCode.KeypadEnter)
|
|| unity::Input.GetKeyDown(KeyCode.KeypadEnter)
|
||||||
) {
|
) {
|
||||||
Submit();
|
Submit();
|
||||||
InputBox.text = "";
|
InputBox.text = "";
|
||||||
|
@@ -3,8 +3,10 @@ using Cryville.Audio.Source;
|
|||||||
using Cryville.Common.Font;
|
using Cryville.Common.Font;
|
||||||
using Cryville.Common.Logging;
|
using Cryville.Common.Logging;
|
||||||
using Cryville.Common.Unity;
|
using Cryville.Common.Unity;
|
||||||
using Cryville.Common.Unity.Input;
|
|
||||||
using Cryville.Common.Unity.UI;
|
using Cryville.Common.Unity.UI;
|
||||||
|
using Cryville.Input;
|
||||||
|
using Cryville.Input.Unity;
|
||||||
|
using Cryville.Input.Unity.Android;
|
||||||
using FFmpeg.AutoGen;
|
using FFmpeg.AutoGen;
|
||||||
using Ionic.Zip;
|
using Ionic.Zip;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
@@ -12,6 +14,7 @@ using System;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using Logger = Cryville.Common.Logging.Logger;
|
using Logger = Cryville.Common.Logging.Logger;
|
||||||
|
using unity = UnityEngine;
|
||||||
|
|
||||||
namespace Cryville.Crtr {
|
namespace Cryville.Crtr {
|
||||||
public static class Game {
|
public static class Game {
|
||||||
@@ -58,7 +61,21 @@ namespace Cryville.Crtr {
|
|||||||
|
|
||||||
GameDataPath = Settings.Default.GameDataPath;
|
GameDataPath = Settings.Default.GameDataPath;
|
||||||
|
|
||||||
Input.simulateMouseWithTouches = false;
|
unity::Input.simulateMouseWithTouches = false;
|
||||||
|
//InputManager.HandlerRegistries.Add(typeof(AndroidAccelerometerHandler));
|
||||||
|
//InputManager.HandlerRegistries.Add(typeof(AndroidAccelerometerUncalibratedHandler));
|
||||||
|
//InputManager.HandlerRegistries.Add(typeof(AndroidGameRotationVectorHandler));
|
||||||
|
//InputManager.HandlerRegistries.Add(typeof(AndroidGravityHandler));
|
||||||
|
//InputManager.HandlerRegistries.Add(typeof(AndroidGyroscopeHandler));
|
||||||
|
//InputManager.HandlerRegistries.Add(typeof(AndroidLinearAccelerationHandler));
|
||||||
|
//InputManager.HandlerRegistries.Add(typeof(AndroidMagneticFieldHandler));
|
||||||
|
//InputManager.HandlerRegistries.Add(typeof(AndroidMagneticFieldUncalibratedHandler));
|
||||||
|
//InputManager.HandlerRegistries.Add(typeof(AndroidRotationVectorHandler));
|
||||||
|
InputManager.HandlerRegistries.Add(typeof(AndroidTouchHandler));
|
||||||
|
InputManager.HandlerRegistries.Add(typeof(UnityGuiInputHandler<UnityKeyReceiver>));
|
||||||
|
InputManager.HandlerRegistries.Add(typeof(UnityGuiInputHandler<UnityMouseReceiver>));
|
||||||
|
InputManager.HandlerRegistries.Add(typeof(UnityMouseHandler));
|
||||||
|
InputManager.HandlerRegistries.Add(typeof(UnityTouchHandler));
|
||||||
InputManager = new InputManager();
|
InputManager = new InputManager();
|
||||||
|
|
||||||
#if UNITY_EDITOR_WIN
|
#if UNITY_EDITOR_WIN
|
||||||
|
@@ -1,20 +1,23 @@
|
|||||||
using Cryville.Common;
|
using Cryville.Common;
|
||||||
using Cryville.Common.Logging;
|
|
||||||
using Cryville.Common.Pdt;
|
using Cryville.Common.Pdt;
|
||||||
using Cryville.Common.Reflection;
|
|
||||||
using Cryville.Common.Unity.Input;
|
|
||||||
using Cryville.Crtr.Config;
|
using Cryville.Crtr.Config;
|
||||||
|
using Cryville.Input;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
using RVector3 = UnityEngine.Vector3;
|
using System.Threading;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.Profiling;
|
||||||
|
using Logger = Cryville.Common.Logging.Logger;
|
||||||
|
using RVector4 = UnityEngine.Vector4;
|
||||||
|
|
||||||
namespace Cryville.Crtr {
|
namespace Cryville.Crtr {
|
||||||
public class InputProxy : IDisposable {
|
public class InputProxy : IDisposable {
|
||||||
readonly PdtEvaluator _etor;
|
readonly PdtEvaluator _etor;
|
||||||
readonly PdtRuleset _ruleset;
|
readonly PdtRuleset _ruleset;
|
||||||
readonly Judge _judge;
|
readonly Judge _judge;
|
||||||
public InputProxy(PdtRuleset ruleset, Judge judge) {
|
readonly InputVector _screenSize;
|
||||||
|
public InputProxy(PdtRuleset ruleset, Judge judge, Vector2 screenSize) {
|
||||||
for (int i = 0; i <= MAX_DEPTH; i++) {
|
for (int i = 0; i <= MAX_DEPTH; i++) {
|
||||||
var vecsrc = new InputVectorSrc();
|
var vecsrc = new InputVectorSrc();
|
||||||
_vecsrcs[i] = vecsrc;
|
_vecsrcs[i] = vecsrc;
|
||||||
@@ -23,6 +26,7 @@ namespace Cryville.Crtr {
|
|||||||
_etor = judge != null ? judge._etor : ChartPlayer.etor;
|
_etor = judge != null ? judge._etor : ChartPlayer.etor;
|
||||||
_ruleset = ruleset;
|
_ruleset = ruleset;
|
||||||
_judge = judge;
|
_judge = judge;
|
||||||
|
_screenSize = new InputVector(screenSize.x, screenSize.y);
|
||||||
foreach (var i in ruleset.inputs) {
|
foreach (var i in ruleset.inputs) {
|
||||||
_use.Add(i.Key, 0);
|
_use.Add(i.Key, 0);
|
||||||
_rev.Add(i.Key, new List<Identifier>());
|
_rev.Add(i.Key, new List<Identifier>());
|
||||||
@@ -42,10 +46,15 @@ namespace Cryville.Crtr {
|
|||||||
public event EventHandler<ProxyChangedEventArgs> ProxyChanged;
|
public event EventHandler<ProxyChangedEventArgs> ProxyChanged;
|
||||||
public void LoadFrom(Dictionary<string, RulesetConfig.InputEntry> config) {
|
public void LoadFrom(Dictionary<string, RulesetConfig.InputEntry> config) {
|
||||||
foreach (var cfg in config) {
|
foreach (var cfg in config) {
|
||||||
|
var handler = Game.InputManager.GetHandlerByTypeName(cfg.Value.handler);
|
||||||
|
if (handler == null) {
|
||||||
|
Logger.Log("main", 3, "Input", "Uninitialized or unknown handler in ruleset config: {0}", cfg.Value.handler);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
Set(new InputProxyEntry {
|
Set(new InputProxyEntry {
|
||||||
Target = new Identifier(cfg.Key),
|
Target = new Identifier(cfg.Key),
|
||||||
Source = new InputSource {
|
Source = new InputSource {
|
||||||
Handler = Game.InputManager.GetHandler(cfg.Value.handler),
|
Handler = handler,
|
||||||
Type = cfg.Value.type
|
Type = cfg.Value.type
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -55,7 +64,7 @@ namespace Cryville.Crtr {
|
|||||||
config.Clear();
|
config.Clear();
|
||||||
foreach (var p in _tproxies) {
|
foreach (var p in _tproxies) {
|
||||||
config.Add((string)p.Key.Name, new RulesetConfig.InputEntry {
|
config.Add((string)p.Key.Name, new RulesetConfig.InputEntry {
|
||||||
handler = TypeNameHelper.GetNamespaceQualifiedName(p.Value.Source.Value.Handler.GetType()),
|
handler = p.Value.Source.Value.Handler.GetType().AssemblyQualifiedName,
|
||||||
type = p.Value.Source.Value.Type
|
type = p.Value.Source.Value.Type
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -176,7 +185,7 @@ namespace Cryville.Crtr {
|
|||||||
|
|
||||||
static readonly int _var_value = IdentifierManager.Shared.Request("value");
|
static readonly int _var_value = IdentifierManager.Shared.Request("value");
|
||||||
const int MAX_DEPTH = 15;
|
const int MAX_DEPTH = 15;
|
||||||
const int MAX_DIMENSION = 3;
|
const int MAX_DIMENSION = 4;
|
||||||
readonly InputVectorSrc[] _vecsrcs = new InputVectorSrc[MAX_DEPTH + 1];
|
readonly InputVectorSrc[] _vecsrcs = new InputVectorSrc[MAX_DEPTH + 1];
|
||||||
readonly InputVectorOp[] _vecops = new InputVectorOp[MAX_DEPTH + 1];
|
readonly InputVectorOp[] _vecops = new InputVectorOp[MAX_DEPTH + 1];
|
||||||
unsafe class InputVectorSrc : PropSrc.FixedBuffer {
|
unsafe class InputVectorSrc : PropSrc.FixedBuffer {
|
||||||
@@ -186,9 +195,9 @@ namespace Cryville.Crtr {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
public bool IsNull { get; set; }
|
public bool IsNull { get; set; }
|
||||||
public void Set(RVector3 vec) {
|
public void Set(RVector4 vec) {
|
||||||
fixed (byte* _ptr = buf) {
|
fixed (byte* _ptr = buf) {
|
||||||
*(RVector3*)_ptr = vec;
|
*(RVector4*)_ptr = vec;
|
||||||
}
|
}
|
||||||
Invalidate();
|
Invalidate();
|
||||||
}
|
}
|
||||||
@@ -204,7 +213,7 @@ namespace Cryville.Crtr {
|
|||||||
_src.IsNull = true;
|
_src.IsNull = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var vec = new RVector3();
|
var vec = new RVector4();
|
||||||
int dim;
|
int dim;
|
||||||
if (op.Type == PdtInternalType.Number) dim = 1;
|
if (op.Type == PdtInternalType.Number) dim = 1;
|
||||||
else if (op.Type == PdtInternalType.Vector) {
|
else if (op.Type == PdtInternalType.Vector) {
|
||||||
@@ -228,19 +237,32 @@ namespace Cryville.Crtr {
|
|||||||
readonly Dictionary<InputIdentifier, float> _vect = new Dictionary<InputIdentifier, float>();
|
readonly Dictionary<InputIdentifier, float> _vect = new Dictionary<InputIdentifier, float>();
|
||||||
readonly Dictionary<ProxiedInputIdentifier, PropSrc> _vecs = new Dictionary<ProxiedInputIdentifier, PropSrc>();
|
readonly Dictionary<ProxiedInputIdentifier, PropSrc> _vecs = new Dictionary<ProxiedInputIdentifier, PropSrc>();
|
||||||
double? _lockTime = null;
|
double? _lockTime = null;
|
||||||
unsafe void OnInput(InputIdentifier id, InputVector vec) {
|
unsafe void OnInput(InputIdentifier id, InputFrame frame) {
|
||||||
lock (_etor) {
|
var rc = id.Source.Handler.ReferenceCue;
|
||||||
|
if (rc.RelativeUnit == RelativeUnit.Pixel) {
|
||||||
|
frame = rc.InverseTransform(frame, _screenSize);
|
||||||
|
var vec = frame.Vector;
|
||||||
|
vec.X /= _screenSize.X; vec.Y /= _screenSize.Y;
|
||||||
|
vec.X -= 0.5f; vec.Y -= 0.5f;
|
||||||
|
vec.X *= ChartPlayer.hitRect.width; vec.Y *= ChartPlayer.hitRect.height;
|
||||||
|
frame.Vector = vec;
|
||||||
|
}
|
||||||
|
else frame = rc.InverseTransform(frame);
|
||||||
|
bool locked = false;
|
||||||
|
try {
|
||||||
|
Profiler.BeginSample("InputProxy.OnInput");
|
||||||
|
Monitor.Enter(_etor, ref locked);
|
||||||
InputProxyEntry proxy;
|
InputProxyEntry proxy;
|
||||||
if (_sproxies.TryGetValue(id.Source, out proxy)) {
|
if (_sproxies.TryGetValue(id.Source, out proxy)) {
|
||||||
_etor.ContextCascadeInsert();
|
_etor.ContextCascadeInsert();
|
||||||
float ft, tt = (float)(_lockTime != null ? _lockTime.Value : (vec.Time - _timeOrigins[id.Source.Handler]));
|
float ft, tt = (float)(_lockTime != null ? _lockTime.Value : (frame.Time - _timeOrigins[id.Source.Handler]));
|
||||||
if (!_vect.TryGetValue(id, out ft)) ft = tt;
|
if (!_vect.TryGetValue(id, out ft)) ft = tt;
|
||||||
if (vec.IsNull) {
|
if (frame.IsNull) {
|
||||||
_etor.ContextCascadeUpdate(_var_value, PropSrc.Null);
|
_etor.ContextCascadeUpdate(_var_value, PropSrc.Null);
|
||||||
OnInput(id, proxy.Target, ft, tt, true);
|
OnInput(id, proxy.Target, ft, tt, true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
_vecsrcs[0].Set(vec.Vector);
|
_vecsrcs[0].Set(new RVector4(frame.Vector.X, frame.Vector.Y, frame.Vector.Z, frame.Vector.W));
|
||||||
_etor.ContextCascadeUpdate(_var_value, _vecsrcs[0]);
|
_etor.ContextCascadeUpdate(_var_value, _vecsrcs[0]);
|
||||||
OnInput(id, proxy.Target, ft, tt, false);
|
OnInput(id, proxy.Target, ft, tt, false);
|
||||||
}
|
}
|
||||||
@@ -248,6 +270,10 @@ namespace Cryville.Crtr {
|
|||||||
_etor.ContextCascadeDiscard();
|
_etor.ContextCascadeDiscard();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
finally {
|
||||||
|
if (locked) Monitor.Exit(_etor);
|
||||||
|
Profiler.EndSample();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
static readonly int _var_fv = IdentifierManager.Shared.Request("input_vec_from");
|
static readonly int _var_fv = IdentifierManager.Shared.Request("input_vec_from");
|
||||||
static readonly int _var_tv = IdentifierManager.Shared.Request("input_vec_to");
|
static readonly int _var_tv = IdentifierManager.Shared.Request("input_vec_to");
|
||||||
@@ -295,7 +321,7 @@ namespace Cryville.Crtr {
|
|||||||
foreach (var s in _sproxies) {
|
foreach (var s in _sproxies) {
|
||||||
var src = s.Key;
|
var src = s.Key;
|
||||||
if (_activeCounts[src] == 0) {
|
if (_activeCounts[src] == 0) {
|
||||||
OnInput(new InputIdentifier { Source = src, Id = 0 }, new InputVector(_lockTime != null ? _lockTime.Value : src.Handler.GetCurrentTimestamp()));
|
OnInput(new InputIdentifier { Source = src, Id = 0 }, new InputFrame(_lockTime != null ? _lockTime.Value : src.Handler.GetCurrentTimestamp()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -3,6 +3,7 @@ using Cryville.Crtr.Browsing;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using TMPro;
|
using TMPro;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
using unity = UnityEngine;
|
||||||
|
|
||||||
namespace Cryville.Crtr {
|
namespace Cryville.Crtr {
|
||||||
public class Menu : MonoBehaviour {
|
public class Menu : MonoBehaviour {
|
||||||
@@ -45,7 +46,7 @@ namespace Cryville.Crtr {
|
|||||||
m_targetAnimator.SetTrigger("T_Main");
|
m_targetAnimator.SetTrigger("T_Main");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (Input.GetKeyDown(KeyCode.Escape)) {
|
if (unity::Input.GetKeyDown(KeyCode.Escape)) {
|
||||||
if (m_targetAnimator != null) Back();
|
if (m_targetAnimator != null) Back();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,6 +2,8 @@
|
|||||||
"name": "Cryville.Crtr",
|
"name": "Cryville.Crtr",
|
||||||
"rootNamespace": "",
|
"rootNamespace": "",
|
||||||
"references": [
|
"references": [
|
||||||
|
"GUID:0bb40a8a1701f13479c68e3659a99bfd",
|
||||||
|
"GUID:ae5eee924eae80345b704d2b7de05cc0",
|
||||||
"GUID:5686e5ee69d0e084c843d61c240d7fdb",
|
"GUID:5686e5ee69d0e084c843d61c240d7fdb",
|
||||||
"GUID:13ba8ce62aa80c74598530029cb2d649",
|
"GUID:13ba8ce62aa80c74598530029cb2d649",
|
||||||
"GUID:2922aa74af3b2854e81b8a8b286d8206",
|
"GUID:2922aa74af3b2854e81b8a8b286d8206",
|
||||||
|
18
Assets/Plugins/Android/AndroidManifest.xml
Normal file
18
Assets/Plugins/Android/AndroidManifest.xml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="com.unity3d.player"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<application>
|
||||||
|
<activity
|
||||||
|
android:name="com.unity3d.player.UnityPlayerActivity"
|
||||||
|
android:theme="@style/UnityThemeSelector">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
<uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS" />
|
||||||
|
</manifest>
|
7
Assets/Plugins/Android/AndroidManifest.xml.meta
Normal file
7
Assets/Plugins/Android/AndroidManifest.xml.meta
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 10f1d59c7d7d3354c9e06e18c37d6c46
|
||||||
|
TextScriptImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
BIN
Assets/Plugins/Android/arm64-v8a/libAndroidInputProxy.so
Normal file
BIN
Assets/Plugins/Android/arm64-v8a/libAndroidInputProxy.so
Normal file
Binary file not shown.
@@ -0,0 +1,33 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1fae26592ef751f47993715f379faed4
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 0
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
Android: Android
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings:
|
||||||
|
CPU: ARM64
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
BIN
Assets/Plugins/Android/armeabi-v7a/libAndroidInputProxy.so
Normal file
BIN
Assets/Plugins/Android/armeabi-v7a/libAndroidInputProxy.so
Normal file
Binary file not shown.
@@ -0,0 +1,33 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 4328ea0ce04f49844a91172367c83c6c
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 0
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
Android: Android
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings:
|
||||||
|
CPU: ARMv7
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@@ -1,9 +1,8 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 7548d5a078795b04b8c54524389ba0fe
|
guid: 4406fa823b7746b47a76d810f5bedf6c
|
||||||
folderAsset: yes
|
folderAsset: yes
|
||||||
timeCreated: 1611035780
|
|
||||||
licenseType: Free
|
|
||||||
DefaultImporter:
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
userData:
|
userData:
|
||||||
assetBundleName:
|
assetBundleName:
|
||||||
assetBundleVariant:
|
assetBundleVariant:
|
@@ -0,0 +1,67 @@
|
|||||||
|
using System;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace Cryville.Input.Unity.Android {
|
||||||
|
public abstract class AndroidInputHandler<TSelf> : InputHandler where TSelf : AndroidInputHandler<TSelf> {
|
||||||
|
protected static TSelf Instance { get; private set; }
|
||||||
|
|
||||||
|
readonly IntPtr _t_T;
|
||||||
|
static readonly jvalue[] _p_void = new jvalue[0];
|
||||||
|
readonly IntPtr _i_T;
|
||||||
|
|
||||||
|
readonly IntPtr _m_T_activate;
|
||||||
|
readonly IntPtr _m_T_deactivate;
|
||||||
|
|
||||||
|
bool _activated;
|
||||||
|
|
||||||
|
public AndroidInputHandler(string className) {
|
||||||
|
if (Instance != null)
|
||||||
|
throw new InvalidOperationException("AndroidInputHandler already created");
|
||||||
|
if (Environment.OSVersion.Platform != PlatformID.Unix)
|
||||||
|
throw new NotSupportedException("Android input is not supported on this device");
|
||||||
|
Instance = (TSelf)this;
|
||||||
|
|
||||||
|
JavaStaticMethods.Init();
|
||||||
|
|
||||||
|
var _lt_T = AndroidJNI.FindClass(className);
|
||||||
|
_t_T = AndroidJNI.NewGlobalRef(_lt_T);
|
||||||
|
AndroidJNI.DeleteLocalRef(_lt_T);
|
||||||
|
|
||||||
|
var _m_T_init = AndroidJNI.GetMethodID(_t_T, "<init>", "()V");
|
||||||
|
var _li_T = AndroidJNI.NewObject(_t_T, _m_T_init, _p_void);
|
||||||
|
_i_T = AndroidJNI.NewGlobalRef(_li_T);
|
||||||
|
AndroidJNI.DeleteLocalRef(_li_T);
|
||||||
|
|
||||||
|
var _m_T_getId = AndroidJNI.GetMethodID(_t_T, "getId", "()I");
|
||||||
|
_m_T_activate = AndroidJNI.GetMethodID(_t_T, "activate", "()V");
|
||||||
|
_m_T_deactivate = AndroidJNI.GetMethodID(_t_T, "deactivate", "()V");
|
||||||
|
|
||||||
|
NativeMethods.AndroidInputProxy_RegisterCallback(
|
||||||
|
AndroidJNI.CallIntMethod(_i_T, _m_T_getId, _p_void),
|
||||||
|
Callback
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Activate() {
|
||||||
|
if (_activated) return;
|
||||||
|
_activated = true;
|
||||||
|
AndroidJNI.CallVoidMethod(_i_T, _m_T_activate, _p_void);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Deactivate() {
|
||||||
|
if (!_activated) return;
|
||||||
|
_activated = false;
|
||||||
|
AndroidJNI.CallVoidMethod(_i_T, _m_T_deactivate, _p_void);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Dispose(bool disposing) {
|
||||||
|
if (disposing) {
|
||||||
|
Deactivate();
|
||||||
|
AndroidJNI.DeleteGlobalRef(_i_T);
|
||||||
|
AndroidJNI.DeleteGlobalRef(_t_T);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private protected abstract AndroidInputProxy_Callback Callback { get; }
|
||||||
|
}
|
||||||
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 8fd2d5f1c7ba0c74c9ce8775075750db
|
guid: ed308f7b1ca3ed443b6eea2559c103c8
|
||||||
MonoImporter:
|
MonoImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
@@ -0,0 +1,107 @@
|
|||||||
|
using Cryville.Common.Interop;
|
||||||
|
using Cryville.Common.Logging;
|
||||||
|
using System;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
|
namespace Cryville.Input.Unity.Android {
|
||||||
|
public abstract class AndroidSensorHandler<TSelf> : AndroidInputHandler<AndroidSensorHandler<TSelf>> where TSelf : AndroidSensorHandler<TSelf> {
|
||||||
|
public AndroidSensorHandler(string typeName, byte dimension) : base("world/cryville/input/unity/android/SensorProxy$" + typeName) {
|
||||||
|
m_typeName = Regex.Replace(typeName, @"(?<=[a-z])(?=[A-Z])", " ");
|
||||||
|
m_dimension = dimension;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool IsNullable => false;
|
||||||
|
|
||||||
|
readonly byte m_dimension;
|
||||||
|
public override byte Dimension => m_dimension;
|
||||||
|
|
||||||
|
readonly string m_typeName;
|
||||||
|
public override string GetTypeName(int type) {
|
||||||
|
switch (type) {
|
||||||
|
case 0: return m_typeName;
|
||||||
|
default: throw new ArgumentOutOfRangeException("type");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override double GetCurrentTimestamp() {
|
||||||
|
return JavaStaticMethods.SystemClock_elapsedRealtimeNanos() / 1e9;
|
||||||
|
}
|
||||||
|
|
||||||
|
private protected sealed override AndroidInputProxy_Callback Callback { get { return OnFeed; } }
|
||||||
|
|
||||||
|
[MonoPInvokeCallback]
|
||||||
|
static void OnFeed(int id, int action, long time, float x, float y, float z, float w) {
|
||||||
|
try {
|
||||||
|
double timeSecs = time / 1e9;
|
||||||
|
Instance.Feed(0, id, new InputFrame(timeSecs, new InputVector(x, y, z, w)));
|
||||||
|
}
|
||||||
|
catch (Exception ex) {
|
||||||
|
Logger.Log("main", 4, "Input", "An error occurred while handling an Android sensor event: {0}", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class AndroidAccelerometerHandler : AndroidSensorHandler<AndroidAccelerometerHandler> {
|
||||||
|
public AndroidAccelerometerHandler() : base("Accelerometer", 3) { }
|
||||||
|
readonly static ReferenceCue _refCue = new ReferenceCue {
|
||||||
|
PhysicalDimension = new PhysicalDimension { Length = 1, Time = -2 },
|
||||||
|
};
|
||||||
|
public override ReferenceCue ReferenceCue => _refCue;
|
||||||
|
}
|
||||||
|
public class AndroidAccelerometerUncalibratedHandler : AndroidSensorHandler<AndroidAccelerometerUncalibratedHandler> {
|
||||||
|
public AndroidAccelerometerUncalibratedHandler() : base("AccelerometerUncalibrated", 3) { }
|
||||||
|
readonly static ReferenceCue _refCue = new ReferenceCue {
|
||||||
|
PhysicalDimension = new PhysicalDimension { Length = 1, Time = -2 },
|
||||||
|
};
|
||||||
|
public override ReferenceCue ReferenceCue => _refCue;
|
||||||
|
}
|
||||||
|
public class AndroidGameRotationVectorHandler : AndroidSensorHandler<AndroidGameRotationVectorHandler> {
|
||||||
|
public AndroidGameRotationVectorHandler() : base("GameRotationVector", 4) { }
|
||||||
|
readonly static ReferenceCue _refCue = new ReferenceCue {
|
||||||
|
PhysicalDimension = new PhysicalDimension(),
|
||||||
|
};
|
||||||
|
public override ReferenceCue ReferenceCue => _refCue;
|
||||||
|
}
|
||||||
|
public class AndroidGravityHandler : AndroidSensorHandler<AndroidGravityHandler> {
|
||||||
|
public AndroidGravityHandler() : base("Gravity", 3) { }
|
||||||
|
readonly static ReferenceCue _refCue = new ReferenceCue {
|
||||||
|
PhysicalDimension = new PhysicalDimension { Length = 1, Time = -2 },
|
||||||
|
};
|
||||||
|
public override ReferenceCue ReferenceCue => _refCue;
|
||||||
|
}
|
||||||
|
public class AndroidGyroscopeHandler : AndroidSensorHandler<AndroidGyroscopeHandler> {
|
||||||
|
public AndroidGyroscopeHandler() : base("Gyroscope", 3) { }
|
||||||
|
readonly static ReferenceCue _refCue = new ReferenceCue {
|
||||||
|
PhysicalDimension = new PhysicalDimension { Time = -1 },
|
||||||
|
};
|
||||||
|
public override ReferenceCue ReferenceCue => _refCue;
|
||||||
|
}
|
||||||
|
public class AndroidLinearAccelerationHandler : AndroidSensorHandler<AndroidLinearAccelerationHandler> {
|
||||||
|
public AndroidLinearAccelerationHandler() : base("LinearAcceleration", 3) { }
|
||||||
|
readonly static ReferenceCue _refCue = new ReferenceCue {
|
||||||
|
PhysicalDimension = new PhysicalDimension { Length = 1, Time = -2 },
|
||||||
|
};
|
||||||
|
public override ReferenceCue ReferenceCue => _refCue;
|
||||||
|
}
|
||||||
|
public class AndroidMagneticFieldHandler : AndroidSensorHandler<AndroidMagneticFieldHandler> {
|
||||||
|
public AndroidMagneticFieldHandler() : base("MagneticField", 3) { }
|
||||||
|
readonly static ReferenceCue _refCue = new ReferenceCue {
|
||||||
|
PhysicalDimension = new PhysicalDimension { Mass = 1, Time = -2, ElectricCurrent = -1 },
|
||||||
|
};
|
||||||
|
public override ReferenceCue ReferenceCue => _refCue;
|
||||||
|
}
|
||||||
|
public class AndroidMagneticFieldUncalibratedHandler : AndroidSensorHandler<AndroidMagneticFieldUncalibratedHandler> {
|
||||||
|
public AndroidMagneticFieldUncalibratedHandler() : base("MagneticFieldUncalibrated", 3) { }
|
||||||
|
readonly static ReferenceCue _refCue = new ReferenceCue {
|
||||||
|
PhysicalDimension = new PhysicalDimension { Mass = 1, Time = -2, ElectricCurrent = -1 },
|
||||||
|
};
|
||||||
|
public override ReferenceCue ReferenceCue => _refCue;
|
||||||
|
}
|
||||||
|
public class AndroidRotationVectorHandler : AndroidSensorHandler<AndroidRotationVectorHandler> {
|
||||||
|
public AndroidRotationVectorHandler() : base("RotationVector", 4) { }
|
||||||
|
readonly static ReferenceCue _refCue = new ReferenceCue {
|
||||||
|
PhysicalDimension = new PhysicalDimension(),
|
||||||
|
};
|
||||||
|
public override ReferenceCue ReferenceCue => _refCue;
|
||||||
|
}
|
||||||
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 35a1c45601c39f94db20178505a68be2
|
guid: ad609064283f3454992d6cdc8885110f
|
||||||
MonoImporter:
|
MonoImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
@@ -0,0 +1,47 @@
|
|||||||
|
using Cryville.Common.Interop;
|
||||||
|
using Cryville.Common.Logging;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Cryville.Input.Unity.Android {
|
||||||
|
public class AndroidTouchHandler : AndroidInputHandler<AndroidTouchHandler> {
|
||||||
|
public AndroidTouchHandler() : base("world/cryville/input/unity/android/TouchProxy") { }
|
||||||
|
|
||||||
|
public override bool IsNullable => true;
|
||||||
|
|
||||||
|
public override byte Dimension => 2;
|
||||||
|
|
||||||
|
readonly static ReferenceCue _refCue = new ReferenceCue {
|
||||||
|
PhysicalDimension = new PhysicalDimension { Length = 1 },
|
||||||
|
RelativeUnit = RelativeUnit.Pixel,
|
||||||
|
Flags = ReferenceFlag.FlipY,
|
||||||
|
Pivot = new InputVector(0, 1),
|
||||||
|
};
|
||||||
|
public override ReferenceCue ReferenceCue => _refCue;
|
||||||
|
|
||||||
|
public override string GetTypeName(int type) {
|
||||||
|
switch (type) {
|
||||||
|
case 0: return "Android Touch";
|
||||||
|
default: throw new ArgumentOutOfRangeException("type");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override double GetCurrentTimestamp() {
|
||||||
|
return JavaStaticMethods.SystemClock_uptimeMillis() / 1000.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private protected override AndroidInputProxy_Callback Callback { get { return OnFeed; } }
|
||||||
|
|
||||||
|
[MonoPInvokeCallback]
|
||||||
|
static void OnFeed(int id, int action, long time, float x, float y, float z, float w) {
|
||||||
|
try {
|
||||||
|
double timeSecs = time / 1000.0;
|
||||||
|
Instance.Feed(0, id, new InputFrame(timeSecs, new InputVector(x, y)));
|
||||||
|
if (action == 1 /*ACTION_UP*/ || action == 3 /*ACTION_CANCEL*/ || action == 6 /*ACTION_POINTER_UP*/)
|
||||||
|
Instance.Feed(0, id, new InputFrame(timeSecs));
|
||||||
|
}
|
||||||
|
catch (Exception ex) {
|
||||||
|
Logger.Log("main", 4, "Input", "An error occurred while handling an Android touch event: {0}", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: b0e1f8fc8f7607246b0012ad74fa0aeb
|
guid: 30eda6ba86d92084f8f038c661147f81
|
||||||
MonoImporter:
|
MonoImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"name": "Cryville.Input.Unity.Android"
|
||||||
|
}
|
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 0bb40a8a1701f13479c68e3659a99bfd
|
||||||
|
AssemblyDefinitionImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
8
Assets/Plugins/Cryville.Input.Unity.Android/Java.meta
Normal file
8
Assets/Plugins/Cryville.Input.Unity.Android/Java.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 89dfa18c4a1ae534096094086e3971ee
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@@ -0,0 +1,6 @@
|
|||||||
|
package world.cryville.input.unity.android;
|
||||||
|
|
||||||
|
final class NativeMethods {
|
||||||
|
private NativeMethods() { }
|
||||||
|
public static native void feed(int hid, int id, int action, long time, float x, float y, float z, float t);
|
||||||
|
}
|
@@ -0,0 +1,32 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1796f226463344b48bb9789967b38eda
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 0
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
Android: Android
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
28
Assets/Plugins/Cryville.Input.Unity.Android/Java/Proxy.java
Normal file
28
Assets/Plugins/Cryville.Input.Unity.Android/Java/Proxy.java
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
package world.cryville.input.unity.android;
|
||||||
|
|
||||||
|
import com.unity3d.player.UnityPlayer;
|
||||||
|
import com.unity3d.player.UnityPlayerActivity;
|
||||||
|
import world.cryville.input.unity.android.NativeMethods;
|
||||||
|
|
||||||
|
public abstract class Proxy {
|
||||||
|
protected static UnityPlayerActivity activity;
|
||||||
|
|
||||||
|
static int _count;
|
||||||
|
int _id;
|
||||||
|
|
||||||
|
public Proxy() {
|
||||||
|
if (activity == null) activity = (UnityPlayerActivity)UnityPlayer.currentActivity;
|
||||||
|
_id = _count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getId() { return _id; }
|
||||||
|
|
||||||
|
public abstract void activate();
|
||||||
|
public abstract void deactivate();
|
||||||
|
|
||||||
|
protected void feed(int id, int action, long time) { NativeMethods.feed(_id, id, action, time, 0, 0, 0, 0); }
|
||||||
|
protected void feed(int id, int action, long time, float x) { NativeMethods.feed(_id, id, action, time, x, 0, 0, 0); }
|
||||||
|
protected void feed(int id, int action, long time, float x, float y) { NativeMethods.feed(_id, id, action, time, x, y, 0, 0); }
|
||||||
|
protected void feed(int id, int action, long time, float x, float y, float z) { NativeMethods.feed(_id, id, action, time, x, y, z, 0); }
|
||||||
|
protected void feed(int id, int action, long time, float x, float y, float z, float w) { NativeMethods.feed(_id, id, action, time, x, y, z, w); }
|
||||||
|
}
|
@@ -0,0 +1,32 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b60db87d680aebd4c8d9071ff17d3a56
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 0
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
Android: Android
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@@ -0,0 +1,104 @@
|
|||||||
|
package world.cryville.input.unity.android;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.hardware.Sensor;
|
||||||
|
import android.hardware.SensorEvent;
|
||||||
|
import android.hardware.SensorEventListener;
|
||||||
|
import android.hardware.SensorManager;
|
||||||
|
import java.lang.IllegalStateException;
|
||||||
|
import java.lang.IndexOutOfBoundsException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import world.cryville.input.unity.android.Proxy;
|
||||||
|
|
||||||
|
public abstract class SensorProxy extends Proxy implements SensorEventListener {
|
||||||
|
static SensorManager manager;
|
||||||
|
|
||||||
|
int dimension;
|
||||||
|
|
||||||
|
HashMap<Sensor, Integer> sensors;
|
||||||
|
List<Sensor> candidateSensors;
|
||||||
|
|
||||||
|
public SensorProxy(int type, int dim) throws IllegalStateException, IndexOutOfBoundsException {
|
||||||
|
if (manager == null) manager = (SensorManager)activity.getSystemService(Context.SENSOR_SERVICE);
|
||||||
|
dimension = dim;
|
||||||
|
if (dimension < 0 || dimension > 4) throw new IndexOutOfBoundsException("Invalid dimension");
|
||||||
|
|
||||||
|
sensors = new HashMap<Sensor, Integer>();
|
||||||
|
candidateSensors = manager.getSensorList(type);
|
||||||
|
if (candidateSensors.size() == 0) throw new IllegalStateException("Sensor not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void activate() {
|
||||||
|
int workingSensorCount = 0;
|
||||||
|
for (Sensor sensor : candidateSensors) {
|
||||||
|
if (manager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_FASTEST)) {
|
||||||
|
sensors.put(sensor, workingSensorCount++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deactivate() {
|
||||||
|
manager.unregisterListener(this);
|
||||||
|
sensors.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAccuracyChanged(Sensor sensor, int accuracy) { }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSensorChanged(SensorEvent event) {
|
||||||
|
Integer id = sensors.get(event.sensor);
|
||||||
|
if (id == null) return;
|
||||||
|
float[] v = event.values;
|
||||||
|
switch (dimension) {
|
||||||
|
case 0: feed(0, id, event.timestamp); break;
|
||||||
|
case 1: feed(0, id, event.timestamp, v[0]); break;
|
||||||
|
case 2: feed(0, id, event.timestamp, v[0], v[1]); break;
|
||||||
|
case 3: feed(0, id, event.timestamp, v[0], v[1], v[2]); break;
|
||||||
|
case 4: feed(0, id, event.timestamp, v[0], v[1], v[2], v[3]); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Accelerometer extends SensorProxy {
|
||||||
|
public Accelerometer() { super(Sensor.TYPE_ACCELEROMETER, 3); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class AccelerometerUncalibrated extends SensorProxy {
|
||||||
|
public AccelerometerUncalibrated() { super(Sensor.TYPE_ACCELEROMETER_UNCALIBRATED, 3); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class GameRotationVector extends SensorProxy {
|
||||||
|
public GameRotationVector() { super(Sensor.TYPE_GAME_ROTATION_VECTOR, 4); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Gravity extends SensorProxy {
|
||||||
|
public Gravity() { super(Sensor.TYPE_GRAVITY, 3); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Gyroscope extends SensorProxy {
|
||||||
|
public Gyroscope() { super(Sensor.TYPE_GYROSCOPE, 3); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class GyroscopeUncalibrated extends SensorProxy {
|
||||||
|
public GyroscopeUncalibrated() { super(Sensor.TYPE_GYROSCOPE_UNCALIBRATED, 3); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class LinearAcceleration extends SensorProxy {
|
||||||
|
public LinearAcceleration() { super(Sensor.TYPE_LINEAR_ACCELERATION, 3); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class MagneticField extends SensorProxy {
|
||||||
|
public MagneticField() { super(Sensor.TYPE_MAGNETIC_FIELD, 3); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class MagneticFieldUncalibrated extends SensorProxy {
|
||||||
|
public MagneticFieldUncalibrated() { super(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, 3); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class RotationVector extends SensorProxy {
|
||||||
|
public RotationVector() { super(Sensor.TYPE_ROTATION_VECTOR, 4); }
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,32 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c1acbb4fd13ca1249880dbc02ff3c9d4
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 0
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
Android: Android
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@@ -0,0 +1,49 @@
|
|||||||
|
package world.cryville.input.unity.android;
|
||||||
|
|
||||||
|
import android.view.MotionEvent;
|
||||||
|
import android.view.View;
|
||||||
|
import com.unity3d.player.UnityPlayer;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import world.cryville.input.unity.android.Proxy;
|
||||||
|
|
||||||
|
public final class TouchProxy extends Proxy implements View.OnTouchListener {
|
||||||
|
public TouchProxy() throws NoSuchFieldException, IllegalAccessException, SecurityException {
|
||||||
|
Field playerField = activity.getClass().getDeclaredField("mUnityPlayer");
|
||||||
|
playerField.setAccessible(true);
|
||||||
|
UnityPlayer player = (UnityPlayer)playerField.get(activity);
|
||||||
|
player.setOnTouchListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean activated;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void activate() {
|
||||||
|
activated = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deactivate() {
|
||||||
|
activated = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onTouch(View v, MotionEvent event) {
|
||||||
|
if (!activated) return false;
|
||||||
|
int pointerCount = event.getPointerCount();
|
||||||
|
int action = event.getActionMasked();
|
||||||
|
int actionIndex = event.getActionIndex();
|
||||||
|
long time = event.getEventTime();
|
||||||
|
for (int i = 0; i < pointerCount; i++) {
|
||||||
|
int id = event.getPointerId(i);
|
||||||
|
float x = event.getX(i);
|
||||||
|
float y = event.getY(i);
|
||||||
|
if (action == 5 || action == 6) {
|
||||||
|
feed(id, i == actionIndex ? action : -1, time, x, y);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
feed(id, action, time, x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,32 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 4bd9aa92ec47fbf4fa63a219cfe7e4ce
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 0
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
Android: Android
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@@ -0,0 +1,27 @@
|
|||||||
|
using System;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace Cryville.Input.Unity.Android {
|
||||||
|
internal static class JavaStaticMethods {
|
||||||
|
static bool _init;
|
||||||
|
static IntPtr _t_SystemClock;
|
||||||
|
static IntPtr _m_SystemClock_elapsedRealtimeNanos;
|
||||||
|
static IntPtr _m_SystemClock_uptimeMillis;
|
||||||
|
static readonly jvalue[] _p_void = new jvalue[0];
|
||||||
|
public static void Init() {
|
||||||
|
if (_init) return;
|
||||||
|
_init = true;
|
||||||
|
var _lt_SystemClock = AndroidJNI.FindClass("android/os/SystemClock");
|
||||||
|
_t_SystemClock = AndroidJNI.NewGlobalRef(_lt_SystemClock);
|
||||||
|
_m_SystemClock_elapsedRealtimeNanos = AndroidJNI.GetStaticMethodID(_lt_SystemClock, "elapsedRealtimeNanos", "()J");
|
||||||
|
_m_SystemClock_uptimeMillis = AndroidJNI.GetStaticMethodID(_lt_SystemClock, "uptimeMillis", "()J");
|
||||||
|
AndroidJNI.DeleteLocalRef(_lt_SystemClock);
|
||||||
|
}
|
||||||
|
public static long SystemClock_elapsedRealtimeNanos() {
|
||||||
|
return AndroidJNI.CallStaticLongMethod(_t_SystemClock, _m_SystemClock_elapsedRealtimeNanos, _p_void);
|
||||||
|
}
|
||||||
|
public static long SystemClock_uptimeMillis() {
|
||||||
|
return AndroidJNI.CallStaticLongMethod(_t_SystemClock, _m_SystemClock_uptimeMillis, _p_void);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 8aa36fa1966064f489cf5c318f576d3f
|
guid: a5eec7567c416414cad01bedd2b1786b
|
||||||
MonoImporter:
|
MonoImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
@@ -0,0 +1,9 @@
|
|||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace Cryville.Input.Unity.Android {
|
||||||
|
internal delegate void AndroidInputProxy_Callback(int id, int action, long time, float x, float y, float z, float w);
|
||||||
|
internal static class NativeMethods {
|
||||||
|
[DllImport("AndroidInputProxy")]
|
||||||
|
public static extern void AndroidInputProxy_RegisterCallback(int hid, AndroidInputProxy_Callback cb);
|
||||||
|
}
|
||||||
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 139cf0675329c9d46b902249fecdb500
|
guid: d66e4c88d885f4a49bdb1c6b5783281e
|
||||||
MonoImporter:
|
MonoImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
8
Assets/Plugins/Cryville.Input.Unity.Builtin.meta
Normal file
8
Assets/Plugins/Cryville.Input.Unity.Builtin.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: caca3e7f8fad7404eb69b96c39190e02
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"name": "Cryville.Input.Unity.Builtin"
|
||||||
|
}
|
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ae5eee924eae80345b704d2b7de05cc0
|
||||||
|
AssemblyDefinitionImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@@ -2,21 +2,21 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
namespace Cryville.Common.Unity.Input {
|
namespace Cryville.Input.Unity {
|
||||||
public class UnityKeyHandler<T> : InputHandler where T : UnityKeyReceiver<T> {
|
public class UnityGuiInputHandler<T> : InputHandler where T : UnityGuiEventReceiver {
|
||||||
GameObject receiver;
|
GameObject _receiver;
|
||||||
T recvcomp;
|
T _recvComp;
|
||||||
|
|
||||||
public UnityKeyHandler() { }
|
public UnityGuiInputHandler() { }
|
||||||
|
|
||||||
protected override void Activate() {
|
protected override void Activate() {
|
||||||
receiver = new GameObject("__keyrecv__");
|
_receiver = new GameObject("__guiRecv__");
|
||||||
recvcomp = receiver.AddComponent<T>();
|
_recvComp = _receiver.AddComponent<T>();
|
||||||
recvcomp.SetCallback(Feed);
|
_recvComp.SetCallback(Feed);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Deactivate() {
|
protected override void Deactivate() {
|
||||||
if (receiver) GameObject.Destroy(receiver);
|
if (_receiver) GameObject.Destroy(_receiver);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Dispose(bool disposing) {
|
public override void Dispose(bool disposing) {
|
||||||
@@ -25,16 +25,15 @@ namespace Cryville.Common.Unity.Input {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool IsNullable(int type) {
|
public override bool IsNullable { get { return true; } }
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override byte GetDimension(int type) {
|
public override byte Dimension { get { return 0; } }
|
||||||
return 0;
|
|
||||||
}
|
readonly static ReferenceCue _refCue = new ReferenceCue { };
|
||||||
|
public override ReferenceCue ReferenceCue => _refCue;
|
||||||
|
|
||||||
public override string GetTypeName(int type) {
|
public override string GetTypeName(int type) {
|
||||||
return recvcomp.GetKeyName(type);
|
return _recvComp.GetKeyName(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override double GetCurrentTimestamp() {
|
public override double GetCurrentTimestamp() {
|
||||||
@@ -42,10 +41,10 @@ namespace Cryville.Common.Unity.Input {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract class UnityKeyReceiver<T> : MonoBehaviour where T : UnityKeyReceiver<T> {
|
public abstract class UnityGuiEventReceiver : MonoBehaviour {
|
||||||
protected Action<int, int, InputVector> Callback;
|
protected Action<int, int, InputFrame> Callback;
|
||||||
protected readonly HashSet<int> Keys = new HashSet<int>();
|
protected readonly HashSet<int> Keys = new HashSet<int>();
|
||||||
public void SetCallback(Action<int, int, InputVector> h) {
|
public void SetCallback(Action<int, int, InputFrame> h) {
|
||||||
Callback = h;
|
Callback = h;
|
||||||
}
|
}
|
||||||
public abstract string GetKeyName(int type);
|
public abstract string GetKeyName(int type);
|
||||||
@@ -55,12 +54,12 @@ namespace Cryville.Common.Unity.Input {
|
|||||||
void Update() {
|
void Update() {
|
||||||
double time = Time.realtimeSinceStartupAsDouble;
|
double time = Time.realtimeSinceStartupAsDouble;
|
||||||
foreach (var k in Keys) {
|
foreach (var k in Keys) {
|
||||||
Callback(k, 0, new InputVector(time, Vector3.zero));
|
Callback(k, 0, new InputFrame(time, new InputVector()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class UnityKeyboardReceiver : UnityKeyReceiver<UnityKeyboardReceiver> {
|
public class UnityKeyReceiver : UnityGuiEventReceiver {
|
||||||
public override string GetKeyName(int type) {
|
public override string GetKeyName(int type) {
|
||||||
return Enum.GetName(typeof(KeyCode), type);
|
return Enum.GetName(typeof(KeyCode), type);
|
||||||
}
|
}
|
||||||
@@ -72,24 +71,24 @@ namespace Cryville.Common.Unity.Input {
|
|||||||
switch (e.type) {
|
switch (e.type) {
|
||||||
case EventType.KeyDown:
|
case EventType.KeyDown:
|
||||||
if (!Keys.Contains(key)) {
|
if (!Keys.Contains(key)) {
|
||||||
Callback(key, 0, new InputVector(time, Vector3.zero));
|
Callback(key, 0, new InputFrame(time, new InputVector()));
|
||||||
Keys.Add(key);
|
Keys.Add(key);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case EventType.KeyUp:
|
case EventType.KeyUp:
|
||||||
Keys.Remove(key);
|
Keys.Remove(key);
|
||||||
Callback(key, 0, new InputVector(time));
|
Callback(key, 0, new InputFrame(time));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class UnityMouseButtonReceiver : UnityKeyReceiver<UnityMouseButtonReceiver> {
|
public class UnityMouseReceiver : UnityGuiEventReceiver {
|
||||||
public override string GetKeyName(int type) {
|
public override string GetKeyName(int type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 0: return "Mouse Left";
|
case 0: return "Mouse Left Button";
|
||||||
case 1: return "Mouse Right";
|
case 1: return "Mouse Right Button";
|
||||||
case 2: return "Mouse Middle";
|
case 2: return "Mouse Middle Button";
|
||||||
default: return string.Format("Mouse Button {0}", type);
|
default: return string.Format("Mouse Button {0}", type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -100,13 +99,13 @@ namespace Cryville.Common.Unity.Input {
|
|||||||
switch (e.type) {
|
switch (e.type) {
|
||||||
case EventType.MouseDown:
|
case EventType.MouseDown:
|
||||||
if (!Keys.Contains(key)) {
|
if (!Keys.Contains(key)) {
|
||||||
Callback(key, 0, new InputVector(time, Vector3.zero));
|
Callback(key, 0, new InputFrame(time, new InputVector()));
|
||||||
Keys.Add(key);
|
Keys.Add(key);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case EventType.MouseUp:
|
case EventType.MouseUp:
|
||||||
Keys.Remove(key);
|
Keys.Remove(key);
|
||||||
Callback(key, 0, new InputVector(time));
|
Callback(key, 0, new InputFrame(time));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 5d13ae3abab4ed94ca872bc13f466c3f
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@@ -2,9 +2,9 @@ using System;
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using unity = UnityEngine;
|
using unity = UnityEngine;
|
||||||
|
|
||||||
namespace Cryville.Common.Unity.Input {
|
namespace Cryville.Input.Unity {
|
||||||
public class UnityMouseHandler : InputHandler {
|
public class UnityMouseHandler : InputHandler {
|
||||||
GameObject receiver;
|
GameObject _receiver;
|
||||||
|
|
||||||
public UnityMouseHandler() {
|
public UnityMouseHandler() {
|
||||||
if (!unity::Input.mousePresent) {
|
if (!unity::Input.mousePresent) {
|
||||||
@@ -13,12 +13,12 @@ namespace Cryville.Common.Unity.Input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected override void Activate() {
|
protected override void Activate() {
|
||||||
receiver = new GameObject("__mouserecv__");
|
_receiver = new GameObject("__mouseRecv__");
|
||||||
receiver.AddComponent<UnityMouseReceiver>().SetHandler(this);
|
_receiver.AddComponent<UnityMouseReceiver>().SetHandler(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Deactivate() {
|
protected override void Deactivate() {
|
||||||
if (receiver) GameObject.Destroy(receiver);
|
if (_receiver) GameObject.Destroy(_receiver);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Dispose(bool disposing) {
|
public override void Dispose(bool disposing) {
|
||||||
@@ -27,15 +27,15 @@ namespace Cryville.Common.Unity.Input {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool IsNullable(int type) {
|
public override bool IsNullable { get { return false; } }
|
||||||
if (type != 0) throw new ArgumentOutOfRangeException("type");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override byte GetDimension(int type) {
|
public override byte Dimension { get { return 2; } }
|
||||||
if (type != 0) throw new ArgumentOutOfRangeException("type");
|
|
||||||
return 2;
|
readonly static ReferenceCue _refCue = new ReferenceCue {
|
||||||
}
|
PhysicalDimension = new PhysicalDimension { Length = 1 },
|
||||||
|
RelativeUnit = RelativeUnit.Pixel,
|
||||||
|
};
|
||||||
|
public override ReferenceCue ReferenceCue => _refCue;
|
||||||
|
|
||||||
public override string GetTypeName(int type) {
|
public override string GetTypeName(int type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
@@ -49,14 +49,14 @@ namespace Cryville.Common.Unity.Input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public class UnityMouseReceiver : MonoBehaviour {
|
public class UnityMouseReceiver : MonoBehaviour {
|
||||||
UnityMouseHandler handler;
|
UnityMouseHandler _handler;
|
||||||
public void SetHandler(UnityMouseHandler h) {
|
public void SetHandler(UnityMouseHandler h) {
|
||||||
handler = h;
|
_handler = h;
|
||||||
}
|
}
|
||||||
void Update() {
|
void Update() {
|
||||||
double time = Time.realtimeSinceStartupAsDouble;
|
double time = Time.realtimeSinceStartupAsDouble;
|
||||||
Vector3 pos = UnityCameraUtils.ScreenToWorldPoint(unity::Input.mousePosition);
|
Vector3 pos = unity::Input.mousePosition;
|
||||||
handler.Feed(0, 0, new InputVector(time, pos));
|
_handler.Feed(0, 0, new InputFrame(time, new InputVector(pos.x, pos.y)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 946e4d6c783bbd645a484b5612476526
|
guid: a48e9f6f85234594bba5e2a940bb33f2
|
||||||
MonoImporter:
|
MonoImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
@@ -2,9 +2,9 @@ using System;
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using unity = UnityEngine;
|
using unity = UnityEngine;
|
||||||
|
|
||||||
namespace Cryville.Common.Unity.Input {
|
namespace Cryville.Input.Unity {
|
||||||
public class UnityTouchHandler : InputHandler {
|
public class UnityTouchHandler : InputHandler {
|
||||||
GameObject receiver;
|
GameObject _receiver;
|
||||||
|
|
||||||
public UnityTouchHandler() {
|
public UnityTouchHandler() {
|
||||||
if (!unity::Input.touchSupported) {
|
if (!unity::Input.touchSupported) {
|
||||||
@@ -13,12 +13,12 @@ namespace Cryville.Common.Unity.Input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected override void Activate() {
|
protected override void Activate() {
|
||||||
receiver = new GameObject("__touchrecv__");
|
_receiver = new GameObject("__touchRecv__");
|
||||||
receiver.AddComponent<UnityPointerReceiver>().SetHandler(this);
|
_receiver.AddComponent<UnityPointerReceiver>().SetHandler(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Deactivate() {
|
protected override void Deactivate() {
|
||||||
if (receiver) GameObject.Destroy(receiver);
|
if (_receiver) GameObject.Destroy(_receiver);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Dispose(bool disposing) {
|
public override void Dispose(bool disposing) {
|
||||||
@@ -27,15 +27,15 @@ namespace Cryville.Common.Unity.Input {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool IsNullable(int type) {
|
public override bool IsNullable { get { return true; } }
|
||||||
if (type != 0) throw new ArgumentOutOfRangeException("type");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override byte GetDimension(int type) {
|
public override byte Dimension { get { return 2; } }
|
||||||
if (type != 0) throw new ArgumentOutOfRangeException("type");
|
|
||||||
return 2;
|
readonly static ReferenceCue _refCue = new ReferenceCue {
|
||||||
}
|
PhysicalDimension = new PhysicalDimension { Length = 1 },
|
||||||
|
RelativeUnit = RelativeUnit.Pixel,
|
||||||
|
};
|
||||||
|
public override ReferenceCue ReferenceCue => _refCue;
|
||||||
|
|
||||||
public override string GetTypeName(int type) {
|
public override string GetTypeName(int type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
@@ -49,19 +49,19 @@ namespace Cryville.Common.Unity.Input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public class UnityPointerReceiver : MonoBehaviour {
|
public class UnityPointerReceiver : MonoBehaviour {
|
||||||
UnityTouchHandler handler;
|
UnityTouchHandler _handler;
|
||||||
public void SetHandler(UnityTouchHandler h) {
|
public void SetHandler(UnityTouchHandler h) {
|
||||||
handler = h;
|
_handler = h;
|
||||||
}
|
}
|
||||||
void Update() {
|
void Update() {
|
||||||
double time = Time.realtimeSinceStartupAsDouble;
|
double time = Time.realtimeSinceStartupAsDouble;
|
||||||
for (int i = 0; i < unity::Input.touchCount; i++) {
|
for (int i = 0; i < unity::Input.touchCount; i++) {
|
||||||
var t = unity::Input.GetTouch(i);
|
var t = unity::Input.GetTouch(i);
|
||||||
Vector2 pos = UnityCameraUtils.ScreenToWorldPoint(t.position);
|
Vector2 pos = t.position;
|
||||||
var vec = new InputVector(time, pos);
|
var vec = new InputFrame(time, new InputVector(pos.x, pos.y));
|
||||||
handler.Feed(0, t.fingerId, vec);
|
_handler.Feed(0, t.fingerId, vec);
|
||||||
if (t.phase == TouchPhase.Ended || t.phase == TouchPhase.Canceled) {
|
if (t.phase == TouchPhase.Ended || t.phase == TouchPhase.Canceled) {
|
||||||
handler.Feed(0, t.fingerId, new InputVector(time));
|
_handler.Feed(0, t.fingerId, new InputFrame(time));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f94e26b2515ef8840bf1a79800235d8f
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
BIN
Assets/Plugins/Cryville.Input.dll
Normal file
BIN
Assets/Plugins/Cryville.Input.dll
Normal file
Binary file not shown.
33
Assets/Plugins/Cryville.Input.dll.meta
Normal file
33
Assets/Plugins/Cryville.Input.dll.meta
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 32c723496ecae8c478e5ecbe2635d1b8
|
||||||
|
PluginImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
iconMap: {}
|
||||||
|
executionOrder: {}
|
||||||
|
defineConstraints: []
|
||||||
|
isPreloaded: 0
|
||||||
|
isOverridable: 0
|
||||||
|
isExplicitlyReferenced: 0
|
||||||
|
validateReferences: 1
|
||||||
|
platformData:
|
||||||
|
- first:
|
||||||
|
Any:
|
||||||
|
second:
|
||||||
|
enabled: 1
|
||||||
|
settings: {}
|
||||||
|
- first:
|
||||||
|
Editor: Editor
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
DefaultValueInitialized: true
|
||||||
|
- first:
|
||||||
|
Windows Store Apps: WindowsStoreApps
|
||||||
|
second:
|
||||||
|
enabled: 0
|
||||||
|
settings:
|
||||||
|
CPU: AnyCPU
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
510
Assets/Plugins/Cryville.Input.xml
Normal file
510
Assets/Plugins/Cryville.Input.xml
Normal file
@@ -0,0 +1,510 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<doc>
|
||||||
|
<assembly>
|
||||||
|
<name>Cryville.Input</name>
|
||||||
|
</assembly>
|
||||||
|
<members>
|
||||||
|
<member name="T:Cryville.Input.InputEvent">
|
||||||
|
<summary>
|
||||||
|
Input event.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.InputEvent.Identifier">
|
||||||
|
<summary>
|
||||||
|
The identifier.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.InputEvent.From">
|
||||||
|
<summary>
|
||||||
|
The input frame last received.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.InputEvent.To">
|
||||||
|
<summary>
|
||||||
|
The new input frame received.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputEvent.ToString">
|
||||||
|
<inheritdoc />
|
||||||
|
</member>
|
||||||
|
<member name="T:Cryville.Input.InputFrameHandler">
|
||||||
|
<summary>
|
||||||
|
Represents the method that will handle the <see cref="E:Cryville.Input.InputHandler.OnInput" /> event.
|
||||||
|
</summary>
|
||||||
|
<param name="identifier">The identifier of <paramref name="vector" />.</param>
|
||||||
|
<param name="vector">The new input frame.</param>
|
||||||
|
</member>
|
||||||
|
<member name="T:Cryville.Input.InputHandler">
|
||||||
|
<summary>
|
||||||
|
Input handler.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="E:Cryville.Input.InputHandler.OnInput">
|
||||||
|
<summary>
|
||||||
|
Occurs when a new input frame is sent.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputHandler.Finalize">
|
||||||
|
<inheritdoc />
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputHandler.Dispose">
|
||||||
|
<inheritdoc />
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputHandler.Activate">
|
||||||
|
<summary>
|
||||||
|
Activates the input handler and starts receiving new input frames.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputHandler.Deactivate">
|
||||||
|
<summary>
|
||||||
|
Deactivates the input handler and stops receiving new input frames.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputHandler.Dispose(System.Boolean)">
|
||||||
|
<summary>
|
||||||
|
Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
|
||||||
|
</summary>
|
||||||
|
<param name="disposing">Whether disposing or finalizing.</param>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.InputHandler.IsNullable">
|
||||||
|
<summary>
|
||||||
|
Whether null input frames may be sent by the input handler.
|
||||||
|
</summary>
|
||||||
|
<remarks>
|
||||||
|
<para>See <see cref="P:Cryville.Input.InputFrame.IsNull" /> for more information.</para>
|
||||||
|
</remarks>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.InputHandler.Dimension">
|
||||||
|
<summary>
|
||||||
|
The dimension of the vectors sent by the input handler.
|
||||||
|
</summary>
|
||||||
|
<remarks>
|
||||||
|
<para>Dimension must be an integer from 0 (inclusive) to 4 (inclusive.) The components of the <see cref="T:Cryville.Input.InputVector" /> whose indices are beyond the dimension should be set to 0.</para>
|
||||||
|
</remarks>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.InputHandler.ReferenceCue">
|
||||||
|
<summary>
|
||||||
|
The reference cue for the vectors sent by the input handler.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputHandler.GetTypeName(System.Int32)">
|
||||||
|
<summary>
|
||||||
|
Gets the friendly name of the specified type.
|
||||||
|
</summary>
|
||||||
|
<param name="type">The type.</param>
|
||||||
|
<returns>The friendly name of the specified type.</returns>
|
||||||
|
<remarks>
|
||||||
|
<para>See <see cref="P:Cryville.Input.InputSource.Type"/> for more information.</para>
|
||||||
|
</remarks>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputHandler.GetCurrentTimestamp">
|
||||||
|
<summary>
|
||||||
|
Gets the current timestamp of the input handler.
|
||||||
|
</summary>
|
||||||
|
<returns>The current timestamp of the input handler in seconds.</returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputHandler.Feed(System.Int32,System.Int32,Cryville.Input.InputFrame)">
|
||||||
|
<summary>
|
||||||
|
Sends a new input frame.
|
||||||
|
</summary>
|
||||||
|
<param name="type">The type of the input frame.</param>
|
||||||
|
<param name="identifier">The ID of the input frame.</param>
|
||||||
|
<param name="frame">The input frame.</param>
|
||||||
|
</member>
|
||||||
|
<member name="T:Cryville.Input.InputIdentifier">
|
||||||
|
<summary>
|
||||||
|
Input identifier.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.InputIdentifier.Source">
|
||||||
|
<summary>
|
||||||
|
The input source.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.InputIdentifier.Id">
|
||||||
|
<summary>
|
||||||
|
The input ID.
|
||||||
|
</summary>
|
||||||
|
<remarks>
|
||||||
|
<para>This property is used to distinguish different inputs on the input source. For example, a touch screen that supports simultaneous touches may assign unique IDs to each finger.</para>
|
||||||
|
</remarks>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputIdentifier.Equals(System.Object)">
|
||||||
|
<inheritdoc />
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputIdentifier.Equals(Cryville.Input.InputIdentifier)">
|
||||||
|
<inheritdoc />
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputIdentifier.GetHashCode">
|
||||||
|
<inheritdoc />
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputIdentifier.ToString">
|
||||||
|
<inheritdoc />
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputIdentifier.op_Equality(Cryville.Input.InputIdentifier,Cryville.Input.InputIdentifier)">
|
||||||
|
<inheritdoc />
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputIdentifier.op_Inequality(Cryville.Input.InputIdentifier,Cryville.Input.InputIdentifier)">
|
||||||
|
<inheritdoc />
|
||||||
|
</member>
|
||||||
|
<member name="T:Cryville.Input.InputManager">
|
||||||
|
<summary>
|
||||||
|
Input manager.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="F:Cryville.Input.InputManager.HandlerRegistries">
|
||||||
|
<summary>
|
||||||
|
A set of handler types to be initialized.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputManager.#ctor">
|
||||||
|
<summary>
|
||||||
|
Creates an instance of the <see cref="T:Cryville.Input.InputManager" /> class and tries to initialize all the handlers in <see cref="F:Cryville.Input.InputManager.HandlerRegistries" />.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputManager.GetHandlerByTypeName(System.String)">
|
||||||
|
<summary>
|
||||||
|
Gets the handler with the specified type name.
|
||||||
|
</summary>
|
||||||
|
<param name="typeName">The type name.</param>
|
||||||
|
<returns>The handler with the specified type name. <see langword="null" /> if not found or not initialized.</returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputManager.EnumerateHandlers(System.Action{Cryville.Input.InputHandler})">
|
||||||
|
<summary>
|
||||||
|
Enumerates all initialized handlers and passes each of them into a callback function.
|
||||||
|
</summary>
|
||||||
|
<param name="cb">The callback function.</param>
|
||||||
|
</member>
|
||||||
|
<member name="T:Cryville.Input.InputSource">
|
||||||
|
<summary>
|
||||||
|
Input source.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.InputSource.Handler">
|
||||||
|
<summary>
|
||||||
|
The input handler.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.InputSource.Type">
|
||||||
|
<summary>
|
||||||
|
The type of the input source as an identifier of a component of the input handler.
|
||||||
|
</summary>
|
||||||
|
<remarks>
|
||||||
|
<para>This property is used to distinguish different components of the input handler. For example, each key on the keyboard is assigned a unique type number. Use <see cref="M:Cryville.Input.InputHandler.GetTypeName(System.Int32)" /> to get a friendly name of a specific type.</para>
|
||||||
|
</remarks>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputSource.Equals(System.Object)">
|
||||||
|
<inheritdoc />
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputSource.Equals(Cryville.Input.InputSource)">
|
||||||
|
<inheritdoc />
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputSource.GetHashCode">
|
||||||
|
<inheritdoc />
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputSource.ToString">
|
||||||
|
<inheritdoc />
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputSource.op_Equality(Cryville.Input.InputSource,Cryville.Input.InputSource)">
|
||||||
|
<inheritdoc />
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputSource.op_Inequality(Cryville.Input.InputSource,Cryville.Input.InputSource)">
|
||||||
|
<inheritdoc />
|
||||||
|
</member>
|
||||||
|
<member name="T:Cryville.Input.InputFrame">
|
||||||
|
<summary>
|
||||||
|
Input frame.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.InputFrame.Time">
|
||||||
|
<summary>
|
||||||
|
The timestamp in seconds.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.InputFrame.IsNull">
|
||||||
|
<summary>
|
||||||
|
Whether the vector is null.
|
||||||
|
</summary>
|
||||||
|
<remarks>
|
||||||
|
<para>An input frame with this property set to <see langword="true" /> marks the end of life of an input ID (see <see cref="P:Cryville.Input.InputIdentifier.Id" />.) This usually occurs when, for example, the button of the device is released.</para>
|
||||||
|
<para>When this property is set to <see langword="true" />, all the components of the vector is meaningless and should be set to 0.</para>
|
||||||
|
</remarks>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.InputFrame.Vector">
|
||||||
|
<summary>
|
||||||
|
The input vector.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputFrame.#ctor(System.Double)">
|
||||||
|
<summary>
|
||||||
|
Creates an instance of the <see cref="T:Cryville.Input.InputFrame" /> struct with <see cref="P:Cryville.Input.InputFrame.IsNull" /> set to <see langword="true" />.
|
||||||
|
</summary>
|
||||||
|
<param name="time">The timestamp in seconds.</param>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputFrame.#ctor(System.Double,Cryville.Input.InputVector)">
|
||||||
|
<summary>
|
||||||
|
Creates an instance of the <see cref="T:Cryville.Input.InputFrame" /> struct.
|
||||||
|
</summary>
|
||||||
|
<param name="time">The timestamp in seconds.</param>
|
||||||
|
<param name="vector">The input vector.</param>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputFrame.ToString">
|
||||||
|
<inheritdoc />
|
||||||
|
</member>
|
||||||
|
<member name="T:Cryville.Input.InputVector">
|
||||||
|
<summary>
|
||||||
|
Input vector.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.InputVector.X">
|
||||||
|
<summary>
|
||||||
|
The first component of the vector.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.InputVector.Y">
|
||||||
|
<summary>
|
||||||
|
The second component of the vector.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.InputVector.Z">
|
||||||
|
<summary>
|
||||||
|
The third component of the vector.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.InputVector.W">
|
||||||
|
<summary>
|
||||||
|
The fourth component of the vector.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputVector.#ctor(System.Single)">
|
||||||
|
<summary>
|
||||||
|
Creates an instance of the <see cref="T:Cryville.Input.InputVector" /> struct of one dimension.
|
||||||
|
</summary>
|
||||||
|
<param name="x">The first component of the vector.</param>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputVector.#ctor(System.Single,System.Single)">
|
||||||
|
<summary>
|
||||||
|
Creates an instance of the <see cref="T:Cryville.Input.InputVector" /> struct of two dimensions.
|
||||||
|
</summary>
|
||||||
|
<param name="x">The first component of the vector.</param>
|
||||||
|
<param name="y">The second component of the vector.</param>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputVector.#ctor(System.Single,System.Single,System.Single)">
|
||||||
|
<summary>
|
||||||
|
Creates an instance of the <see cref="T:Cryville.Input.InputVector" /> struct of three dimensions.
|
||||||
|
</summary>
|
||||||
|
<param name="x">The first component of the vector.</param>
|
||||||
|
<param name="y">The second component of the vector.</param>
|
||||||
|
<param name="z">The third component of the vector.</param>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputVector.#ctor(System.Single,System.Single,System.Single,System.Single)">
|
||||||
|
<summary>
|
||||||
|
Creates an instance of the <see cref="T:Cryville.Input.InputVector" /> struct of four dimensions.
|
||||||
|
</summary>
|
||||||
|
<param name="x">The first component of the vector.</param>
|
||||||
|
<param name="y">The second component of the vector.</param>
|
||||||
|
<param name="z">The third component of the vector.</param>
|
||||||
|
<param name="w">The fourth component of the vector.</param>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputVector.op_Addition(Cryville.Input.InputVector,Cryville.Input.InputVector)">
|
||||||
|
<inheritdoc />
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputVector.op_Subtraction(Cryville.Input.InputVector,Cryville.Input.InputVector)">
|
||||||
|
<inheritdoc />
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputVector.op_Multiply(System.Single,Cryville.Input.InputVector)">
|
||||||
|
<inheritdoc />
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputVector.op_UnaryNegation(Cryville.Input.InputVector)">
|
||||||
|
<inheritdoc />
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.InputVector.ToString">
|
||||||
|
<inheritdoc />
|
||||||
|
</member>
|
||||||
|
<member name="T:Cryville.Input.ReferenceCue">
|
||||||
|
<summary>
|
||||||
|
Provides cues about the frame of reference.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.ReferenceCue.PhysicalDimension">
|
||||||
|
<summary>
|
||||||
|
The physical dimension.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.ReferenceCue.RelativeUnit">
|
||||||
|
<summary>
|
||||||
|
The additional relative unit.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.ReferenceCue.Flags">
|
||||||
|
<summary>
|
||||||
|
The reference flags.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.ReferenceCue.Origin">
|
||||||
|
<summary>
|
||||||
|
The origin.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.ReferenceCue.Pivot">
|
||||||
|
<summary>
|
||||||
|
The pivot.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.ReferenceCue.Transform(Cryville.Input.InputFrame)">
|
||||||
|
<summary>
|
||||||
|
Transforms a frame into the reference by applying the offset specified by <see cref="P:Cryville.Input.ReferenceCue.Origin" />.
|
||||||
|
</summary>
|
||||||
|
<param name="frame">The input frame.</param>
|
||||||
|
<returns>The transformed input frame.</returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.ReferenceCue.InverseTransform(Cryville.Input.InputFrame)">
|
||||||
|
<summary>
|
||||||
|
Transforms a frame out of the reference by removing the offset specified by <see cref="P:Cryville.Input.ReferenceCue.Origin" />.
|
||||||
|
</summary>
|
||||||
|
<param name="frame">The input frame.</param>
|
||||||
|
<returns>The transformed input frame.</returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.ReferenceCue.Transform(Cryville.Input.InputFrame,Cryville.Input.InputVector)">
|
||||||
|
<summary>
|
||||||
|
Transforms a frame into the reference by applying the offset specified by <see cref="P:Cryville.Input.ReferenceCue.Origin" /> and <see cref="P:Cryville.Input.ReferenceCue.Pivot" />.
|
||||||
|
</summary>
|
||||||
|
<param name="frame">The input frame.</param>
|
||||||
|
<param name="universe">The universe size.</param>
|
||||||
|
<returns>The transformed input frame.</returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.ReferenceCue.InverseTransform(Cryville.Input.InputFrame,Cryville.Input.InputVector)">
|
||||||
|
<summary>
|
||||||
|
Transforms a frame out of the reference by removing the offset specified by <see cref="P:Cryville.Input.ReferenceCue.Origin" /> and <see cref="P:Cryville.Input.ReferenceCue.Pivot" />.
|
||||||
|
</summary>
|
||||||
|
<param name="frame">The input frame.</param>
|
||||||
|
<param name="universe">The universe size.</param>
|
||||||
|
<returns>The transformed input frame.</returns>
|
||||||
|
</member>
|
||||||
|
<member name="T:Cryville.Input.PhysicalDimension">
|
||||||
|
<summary>
|
||||||
|
Physical dimension.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.PhysicalDimension.Time">
|
||||||
|
<summary>
|
||||||
|
The dimensions of time.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.PhysicalDimension.Length">
|
||||||
|
<summary>
|
||||||
|
The dimensions of length.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.PhysicalDimension.Mass">
|
||||||
|
<summary>
|
||||||
|
The dimensions of mass.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.PhysicalDimension.ElectricCurrent">
|
||||||
|
<summary>
|
||||||
|
The dimensions of electric current.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.PhysicalDimension.ThermodynamicTemperature">
|
||||||
|
<summary>
|
||||||
|
The dimensions of thermodynamic temperature.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.PhysicalDimension.AmountOfSubstance">
|
||||||
|
<summary>
|
||||||
|
The dimensions of amount of substance.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:Cryville.Input.PhysicalDimension.LuminousIntensity">
|
||||||
|
<summary>
|
||||||
|
The dimensions of luminous intensity.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="T:Cryville.Input.RelativeUnit">
|
||||||
|
<summary>
|
||||||
|
Relative unit.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="F:Cryville.Input.RelativeUnit.None">
|
||||||
|
<summary>
|
||||||
|
None.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="F:Cryville.Input.RelativeUnit.Pixel">
|
||||||
|
<summary>
|
||||||
|
Pixel.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="T:Cryville.Input.ReferenceFlag">
|
||||||
|
<summary>
|
||||||
|
Reference flag.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="F:Cryville.Input.ReferenceFlag.None">
|
||||||
|
<summary>
|
||||||
|
None.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="F:Cryville.Input.ReferenceFlag.FlipX">
|
||||||
|
<summary>
|
||||||
|
The X axis is flipped.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="F:Cryville.Input.ReferenceFlag.FlipY">
|
||||||
|
<summary>
|
||||||
|
The Y axis is flipped.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="F:Cryville.Input.ReferenceFlag.FlipZ">
|
||||||
|
<summary>
|
||||||
|
The Z axis is flipped.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="F:Cryville.Input.ReferenceFlag.FlipW">
|
||||||
|
<summary>
|
||||||
|
The W axis is flipped.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="T:Cryville.Input.SimpleInputConsumer">
|
||||||
|
<summary>
|
||||||
|
A simple input consumer that receives input frames.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.SimpleInputConsumer.#ctor(Cryville.Input.InputManager)">
|
||||||
|
<summary>
|
||||||
|
Creates an instance of the <see cref="T:Cryville.Input.SimpleInputConsumer" /> class.
|
||||||
|
</summary>
|
||||||
|
<param name="manager">The input consumer.</param>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.SimpleInputConsumer.Activate">
|
||||||
|
<summary>
|
||||||
|
Activates all the input handlers.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.SimpleInputConsumer.Deactivate">
|
||||||
|
<summary>
|
||||||
|
Deactivates all the input handlers.
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.SimpleInputConsumer.OnInput(Cryville.Input.InputIdentifier,Cryville.Input.InputFrame)">
|
||||||
|
<summary>
|
||||||
|
Called when a new input frame is received.
|
||||||
|
</summary>
|
||||||
|
<param name="identifier">The input identifier.</param>
|
||||||
|
<param name="frame">The new input frame.</param>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.SimpleInputConsumer.EnumerateEvents(System.Action{Cryville.Input.InputEvent})">
|
||||||
|
<summary>
|
||||||
|
Enumerates all the input events in the queue, passes each of them into the given callback function, and then flushes the queue.
|
||||||
|
</summary>
|
||||||
|
<param name="cb">The callback function.</param>
|
||||||
|
</member>
|
||||||
|
<member name="M:Cryville.Input.SimpleInputConsumer.EnumerateActiveIdentifiers(System.Action{Cryville.Input.InputIdentifier,Cryville.Input.InputFrame})">
|
||||||
|
<summary>
|
||||||
|
Enumerates all the active identifiers and passes each of them into the given callback function with its current frame.
|
||||||
|
</summary>
|
||||||
|
<param name="cb">The callback function.</param>
|
||||||
|
</member>
|
||||||
|
</members>
|
||||||
|
</doc>
|
7
Assets/Plugins/Cryville.Input.xml.meta
Normal file
7
Assets/Plugins/Cryville.Input.xml.meta
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 46bef57d10a154a489b726decf5cb994
|
||||||
|
TextScriptImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
Reference in New Issue
Block a user