From c191e0fe7414d74052def98d82e3ff7958d61ce6 Mon Sep 17 00:00:00 2001 From: Katboi01 Date: Fri, 4 Oct 2024 16:38:54 +0200 Subject: [PATCH] Add project files. --- .vsconfig | 6 + Assets/B83.Win32.cs | 478 ++++++++++ Assets/B83.Win32.cs.meta | 11 + Assets/BmpLoader.cs | 606 +++++++++++++ Assets/BmpLoader.cs.meta | 11 + Assets/CameraOrbit.cs | 108 +++ Assets/CameraOrbit.cs.meta | 11 + Assets/CustomCardReader.cs | 97 ++ Assets/CustomCardReader.cs.meta | 11 + Assets/Plugins.meta | 10 + Assets/Plugins/x86.meta | 10 + Assets/Plugins/x86/UnityCapturePlugin.dll | Bin 0 -> 85504 bytes .../Plugins/x86/UnityCapturePlugin.dll.meta | 87 ++ Assets/Plugins/x86_64.meta | 9 + Assets/Plugins/x86_64/UnityCapturePlugin.dll | Bin 0 -> 98816 bytes .../x86_64/UnityCapturePlugin.dll.meta | 87 ++ Assets/UnityCapture.cs | 118 +++ Assets/UnityCapture.cs.meta | 12 + Assets/UnityCaptureExample.unity | 857 ++++++++++++++++++ Assets/UnityCaptureExample.unity.meta | 8 + Packages/manifest.json | 40 + Packages/packages-lock.json | 373 ++++++++ ProjectSettings/AudioManager.asset | 19 + ProjectSettings/ClusterInputManager.asset | 6 + ProjectSettings/DynamicsManager.asset | 34 + ProjectSettings/EditorBuildSettings.asset | 8 + ProjectSettings/EditorSettings.asset | 30 + ProjectSettings/GraphicsSettings.asset | 63 ++ ProjectSettings/InputManager.asset | 295 ++++++ ProjectSettings/MemorySettings.asset | 35 + ProjectSettings/NavMeshAreas.asset | 91 ++ ProjectSettings/PackageManagerSettings.asset | 35 + .../Settings.json | 5 + ProjectSettings/Physics2DSettings.asset | 56 ++ ProjectSettings/PresetManager.asset | 7 + ProjectSettings/ProjectSettings.asset | 764 ++++++++++++++++ ProjectSettings/ProjectVersion.txt | 2 + ProjectSettings/QualitySettings.asset | 232 +++++ ProjectSettings/SceneTemplateSettings.json | 121 +++ ProjectSettings/TagManager.asset | 43 + ProjectSettings/TimeManager.asset | 9 + ProjectSettings/UnityConnectSettings.asset | 36 + ProjectSettings/VFXManager.asset | 12 + ProjectSettings/VersionControlSettings.asset | 8 + ProjectSettings/XRSettings.asset | 10 + README.md | 44 +- 46 files changed, 4914 insertions(+), 1 deletion(-) create mode 100644 .vsconfig create mode 100644 Assets/B83.Win32.cs create mode 100644 Assets/B83.Win32.cs.meta create mode 100644 Assets/BmpLoader.cs create mode 100644 Assets/BmpLoader.cs.meta create mode 100644 Assets/CameraOrbit.cs create mode 100644 Assets/CameraOrbit.cs.meta create mode 100644 Assets/CustomCardReader.cs create mode 100644 Assets/CustomCardReader.cs.meta create mode 100644 Assets/Plugins.meta create mode 100644 Assets/Plugins/x86.meta create mode 100644 Assets/Plugins/x86/UnityCapturePlugin.dll create mode 100644 Assets/Plugins/x86/UnityCapturePlugin.dll.meta create mode 100644 Assets/Plugins/x86_64.meta create mode 100644 Assets/Plugins/x86_64/UnityCapturePlugin.dll create mode 100644 Assets/Plugins/x86_64/UnityCapturePlugin.dll.meta create mode 100644 Assets/UnityCapture.cs create mode 100644 Assets/UnityCapture.cs.meta create mode 100644 Assets/UnityCaptureExample.unity create mode 100644 Assets/UnityCaptureExample.unity.meta create mode 100644 Packages/manifest.json create mode 100644 Packages/packages-lock.json create mode 100644 ProjectSettings/AudioManager.asset create mode 100644 ProjectSettings/ClusterInputManager.asset create mode 100644 ProjectSettings/DynamicsManager.asset create mode 100644 ProjectSettings/EditorBuildSettings.asset create mode 100644 ProjectSettings/EditorSettings.asset create mode 100644 ProjectSettings/GraphicsSettings.asset create mode 100644 ProjectSettings/InputManager.asset create mode 100644 ProjectSettings/MemorySettings.asset create mode 100644 ProjectSettings/NavMeshAreas.asset create mode 100644 ProjectSettings/PackageManagerSettings.asset create mode 100644 ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json create mode 100644 ProjectSettings/Physics2DSettings.asset create mode 100644 ProjectSettings/PresetManager.asset create mode 100644 ProjectSettings/ProjectSettings.asset create mode 100644 ProjectSettings/ProjectVersion.txt create mode 100644 ProjectSettings/QualitySettings.asset create mode 100644 ProjectSettings/SceneTemplateSettings.json create mode 100644 ProjectSettings/TagManager.asset create mode 100644 ProjectSettings/TimeManager.asset create mode 100644 ProjectSettings/UnityConnectSettings.asset create mode 100644 ProjectSettings/VFXManager.asset create mode 100644 ProjectSettings/VersionControlSettings.asset create mode 100644 ProjectSettings/XRSettings.asset diff --git a/.vsconfig b/.vsconfig new file mode 100644 index 0000000..f019fd0 --- /dev/null +++ b/.vsconfig @@ -0,0 +1,6 @@ +{ + "version": "1.0", + "components": [ + "Microsoft.VisualStudio.Workload.ManagedGame" + ] +} diff --git a/Assets/B83.Win32.cs b/Assets/B83.Win32.cs new file mode 100644 index 0000000..04a25ba --- /dev/null +++ b/Assets/B83.Win32.cs @@ -0,0 +1,478 @@ +/* * * * * + * This is a collection of Win API helpers. Mainly dealing with window message hooks + * and file drag&drop support for Windows standalone Unity applications. + * + * 2019.11.28 - Changed the "UnityDragAndDropHook" class to a static class. This + * has been done for IL2CPP support. IL2CPP can not marshall instance method + * callbacks passed to native code. So the callbacks must be static methods. + * Therefore all fields involved also need to be static. + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Markus Göbel (Bunny83) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * * * * */ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; + +namespace B83.Win32 +{ + public enum HookType : int + { + WH_JOURNALRECORD = 0, + WH_JOURNALPLAYBACK = 1, + WH_KEYBOARD = 2, + WH_GETMESSAGE = 3, + WH_CALLWNDPROC = 4, + WH_CBT = 5, + WH_SYSMSGFILTER = 6, + WH_MOUSE = 7, + WH_HARDWARE = 8, + WH_DEBUG = 9, + WH_SHELL = 10, + WH_FOREGROUNDIDLE = 11, + WH_CALLWNDPROCRET = 12, + WH_KEYBOARD_LL = 13, + WH_MOUSE_LL = 14 + } + + // windows messages + public enum WM : uint + { + NULL = 0x0000, + CREATE = 0x0001, + DESTROY = 0x0002, + MOVE = 0x0003, + SIZE = 0x0005, + ACTIVATE = 0x0006, + SETFOCUS = 0x0007, + KILLFOCUS = 0x0008, + ENABLE = 0x000A, + SETREDRAW = 0x000B, + SETTEXT = 0x000C, + GETTEXT = 0x000D, + GETTEXTLENGTH = 0x000E, + PAINT = 0x000F, + CLOSE = 0x0010, + QUERYENDSESSION = 0x0011, + QUERYOPEN = 0x0013, + ENDSESSION = 0x0016, + QUIT = 0x0012, + ERASEBKGND = 0x0014, + SYSCOLORCHANGE = 0x0015, + SHOWWINDOW = 0x0018, + WININICHANGE = 0x001A, + SETTINGCHANGE = WININICHANGE, + DEVMODECHANGE = 0x001B, + ACTIVATEAPP = 0x001C, + FONTCHANGE = 0x001D, + TIMECHANGE = 0x001E, + CANCELMODE = 0x001F, + SETCURSOR = 0x0020, + MOUSEACTIVATE = 0x0021, + CHILDACTIVATE = 0x0022, + QUEUESYNC = 0x0023, + GETMINMAXINFO = 0x0024, + PAINTICON = 0x0026, + ICONERASEBKGND = 0x0027, + NEXTDLGCTL = 0x0028, + SPOOLERSTATUS = 0x002A, + DRAWITEM = 0x002B, + MEASUREITEM = 0x002C, + DELETEITEM = 0x002D, + VKEYTOITEM = 0x002E, + CHARTOITEM = 0x002F, + SETFONT = 0x0030, + GETFONT = 0x0031, + SETHOTKEY = 0x0032, + GETHOTKEY = 0x0033, + QUERYDRAGICON = 0x0037, + COMPAREITEM = 0x0039, + GETOBJECT = 0x003D, + COMPACTING = 0x0041, + [Obsolete] + COMMNOTIFY = 0x0044, + WINDOWPOSCHANGING = 0x0046, + WINDOWPOSCHANGED = 0x0047, + [Obsolete] + POWER = 0x0048, + COPYDATA = 0x004A, + CANCELJOURNAL = 0x004B, + NOTIFY = 0x004E, + INPUTLANGCHANGEREQUEST = 0x0050, + INPUTLANGCHANGE = 0x0051, + TCARD = 0x0052, + HELP = 0x0053, + USERCHANGED = 0x0054, + NOTIFYFORMAT = 0x0055, + CONTEXTMENU = 0x007B, + STYLECHANGING = 0x007C, + STYLECHANGED = 0x007D, + DISPLAYCHANGE = 0x007E, + GETICON = 0x007F, + SETICON = 0x0080, + NCCREATE = 0x0081, + NCDESTROY = 0x0082, + NCCALCSIZE = 0x0083, + NCHITTEST = 0x0084, + NCPAINT = 0x0085, + NCACTIVATE = 0x0086, + GETDLGCODE = 0x0087, + SYNCPAINT = 0x0088, + NCMOUSEMOVE = 0x00A0, + NCLBUTTONDOWN = 0x00A1, + NCLBUTTONUP = 0x00A2, + NCLBUTTONDBLCLK = 0x00A3, + NCRBUTTONDOWN = 0x00A4, + NCRBUTTONUP = 0x00A5, + NCRBUTTONDBLCLK = 0x00A6, + NCMBUTTONDOWN = 0x00A7, + NCMBUTTONUP = 0x00A8, + NCMBUTTONDBLCLK = 0x00A9, + NCXBUTTONDOWN = 0x00AB, + NCXBUTTONUP = 0x00AC, + NCXBUTTONDBLCLK = 0x00AD, + INPUT_DEVICE_CHANGE = 0x00FE, + INPUT = 0x00FF, + KEYFIRST = 0x0100, + KEYDOWN = 0x0100, + KEYUP = 0x0101, + CHAR = 0x0102, + DEADCHAR = 0x0103, + SYSKEYDOWN = 0x0104, + SYSKEYUP = 0x0105, + SYSCHAR = 0x0106, + SYSDEADCHAR = 0x0107, + UNICHAR = 0x0109, + KEYLAST = 0x0108, + IME_STARTCOMPOSITION = 0x010D, + IME_ENDCOMPOSITION = 0x010E, + IME_COMPOSITION = 0x010F, + IME_KEYLAST = 0x010F, + INITDIALOG = 0x0110, + COMMAND = 0x0111, + SYSCOMMAND = 0x0112, + TIMER = 0x0113, + HSCROLL = 0x0114, + VSCROLL = 0x0115, + INITMENU = 0x0116, + INITMENUPOPUP = 0x0117, + MENUSELECT = 0x011F, + MENUCHAR = 0x0120, + ENTERIDLE = 0x0121, + MENURBUTTONUP = 0x0122, + MENUDRAG = 0x0123, + MENUGETOBJECT = 0x0124, + UNINITMENUPOPUP = 0x0125, + MENUCOMMAND = 0x0126, + CHANGEUISTATE = 0x0127, + UPDATEUISTATE = 0x0128, + QUERYUISTATE = 0x0129, + CTLCOLORMSGBOX = 0x0132, + CTLCOLOREDIT = 0x0133, + CTLCOLORLISTBOX = 0x0134, + CTLCOLORBTN = 0x0135, + CTLCOLORDLG = 0x0136, + CTLCOLORSCROLLBAR = 0x0137, + CTLCOLORSTATIC = 0x0138, + MOUSEFIRST = 0x0200, + MOUSEMOVE = 0x0200, + LBUTTONDOWN = 0x0201, + LBUTTONUP = 0x0202, + LBUTTONDBLCLK = 0x0203, + RBUTTONDOWN = 0x0204, + RBUTTONUP = 0x0205, + RBUTTONDBLCLK = 0x0206, + MBUTTONDOWN = 0x0207, + MBUTTONUP = 0x0208, + MBUTTONDBLCLK = 0x0209, + MOUSEWHEEL = 0x020A, + XBUTTONDOWN = 0x020B, + XBUTTONUP = 0x020C, + XBUTTONDBLCLK = 0x020D, + MOUSEHWHEEL = 0x020E, + MOUSELAST = 0x020E, + PARENTNOTIFY = 0x0210, + ENTERMENULOOP = 0x0211, + EXITMENULOOP = 0x0212, + NEXTMENU = 0x0213, + SIZING = 0x0214, + CAPTURECHANGED = 0x0215, + MOVING = 0x0216, + POWERBROADCAST = 0x0218, + DEVICECHANGE = 0x0219, + MDICREATE = 0x0220, + MDIDESTROY = 0x0221, + MDIACTIVATE = 0x0222, + MDIRESTORE = 0x0223, + MDINEXT = 0x0224, + MDIMAXIMIZE = 0x0225, + MDITILE = 0x0226, + MDICASCADE = 0x0227, + MDIICONARRANGE = 0x0228, + MDIGETACTIVE = 0x0229, + MDISETMENU = 0x0230, + ENTERSIZEMOVE = 0x0231, + EXITSIZEMOVE = 0x0232, + DROPFILES = 0x0233, + MDIREFRESHMENU = 0x0234, + IME_SETCONTEXT = 0x0281, + IME_NOTIFY = 0x0282, + IME_CONTROL = 0x0283, + IME_COMPOSITIONFULL = 0x0284, + IME_SELECT = 0x0285, + IME_CHAR = 0x0286, + IME_REQUEST = 0x0288, + IME_KEYDOWN = 0x0290, + IME_KEYUP = 0x0291, + MOUSEHOVER = 0x02A1, + MOUSELEAVE = 0x02A3, + NCMOUSEHOVER = 0x02A0, + NCMOUSELEAVE = 0x02A2, + WTSSESSION_CHANGE = 0x02B1, + TABLET_FIRST = 0x02c0, + TABLET_LAST = 0x02df, + CUT = 0x0300, + COPY = 0x0301, + PASTE = 0x0302, + CLEAR = 0x0303, + UNDO = 0x0304, + RENDERFORMAT = 0x0305, + RENDERALLFORMATS = 0x0306, + DESTROYCLIPBOARD = 0x0307, + DRAWCLIPBOARD = 0x0308, + PAINTCLIPBOARD = 0x0309, + VSCROLLCLIPBOARD = 0x030A, + SIZECLIPBOARD = 0x030B, + ASKCBFORMATNAME = 0x030C, + CHANGECBCHAIN = 0x030D, + HSCROLLCLIPBOARD = 0x030E, + QUERYNEWPALETTE = 0x030F, + PALETTEISCHANGING = 0x0310, + PALETTECHANGED = 0x0311, + HOTKEY = 0x0312, + PRINT = 0x0317, + PRINTCLIENT = 0x0318, + APPCOMMAND = 0x0319, + THEMECHANGED = 0x031A, + CLIPBOARDUPDATE = 0x031D, + DWMCOMPOSITIONCHANGED = 0x031E, + DWMNCRENDERINGCHANGED = 0x031F, + DWMCOLORIZATIONCOLORCHANGED = 0x0320, + DWMWINDOWMAXIMIZEDCHANGE = 0x0321, + GETTITLEBARINFOEX = 0x033F, + HANDHELDFIRST = 0x0358, + HANDHELDLAST = 0x035F, + AFXFIRST = 0x0360, + AFXLAST = 0x037F, + PENWINFIRST = 0x0380, + PENWINLAST = 0x038F, + APP = 0x8000, + USER = 0x0400, + CPL_LAUNCH = USER + 0x1000, + CPL_LAUNCHED = USER + 0x1001, + SYSTIMER = 0x118, + } + + // WH_CALLWNDPROC + [StructLayout(LayoutKind.Sequential)] + public struct CWPSTRUCT + { + public IntPtr lParam; + public IntPtr wParam; + public WM message; + public IntPtr hwnd; + } + + [StructLayout(LayoutKind.Sequential)] + public struct POINT + { + public int x, y; + public POINT(int aX, int aY) + { + x = aX; + y = aY; + } + public override string ToString() + { + return "(" + x + ", " + y + ")"; + } + } + + //WH_GETMESSAGE + [StructLayout(LayoutKind.Sequential)] + public struct MSG + { + public IntPtr hwnd; + public WM message; + public IntPtr wParam; + public IntPtr lParam; + public ushort time; + public POINT pt; + } + + [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 override string ToString() + { + return "(" + Left + ", " + Top + ", " + Right + ", " + Bottom + ")"; + } + } + + public delegate IntPtr HookProc(int code, IntPtr wParam, ref MSG lParam); + public delegate bool EnumThreadDelegate(IntPtr Hwnd, IntPtr lParam); + + public static class Window + { + [DllImport("user32.dll")] + public static extern bool EnumThreadWindows(uint dwThreadId, EnumThreadDelegate lpfn, IntPtr lParam); + + [DllImport("user32.dll", SetLastError = true)] + public static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect); + + [DllImport("user32.dll")] + public static extern bool IsWindowVisible(IntPtr hWnd); + + [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] + static extern int GetClassName(IntPtr hWnd, System.Text.StringBuilder lpClassName, int nMaxCount); + public static string GetClassName(IntPtr hWnd) + { + var sb = new System.Text.StringBuilder(256); + int count = GetClassName(hWnd, sb, 256); + return sb.ToString(0, count); + } + + [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] + static extern int GetWindowTextLength(IntPtr hWnd); + [DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + static extern int GetWindowText(IntPtr hWnd, System.Text.StringBuilder lpString, int nMaxCount); + public static string GetWindowText(IntPtr hWnd) + { + int length = GetWindowTextLength(hWnd) + 2; + var sb = new System.Text.StringBuilder(length); + int count = GetWindowText(hWnd, sb, length); + return sb.ToString(0, count); + } + } + + public static class WinAPI + { + [DllImport("kernel32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr GetModuleHandle(string lpModuleName); + [DllImport("kernel32.dll")] + public static extern uint GetCurrentThreadId(); + + [DllImport("user32.dll", SetLastError = true)] + public static extern IntPtr SetWindowsHookEx(HookType hookType, HookProc lpfn, IntPtr hMod, uint dwThreadId); + [DllImport("user32.dll", SetLastError = true)] + public static extern bool UnhookWindowsHookEx(IntPtr hhk); + [DllImport("user32.dll")] + public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, ref MSG lParam); + + [DllImport("shell32.dll")] + public static extern void DragAcceptFiles(IntPtr hwnd, bool fAccept); + [DllImport("shell32.dll", CharSet = CharSet.Unicode)] + public static extern uint DragQueryFile(IntPtr hDrop, uint iFile, System.Text.StringBuilder lpszFile, uint cch); + [DllImport("shell32.dll")] + public static extern void DragFinish(IntPtr hDrop); + + [DllImport("shell32.dll")] + public static extern void DragQueryPoint(IntPtr hDrop, out POINT pos); + } + + public static class UnityDragAndDropHook + { + public delegate void DroppedFilesEvent(List aPathNames, POINT aDropPoint); + public static event DroppedFilesEvent OnDroppedFiles; + + private static uint threadId; + private static IntPtr mainWindow = IntPtr.Zero; + private static IntPtr m_Hook; + private static string m_ClassName = "UnityWndClass"; + + // attribute required for IL2CPP, also has to be a static method + [AOT.MonoPInvokeCallback(typeof(EnumThreadDelegate))] + private static bool EnumCallback(IntPtr W, IntPtr _) + { + if (Window.IsWindowVisible(W) && (mainWindow == IntPtr.Zero || (m_ClassName != null && Window.GetClassName(W) == m_ClassName))) + { + mainWindow = W; + } + return true; + } + + public static void InstallHook() + { + threadId = WinAPI.GetCurrentThreadId(); + if (threadId > 0) + Window.EnumThreadWindows(threadId, EnumCallback, IntPtr.Zero); + + var hModule = WinAPI.GetModuleHandle(null); + m_Hook = WinAPI.SetWindowsHookEx(HookType.WH_GETMESSAGE, Callback, hModule, threadId); + // Allow dragging of files onto the main window. generates the WM_DROPFILES message + WinAPI.DragAcceptFiles(mainWindow, true); + } + public static void UninstallHook() + { + WinAPI.UnhookWindowsHookEx(m_Hook); + WinAPI.DragAcceptFiles(mainWindow, false); + m_Hook = IntPtr.Zero; + } + + // attribute required for IL2CPP, also has to be a static method + [AOT.MonoPInvokeCallback(typeof(HookProc))] + private static IntPtr Callback(int code, IntPtr wParam, ref MSG lParam) + { + if (code == 0 && lParam.message == WM.DROPFILES) + { + POINT pos; + WinAPI.DragQueryPoint(lParam.wParam, out pos); + + // 0xFFFFFFFF as index makes the method return the number of files + uint n = WinAPI.DragQueryFile(lParam.wParam, 0xFFFFFFFF, null, 0); + var sb = new System.Text.StringBuilder(1024); + + List result = new List(); + for (uint i = 0; i < n; i++) + { + int len = (int)WinAPI.DragQueryFile(lParam.wParam, i, sb, 1024); + result.Add(sb.ToString(0, len)); + sb.Length = 0; + } + WinAPI.DragFinish(lParam.wParam); + if (OnDroppedFiles != null) + OnDroppedFiles(result, pos); + } + return WinAPI.CallNextHookEx(m_Hook, code, wParam, ref lParam); + } + } +} diff --git a/Assets/B83.Win32.cs.meta b/Assets/B83.Win32.cs.meta new file mode 100644 index 0000000..afa72b6 --- /dev/null +++ b/Assets/B83.Win32.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 30c5021c0b00eb24e97d49b9e31ee383 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/BmpLoader.cs b/Assets/BmpLoader.cs new file mode 100644 index 0000000..f15095c --- /dev/null +++ b/Assets/BmpLoader.cs @@ -0,0 +1,606 @@ +#region License and Information +/***** +* +* BMPLoader.cs +* +* This is a simple implementation of a BMP file loader for Unity3D. +* Formats it should support are: +* - 1 bit monochrome indexed +* - 2-8 bit indexed +* - 16 / 24 / 32 bit color (including "BI_BITFIELDS") +* - RLE-4 and RLE-8 support has been added. +* +* Unless the type is "BI_ALPHABITFIELDS" the loader does not interpret alpha +* values by default, however you can set the "ReadPaletteAlpha" setting to +* true to interpret the 4th (usually "00") value as alpha for indexed images. +* You can also set "ForceAlphaReadWhenPossible" to true so it will interpret +* the "left over" bits as alpha if there are any. It will also force to read +* alpha from a palette if it's an indexed image, just like "ReadPaletteAlpha". +* +* It's not tested well to the bone, so there might be some errors somewhere. +* However I tested it with 4 different images created with MS Paint +* (1bit, 4bit, 8bit, 24bit) as those are the only formats supported. +* +* 2017.02.05 - first version +* 2017.03.06 - Added RLE4 / RLE8 support +* 2021.01.21 - Fixed RLE4 bug; Fixed wrongly reading bit masks for indexed images. +* 2021.01.22 - Addes support for negative heights (top-down images) The actual +* flipping happens once at the Texture2D conversion. +* +* Copyright (c) 2017 Markus Göbel (Bunny83) +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to +* deal in the Software without restriction, including without limitation the +* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +* sell copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +* IN THE SOFTWARE. +* +*****/ +#endregion License and Information +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System; + +namespace B83.Image.BMP +{ + public enum BMPComressionMode : int + { + BI_RGB = 0x00, + BI_RLE8 = 0x01, + BI_RLE4 = 0x02, + BI_BITFIELDS = 0x03, + BI_JPEG = 0x04, + BI_PNG = 0x05, + BI_ALPHABITFIELDS = 0x06, + + BI_CMYK = 0x0B, + BI_CMYKRLE8 = 0x0C, + BI_CMYKRLE4 = 0x0D, + + } + public struct BMPFileHeader + { + public ushort magic; // "BM" + public uint filesize; + public uint reserved; + public uint offset; + } + public struct BitmapInfoHeader + { + public uint size; + public int width; + public int height; + public ushort nColorPlanes; // always 1 + public ushort nBitsPerPixel; // [1,4,8,16,24,32] + public BMPComressionMode compressionMethod; + public uint rawImageSize; // can be "0" + public int xPPM; + public int yPPM; + public uint nPaletteColors; + public uint nImportantColors; + + public int absWidth { get { return Mathf.Abs(width); } } + public int absHeight { get { return Mathf.Abs(height); } } + + } + + public class BMPImage + { + public BMPFileHeader header; + public BitmapInfoHeader info; + public uint rMask = 0x00FF0000; + public uint gMask = 0x0000FF00; + public uint bMask = 0x000000FF; + public uint aMask = 0x00000000; + public List palette; + public Color32[] imageData; + public Texture2D ToTexture2D() + { + var tex = new Texture2D(info.absWidth, info.absHeight); + + if (info.height < 0) + FlipImage(); + + tex.SetPixels32(imageData); + tex.Apply(); + return tex; + } + // flip image if height is negative + internal void FlipImage() + { + if (info.height > 0) + return; + int w = info.absWidth; + int h = info.absHeight; + int h2 = h / 2; + for (int y = 0; y < h2; y++) + { + for (int x = 0, o1 = y * w, o2 = (h - y - 1) * w; x < w; x++, o1++, o2++) + { + var tmp = imageData[o1]; + imageData[o1] = imageData[o2]; + imageData[o2] = tmp; + } + } + info.height = h; + } + + public void ReplaceColor(Color32 aColorToSearch, Color32 aReplacementColor) + { + var s = aColorToSearch; + for (int i = 0; i < imageData.Length; i++) + { + var c = imageData[i]; + if (c.r == s.r && c.g == s.g && c.b == s.b && c.a == s.a) + imageData[i] = aReplacementColor; + } + } + public void ReplaceFirstPixelColor(Color32 aReplacementColor) + { + ReplaceColor(imageData[0], aReplacementColor); + } + public void ReplaceFirstPixelColorWithTransparency() + { + ReplaceFirstPixelColor(new Color32(0, 0, 0, 0)); + } + } + + + public class BMPLoader + { + const ushort MAGIC = 0x4D42; // "BM" little endian + public bool ReadPaletteAlpha = false; + public bool ForceAlphaReadWhenPossible = false; + + public BMPImage LoadBMP(string aFileName) + { + using (var file = File.OpenRead(aFileName)) + return LoadBMP(file); + } + public BMPImage LoadBMP(byte[] aData) + { + using (var stream = new MemoryStream(aData)) + return LoadBMP(stream); + } + + public BMPImage LoadBMP(Stream aData) + { + using (var reader = new BinaryReader(aData)) + return LoadBMP(reader); + + } + public BMPImage LoadBMP(BinaryReader aReader) + { + BMPImage bmp = new BMPImage(); + if (!ReadFileHeader(aReader, ref bmp.header)) + { + Debug.LogError("Not a BMP file"); + return null; + } + if (!ReadInfoHeader(aReader, ref bmp.info)) + { + Debug.LogError("Unsupported header format"); + return null; + } + if (bmp.info.compressionMethod != BMPComressionMode.BI_RGB + && bmp.info.compressionMethod != BMPComressionMode.BI_BITFIELDS + && bmp.info.compressionMethod != BMPComressionMode.BI_ALPHABITFIELDS + && bmp.info.compressionMethod != BMPComressionMode.BI_RLE4 + && bmp.info.compressionMethod != BMPComressionMode.BI_RLE8 + ) + { + Debug.LogError("Unsupported image format: " + bmp.info.compressionMethod); + return null; + } + long offset = 14 + bmp.info.size; + aReader.BaseStream.Seek(offset, SeekOrigin.Begin); + if (bmp.info.nBitsPerPixel < 24) + { + bmp.rMask = 0x00007C00; + bmp.gMask = 0x000003E0; + bmp.bMask = 0x0000001F; + } + + if (bmp.info.nBitsPerPixel > 8 && (bmp.info.compressionMethod == BMPComressionMode.BI_BITFIELDS || bmp.info.compressionMethod == BMPComressionMode.BI_ALPHABITFIELDS)) + { + bmp.rMask = aReader.ReadUInt32(); + bmp.gMask = aReader.ReadUInt32(); + bmp.bMask = aReader.ReadUInt32(); + } + if (ForceAlphaReadWhenPossible) + bmp.aMask = GetMask(bmp.info.nBitsPerPixel) ^ (bmp.rMask | bmp.gMask | bmp.bMask); + + if (bmp.info.compressionMethod == BMPComressionMode.BI_ALPHABITFIELDS) + bmp.aMask = aReader.ReadUInt32(); + + if (bmp.info.nPaletteColors > 0 || bmp.info.nBitsPerPixel <= 8) + bmp.palette = ReadPalette(aReader, bmp, ReadPaletteAlpha || ForceAlphaReadWhenPossible); + + + aReader.BaseStream.Seek(bmp.header.offset, SeekOrigin.Begin); + bool uncompressed = bmp.info.compressionMethod == BMPComressionMode.BI_RGB || + bmp.info.compressionMethod == BMPComressionMode.BI_BITFIELDS || + bmp.info.compressionMethod == BMPComressionMode.BI_ALPHABITFIELDS; + if (bmp.info.nBitsPerPixel == 32 && uncompressed) + Read32BitImage(aReader, bmp); + else if (bmp.info.nBitsPerPixel == 24 && uncompressed) + Read24BitImage(aReader, bmp); + else if (bmp.info.nBitsPerPixel == 16 && uncompressed) + Read16BitImage(aReader, bmp); + else if (bmp.info.compressionMethod == BMPComressionMode.BI_RLE4 && bmp.info.nBitsPerPixel == 4 && bmp.palette != null) + ReadIndexedImageRLE4(aReader, bmp); + else if (bmp.info.compressionMethod == BMPComressionMode.BI_RLE8 && bmp.info.nBitsPerPixel == 8 && bmp.palette != null) + ReadIndexedImageRLE8(aReader, bmp); + else if (uncompressed && bmp.info.nBitsPerPixel <= 8 && bmp.palette != null) + ReadIndexedImage(aReader, bmp); + else + { + Debug.LogError("Unsupported file format: " + bmp.info.compressionMethod + " BPP: " + bmp.info.nBitsPerPixel); + return null; + } + return bmp; + } + + + private static void Read32BitImage(BinaryReader aReader, BMPImage bmp) + { + int w = Mathf.Abs(bmp.info.width); + int h = Mathf.Abs(bmp.info.height); + Color32[] data = bmp.imageData = new Color32[w * h]; + if (aReader.BaseStream.Position + w * h * 4 > aReader.BaseStream.Length) + { + Debug.LogError("Unexpected end of file."); + return; + } + int shiftR = GetShiftCount(bmp.rMask); + int shiftG = GetShiftCount(bmp.gMask); + int shiftB = GetShiftCount(bmp.bMask); + int shiftA = GetShiftCount(bmp.aMask); + byte a = 255; + for (int i = 0; i < data.Length; i++) + { + uint v = aReader.ReadUInt32(); + byte r = (byte)((v & bmp.rMask) >> shiftR); + byte g = (byte)((v & bmp.gMask) >> shiftG); + byte b = (byte)((v & bmp.bMask) >> shiftB); + if (bmp.bMask != 0) + a = (byte)((v & bmp.aMask) >> shiftA); + data[i] = new Color32(r, g, b, a); + } + } + + + private static void Read24BitImage(BinaryReader aReader, BMPImage bmp) + { + int w = Mathf.Abs(bmp.info.width); + int h = Mathf.Abs(bmp.info.height); + int rowLength = ((24 * w + 31) / 32) * 4; + int count = rowLength * h; + int pad = rowLength - w * 3; + Color32[] data = bmp.imageData = new Color32[w * h]; + if (aReader.BaseStream.Position + count > aReader.BaseStream.Length) + { + Debug.LogError("Unexpected end of file. (Have " + (aReader.BaseStream.Position + count) + " bytes, expected " + aReader.BaseStream.Length + " bytes)"); + return; + } + int shiftR = GetShiftCount(bmp.rMask); + int shiftG = GetShiftCount(bmp.gMask); + int shiftB = GetShiftCount(bmp.bMask); + for (int y = 0; y < h; y++) + { + for (int x = 0; x < w; x++) + { + uint v = aReader.ReadByte() | ((uint)aReader.ReadByte() << 8) | ((uint)aReader.ReadByte() << 16); + byte r = (byte)((v & bmp.rMask) >> shiftR); + byte g = (byte)((v & bmp.gMask) >> shiftG); + byte b = (byte)((v & bmp.bMask) >> shiftB); + data[x + y * w] = new Color32(r, g, b, 255); + } + for (int i = 0; i < pad; i++) + aReader.ReadByte(); + } + } + + private static void Read16BitImage(BinaryReader aReader, BMPImage bmp) + { + int w = Mathf.Abs(bmp.info.width); + int h = Mathf.Abs(bmp.info.height); + int rowLength = ((16 * w + 31) / 32) * 4; + int count = rowLength * h; + int pad = rowLength - w * 2; + Color32[] data = bmp.imageData = new Color32[w * h]; + if (aReader.BaseStream.Position + count > aReader.BaseStream.Length) + { + Debug.LogError("Unexpected end of file. (Have " + (aReader.BaseStream.Position + count) + " bytes, expected " + aReader.BaseStream.Length + " bytes)"); + return; + } + int shiftR = GetShiftCount(bmp.rMask); + int shiftG = GetShiftCount(bmp.gMask); + int shiftB = GetShiftCount(bmp.bMask); + int shiftA = GetShiftCount(bmp.aMask); + byte a = 255; + for (int y = 0; y < h; y++) + { + for (int x = 0; x < w; x++) + { + uint v = aReader.ReadByte() | ((uint)aReader.ReadByte() << 8); + byte r = (byte)((v & bmp.rMask) >> shiftR); + byte g = (byte)((v & bmp.gMask) >> shiftG); + byte b = (byte)((v & bmp.bMask) >> shiftB); + if (bmp.aMask != 0) + a = (byte)((v & bmp.aMask) >> shiftA); + data[x + y * w] = new Color32(r, g, b, a); + } + for (int i = 0; i < pad; i++) + aReader.ReadByte(); + } + } + + private static void ReadIndexedImage(BinaryReader aReader, BMPImage bmp) + { + int w = Mathf.Abs(bmp.info.width); + int h = Mathf.Abs(bmp.info.height); + int bitCount = bmp.info.nBitsPerPixel; + int rowLength = ((bitCount * w + 31) / 32) * 4; + int count = rowLength * h; + int pad = rowLength - (w * bitCount + 7) / 8; + Color32[] data = bmp.imageData = new Color32[w * h]; + if (aReader.BaseStream.Position + count > aReader.BaseStream.Length) + { + Debug.LogError("Unexpected end of file. (Have " + (aReader.BaseStream.Position + count) + " bytes, expected " + aReader.BaseStream.Length + " bytes)"); + return; + } + BitStreamReader bitReader = new BitStreamReader(aReader); + for (int y = 0; y < h; y++) + { + for (int x = 0; x < w; x++) + { + int v = (int)bitReader.ReadBits(bitCount); + if (v >= bmp.palette.Count) + { + Debug.LogError("Indexed bitmap has indices greater than it's color palette"); + return; + } + data[x + y * w] = bmp.palette[v]; + } + bitReader.Flush(); + for (int i = 0; i < pad; i++) + aReader.ReadByte(); + } + } + private static void ReadIndexedImageRLE4(BinaryReader aReader, BMPImage bmp) + { + int w = Mathf.Abs(bmp.info.width); + int h = Mathf.Abs(bmp.info.height); + Color32[] data = bmp.imageData = new Color32[w * h]; + int x = 0; + int y = 0; + int yOffset = 0; + while (aReader.BaseStream.Position < aReader.BaseStream.Length - 1) + { + int count = (int)aReader.ReadByte(); + byte d = aReader.ReadByte(); + if (count > 0) + { + for (int i = (count / 2); i > 0; i--) + { + data[x++ + yOffset] = bmp.palette[(d >> 4) & 0x0F]; + data[x++ + yOffset] = bmp.palette[d & 0x0F]; + } + if ((count & 0x01) > 0) + { + data[x++ + yOffset] = bmp.palette[(d >> 4) & 0x0F]; + } + } + else + { + if (d == 0) + { + x = 0; + y += 1; + yOffset = y * w; + } + else if (d == 1) + { + break; + } + else if (d == 2) + { + x += aReader.ReadByte(); + y += aReader.ReadByte(); + yOffset = y * w; + } + else + { + for (int i = (d / 2); i > 0; i--) + { + byte d2 = aReader.ReadByte(); + data[x++ + yOffset] = bmp.palette[(d2 >> 4) & 0x0F]; + if (x + 1 < w) + data[x++ + yOffset] = bmp.palette[d2 & 0x0F]; + } + if ((d & 0x01) > 0) + { + data[x++ + yOffset] = bmp.palette[(aReader.ReadByte() >> 4) & 0x0F]; + } + if ((((d - 1) / 2) & 1) == 0) + { + aReader.ReadByte(); // padding (word alignment) + } + } + } + } + } + private static void ReadIndexedImageRLE8(BinaryReader aReader, BMPImage bmp) + { + int w = Mathf.Abs(bmp.info.width); + int h = Mathf.Abs(bmp.info.height); + Color32[] data = bmp.imageData = new Color32[w * h]; + int x = 0; + int y = 0; + int yOffset = 0; + while (aReader.BaseStream.Position < aReader.BaseStream.Length - 1) + { + int count = (int)aReader.ReadByte(); + byte d = aReader.ReadByte(); + if (count > 0) + { + for (int i = count; i > 0; i--) + { + data[x++ + yOffset] = bmp.palette[d]; + } + } + else + { + if (d == 0) + { + x = 0; + y += 1; + yOffset = y * w; + } + else if (d == 1) + { + break; + } + else if (d == 2) + { + x += aReader.ReadByte(); + y += aReader.ReadByte(); + yOffset = y * w; + } + else + { + for (int i = d; i > 0; i--) + { + data[x++ + yOffset] = bmp.palette[aReader.ReadByte()]; + } + if ((d & 0x01) > 0) + { + aReader.ReadByte(); // padding (word alignment) + } + } + } + } + } + private static int GetShiftCount(uint mask) + { + for (int i = 0; i < 32; i++) + { + if ((mask & 0x01) > 0) + return i; + mask >>= 1; + } + return -1; + } + private static uint GetMask(int bitCount) + { + uint mask = 0; + for (int i = 0; i < bitCount; i++) + { + mask <<= 1; + mask |= 0x01; + } + return mask; + } + private static bool ReadFileHeader(BinaryReader aReader, ref BMPFileHeader aFileHeader) + { + aFileHeader.magic = aReader.ReadUInt16(); + if (aFileHeader.magic != MAGIC) + return false; + aFileHeader.filesize = aReader.ReadUInt32(); + aFileHeader.reserved = aReader.ReadUInt32(); + aFileHeader.offset = aReader.ReadUInt32(); + return true; + } + private static bool ReadInfoHeader(BinaryReader aReader, ref BitmapInfoHeader aHeader) + { + aHeader.size = aReader.ReadUInt32(); + if (aHeader.size < 40) + return false; + aHeader.width = aReader.ReadInt32(); + aHeader.height = aReader.ReadInt32(); + aHeader.nColorPlanes = aReader.ReadUInt16(); + aHeader.nBitsPerPixel = aReader.ReadUInt16(); + aHeader.compressionMethod = (BMPComressionMode)aReader.ReadInt32(); + aHeader.rawImageSize = aReader.ReadUInt32(); + aHeader.xPPM = aReader.ReadInt32(); + aHeader.yPPM = aReader.ReadInt32(); + aHeader.nPaletteColors = aReader.ReadUInt32(); + aHeader.nImportantColors = aReader.ReadUInt32(); + int pad = (int)aHeader.size - 40; + if (pad > 0) + aReader.ReadBytes(pad); + return true; + } + public static List ReadPalette(BinaryReader aReader, BMPImage aBmp, bool aReadAlpha) + { + uint count = aBmp.info.nPaletteColors; + if (count == 0u) + count = 1u << aBmp.info.nBitsPerPixel; + var palette = new List((int)count); + for (int i = 0; i < count; i++) + { + byte b = aReader.ReadByte(); + byte g = aReader.ReadByte(); + byte r = aReader.ReadByte(); + byte a = aReader.ReadByte(); + if (!aReadAlpha) + a = 255; + palette.Add(new Color32(r, g, b, a)); + } + return palette; + } + + } + public class BitStreamReader + { + BinaryReader m_Reader; + byte m_Data = 0; + int m_Bits = 0; + + public BitStreamReader(BinaryReader aReader) + { + m_Reader = aReader; + } + public BitStreamReader(Stream aStream) : this(new BinaryReader(aStream)) { } + + public byte ReadBit() + { + if (m_Bits <= 0) + { + m_Data = m_Reader.ReadByte(); + m_Bits = 8; + } + return (byte)((m_Data >> --m_Bits) & 1); + } + + public ulong ReadBits(int aCount) + { + ulong val = 0UL; + if (aCount <= 0 || aCount > 32) + throw new System.ArgumentOutOfRangeException("aCount", "aCount must be between 1 and 32 inclusive"); + for (int i = aCount - 1; i >= 0; i--) + val |= ((ulong)ReadBit() << i); + return val; + } + public void Flush() + { + m_Data = 0; + m_Bits = 0; + } + } +} \ No newline at end of file diff --git a/Assets/BmpLoader.cs.meta b/Assets/BmpLoader.cs.meta new file mode 100644 index 0000000..d24ccdf --- /dev/null +++ b/Assets/BmpLoader.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ba8dd63641342d24eb9b629682637e1f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/CameraOrbit.cs b/Assets/CameraOrbit.cs new file mode 100644 index 0000000..594eef1 --- /dev/null +++ b/Assets/CameraOrbit.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +public class CameraOrbit : MonoBehaviour +{ + public static CameraOrbit Instance; + bool controlOn; + + EventSystem eventSystem; + + [Header("Orbit Camera")] + public float CamZoomMin = 1, CamZoomMax = 15; + + public float CamZoom = 2.4f; + public float MoveSpeed = 1; + public float ZoomSpeed = 1f; + public Camera Camera; + + private void Awake() + { + Instance = this; + Camera = GetComponent(); + eventSystem = EventSystem.current; + } + + void Update() + { + OrbitAround(false); + } + + float baseZoom; + float baseDist; + Vector2 lastMouse; + Vector2 lastTouch; + int lastTouchCount; + bool lastControlOn; + + void OrbitAround(bool aroundCharacter = false) + { + Vector2 mouse = Input.mousePosition; + Vector2 mouseDelta = Vector2.zero; + Vector2 touchDelta = Vector2.zero; + Vector3 position = transform.position; + + if (Input.GetMouseButtonDown(0) && Input.touchCount == 0 && !eventSystem.IsPointerOverGameObject()) + { + Debug.Log("Mouse"); + lastControlOn = false; + controlOn = true; + } + if (Input.GetMouseButton(0) && controlOn) + { + if(lastControlOn == false) + { + lastControlOn = true; + mouseDelta = Vector2.zero; + } + else + { + mouseDelta = (mouse - lastMouse) * Time.deltaTime; + } + position -= mouseDelta.x * MoveSpeed * transform.right; + position -= mouseDelta.y * MoveSpeed * transform.up; + position.x = Mathf.Clamp(position.x, -5, 5); + position.y = Mathf.Clamp(position.y, -5, 5); + lastMouse = mouse; + } + else + { + controlOn = false; + } + + if (!eventSystem.IsPointerOverGameObject()) + { + SetZoom(CamZoom - Input.mouseScrollDelta.y * ZoomSpeed); + } + + float camDist = CamZoom; + Camera.orthographicSize = camDist; + transform.position = position; + } + + public void SetZoom(string value) + { + SetZoom(float.Parse(value, CultureInfo.InvariantCulture)); + } + + public void SetZoom(float value) + { + value = Mathf.Round(value * 1000) / 1000; + CamZoom = Mathf.Clamp(value, CamZoomMin, CamZoomMax); + } + + public void SetZoomSpeed(float value) + { + ZoomSpeed = value; + } + + public void SetMoveSpeed(float value) + { + MoveSpeed = value; + } +} diff --git a/Assets/CameraOrbit.cs.meta b/Assets/CameraOrbit.cs.meta new file mode 100644 index 0000000..162e0b1 --- /dev/null +++ b/Assets/CameraOrbit.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 603374773bab5e448bceaac8eaa32a17 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/CustomCardReader.cs b/Assets/CustomCardReader.cs new file mode 100644 index 0000000..4c8a642 --- /dev/null +++ b/Assets/CustomCardReader.cs @@ -0,0 +1,97 @@ +using System.Collections.Generic; +using UnityEngine; +using System.Linq; +using B83.Win32; +using System; +using B83.Image.BMP; +using UnityEngine.Tilemaps; + +public class CustomCardReader : MonoBehaviour +{ + public SpriteRenderer Renderer; + public float Timer; + private BMPLoader _BMPLoader; + private Texture2D _tex; + + void OnEnable() + { + _BMPLoader = new BMPLoader(); + UnityDragAndDropHook.InstallHook(); + UnityDragAndDropHook.OnDroppedFiles += OnFiles; + + } + void OnDisable() + { + UnityDragAndDropHook.OnDroppedFiles -= OnFiles; + UnityDragAndDropHook.UninstallHook(); + } + + private void Update() + { + if(Timer > 0) + { + Timer -= Time.deltaTime; + if(Timer <= 0) + { + ClearTextures(); + } + } + } + + void OnFiles(List aFiles, POINT aPos) + { + ClearTextures(); + + string file = ""; + bool isBmp = false; + + // scan through dropped files and filter out supported image types + foreach (var f in aFiles) + { + var fi = new System.IO.FileInfo(f); + var ext = fi.Extension.ToLower(); + if(ext == ".bmp") + { + file = f; + isBmp = true; + break; + } + else if (ext == ".png" || ext == ".jpg" || ext == ".jpeg") + { + file = f; + break; + } + } + + // If the user dropped a supported file, create a DropInfo + if (file == "") return; + + var data = System.IO.File.ReadAllBytes(file); + + if(isBmp) + { + BMPImage bmpImg = _BMPLoader.LoadBMP(data); + _tex = bmpImg.ToTexture2D(); + } + else + { + _tex = new Texture2D(1, 1); + _tex.LoadImage(data); + } + + Timer = 5; + Renderer.sprite = Sprite.Create(_tex, new Rect(0.0f, 0.0f, _tex.width, _tex.height), new Vector2(0.5f, 0.5f), 100.0f); + } + + private void ClearTextures() + { + if (_tex != null) + { + Destroy(_tex); + } + if (Renderer.sprite != null) + { + Destroy(Renderer.sprite); + } + } +} \ No newline at end of file diff --git a/Assets/CustomCardReader.cs.meta b/Assets/CustomCardReader.cs.meta new file mode 100644 index 0000000..f1d030d --- /dev/null +++ b/Assets/CustomCardReader.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: afc3fa307428b2b409ba8578de599e0a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins.meta b/Assets/Plugins.meta new file mode 100644 index 0000000..5eaae50 --- /dev/null +++ b/Assets/Plugins.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: f452a138547dbb34b9edfa5d6695c929 +folderAsset: yes +timeCreated: 1519955869 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/x86.meta b/Assets/Plugins/x86.meta new file mode 100644 index 0000000..9f73c74 --- /dev/null +++ b/Assets/Plugins/x86.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 9cd051131b4a37240be23bed28adaa6a +folderAsset: yes +timeCreated: 1519954762 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/x86/UnityCapturePlugin.dll b/Assets/Plugins/x86/UnityCapturePlugin.dll new file mode 100644 index 0000000000000000000000000000000000000000..a2fabbeb3457e649763800c60295bec17664cedb GIT binary patch literal 85504 zcmeFa4OmpywKsl-Ilw^%W{jX1(V&ir4VscnY$Zqn#sQLw4iW~50;W|uotnntIes*P zkOK+B$=rJHoAymxdv7dBZ_bnMNxxrs#I*MJ3-9rKZD-bw`Uk#Rf8YICU%Bra-*`aI`tr7{dgU8gU;9SZ zn)T&b_dl?8+f6AcGwjiz`5pJa34ibWgZKXj|Nij)ck%81;s^I1 zs!zpR4d{RW{eOT0o@ZYdY-~xoAXJ5V@#lGh{OMQx2gn~k#&hRg0Nj7DDS zD@-$B%Y20yh6`ykQHC1GaxpeX5Y*!qUPK0p(05z(bO{cxpzoH9V#oVy=LOV29AQKC zi2bP}E?}$fPZQ*%XHB*0an~_X&=S?i-Hj<-iFcy~+O18&oN!8OKu$EAakuoS`$fTe zINoMA*)Ccih!^m!^R2O`S)Y%;2JW^s_Sp!wN5M-0zMei@J33M1_&apj7D08 zNVmlzWgyb+6ltjuX>Bx;3z62vA}woMYfq<0s{n!fb9nMET2V#;l5c>oOj+bdi7v0; zp+T;v+dvdwvDg|=l5Pn^D_icK);j8bNzitSN(RzpAszke=@y<$0tsB|ev6>YM(C{+ z8mFhH@h}U*ZdLc&jIfeuSQZbnAuPkl3JG@G^mH&1ppgbN(%iS4*3+rcYT84aq8Pb< zZTb`})?Q<%kIAiF=t{WsC&4Bsxmf@lL_IEQoi%8=Ui2+dyT>m1Y`zll7%F4(-(!!c zBNF%W(rTp?rL?s1r*VrW`{#g@` ziWd(*;sWvc$S{(*sT|fX34#U(@M;abxDipT&c3dqG%Na3R}r5MIunGZ+XQ8%qo-_x zc7olLfE1_#Fn+Dlzt_}mDr^ZTm$P55<-seag0I4^xA%zW>hgiF2>Z1(5)Sb;7#E7En{DE-KzSLbKc=a&E1^=X;P{xj>dZ7TQ^^ XZuUPD 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æ=gL{cZU-iW4{wg-uY>6< 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
  • {7?3xmj+Dukbfse$2hGCV-qJUC{i?22 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", + "defaultInstantiationMode": 1 + }, + "newSceneOverride": 0 +} \ No newline at end of file diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset new file mode 100644 index 0000000..1c92a78 --- /dev/null +++ b/ProjectSettings/TagManager.asset @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!78 &1 +TagManager: + serializedVersion: 2 + tags: [] + layers: + - Default + - TransparentFX + - Ignore Raycast + - + - Water + - UI + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + m_SortingLayers: + - name: Default + uniqueID: 0 + locked: 0 diff --git a/ProjectSettings/TimeManager.asset b/ProjectSettings/TimeManager.asset new file mode 100644 index 0000000..558a017 --- /dev/null +++ b/ProjectSettings/TimeManager.asset @@ -0,0 +1,9 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!5 &1 +TimeManager: + m_ObjectHideFlags: 0 + Fixed Timestep: 0.02 + Maximum Allowed Timestep: 0.33333334 + m_TimeScale: 1 + Maximum Particle Timestep: 0.03 diff --git a/ProjectSettings/UnityConnectSettings.asset b/ProjectSettings/UnityConnectSettings.asset new file mode 100644 index 0000000..a88bee0 --- /dev/null +++ b/ProjectSettings/UnityConnectSettings.asset @@ -0,0 +1,36 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!310 &1 +UnityConnectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 1 + m_Enabled: 0 + m_TestMode: 0 + m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events + m_EventUrl: https://cdp.cloud.unity3d.com/v1/events + m_ConfigUrl: https://config.uca.cloud.unity3d.com + m_DashboardUrl: https://dashboard.unity3d.com + m_TestInitMode: 0 + CrashReportingSettings: + m_EventUrl: https://perf-events.cloud.unity3d.com + m_Enabled: 0 + m_LogBufferSize: 10 + m_CaptureEditorExceptions: 1 + UnityPurchasingSettings: + m_Enabled: 0 + m_TestMode: 0 + UnityAnalyticsSettings: + m_Enabled: 0 + m_TestMode: 0 + m_InitializeOnStartup: 1 + m_PackageRequiringCoreStatsPresent: 0 + UnityAdsSettings: + m_Enabled: 0 + m_InitializeOnStartup: 1 + m_TestMode: 0 + m_IosGameId: + m_AndroidGameId: + m_GameIds: {} + m_GameId: + PerformanceReportingSettings: + m_Enabled: 0 diff --git a/ProjectSettings/VFXManager.asset b/ProjectSettings/VFXManager.asset new file mode 100644 index 0000000..3a95c98 --- /dev/null +++ b/ProjectSettings/VFXManager.asset @@ -0,0 +1,12 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!937362698 &1 +VFXManager: + m_ObjectHideFlags: 0 + m_IndirectShader: {fileID: 0} + m_CopyBufferShader: {fileID: 0} + m_SortShader: {fileID: 0} + m_StripUpdateShader: {fileID: 0} + m_RenderPipeSettingsPath: + m_FixedTimeStep: 0.016666668 + m_MaxDeltaTime: 0.05 diff --git a/ProjectSettings/VersionControlSettings.asset b/ProjectSettings/VersionControlSettings.asset new file mode 100644 index 0000000..dca2881 --- /dev/null +++ b/ProjectSettings/VersionControlSettings.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!890905787 &1 +VersionControlSettings: + m_ObjectHideFlags: 0 + m_Mode: Visible Meta Files + m_CollabEditorSettings: + inProgressEnabled: 1 diff --git a/ProjectSettings/XRSettings.asset b/ProjectSettings/XRSettings.asset new file mode 100644 index 0000000..482590c --- /dev/null +++ b/ProjectSettings/XRSettings.asset @@ -0,0 +1,10 @@ +{ + "m_SettingKeys": [ + "VR Device Disabled", + "VR Device User Alert" + ], + "m_SettingValues": [ + "False", + "False" + ] +} \ No newline at end of file diff --git a/README.md b/README.md index 6efb755..bda5ec6 100644 --- a/README.md +++ b/README.md @@ -1 +1,43 @@ -# Planet Tours Scanner \ No newline at end of file +# Planet Tours Scanner + +App that simulates KF3:PT's QR scanner. + +It creates a virtual camera that can be accessed by the game (or anything else). + +Dragging and dropping an image onto the window will display that image for 5 seconds. + +## Setup Guide: + +1. Unpack + +2. Run `Install Scanner.bat` + +3. In Planet Tours press F1. In KemFixes settings set `Dummy Cameras` to `Fill` and `Primary Camera` to `Planet Tours Scanner` + +## Usage: + +1. Run Planet Tours + +2. Run `Planet Tours Scanner.exe` + +3. When in-game, drag and drop a jpg, png or bmp on the scanner window + +4. Drag with mouse + mouse wheel in the scanner window to center on the QR code + +5. It just works + +## Uninstall: + +1. Run `Uninstall.bat` + +## Credits: + +https://github.com/Bunny83/UnityWindowsFileDrag-Drop + +https://github.com/mrayy/UnityCam + +https://github.com/schellingb/UnityCapture + +PT install guide: + +https://gmg.hopto.org:82/gmg/wiki/index.php/Kemono_Friends_3:_Planet_Tours