Move part of the input module to Cryville.Input.

This commit is contained in:
2023-05-05 00:40:51 +08:00
parent b143fb49ce
commit 0b2ea3ddbc
62 changed files with 1417 additions and 1602 deletions

View File

@@ -1,9 +0,0 @@
fileFormatVersion: 2
guid: 7548d5a078795b04b8c54524389ba0fe
folderAsset: yes
timeCreated: 1611035780
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: b0e1f8fc8f7607246b0012ad74fa0aeb
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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);
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 139cf0675329c9d46b902249fecdb500
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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);
}
}
}

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: aaf7daeaf7afb3146b3eea2a07f88055
timeCreated: 1611035810
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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 */
}
}

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: 466300df0840ba54d95240e3a800a642
timeCreated: 1611373988
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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);
}
}

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: a6ff72ea2b7f71345aa19940faf026e8
timeCreated: 1622589747
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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();
}
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 8fd2d5f1c7ba0c74c9ce8775075750db
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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;
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 35a1c45601c39f94db20178505a68be2
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,114 +0,0 @@
using System;
using System.Collections.Generic;
using UnityEngine;
namespace Cryville.Common.Unity.Input {
public class UnityKeyHandler<T> : InputHandler where T : UnityKeyReceiver<T> {
GameObject receiver;
T recvcomp;
public UnityKeyHandler() { }
protected override void Activate() {
receiver = new GameObject("__keyrecv__");
recvcomp = receiver.AddComponent<T>();
recvcomp.SetCallback(Feed);
}
protected override void Deactivate() {
if (receiver) GameObject.Destroy(receiver);
}
public override void Dispose(bool disposing) {
if (disposing) {
Deactivate();
}
}
public override bool IsNullable(int type) {
return false;
}
public override byte GetDimension(int type) {
return 0;
}
public override string GetTypeName(int type) {
return recvcomp.GetKeyName(type);
}
public override double GetCurrentTimestamp() {
return Time.realtimeSinceStartupAsDouble;
}
}
public abstract class UnityKeyReceiver<T> : MonoBehaviour where T : UnityKeyReceiver<T> {
protected Action<int, int, InputVector> Callback;
protected readonly HashSet<int> Keys = new HashSet<int>();
public void SetCallback(Action<int, int, InputVector> h) {
Callback = h;
}
public abstract string GetKeyName(int type);
void Awake() {
useGUILayout = false;
}
void Update() {
double time = Time.realtimeSinceStartupAsDouble;
foreach (var k in Keys) {
Callback(k, 0, new InputVector(time, Vector3.zero));
}
}
}
public class UnityKeyboardReceiver : UnityKeyReceiver<UnityKeyboardReceiver> {
public override string GetKeyName(int type) {
return Enum.GetName(typeof(KeyCode), type);
}
void OnGUI() {
var e = Event.current;
if (e.keyCode == KeyCode.None) return;
double time = Time.realtimeSinceStartupAsDouble;
var key = (int)e.keyCode;
switch (e.type) {
case EventType.KeyDown:
if (!Keys.Contains(key)) {
Callback(key, 0, new InputVector(time, Vector3.zero));
Keys.Add(key);
}
break;
case EventType.KeyUp:
Keys.Remove(key);
Callback(key, 0, new InputVector(time));
break;
}
}
}
public class UnityMouseButtonReceiver : UnityKeyReceiver<UnityMouseButtonReceiver> {
public override string GetKeyName(int type) {
switch (type) {
case 0: return "Mouse Left";
case 1: return "Mouse Right";
case 2: return "Mouse Middle";
default: return string.Format("Mouse Button {0}", type);
}
}
void OnGUI() {
var e = Event.current;
double time = Time.realtimeSinceStartupAsDouble;
var key = e.button;
switch (e.type) {
case EventType.MouseDown:
if (!Keys.Contains(key)) {
Callback(key, 0, new InputVector(time, Vector3.zero));
Keys.Add(key);
}
break;
case EventType.MouseUp:
Keys.Remove(key);
Callback(key, 0, new InputVector(time));
break;
}
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 8aa36fa1966064f489cf5c318f576d3f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,63 +0,0 @@
using System;
using UnityEngine;
using unity = UnityEngine;
namespace Cryville.Common.Unity.Input {
public class UnityMouseHandler : InputHandler {
GameObject receiver;
public UnityMouseHandler() {
if (!unity::Input.mousePresent) {
throw new NotSupportedException("Unity mouse is not supported on this device");
}
}
protected override void Activate() {
receiver = new GameObject("__mouserecv__");
receiver.AddComponent<UnityMouseReceiver>().SetHandler(this);
}
protected override void Deactivate() {
if (receiver) GameObject.Destroy(receiver);
}
public override void Dispose(bool disposing) {
if (disposing) {
Deactivate();
}
}
public override bool IsNullable(int type) {
if (type != 0) throw new ArgumentOutOfRangeException("type");
return false;
}
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 "Mouse Position";
default: throw new ArgumentOutOfRangeException("type");
}
}
public override double GetCurrentTimestamp() {
return Time.realtimeSinceStartupAsDouble;
}
public class UnityMouseReceiver : MonoBehaviour {
UnityMouseHandler handler;
public void SetHandler(UnityMouseHandler h) {
handler = h;
}
void Update() {
double time = Time.realtimeSinceStartupAsDouble;
Vector3 pos = UnityCameraUtils.ScreenToWorldPoint(unity::Input.mousePosition);
handler.Feed(0, 0, new InputVector(time, pos));
}
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 946e4d6c783bbd645a484b5612476526
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,70 +0,0 @@
using System;
using UnityEngine;
using unity = UnityEngine;
namespace Cryville.Common.Unity.Input {
public class UnityTouchHandler : InputHandler {
GameObject receiver;
public UnityTouchHandler() {
if (!unity::Input.touchSupported) {
throw new NotSupportedException("Unity touch is not supported on this device");
}
}
protected override void Activate() {
receiver = new GameObject("__touchrecv__");
receiver.AddComponent<UnityPointerReceiver>().SetHandler(this);
}
protected override void Deactivate() {
if (receiver) GameObject.Destroy(receiver);
}
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 "Touch";
default: throw new ArgumentOutOfRangeException("type");
}
}
public override double GetCurrentTimestamp() {
return Time.realtimeSinceStartupAsDouble;
}
public class UnityPointerReceiver : MonoBehaviour {
UnityTouchHandler handler;
public void SetHandler(UnityTouchHandler h) {
handler = h;
}
void Update() {
double time = Time.realtimeSinceStartupAsDouble;
for (int i = 0; i < unity::Input.touchCount; i++) {
var t = unity::Input.GetTouch(i);
Vector2 pos = UnityCameraUtils.ScreenToWorldPoint(t.position);
var vec = new InputVector(time, pos);
handler.Feed(0, t.fingerId, vec);
if (t.phase == TouchPhase.Ended || t.phase == TouchPhase.Canceled) {
handler.Feed(0, t.fingerId, new InputVector(time));
}
}
}
}
}
}

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: 93f60577ebaa5824dba5f322bbd1ad26
timeCreated: 1618910605
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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()));
}
}
}

View File

@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: d1b353deb73c51b409b15e54c54a6bb1
timeCreated: 1611282071
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -623,7 +623,7 @@ namespace Cryville.Crtr {
judge = new Judge(this, pruleset);
etor.ContextJudge = judge;
inputProxy = new InputProxy(pruleset, judge);
inputProxy = new InputProxy(pruleset, judge, screenSize);
inputProxy.LoadFrom(_rscfg.inputs);
if (!inputProxy.IsCompleted()) {
throw new ArgumentException("Input config not completed\nPlease complete the input settings");

View File

@@ -56,7 +56,7 @@ namespace Cryville.Crtr.Config {
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);
m_inputConfigPanel.proxy = proxy;

View File

@@ -1,6 +1,6 @@
using Cryville.Common;
using Cryville.Common.Unity;
using Cryville.Common.Unity.Input;
using Cryville.Input;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
@@ -77,7 +77,7 @@ namespace Cryville.Crtr.Config {
void Update() {
if (m_inputDialog.activeSelf) {
_consumer.EnumerateEvents(ev => {
AddSourceItem(ev.Id.Source);
AddSourceItem(ev.Identifier.Source);
});
}
}
@@ -95,7 +95,7 @@ namespace Cryville.Crtr.Config {
if (proxy.IsUsed(tsrc)) {
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>";
}
else flag = true;

View File

@@ -6,6 +6,7 @@ using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using Logger = Cryville.Common.Logging.Logger;
using unity = UnityEngine;
namespace Cryville.Crtr {
public class Console : MonoBehaviour {
@@ -36,8 +37,8 @@ namespace Cryville.Crtr {
void Update() {
if (
Input.GetKeyDown(KeyCode.Return)
|| Input.GetKeyDown(KeyCode.KeypadEnter)
unity::Input.GetKeyDown(KeyCode.Return)
|| unity::Input.GetKeyDown(KeyCode.KeypadEnter)
) {
Submit();
InputBox.text = "";

View File

@@ -3,8 +3,10 @@ using Cryville.Audio.Source;
using Cryville.Common.Font;
using Cryville.Common.Logging;
using Cryville.Common.Unity;
using Cryville.Common.Unity.Input;
using Cryville.Common.Unity.UI;
using Cryville.Input;
using Cryville.Input.Unity;
using Cryville.Input.Unity.Android;
using FFmpeg.AutoGen;
using Ionic.Zip;
using Newtonsoft.Json;
@@ -12,6 +14,7 @@ using System;
using System.IO;
using UnityEngine;
using Logger = Cryville.Common.Logging.Logger;
using unity = UnityEngine;
namespace Cryville.Crtr {
public static class Game {
@@ -58,7 +61,21 @@ namespace Cryville.Crtr {
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();
#if UNITY_EDITOR_WIN

View File

@@ -1,20 +1,23 @@
using Cryville.Common;
using Cryville.Common.Logging;
using Cryville.Common.Pdt;
using Cryville.Common.Reflection;
using Cryville.Common.Unity.Input;
using Cryville.Crtr.Config;
using Cryville.Input;
using System;
using System.Collections.Generic;
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 {
public class InputProxy : IDisposable {
readonly PdtEvaluator _etor;
readonly PdtRuleset _ruleset;
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++) {
var vecsrc = new InputVectorSrc();
_vecsrcs[i] = vecsrc;
@@ -23,6 +26,7 @@ namespace Cryville.Crtr {
_etor = judge != null ? judge._etor : ChartPlayer.etor;
_ruleset = ruleset;
_judge = judge;
_screenSize = new InputVector(screenSize.x, screenSize.y);
foreach (var i in ruleset.inputs) {
_use.Add(i.Key, 0);
_rev.Add(i.Key, new List<Identifier>());
@@ -42,10 +46,15 @@ namespace Cryville.Crtr {
public event EventHandler<ProxyChangedEventArgs> ProxyChanged;
public void LoadFrom(Dictionary<string, RulesetConfig.InputEntry> 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 {
Target = new Identifier(cfg.Key),
Source = new InputSource {
Handler = Game.InputManager.GetHandler(cfg.Value.handler),
Handler = handler,
Type = cfg.Value.type
}
});
@@ -55,7 +64,7 @@ namespace Cryville.Crtr {
config.Clear();
foreach (var p in _tproxies) {
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
});
}
@@ -176,7 +185,7 @@ namespace Cryville.Crtr {
static readonly int _var_value = IdentifierManager.Shared.Request("value");
const int MAX_DEPTH = 15;
const int MAX_DIMENSION = 3;
const int MAX_DIMENSION = 4;
readonly InputVectorSrc[] _vecsrcs = new InputVectorSrc[MAX_DEPTH + 1];
readonly InputVectorOp[] _vecops = new InputVectorOp[MAX_DEPTH + 1];
unsafe class InputVectorSrc : PropSrc.FixedBuffer {
@@ -186,9 +195,9 @@ namespace Cryville.Crtr {
}
}
public bool IsNull { get; set; }
public void Set(RVector3 vec) {
public void Set(RVector4 vec) {
fixed (byte* _ptr = buf) {
*(RVector3*)_ptr = vec;
*(RVector4*)_ptr = vec;
}
Invalidate();
}
@@ -204,7 +213,7 @@ namespace Cryville.Crtr {
_src.IsNull = true;
}
else {
var vec = new RVector3();
var vec = new RVector4();
int dim;
if (op.Type == PdtInternalType.Number) dim = 1;
else if (op.Type == PdtInternalType.Vector) {
@@ -228,19 +237,32 @@ namespace Cryville.Crtr {
readonly Dictionary<InputIdentifier, float> _vect = new Dictionary<InputIdentifier, float>();
readonly Dictionary<ProxiedInputIdentifier, PropSrc> _vecs = new Dictionary<ProxiedInputIdentifier, PropSrc>();
double? _lockTime = null;
unsafe void OnInput(InputIdentifier id, InputVector vec) {
lock (_etor) {
unsafe void OnInput(InputIdentifier id, InputFrame frame) {
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;
if (_sproxies.TryGetValue(id.Source, out proxy)) {
_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 (vec.IsNull) {
if (frame.IsNull) {
_etor.ContextCascadeUpdate(_var_value, PropSrc.Null);
OnInput(id, proxy.Target, ft, tt, true);
}
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]);
OnInput(id, proxy.Target, ft, tt, false);
}
@@ -248,6 +270,10 @@ namespace Cryville.Crtr {
_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_tv = IdentifierManager.Shared.Request("input_vec_to");
@@ -295,7 +321,7 @@ namespace Cryville.Crtr {
foreach (var s in _sproxies) {
var src = s.Key;
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()));
}
}
}

View File

@@ -3,6 +3,7 @@ using Cryville.Crtr.Browsing;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using unity = UnityEngine;
namespace Cryville.Crtr {
public class Menu : MonoBehaviour {
@@ -45,7 +46,7 @@ namespace Cryville.Crtr {
m_targetAnimator.SetTrigger("T_Main");
}
}
if (Input.GetKeyDown(KeyCode.Escape)) {
if (unity::Input.GetKeyDown(KeyCode.Escape)) {
if (m_targetAnimator != null) Back();
}
}

View File

@@ -2,6 +2,8 @@
"name": "Cryville.Crtr",
"rootNamespace": "",
"references": [
"GUID:0bb40a8a1701f13479c68e3659a99bfd",
"GUID:ae5eee924eae80345b704d2b7de05cc0",
"GUID:5686e5ee69d0e084c843d61c240d7fdb",
"GUID:13ba8ce62aa80c74598530029cb2d649",
"GUID:2922aa74af3b2854e81b8a8b286d8206",