From ed77b1a8cdee42203ff785409e2de60ca5f472bc Mon Sep 17 00:00:00 2001 From: hecomi Date: Thu, 27 Oct 2016 15:36:29 +0900 Subject: [PATCH] initial commit. --- .gitignore | 25 ++ Assets/uDesktopDuplication.meta | 9 + Assets/uDesktopDuplication/Materials.meta | 9 + .../Materials/NativeTexture.mat | Bin 0 -> 5064 bytes .../Materials/NativeTexture.mat.meta | 8 + Assets/uDesktopDuplication/Plugins.meta | 9 + .../Plugins/uDesktopDuplication.dll | Bin 0 -> 12288 bytes .../Plugins/uDesktopDuplication.dll.meta | 20 ++ Assets/uDesktopDuplication/Scenes.meta | 9 + .../uDesktopDuplication/Scenes/Example.unity | Bin 0 -> 17096 bytes .../Scenes/Example.unity.meta | 8 + Assets/uDesktopDuplication/Scripts.meta | 9 + .../Scripts/uDesktopDuplication.cs | 62 ++++ .../Scripts/uDesktopDuplication.cs.meta | 12 + Plugins/uDesktopDuplication/.gitignore | 272 ++++++++++++++++++ .../uDesktopDuplication/IUnityGraphics.h | 49 ++++ .../uDesktopDuplication/IUnityGraphicsD3D11.h | 9 + .../uDesktopDuplication/IUnityInterface.h | 148 ++++++++++ .../uDesktopDuplication/main.cpp | 179 ++++++++++++ .../uDesktopDuplication.filters | 33 +++ .../uDesktopDuplication.vcxproj | 135 +++++++++ ProjectSettings/AudioManager.asset | Bin 0 -> 4140 bytes ProjectSettings/ClusterInputManager.asset | Bin 0 -> 4104 bytes ProjectSettings/DynamicsManager.asset | Bin 0 -> 4280 bytes ProjectSettings/EditorBuildSettings.asset | Bin 0 -> 4104 bytes ProjectSettings/EditorSettings.asset | Bin 0 -> 4212 bytes ProjectSettings/GraphicsSettings.asset | Bin 0 -> 4392 bytes ProjectSettings/InputManager.asset | Bin 0 -> 5520 bytes ProjectSettings/NavMeshAreas.asset | Bin 0 -> 4384 bytes ProjectSettings/NetworkManager.asset | Bin 0 -> 4112 bytes ProjectSettings/Physics2DSettings.asset | Bin 0 -> 4364 bytes ProjectSettings/ProjectSettings.asset | Bin 0 -> 43089 bytes ProjectSettings/ProjectVersion.txt | 2 + ProjectSettings/QualitySettings.asset | Bin 0 -> 5004 bytes ProjectSettings/TagManager.asset | Bin 0 -> 4308 bytes ProjectSettings/TimeManager.asset | Bin 0 -> 4112 bytes ProjectSettings/UnityAdsSettings.asset | Bin 0 -> 4116 bytes ProjectSettings/UnityConnectSettings.asset | Bin 0 -> 4192 bytes 38 files changed, 1007 insertions(+) create mode 100644 .gitignore create mode 100644 Assets/uDesktopDuplication.meta create mode 100644 Assets/uDesktopDuplication/Materials.meta create mode 100644 Assets/uDesktopDuplication/Materials/NativeTexture.mat create mode 100644 Assets/uDesktopDuplication/Materials/NativeTexture.mat.meta create mode 100644 Assets/uDesktopDuplication/Plugins.meta create mode 100644 Assets/uDesktopDuplication/Plugins/uDesktopDuplication.dll create mode 100644 Assets/uDesktopDuplication/Plugins/uDesktopDuplication.dll.meta create mode 100644 Assets/uDesktopDuplication/Scenes.meta create mode 100644 Assets/uDesktopDuplication/Scenes/Example.unity create mode 100644 Assets/uDesktopDuplication/Scenes/Example.unity.meta create mode 100644 Assets/uDesktopDuplication/Scripts.meta create mode 100644 Assets/uDesktopDuplication/Scripts/uDesktopDuplication.cs create mode 100644 Assets/uDesktopDuplication/Scripts/uDesktopDuplication.cs.meta create mode 100644 Plugins/uDesktopDuplication/.gitignore create mode 100644 Plugins/uDesktopDuplication/uDesktopDuplication/IUnityGraphics.h create mode 100644 Plugins/uDesktopDuplication/uDesktopDuplication/IUnityGraphicsD3D11.h create mode 100644 Plugins/uDesktopDuplication/uDesktopDuplication/IUnityInterface.h create mode 100644 Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp create mode 100644 Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.filters create mode 100644 Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.vcxproj 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/NavMeshAreas.asset create mode 100644 ProjectSettings/NetworkManager.asset create mode 100644 ProjectSettings/Physics2DSettings.asset create mode 100644 ProjectSettings/ProjectSettings.asset create mode 100644 ProjectSettings/ProjectVersion.txt create mode 100644 ProjectSettings/QualitySettings.asset create mode 100644 ProjectSettings/TagManager.asset create mode 100644 ProjectSettings/TimeManager.asset create mode 100644 ProjectSettings/UnityAdsSettings.asset create mode 100644 ProjectSettings/UnityConnectSettings.asset diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e08563d --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# Unity3D temporary directories +/[Ll]ibrary/ +/[Tt]emp/ +/[Oo]bj/ +/[Bb]uild/ + +# Autogenerated VS/MD solution and project files +*.csproj +*.unityproj +*.sln +*.suo +*.tmp +*.user +*.userprefs +*.pidb +*.booproj + +# Unity3D generated meta files +*.pidb.meta + +# Unity3D Generated File On Crash Reports +sysinfo.txt + +# Others +.DS_Store diff --git a/Assets/uDesktopDuplication.meta b/Assets/uDesktopDuplication.meta new file mode 100644 index 0000000..6f4f7b1 --- /dev/null +++ b/Assets/uDesktopDuplication.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6cafb37e09eca694285c387022c33179 +folderAsset: yes +timeCreated: 1477544983 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Materials.meta b/Assets/uDesktopDuplication/Materials.meta new file mode 100644 index 0000000..afd68c2 --- /dev/null +++ b/Assets/uDesktopDuplication/Materials.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 168bfc51ae38cb945b9cbb64e3c15a3a +folderAsset: yes +timeCreated: 1452486970 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Materials/NativeTexture.mat b/Assets/uDesktopDuplication/Materials/NativeTexture.mat new file mode 100644 index 0000000000000000000000000000000000000000..1570aa2e4b478e9bfe69416db5fc862acbb15b34 GIT binary patch literal 5064 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 literal 0 HcmV?d00001 diff --git a/Assets/uDesktopDuplication/Plugins/uDesktopDuplication.dll.meta b/Assets/uDesktopDuplication/Plugins/uDesktopDuplication.dll.meta new file mode 100644 index 0000000..e1c5b83 --- /dev/null +++ b/Assets/uDesktopDuplication/Plugins/uDesktopDuplication.dll.meta @@ -0,0 +1,20 @@ +fileFormatVersion: 2 +guid: 02fc121822cf2ea4e82e16c4a28bf711 +timeCreated: 1477546714 +licenseType: Pro +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + platformData: + Any: + enabled: 1 + settings: {} + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Scenes.meta b/Assets/uDesktopDuplication/Scenes.meta new file mode 100644 index 0000000..d556f18 --- /dev/null +++ b/Assets/uDesktopDuplication/Scenes.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4916b05f682614c478174c4863f32ca2 +folderAsset: yes +timeCreated: 1452486965 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Scenes/Example.unity b/Assets/uDesktopDuplication/Scenes/Example.unity new file mode 100644 index 0000000000000000000000000000000000000000..5b01201debeeab6778799dc0e522c0ce819d87f5 GIT binary patch literal 17096 zcmeHOYmi*Ub?(s$5Fo@eJZ)(t79&7BWTfygTFvZ3+7-LnWmj6TBP{ODTWz@!LZ{HStJzOPUB z+`hBBuv?WMNhK}y-0rW>J$<_S^f~ADy{puvk1N&stWxS|r7nFPSGDrI73VGAvRr+1 z@ZiA|P=)Kk=N~)ygrzs_@!nkYcC7qsoGw&%>_g{$^2F7CE)XMor6r;6iPqFohPDB`X&cI4}2D( zKF_oXeM;RtN7eQlK8HB;E}ugk+~spv9Z#th;Iqx}VISEk2IT|P(D@s!#PIj;sE zj_^q2R942udAJ-n$Hg(*c_^UYw@trC0cUEQhXooF-0hd^WchT0|HI(J`9FquP1C2A zV?LRQA4@z#yh+dVX}E{-97kN|CUpg9uSI74_&T0a
ze**DZ4fo7R@c$j+8RAL) zTuYjo|!Cmf*q1*XeyVT%4YtNTk>PEI$~!cq6ca>nYOT+UeCo75txFV%%AM|GEN zGgmL$y}-F_RCkLvgZ>EgO^oU;_#ugHPj$C=qq++&W@QEF$e(>PrSQ+)22^)w9nhqj zYIV;LPmU{A_vALv>JC+#D4OVL%%<|@H9UkkbG@$pSx`{R>- zdglYTf8~j$e@cG_LfmNtsbDaP&8G4Hd%opOCdofhwqI^Gm%r_oo6Y6lhbsAV zv$^z^zus(9@aJZ8=`DY5Hkbd^sFJ^Iw%wEFjhhW#sE%9tWwXV&d6@zuc?_Eh3+ut75l@ASAiQ=V`^OOP}^xBi1&r%K;x!90L-_I z9o3>AWlO_FzuXBw4Y;ik6!Vc!BeDiQTpO7FFs$@Od6cO$FZ}z#HBX!1D>_oP$$Wo&Y-;&5#-^6f zOk-2a=Wz5Z`XWxj@`;`G$H%7U8`-HdOdP`?W{UdGJuk6o8mQQt^}sk*iA`gi`kO{#hl7_5uI-0|j~iUu z4~?g^9jzH$+Ybl7!{D?ZOq`zy%+J?R=6K!Mv>W(eXd0zxKj35Q^xr|1^t2yLmd|r2 z6Q})P;yhsPYX?v!&UI$u{8Mj#iZXF=))~#`$Dn`9;Ito1*@aM}Z_KVmgBesjlyav-xe0bNJVN` z4Ji*T>%(ZoD+W9K{9xd3?+c?!zn`mUv$j3RR|=}&2g8MmDuG)%R}4neqeZXet1S)H zz%S<0;g<9^a8ck=2!|tYv=HPHm2??Bq1SeQ6s%$Ys>LEgsUEMql~M*33fu3OVEq8| zu|`HL&<203QjL5*`fTu`VZUO4dc8d;L%Q*LyOt7R{7*)`UEt9MP2GUEz}c4Q5f}vd0%l4y?o%h-yXGRX63^KApeOMJBpb;?7X z5-%0s&>^iA4s@?n*FB5@ttBwl(5*nH&pAxi9{m6LYa^qY{A_S4GAxa+%y z&q7?8tev%dXqTtrldj`(7WI#)Q=Y}hOpSbEyPVWd_G9Ilz*yfvo#SoRcnxi0H-Bm9 zY+PsYxwx74(=N-IjnJQAaN1=T$C;3(r(I5EYAB08=mE}tX_qbi1mwBK;Ec~)ykhWk z9Q-C=e}c?;Sca@L|Kz%yTc=OX!+CXF<+?Xgb@k4=_~r8aLC_S_J(Os`~59NG=nMu z_js_qfmh^B1J$9jU+F64gPgDH46SpmUL{vxEDQ>LYqpdtz;(Hu42H$(h~EqI9R;w< zV8w8|tE9yk@kaHne%X(<`5Onxx@));M!xvG@|rMeD|k_*-LHs*B)|iIRPjocwOwTA zQ+7XpWf1vWB6#4=AfMOKdQVUaMyezF{sHl6*=i-+IN0Nj!3%+d_9k^qNBuJIR=7TR zm=SaxmFdtXqwF8Dzz^z!1%1$G0C_y%7H#V)ymv`7@8NS_>wNR!zU=WdFW={qBQwp$ z4beO@?4>!P>Zls|B+XG1@eJ{#IpUUJBEB1ZXpShuAsQtv=8oo!{ON|68u`-=F*Wk1 zt79V0Ek^#_K6FD&G_wrXEEPmY)K z#6)?n#?{IbyP>2!@^~;=9=ajBZ5h(hYB{ zwWvDK>TPwqo*FMB3dM7AMYrfN8+ z`R)7O+4rBjUj0`tN(Zv5{3}qmiAp$K3`WJ6E(TkSHcmd3pFFrIR4OXsY+^9Wr!fYz zd}bPhSw2+$>=g1)`2|m@3sG)Crc!Z?6qxdJvsgZCOBvi97nPqleFxq(z*NoHb7(E% zebgXcX*5*x9V`vnTyi6V3rTt+y%3I?1E86yD^s=Nr$Yh zm0n=MZBR~YWnbix-ZS)W(0nbhDl+?Yf@ZBiRvua__G34Om50`fI28a7o<%t6S*lQ9 zVZ0pVY_y=2$wUs&tFH2fC>S0FPaf6dDQ-;kGog1^p#QtS{=!{->rVVZ*EPS|Sh(n| zQI6$zjcmARy*rBqrW$3Q-cWEZr_;M;v`wXV=K`ON-dR44dT05}RPQXGM!mCqT)m^$ zwt7Lmqh4gI`5^2@I0NS~^M%`lyC1n>bMJ${dFh7oorgYk%9D@Y!WsW8xgs-hr_Xf8 zDdluCo<`eLGfv*KnQ_afamFp5na;T7(>UXn&nL}zt6%W81z~mOvt7VQU$|(=+WGGs z*K+%UQ(k=Sjbl<51A7@$O{tkU+s{Z5rH|L|Zcu2u0D5hgJB5A_IHL*Lh9+e931Cv8aY83lCya8WraL%?% z-)HdHuF7HXX5btbwN$BC{xoXjukEUX+i}qr;Bl)yUOO(CzZkdUVjn^;{a%MUF|n&L zeHs}16}uYawqLQUF>d>%KXv7?{c_#hes4jY{qku+Ir67bW4|XMyL@cFau_kWUpb73 zaoevPMi7_vy3g=;4~ZFwJYsMjMyL$?PU%CI$5G{)@JUD3Q399mp-MRyBD;R@6(Q3v znFN=9Uk6V5G%}Nw=UtSEFD8g&@q;K6=eU`O^9}YfDUpYMkI4p7R-R^!3C=*u%5z2? z7d{IOAI=j~BcC%hHkl9i0d7T>eQ^#dl=CcPCX2Tj{A_{ixM%Ql9DG8lTGimo9Q-z5 zyO25m^cPdj|9OC?n*a0bcuIW>JpR`3xqy6-8ppd_V}iT$W<3VSMf>vv_)u>d)GC$M zd?tXWQR6%?*q=&oS2o~WC(=s{5c9Em3wx>g$YYT6*t90(Yk&MU9-{-&N5i_YouBAb zcnsYg@Z21Y0~H)JxIjlKk7{;gD8T0h16#+1VIAqXuIk}Tr2%!1@av>q_~OU*XZRUW zz;-Acv%wPuZ}?ycXX9Qm#ODltX;`1f<9$KoH`dp9d4FKk_bD*x<5Ty6(Xi4MhFb%k zy|nvVylN4z5A1=Dkzx|w@0W3IW8RX+rdA3~Z~GE8$2? z>71>wd7#R7sytJQ@MsI^b5#sYrn89E9p6*?+@>F0zyHHmHXJwKyI~16mak%5kNKy- zbgEGsrjG~@1<`cz2`w5mjUJOcsQJ`zS_FDCwh8|6uT?D{_B9nB?J-Tu$9?i=`Osr# zHGNW^Pl`|2H!b#Iu!fYK*1>vM?oe6;?ofJ6H$vb}BmDwoHxgi^Lj33k{8EFHmrH+{ z!Ravt7YpBFaC%H8%1O(x4rTJE$Fy=1?>9I-ri*{k;PjYG^*B(>j zDYXY{^)D!Mt>`hCtUOj97HLdyS3lErT%H_XHTA`~s!r0U)Xz|S7n%HHk13wo@~6j4 z>73NJ<~lBV^()jVKlcZdeO=7sd*ZIgCKKiSA?TL^=e`q< znFcEJ$>VIn`P>1YWa(%BBzix%-todm=ij!j`O2SN^LzI{I-Xj> zeSiO)q+g{y)u|@?X1WtT?qk|{?n|&xDkJuQHir9)wzvry+X?$j_ObOFyobr+Fjbll zpG27~ZtXq&DwD;FD3gbc2Z&S7od)L&G7;~F1b?Q>?)wPAzhiLDHszm-I}V`ubL3UX zM4`5lIQ^={DQ6Zq{%ap?Upr0!Ut{Pw z-Epuxqj#_|jsT>Di=o-Z3*`&EPA3Ty(IV-mkgKJq^0F+kM@%xvN z%^js}K@^ro@cg2sg1I(ky`$veuMhazCvWAYWfr*K_llKZ#E)BSN&dpY5qR2$gx_L6 z3BWv`T&X`_;vn=_L!I&+6C6q}y-IKLMJ>Pd&h~bU)j#)60`2-S0{8WK`8@rSejKs# z&EQS$qCbD8p+i8G?I@5nFnV_W?R1w=ZvliN?viT{czN&$=e!npbp&c z;W@LazdVhfoZQ~xVc}lBAk3D_eue&9_wRzh`oRh-+19sF-uCZ@g8u0I1<$nZnY-xf z7oTqK{@jCW7{Gsk3_aEfkJdFl*6UQ`CYbucih&>RWgtl9*Z0?C<4u4EAL+RvwF6Kw zo;5hz?8YN~kHN(O#PnAgTpU1*=L{|mAjZoE7Y86X4G)JI zgKGz1aPrv;oP20JgilKS9f~g+OdJ4d#Gw2HIQi=bD_n`wpuCMTWuyZjKl3*V_1$Ia ztyO%0Tn7dZIz3{ za=HFdgqO=z@oAlpz%l33c&L$})b9^N*%|7ooL?-;7ZqNq3e#h&S~ZQ-)J!U+Q`Ng6 z`R7pdO&q#SwCS|ppT--1Vpb*7C_jr_&{^6({RRqtiBR{rkIC`Bnim zh2BL{QVNzC?`LpQb$+#kQ@+hZ*fRL6Vl&(fKG3ZviO8f{42B{v8kZZ=c{wOc*BRkx z;p9~p?)dqa*FD-bzjwh?kM>|SXOebjU@=;ty{!$@t5G+(wwgmZ;+4}c6Pml)ZaMMu zEqkIu%LDh`hY4NftIpbVH1HbuFw1_)EEO*JHFzdd zM^Ip2$DSD@H557JmWM7j{FGjNqvf41eAM!Ti;u7OB_y_Qdj&6HmQgC*szjj;H<6K* z#>vx5PCoR_JE5Ug2u@p~S>W**(jB z%w+dB_dJue1+))L)^4y&chTborF0v<9fP{jt*~yYB$= z@$i*I9>qy%CTned1!;x8w)(?gR93(8@}SwT9D6#e)PEqSvy@q8oO51V{rq#?tGK6d z{lq=Q`((Vbrn8wpE9ZNu@3+jqaP)~<)9b6=Iqe$A#+1qEOWmHi>m@DjuZ+`0l4W;) zTVJ!-kktK>saqdLzs6+!o%Mg#H?oa<().sharedMaterial.mainTexture = tex; + + SetTexturePtr(tex.GetNativeTexturePtr()); + renderCoroutine_ = StartCoroutine(OnRender()); + } + + void OnDisable() + { + if (renderCoroutine_ != null) { + StopCoroutine(renderCoroutine_); + renderCoroutine_ = null; + } + } + + void Update() + { + isPointerVisible = IsPointerVisible(); + pointerX = GetPointerX(); + pointerY = GetPointerY(); + } + + IEnumerator OnRender() + { + for (;;) { + yield return new WaitForEndOfFrame(); + GL.IssuePluginEvent(GetRenderEventFunc(), 0); + } + } +} \ No newline at end of file diff --git a/Assets/uDesktopDuplication/Scripts/uDesktopDuplication.cs.meta b/Assets/uDesktopDuplication/Scripts/uDesktopDuplication.cs.meta new file mode 100644 index 0000000..4b7ab66 --- /dev/null +++ b/Assets/uDesktopDuplication/Scripts/uDesktopDuplication.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: bb54a34570e4747429b1c5b66c69d356 +timeCreated: 1452445649 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/uDesktopDuplication/.gitignore b/Plugins/uDesktopDuplication/.gitignore new file mode 100644 index 0000000..62dd6c9 --- /dev/null +++ b/Plugins/uDesktopDuplication/.gitignore @@ -0,0 +1,272 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +project.fragment.lock.json +artifacts/ +Properties/launchSettings.json + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/ diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/IUnityGraphics.h b/Plugins/uDesktopDuplication/uDesktopDuplication/IUnityGraphics.h new file mode 100644 index 0000000..edf4a6b --- /dev/null +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/IUnityGraphics.h @@ -0,0 +1,49 @@ +#pragma once +#include "IUnityInterface.h" + +typedef enum UnityGfxRenderer +{ + kUnityGfxRendererOpenGL = 0, // Desktop OpenGL 2 (deprecated) + kUnityGfxRendererD3D9 = 1, // Direct3D 9 + kUnityGfxRendererD3D11 = 2, // Direct3D 11 + kUnityGfxRendererGCM = 3, // PlayStation 3 + kUnityGfxRendererNull = 4, // "null" device (used in batch mode) + kUnityGfxRendererXenon = 6, // Xbox 360 + kUnityGfxRendererOpenGLES20 = 8, // OpenGL ES 2.0 + kUnityGfxRendererOpenGLES30 = 11, // OpenGL ES 3.x + kUnityGfxRendererGXM = 12, // PlayStation Vita + kUnityGfxRendererPS4 = 13, // PlayStation 4 + kUnityGfxRendererXboxOne = 14, // Xbox One + kUnityGfxRendererMetal = 16, // iOS Metal + kUnityGfxRendererOpenGLCore = 17, // Desktop OpenGL core + kUnityGfxRendererD3D12 = 18, // Direct3D 12 +} UnityGfxRenderer; + +typedef enum UnityGfxDeviceEventType +{ + kUnityGfxDeviceEventInitialize = 0, + kUnityGfxDeviceEventShutdown = 1, + kUnityGfxDeviceEventBeforeReset = 2, + kUnityGfxDeviceEventAfterReset = 3, +} UnityGfxDeviceEventType; + +typedef void (UNITY_INTERFACE_API * IUnityGraphicsDeviceEventCallback)(UnityGfxDeviceEventType eventType); + +// Should only be used on the rendering thread unless noted otherwise. +UNITY_DECLARE_INTERFACE(IUnityGraphics) +{ + UnityGfxRenderer (UNITY_INTERFACE_API * GetRenderer)(); // Thread safe + + // This callback will be called when graphics device is created, destroyed, reset, etc. + // It is possible to miss the kUnityGfxDeviceEventInitialize event in case plugin is loaded at a later time, + // when the graphics device is already created. + void (UNITY_INTERFACE_API * RegisterDeviceEventCallback)(IUnityGraphicsDeviceEventCallback callback); + void (UNITY_INTERFACE_API * UnregisterDeviceEventCallback)(IUnityGraphicsDeviceEventCallback callback); +}; +UNITY_REGISTER_INTERFACE_GUID(0x7CBA0A9CA4DDB544ULL,0x8C5AD4926EB17B11ULL,IUnityGraphics) + + + +// Certain Unity APIs (GL.IssuePluginEvent, CommandBuffer.IssuePluginEvent) can callback into native plugins. +// Provide them with an address to a function of this signature. +typedef void (UNITY_INTERFACE_API * UnityRenderingEvent)(int eventId); diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/IUnityGraphicsD3D11.h b/Plugins/uDesktopDuplication/uDesktopDuplication/IUnityGraphicsD3D11.h new file mode 100644 index 0000000..a3f4c8b --- /dev/null +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/IUnityGraphicsD3D11.h @@ -0,0 +1,9 @@ +#pragma once +#include "IUnityInterface.h" + +// Should only be used on the rendering thread unless noted otherwise. +UNITY_DECLARE_INTERFACE(IUnityGraphicsD3D11) +{ + ID3D11Device* (UNITY_INTERFACE_API * GetDevice)(); +}; +UNITY_REGISTER_INTERFACE_GUID(0xAAB37EF87A87D748ULL,0xBF76967F07EFB177ULL,IUnityGraphicsD3D11) diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/IUnityInterface.h b/Plugins/uDesktopDuplication/uDesktopDuplication/IUnityInterface.h new file mode 100644 index 0000000..25073e0 --- /dev/null +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/IUnityInterface.h @@ -0,0 +1,148 @@ +#pragma once + +// Unity native plugin API +// Compatible with C99 + +#if defined(__CYGWIN32__) + #define UNITY_INTERFACE_API __stdcall + #define UNITY_INTERFACE_EXPORT __declspec(dllexport) +#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) || defined(WINAPI_FAMILY) + #define UNITY_INTERFACE_API __stdcall + #define UNITY_INTERFACE_EXPORT __declspec(dllexport) +#elif defined(__MACH__) || defined(__ANDROID__) || defined(__linux__) || defined(__QNX__) + #define UNITY_INTERFACE_API + #define UNITY_INTERFACE_EXPORT +#else + #define UNITY_INTERFACE_API + #define UNITY_INTERFACE_EXPORT +#endif + + + +// Unity Interface GUID +// Ensures cross plugin uniqueness. +// +// Template specialization is used to produce a means of looking up a GUID from it's payload type at compile time. +// The net result should compile down to passing around the GUID. +// +// UNITY_REGISTER_INTERFACE_GUID should be placed in the header file of any payload definition outside of all namespaces. +// The payload structure and the registration GUID are all that is required to expose the interface to other systems. +struct UnityInterfaceGUID +{ +#ifdef __cplusplus + UnityInterfaceGUID(unsigned long long high, unsigned long long low) + : m_GUIDHigh(high) + , m_GUIDLow(low) + { + } + + UnityInterfaceGUID(const UnityInterfaceGUID& other) + { + m_GUIDHigh = other.m_GUIDHigh; + m_GUIDLow = other.m_GUIDLow; + } + + UnityInterfaceGUID& operator=(const UnityInterfaceGUID& other) + { + m_GUIDHigh = other.m_GUIDHigh; + m_GUIDLow = other.m_GUIDLow; + return *this; + } + + bool Equals(const UnityInterfaceGUID& other) const { return m_GUIDHigh == other.m_GUIDHigh && m_GUIDLow == other.m_GUIDLow; } + bool LessThan(const UnityInterfaceGUID& other) const { return m_GUIDHigh < other.m_GUIDHigh || (m_GUIDHigh == other.m_GUIDHigh && m_GUIDLow < other.m_GUIDLow); } +#endif + unsigned long long m_GUIDHigh; + unsigned long long m_GUIDLow; +}; +#ifdef __cplusplus +inline bool operator==(const UnityInterfaceGUID& left, const UnityInterfaceGUID& right) { return left.Equals(right); } +inline bool operator!=(const UnityInterfaceGUID& left, const UnityInterfaceGUID& right) { return !left.Equals(right); } +inline bool operator< (const UnityInterfaceGUID& left, const UnityInterfaceGUID& right) { return left.LessThan(right); } +inline bool operator> (const UnityInterfaceGUID& left, const UnityInterfaceGUID& right) { return right.LessThan(left); } +inline bool operator>=(const UnityInterfaceGUID& left, const UnityInterfaceGUID& right) { return !operator< (left,right); } +inline bool operator<=(const UnityInterfaceGUID& left, const UnityInterfaceGUID& right) { return !operator> (left,right); } +#else +typedef struct UnityInterfaceGUID UnityInterfaceGUID; +#endif + + + +#define UNITY_GET_INTERFACE_GUID(TYPE) TYPE##_GUID +#define UNITY_GET_INTERFACE(INTERFACES, TYPE) (TYPE*)INTERFACES->GetInterface(UNITY_GET_INTERFACE_GUID(TYPE)); + +#ifdef __cplusplus + #define UNITY_DECLARE_INTERFACE(NAME) \ + struct NAME : IUnityInterface + + template \ + inline const UnityInterfaceGUID GetUnityInterfaceGUID(); \ + + #define UNITY_REGISTER_INTERFACE_GUID(HASHH, HASHL, TYPE) \ + const UnityInterfaceGUID TYPE##_GUID(HASHH, HASHL); \ + template<> \ + inline const UnityInterfaceGUID GetUnityInterfaceGUID() \ + { \ + return UNITY_GET_INTERFACE_GUID(TYPE); \ + } +#else + #define UNITY_DECLARE_INTERFACE(NAME) \ + typedef struct NAME NAME; \ + struct NAME + + #define UNITY_REGISTER_INTERFACE_GUID(HASHH, HASHL, TYPE) \ + const UnityInterfaceGUID TYPE##_GUID = {HASHH, HASHL}; +#endif + + + +#ifdef __cplusplus +struct IUnityInterface +{ +}; +#else +typedef void IUnityInterface; +#endif + + + +typedef struct IUnityInterfaces +{ + // Returns an interface matching the guid. + // Returns nullptr if the given interface is unavailable in the active Unity runtime. + IUnityInterface* (UNITY_INTERFACE_API * GetInterface)(UnityInterfaceGUID guid); + + // Registers a new interface. + void (UNITY_INTERFACE_API * RegisterInterface)(UnityInterfaceGUID guid, IUnityInterface* ptr); + +#ifdef __cplusplus + // Helper for GetInterface. + template + INTERFACE* Get() + { + return static_cast(GetInterface(GetUnityInterfaceGUID())); + } + + // Helper for RegisterInterface. + template + void Register(IUnityInterface* ptr) + { + RegisterInterface(GetUnityInterfaceGUID(), ptr); + } +#endif +} IUnityInterfaces; + + + +#ifdef __cplusplus +extern "C" { +#endif + +// If exported by a plugin, this function will be called when the plugin is loaded. +void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginLoad(IUnityInterfaces* unityInterfaces); +// If exported by a plugin, this function will be called when the plugin is about to be unloaded. +void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginUnload(); + +#ifdef __cplusplus +} +#endif diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp new file mode 100644 index 0000000..166829a --- /dev/null +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp @@ -0,0 +1,179 @@ +#include +#include + +#include "IUnityInterface.h" +#include "IUnityGraphics.h" +#include "IUnityGraphicsD3D11.h" + +#pragma comment(lib, "dxgi.lib") + + +namespace +{ + IUnityInterfaces* g_unity = nullptr; + IDXGIOutputDuplication* g_deskDupl = nullptr; + ID3D11Texture2D* g_texture = nullptr; + bool g_isPointerVisible = -1; + int g_pointerX = -1; + int g_pointerY = -1; + int g_width = -1; + int g_height = -1; +} + + +extern "C" +{ + void InitializeDuplication() + { + IDXGIFactory1* factory; + CreateDXGIFactory1(__uuidof(IDXGIFactory1), reinterpret_cast(&factory)); + + // Check all display adapters. + IDXGIAdapter1* adapter; + for (int i = 0; (factory->EnumAdapters1(i, &adapter) != DXGI_ERROR_NOT_FOUND); ++i) + { + // Search the main monitor from all outputs. + IDXGIOutput* output; + for (int j = 0; (adapter->EnumOutputs(j, &output) != DXGI_ERROR_NOT_FOUND); j++) + { + DXGI_OUTPUT_DESC outputDesc; + output->GetDesc(&outputDesc); + + MONITORINFOEX monitorInfo; + monitorInfo.cbSize = sizeof(MONITORINFOEX); + GetMonitorInfo(outputDesc.Monitor, &monitorInfo); + + if (monitorInfo.dwFlags == MONITORINFOF_PRIMARY) + { + g_width = monitorInfo.rcMonitor.right - monitorInfo.rcMonitor.left; + g_height = monitorInfo.rcMonitor.bottom - monitorInfo.rcMonitor.top; + + auto device = g_unity->Get()->GetDevice(); + IDXGIOutput1* output1; + output1 = reinterpret_cast(output); + output1->DuplicateOutput(device, &g_deskDupl); + + output->Release(); + adapter->Release(); + factory->Release(); + + return; + } + + output->Release(); + } + + adapter->Release(); + } + + factory->Release(); + } + + void FinalizeDuplication() + { + g_deskDupl->Release(); + g_deskDupl = nullptr; + } + + UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API UnityPluginLoad(IUnityInterfaces* unityInterfaces) + { + g_unity = unityInterfaces; + InitializeDuplication(); + } + + UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API UnityPluginUnload() + { + g_unity = nullptr; + g_texture = nullptr; + g_width = -1; + g_height = -1; + g_pointerX = -1; + g_pointerY = -1; + FinalizeDuplication(); + } + + void UNITY_INTERFACE_API OnRenderEvent(int eventId) + { + if (g_deskDupl == nullptr || g_texture == nullptr) return; + + HRESULT hr; + IDXGIResource* resource = nullptr; + DXGI_OUTDUPL_FRAME_INFO frameInfo; + + const UINT timeout = 100; // ms + hr = g_deskDupl->AcquireNextFrame(timeout, &frameInfo, &resource); + switch (hr) + { + case S_OK: + { + break; + } + case DXGI_ERROR_ACCESS_LOST: + { + FinalizeDuplication(); + InitializeDuplication(); + return; + } + default: + { + return; + } + } + + g_isPointerVisible = frameInfo.PointerPosition.Visible; + g_pointerX = frameInfo.PointerPosition.Position.x; + g_pointerY = frameInfo.PointerPosition.Position.y; + + ID3D11Texture2D* texture; + hr = resource->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast(&texture)); + if (hr != S_OK) + { + resource->Release(); + return; + } + + resource->Release(); + + ID3D11DeviceContext* context; + auto device = g_unity->Get()->GetDevice(); + device->GetImmediateContext(&context); + context->CopyResource(g_texture, texture); + + g_deskDupl->ReleaseFrame(); + } + + UNITY_INTERFACE_EXPORT UnityRenderingEvent UNITY_INTERFACE_API GetRenderEventFunc() + { + return OnRenderEvent; + } + + UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API GetWidth() + { + return g_width; + } + + UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API GetHeight() + { + return g_height; + } + + UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API IsPointerVisible() + { + return g_isPointerVisible; + } + + UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API GetPointerX() + { + return g_pointerX; + } + + UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API GetPointerY() + { + return g_pointerY; + } + + UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API SetTexturePtr(void* texture) + { + g_texture = reinterpret_cast(texture); + } +} \ No newline at end of file diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.filters b/Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.filters new file mode 100644 index 0000000..79635bf --- /dev/null +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.vcxproj b/Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.vcxproj new file mode 100644 index 0000000..af212d0 --- /dev/null +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.vcxproj @@ -0,0 +1,135 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {BC5DE2F9-BDCC-4449-A017-E5642E04BB56} + uDesktopDuplication + 8.1 + uDesktopDuplication + + + + DynamicLibrary + true + v140 + MultiByte + + + DynamicLibrary + false + v140 + true + MultiByte + + + DynamicLibrary + true + v140 + MultiByte + + + DynamicLibrary + false + v140 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + Level3 + Disabled + true + + + + + Level3 + Disabled + true + + + copy /Y "$(SolutionDir)$(Platform)\$(Configuration)\$(TargetFileName)" "$(SolutionDir)..\..\Assets\$(ProjectName)\Plugins" + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + + + + + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + + + copy /Y "$(SolutionDir)$(Platform)\$(Configuration)\$(TargetFileName)" "$(SolutionDir)..\..\Assets\$(ProjectName)\Plugins" + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ProjectSettings/AudioManager.asset b/ProjectSettings/AudioManager.asset new file mode 100644 index 0000000000000000000000000000000000000000..fe6cc1df2727d6927eb6b00f413f35e5873481cf GIT binary patch literal 4140 zcmeH~y>1gh6ov2F;V*Vbsx&lPL{yO_3lL>~Fvvn!a=gNAGHhn8O~xK;y<3oKYd-)b zC{4OFv{XC*;thBMUIBB?Y*vv{r<^NY%{`y*T+N(yGa`*IB3rv6vWXRo$g9rFPB-bw zztw6L1OP4M^ONOyeD*&4`>j3uZGQY>>rW(qXS^0E(Z6z{BoE}ODdqP-$~8dtRT;=7 zdN-iS8%TLv^^-glk6YNjSSlj-r;nqsPDWR0;&5=OByT6%UqH#!U7 zsW`Wp^mL*MlZVkqBO97xlFm3NU8qk+yJOzYLCafAkMo7Qbai!JlfgeD?Q6kcY9HPK?|^r} nJK!Dg4tNK=1Kt7efOo(c$@wQK4gI% literal 0 HcmV?d00001 diff --git a/ProjectSettings/ClusterInputManager.asset b/ProjectSettings/ClusterInputManager.asset new file mode 100644 index 0000000000000000000000000000000000000000..60e3abb77ac8aa2637282579c4cff0ff06c7f609 GIT binary patch literal 4104 zcmeH_yGjE=6o$|2=HmTsCBA?~AfVU=VxfhCNNgp@C`uA!bEyZkw)G8?!p?UQA&8BZ zc?Q@2-&s}`Q(K*Z!4aV~XA887Da%iyNQ{!&h#PWXG4n~>9>%-4Pe+hY-K3;38KA&)!{%Xbx$@ku;@3IEY zLEq?eIq*KOdo1-y-~)fD&eQ>QKpjvA)B$xs9Z(0<0d+tfPzV0Qfgc#wdy@bF literal 0 HcmV?d00001 diff --git a/ProjectSettings/DynamicsManager.asset b/ProjectSettings/DynamicsManager.asset new file mode 100644 index 0000000000000000000000000000000000000000..4fed4b8012efa9b2ca01c22d1994c5b5125f9016 GIT binary patch literal 4280 zcmeH~&ubGw6vy8rwbuCi$3?1G@E!7#@#SG35_1ipCBH* ziy(OQ=?&v$dq`q5IxKcfHd7_$ES3NxJxqJlc?%ukMa z(f2cpHN5Ys3C`~e=kok?&Ks>>s-tvG#&SzpdUXGWm0j(6v`syFOpS)Ki&@T^bjoUJ zt|Dn!HD$-R5dx`cqgIy@G^A_!;Cj-DBel`8Ds3fZ6H~X1Qte5Qm#HSPlaX6*HdEy| zFEL$ZSFxRRI*F?&w2$v7lSF86Je^|2tqxjK=}ql6tlq*w7_P+ffl=2sW!velswFm3 zpmo_(wwf5DQ`E)@tlsvDW`B@{jXxOvEEXU-kAnpTf&xK-pg>R{C=e6~3Iqj$0zrZQ jMS-1P=idLN*QL_n)s@oV;v!$8vuh>M9Adsw{!9Ayy|u)YkS!^i*}^!9t{Ws2{*uAQUNjR8M@n|yW3!~WAe zd)w0A9BVHQ`IlYujIEE_KJiX$WIpbuE-Bc zaLP{YRleHz$5~$9-XA^W(`@9+GA|}G+?NNk|Uyvyz)YHuYR}Q>^JG> zcsvdQ1`gP>?Ujvhhlh85+}=7mvP+Gdj4g7q#w+YTQNi`&a#Iim{QFR&;!{Ay2?oJ4 z@qjvv^J#?o1zxE@ZXsxL1P2b@U=4VUzA|=;p8?Nrt{QDIzRwQclc+B}DC-;3+Ecv3 z&<}XlIR?jRfNa3gkKh>Ro&oq7c(tFi4A1Ll5qRmTNk8{tl!)E=w=NR~T zfNV4TBgeom0A!o>`GsTj3H_)5UhNaFa9*F6ftOzG^U5(k(cwGq!GD$4dHmN7I#Chp~FYOLdYPuWPs(Hr47 zyJ@6i?4{c2sW7*Z8?}=>E>mqSc48&}k?okwJ-0DuAE~~`WA{+)iPw>_Q^sD(WU4E| zS85*A6;g7)T{BRYIl9*DtI$1BTG{gO4IRe0R1%lbxCU+qvd9bPHnn$u#Ie7>pJw`!{u5RdB!z6C?wQGgb F{4dG-;{yNy literal 0 HcmV?d00001 diff --git a/ProjectSettings/GraphicsSettings.asset b/ProjectSettings/GraphicsSettings.asset new file mode 100644 index 0000000000000000000000000000000000000000..8c694b01fe04776b2ceeed77e61b5aa0c0f8d4d7 GIT binary patch literal 4392 zcmeI0yK@{h9LKd6+k{7e1i~xCgm)akj-A91l9=-|Ht~f^?3g!3zLV|E?A_k%?Tu}Q z;tEO%N}80RqF_=(&kQM{rGSEliW!EX!F<2cO5Vo}e*lwTqFL#qpMKw;w32QUAr2f6 z;^1*1!~;S+h=&kohEETVu8)d;c6WC@4`2}G=C3!7-TrQB=;Wv4f1C^d{A&$td7lt> z;YoW{h%Wqhb)zeUhd*EK6Wv>$==K3Jjwzlvi292tlq;doJk)+hj4{;dkI>r4&!RSm zavuu&XdXQ1{}$?G{hAp*4BdCo-j6cixY3npQ`hF5*X0;mUiWT;3%d7c-=glljvL)A zw5iKE(DJ%?3)=F!_dA}QFWwen6m_YQUgyuzCgYmZ^16o%);zt=4>_LIeOSjR>K=C7 z%=ZS`)O`enme+mM;DYXBj%Rfr*D;E^PdILLzebz7M^I>a-6st$=pJ=EtINILYn`8R z+~|IbHg%7o(DJ%Z8(h$R#__D~vpPm`zRx*sbiYTNy3eD~^13e=T+rqDqvg*LZ-QR) z9dg_gKjD1+h&Ipr2|Q`g^+s_XS;${9*u_7BF+8U)r#Sc9b@=m4yyAFY=3Ebhn|%62 z`dp7VZu0pZZR(zMakBX!FKu?dHXq(MG;&^EHlI_Pl4tWdt$hto=X1t!Pt2A?_b8I) zyvAJ|bHCa93io9)uTo}SuQ~3Cam1*g@UG%oi7v;K#3E{SaQqdola~$WefS9=*ZCYd z%=&+k_@6h}@oy4-fxJwAqx%CmbtlNXdvUDp8|3ApE|9jo?qrTz-6`_&p6)M+?lgI~ zs5?VmF6z#b!}7ZP-Jn@+buSW@$<6-x8@k*-^WkkQ{h9r9mAq_tdjBku!>qsEKg$L?ZrAe~dD-Z4e_n$w^ILJ;)AN$x z%=2w>7}uY=orLpun?}w!pCxhLHQ4bl6aHR~-%9xVIet6gALRIN3I8z1_u~VE`G1t- zLkVBa@v{m4ILGG_F3HP6T#RIE)33FcR2=)wjkcKT_yKB5o3gGVM;og%YF$NI zC9Eq^t;W%L<23An$zV(Fv=^GSpi@_M zlNpmc36X)86~EG3|0PdF!t~0h6(06S;o<36$#hbN%Z{ zo1Z5f&nJy_`~9l5l5bhoOR2hdf{w=jP^vzd)NNlW)rVhu!T;0Hv3k@w#+qjh;9m%o BC8PiV literal 0 HcmV?d00001 diff --git a/ProjectSettings/InputManager.asset b/ProjectSettings/InputManager.asset new file mode 100644 index 0000000000000000000000000000000000000000..37897785149b805be4d8e6b002643137634e8bc3 GIT binary patch literal 5520 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 F_6sQLsiOb@ literal 0 HcmV?d00001 diff --git a/ProjectSettings/TimeManager.asset b/ProjectSettings/TimeManager.asset new file mode 100644 index 0000000000000000000000000000000000000000..b7b21cb5d6a9d9e6c1d295c864879ff4160d0aa6 GIT binary patch literal 4112 zcmZQzVB}+95D;KsVBiPRK#GCERL?}uFwKzR-~a#r85w~BtU$c@RmvB^9M=<_(`^;r zz8Aa#5_14zkUR*OGcYtjv_treK$&IC3=NwY85&rCLLhYz%*e11sFnxF2Z=KQF#`uk z4k9iM6=y~hH-U?5*=+2T_p1(+N6je5(rQTR0tW_K}Ly<;-!GfSKtC58hR)= z3MDrI^WNG4Avgirm1cM5+wt@IZDo<|l^=Av-jY56h^pj4Ybr_u|GB|AmgkS suBqbsMjLju4p;}Q1J(iSfOWt+U>&dySO=^F)`9=!0RH{>OFa6hPojZh`v3p{ literal 0 HcmV?d00001 diff --git a/ProjectSettings/UnityConnectSettings.asset b/ProjectSettings/UnityConnectSettings.asset new file mode 100644 index 0000000000000000000000000000000000000000..bd9e618ad7c9660cf128bc55917c959a6a05aeba GIT binary patch literal 4192 zcmeH~%Wl*#6o!u{!~K4zluHpyM50llAT|V5NFZ@9?GDi>j`0?Iuyh`BOcqzy)o4RDBdwbr~Yh zgrJ9<`;s~49S$_)gP+o4A`dV${66a}@D%#cq6)ktdOSja?_w-MaF4z-o98vi-3_k8 zqi4)FIWXVTa6!-ycn+Pt+|%cO_4hH}Nq;}M4qN{~!v)>pF#`Grxv%%Hzq?lRLk;(= za~)=GzT36V#nr06+qKSx5}N&VET4}-Kg2sh5f2gYo~z&Nr(Ks5;M~|}t1c%2L!&d{ zAp++@-Dc-%>zoGXHq&{h$3$l|{mW-{KMNij-md!`cm;0zbB^&&{>+2xu>CpT@QzjY z3(QU3ZT*YL520oIe+gWNt-nz7)ihC)@L?v zsHjlmT%W)^c-v^}9QfUrMExrRy5<~k4mby#1I_{GfOEh(;2dxc{Fe^g;!_Qk%FEk9 rkjr9lP2z@9`tc|m_x&+0HH&>e&bERmPXhBYh;dnwWn&2LMRofFStrzD literal 0 HcmV?d00001