From 67c90073d971d9be58b79cd38be29a7126258ac8 Mon Sep 17 00:00:00 2001 From: hecomi Date: Sun, 27 Nov 2016 16:22:03 +0900 Subject: [PATCH] fix unity log call from native. --- .../Examples/Scenes/Multiple Monitors.unity | Bin 14944 -> 15152 bytes .../Plugins/x86_64/uDesktopDuplication.dll | Bin 76800 -> 76800 bytes Assets/uDesktopDuplication/Scripts/Lib.cs | 10 ++++++---- Assets/uDesktopDuplication/Scripts/Manager.cs | 18 ++++++++++++++++-- .../uDesktopDuplication/Debug.cpp | 17 ++++++++++++----- .../uDesktopDuplication/Debug.h | 9 +++++++-- .../uDesktopDuplication/main.cpp | 12 ++++-------- 7 files changed, 45 insertions(+), 21 deletions(-) diff --git a/Assets/uDesktopDuplication/Examples/Scenes/Multiple Monitors.unity b/Assets/uDesktopDuplication/Examples/Scenes/Multiple Monitors.unity index dabb2a620417f3e6dc402453691d6ef1ba67cc31..09f5588db17fbf80ef9f41fdd0c508ebc268566f 100644 GIT binary patch delta 456 zcmaD*vY||xfx-AW1B0~z0|Ns;1A_^WVqh@UGto0jGnyzZC%UA^?$VXi-6`Mv`GuCv z{MZFl&)~Juub4@Yk%5t6Ap=8$15ktoh@~dqW7VJhl1YNIBqK99J1@1kcoMUy=mdw~ zy(xL+p{mahF0OgR>CmX72PUdA( zP$^DM%t`glPf29}vlwzyi!y=Qd}~NQj<$E^YbR_uxW@FrRL_Br8;M1=A;y* z=7ndZ<~ir2CKhcDW^>fqJlVjJQ8EK)@_!&G0$BkB*EsHogXkNR-x^A@dayDu1We{N z5|^C;WYq%2LC#?W>Hw(;@}83pq9rCf8c8!A*c@xLl9ivq9-;&!vA}_G@<9{j$rsEy UCL35xV`{Jma%DC@v8Z7L0LkEPO#lD@ delta 289 zcmdl`_Mk+Xfx%dvfx#+)fq{V^$aVnI45oS}dWLC+6Q$)uEhT(*%n0y%o>6ze_u{FY zTcv=~4jcW7nI?Z!)tJo4ETQ=y2;%0Q4()uY`|Xm>9W92$ZylRhY@`MAW!jZ9dX{x~ zReQ(+b>(mLb7z`7nbkvk0W(8`2T+6&h=KMqFnEI4j0_7I7#d=LToxdf0f}=kO#Yy% zIk}%rVe%C=_07WU4qBT-3>_FHBY=`1dy7D-fZ!U(9dQtSV)9xeX;uqX1_qzWXN|;V zJAkZOpg71TMxYLmnjr5v=^&b8GNZ9HGHZ;(`kb3OXt#?zj~xrDhf?xaVM_={Sy}*F96* z_e8N=%EA>~O594*3e##x%cU~Za^CN`_l^wK@BMtd3%IH$~a+uPSaTV$)TnlrTY6 z4zk_qSWWM}EJ#ydUBVJI4b&1g2EPXj7Hg)cbfufu{cMj6q^A)8mSFq<2`Wel4!($7LwvfPRRWVx68ZBBc zqAXgy0B-@c1o!~#T}LYl>7+!)cnvCq=&x|>cQ2Fn3UDC!pMZd$0rnsWAJU_McHdR- z$)ep$iE|3GbkOzkMxNSr6l2pBQaLOEC`$OyvU_Ws4(rI_QWmI&dL-l|I{J&T(c%#Y)iv@bPesqTTAo(y3UQX3Lx`EOBW2w=STz<#HK9i!XcB3^uDvJEo1xB$sRoiO5YrqPtHc-zq zd(|+_vIeZ0M?{!)Gtc^s22_9N&bR;1B5=X6#E+#A+__3#)PGg~YtEk_U~2{vj3bS1 z<{5!{#cR&@h)qUQbWCc0%xlgCk}=0ujf4@e*~f{q^^c4~r?5w&0dtM!DFONkRg6|x zDs~u3>#9m_*%G1j4H(7CG<%_|);+I(YZZ{zopkte6cqVlw8ei6(mbQBUdir*gsX7C zI5HJZ1|g=?b0_k+IpNZI`-b{dqGF@XFgi+69EPC7ic-sHJ?}6Cg36`d8D+0oh3P%R zI)8P9%0dz50G_5Bi9GBB!<|Jm&xlOW8@;-qxJg#s$4E@ECPl`fQ??_)cj~h7p7n;e z{seu}XiY3Pwm&+ds>4v9^U=jd^J9;R;Qcsne%xRZm})|}*q(qYLa9zWi(BPva%^Gj zMTg=1K}twLOUItGA7;OMHZYyRs9=meVYJMS%tcMco^}|T!46eHxY3e?A1Z~zPz#YM zL>^9nSc*;i(WfMp5}E2SxFgMK$cLpl7rkaLKsq{KL(1KT0pJ%a755tKBS$8{HRXClaQR*-R|Q{M~vjY%Ks!ysz3%8aZF zcrmDan^-kn3(d__EM8aJWG+&aB-^`F@M~xD4XR~+t`T<*$h>A ziopokQ`#f=1?(h1BRdQYA!RJmZlMS~=qYWeW-Yn}h(SVjDErYXPBV8u3)45z#8rY@4dq`uX``4HPSy3PC$34(P||%{*pKho@`pJ-fA>EQ>(7p ziTzfqrP`U*^;xRG29m-9?7@pN-J&-4^ev=(-^7TcegWu|Q?(*_OnD5hr}9d9u)rY}!nWk2DWclug&dK;30277e*YNs+14pvkeP>5Z|4EGH4!d!~^D z`pGnk!{`h{_t3A=ds-ki!1T+hbTqYiDZkkYXI~VX;=HQ@}LCGr`rqK z1vgPu8w(2wU^%tdYQEaa!b8SsMr|!v6ymATe7CS*O;}%5?a1zh`>A7@d!5#r%zdn5 zom9UMH^7gCM@4E@&BH5Ulm?wIO>9%0Sl^SsI2@0Tt693kcAjwFKG($V)QM==8%r?j zH%1G()nmJ+8Y$5{0ZT%BiWG0pT1PbX%cC4-7iL#CT0I?xch~cB`>@oe!E9N?gc>#^ ziOL>CqPj6v`Ad!XXLS>6w4LuF*fX+k)$<>c;9#~XGP3F>PB&%e zBS-naoTn&vvW;fPvq?44BK|z-+B(*&UhAsnsTd_JQ`!7_bv0+_vBby*?5ld6s&?B= zrmC^p^}{^saQfC-)}?-KjV|xGWcq#miE1s@ufh9jO?IzAZ*?H+6qVj%H!c2Lrm+t= zUom#sI4{Sp93fn6Kahn9{^R3!H2J8-UiYb^C9$%ow)A>6tfSesnssg1So6yomesIv z$eZqHcuSWoqvewvs$0v%(KOS=kya)<((tA5Sygk8CoM+ zb+@!Ey3xR@!E33M!`Zw>b(^U%3-6;s;oCc)}FcDhM)$24?B*YU#0`HJx(j`MQ7h!(;$Uho-bC~MJlNz>6- zFrKr&_ZBL^HU%rmpGz?(mf!Kj*lo|GSZjHT^_0F%facAm-Zg`#4`w8yh$;Yh#%ZF1DY0b4kqr z_D#$Yjh3;@)?w^m^BA=yD{J0Pb7%>x*P_1W!eZ8|MOVZ4#b_dj;SDT!==JGNlTI(T ztwnGDFOcH(F$#=^xd56IxrXcdR?)M$MWd$GH%XDLRKT;7AV(ereskNEfCdKc-0^SYsZO(3R&S78+*vK}o z`)|Z(VzgevNc`xSnpOR<9!+RpGKQ75X{GjNesPhehZq+eh7${EbnvpgFPiv^M_3iK zt=I96Z0RH5sil+JW(4YaOYejlm9*bK4u`$wC2DCsq-9InxV*FVXt{e2uR6)sg}hbw z<1fS+UVo%CAe9$dx}4Y8S$p~44#y#y$?R{Hu+q47nr~aMS#3YS*c#R@sh(N}8=}z@ zQmhY>V;#LL(@VPB`jucv--YZPhM5Zr=C!M#sw>&D_D?idekxepL8F=u%|p}mu(_eb z!$Q1*I++lk_^2=}3rm1Cl<2Y~SU|kXl3)f;mrH`Td7@YnYkqO}WFJ;!MQ62|%Ht48xvz5wy!y!k0#fM|s9 zRjS6;$jw?reJY*$RME?9RL3~Y$=e0%JEDZ!F(>_xC0sy>E+w2nyh{n+V@)nM%V5it_8HlcEOT#>Js}%D%%_Ec8^{zphbu-yt zT^r!#59=1(rk1I4wi?b?Wc!etliB|0v|XEx?=}o`>zCcaLOQ)8GaQ0$_(F!=SaoAp z&EN0v65bYq&ujQH=PR;0!Fie00jJg9`m;Raz~CYMVH`tdTu}lYo+(8MH3;xtwq)Mj z$C~`V;avR69}#K2#wU{nMDs(4cGw})fIrPjspstxcQM3#dz8kF@2~M8#)z?F7?-CZ zCQk0CKeGt=hj&PHKSUwc3St;x{KQ;BqMk(-o#myBMpLs;6{v)G}YjWm{D*pEHynAW0@l=3oCob%7cBd!yq=T%;;kOjBouxSQS zd4e3zeLQOqB=eU)Cr7{f`uVWgkITCbn;&6!Lz$M9)galOkVT;yvj;s50RyE&pOwjB zQcT*-SZK-^O<8|tNoiy_LM>tK8BS+g)kXS_{;W7Bje9vIgSZ>fudL*(vraCmE^ zA|G@oDAr;)LI7{H_MNpU9(saZLoBxZ$8pd=Pr?AB^)5~vFr#bjmyt$eeR2rap}J|p zhS%&qD&j4}BGY59V;UZLll}fuPm_BoMd}=I6bdC|9jkopJv#3TYdu?TWZvl)`$q&1!9_|0}^=LnjEWA z>@Xx}k$=>D~R2_h(I-fE03fJp##O3Poxf)wMoryeynC!FB|d9 z;VAo+rKTE8R_&Ziq-vx#9DM)c?MYJP<)i57R{%0Dq=nnXLO`{P~)Io;^1>K zDbRWdopL;B@pY0_+lm`e{PFdCz~zS7S+i>#F~-(S7@yw%tH;k<$zWJ#gB1-00BG z1<&bo=PWu6R)o$Ti)yjxnqPN`03TS1w`voqn$YAbR)j{qG1};1Jo?zpIPxf2LCNdz z^wZgiUV0Zcjx_Q_g4pus#D|@MbQ=hnhNu6Sg z`bVfk*}nc)0-JnUVWayEvQGxoQRCRR157??UsOm6nV;C(14C64 zTR8ALU*owKQ@^^(a{Jf8nZ<@d-}uCxeK8qMq;V(GzVVGZ^J419U$NY@I+~t8u;YWT z`39VRF@4Jwp5Fc@yENpQuSfBV>B}!u=9=hIc5CQ0-||y0roVTIyXI>@ z`C{^*LdF#R8zL#Ir!Zw^ zPcp{&_4*9*vPzzJnXBxb*Mih+w(_;5zVnV$2#C(&cZMarUPs-@M!f!u&*)EIOn$^( z85OE7Vlzj5=acryi>c^oqa)PmY{}?ve2j-*O#OlJ9E~eDZ}_Jbt*z;_fp(PEH*rUS z>!wr;Gcm7VpwLdG#dt+Sn=E^YKA+DlW+X^f+lp>9hmvm7Mz+q6+pjVjfjhW?TNZJE$ zu+8IohV>sz(Nk+6x-CV2dYuOJ1(Bp=|9m;~dTWBob2#YMNGN;Y2D{z(Q729%E)^7!~^vFdZs*s3V7Du z7~)plZ~KWeyj`f6NF$KS%0+3N8Ua^HR0C15U7fNT?)4MyY2Z8DYsKB$3On4r`aC}u z_YBg#Bd6frlr@y;GzcTJUC8*a&tZh;87lo7BK=zkd8;l}_;=xR_QBi1fxFP>$_Aic zpmyK{ve!L8l>IKd@OFf$Io0e5^u97v6-BX3_O(u)0S8AQ3v>LX0?6}T)0bx{Z!Yh}oEWGTExIcII zaeu}w8E^2LEOU39AWx5ql+G-Ae4weYADuSY`>aGtH$9d&nbvMK08`BIvmqzys>;8d z8!R%juYyH;e{=_P{D9};mub+dRF>9K{0)d>;nxYT2VZ*`S=xjeHD3jrVnd$jY)8}B zx8wbX-rMWU`>lT&JMk(nsNIe7{v0)FjxT&J-sxZB>!tXW<2>&m)_a1%WOT_g3ABBy z4&CFKnq3XI$6XL{r@8r=hI7fp)ipn>!ntn58Bm6SARs#mV1DLi^hzo>$2WZL#RDjYkPhp6>37ksw;sg#QJ>7)bYN(ejg-^-8x2T zn?+iEm_W~yTS2;q#Zm9q)ayQl7#g|Na);xN4_+EADi<%!JMi6}@D-amFtAe+UKsve8|-=n-@$PlJjFFWq^2ej%!3EF81y#z9=ZY`+{Ld8!TP<~QYK z#9*_W19_{iGel7v$06o?*Gxi|Y;WeZbKX7xvS_Iv`a_r&?kToj1-RONNW5*p9(%GU zdHHC!)5~n0E4_nGFGs#2a`hxHPc5UYiy=;4;&YB<$af!^AiNCb!|K-ILgD)7B>Mqm zAs5PePcnq-rC0e#f>+~Qyt)Oivf1oO-SmGpBK=+~u!z78^5;hE`lOH=!;p`~7=uy2 z?;++kxqZXUI8Cunxro+`Kohkgt_Q|p*+h4Ai0n&|1K8-vy*2;rWQQh4x=%icnAPmo zNL}7E@(8w)2XmvyT~E z-nIF^8!Y5&LEfsn3{i-g28ao+(%}c)E}pmF`Gg;0V6`Fc_{)YYa@`1s&y>vZRv3b_ zAvIu#cho98XV+o)0r&K*eHAR)`*TkR3Qtp_;lm}GndHhqeE86cyL#3>1`62d30HTq zqtgrlU-cos&)Pd8iO-~{TwFu!VZTia8gqS{@MRb*a$ov!)2_ZGN?*zj!uAGG^TuC8UOwL;Q?oh?SQ(t^$RdF+8 zg*a~}r$1Hx<9q&n+djD>SoUZ z)J@=+>sw?y!KP>@ZoE=ENoUFqQadf=?F21nJN?U_-!a#TDH4%du z(?ENuPd}nuXF?OQjt|+}Ikj6&O`?0nej@I&m_Wx?=mqcvz?b$nxN2h|wwo2^gnHHI znu>_RHzXyq47JlJ8v|r%a~2bOns#e(G)BErW@4eULQUH?xVlZP4OfC`G8SJBwekY( zlD!ol(BaN@RTqBy31x`i6%**|E@I-75c|9PsenmB?4%Iu^L@7$&TK}!8>Kd4)^}qxt9G*^@4l+v5K8U!{Ir&_ zrsk$W<-IUx4#gG(Uv3zSs-V2Iy~oVllT9*D))cK{_sll0q!3c=l`oQ77g%RsP}NK} z{Jma*4|~9X4lB5_KdPbhmTX*o_S$CmoXJWTHDUMPo9JtK2^&T|c7?QA%p&n_$Jpe# z5ml{3haO{jbKg|=Gu^yq?%@bK96!bwuJ_yx5rWmaV0=k2^z&_{%W|eC3g2B02~SO2M1) za(p$7mf2q~af%P*;?7ShY0-5MIg|L^O=Mqttu0u5b(jMUqb<1<3$UuRz}H@A%la(# z(f!TSlW?SK(?+uKi+x`j+m1Ana57*^?m$EWlAgqiNPIb|-5>>Uft}ov1nBnK&|V18 z;w}cus3yeQ3=7$%#c$#aC1FX#o7F#{qE27z^!>>ih*a91*ro5e8&TArQ>hpBf;hdJ zk7$o?HJsu)t^;LMA|>GaMCe#`p%91II`-v~5Y4qt?AIlO)%RF8w#U@ElcF3}$O<<4 zx$wd6`x|e8;qQ}MUoLXG)eC%Ox7y1rZmow~YbR4ac@Rej?1j8SxV)=NCS*k}6+qsq z%Z4Z}?G2AsvnfkMYRp9>e>v>`WU=*2+l=v~oY4~&td?EC45G3F;}e9zKyu*nB(nO| z!sp{-KQ8a;z(?p{QIQ1FE>_6UoL^D z?8{MExG^wbkL148ukd9fmv{9=D}8CpeR*o*zRX|`mKg$m>mYooS=kp1am(wPHb4@t zw5kh>7@m#RC;a{3-HR|1`> zJ7bKU1Rbj`PB?W4VrbLRTr_M3jrSxQEA98>vN|EVkbS>Au%T~L8c%=1XA#I{lu(z8 zVAA%q`tWh`*Cwpa3je_w6T}cmt91P!q}m45WU)oQ!2fW}+%Dfp#6n z#iTI2F?rDpiV)9V&OTci5Y?5RTX~2$3)EoEuR_&XFfaCO<%gZ(=DXxM6-M?f6M3d1 z&yAof6uI{a{M1PUEy$XeQHC`GdE9jij~m9kR|jf-Xv7+?&gmS7IA`^E&Bk0qT057D z91@VjI?ylV(BXY*)@Sp$tcm@$IIvA3c~^N0}Z$ly;<(8X0W4`N~P;vCzSWvt26+;wALt?Ag48qa9KCx&SrxF&pp z+UA>_<<>GkpG>0qKSd($dX)&VE58||u-v@mJ~ih$%PY2+Iq|Wq?fS+|dcTW!>ow~cW31uqdl>j{ zb~0YV$9hj3^i?Q68>)e0CEWd8f|onllJzZO%l!Z5udT3ynXXNJZsPf;P5~&e{VNBx z$#GG|?6399eb>%Gd{*^CRVjH3ev7p8*!m6aVy{I)-=;eQuwSZ9^^)Dt9`n@Uz^!9A z3b0+IPoVVONH5X`vzi-UQhnL*jj{2ivvE#%eNLgtEw=DZs-xJV{SqpI<%? z-$IzK#22e%5cWY%l+R|)+>sdV_7 zuP+FPp#$5y*+&g$CpSl$V$HC$1I01&KcTQ_gOHCA=Y?3B7E&kM0RbG2RH0~#Hj7s^ zEgvk}DM%^OzJ!=+Zc1U1)(DC^N|Cm&qz-zJ;jx8OH9bhP$W7HCsv1 z>R7_oz^E#y2%{wtt3s_koJd&4P3iNhFZfmGdn2vT+@cL}P6;qKG zi^Xlt@mB+}AA`grw6*Mke|XlJnOovqtfn}X!_$FtwYDm=hp7(vq3 zl`+~Oh3KzWHpZ&D6t$x{LQW%Cc>R&YC7Y$Lz>2Kpcm<7gB??WWuZrY}^fiEj337d8?o3X2|<_f;k+GX(Qm_Tu@ z+OW@dB~{Z1=4mJ9xx0;NHJo(RTfl#3^4~oEOU^s$_2<7``EMNm?aP06@!z%lcN_mb z#(z)n-&6dznE#&PzvuYxm;ASc|6b(3m)$w|6%_5Rs-mjTf7rI(?U!l9n;(U8lwEb9 z&$-ZrtjV4Rt)dLPGQx-Bj&FVpk$A_B(ycV2}5N*C==g-dd7r?=h6s%Wv7aiyyri;=9NW zkB*8D6?t662XA4Vuej#);=H`()UfyS<8}MVuB?TF?8p45xNbgl$!XK>oP`wZn(=W8 z1dPJf&Q4c(we@#VP9x=vpKA$a?R&1uyj+|33^PBD%D7U{RF`E71Wg%~Ntn; z-QV|lou?AN3B1$#N+4_C{rYsnfEtG~Ar7S~81Q4C(LZ=A&AX!WhbUMkj6m$&H z^JrUco6mJ?i}(_f*9)3^<0j|?iZAcuU~LL=141y`+4F~xvd$Ycy{zbjYuWb&0j6w3 zU>Ero#bdRP#=I4#C_OB07?-ta6|uH(MX@cOg4wsTrN8<&Om(3|i?##6-VA#+M8$x1 z7&_~bVADl&W{zN%ld#Cw2QgHi_|r4|rJC*wjFa|KI)dR}ocYnQ-O)by`4m5xb#_yF z0={~|hdUpDriUz*twB0ft@DBG;_2+<{&0Lv3YBR;bMlha^cEhUGtNce;uJG53)`$IP3a7Rtc{cOYG`hbEnhbMWO zl9Ghblm`L}n+VLQFECwVeqF(rLU8YMuFHG?G>pq_8YKgg_g3k*Pm>}_fZO;2B zd4f=)?g@doBzEysQ&V13!OoC&-j%427V(9R1U~me@(ZQhi+&VF3Hkg60`sKY7Kytg zQsvFVU&)$^ss-Io6S5@|V}=MmHHmE~>e@MBaOGs>d9sMl|5M-V`7w4#1*v9>_lHxMi?(f=or+XlF#6(OacoOIznfUWN zhq{gZ`F)sa&0$5^b{i8Wk}x+q$Opn<5=TqS0^Y|;j?&)2(uyi&F_8FuK7P36@@B12Km1WJ@TytS>h$-^z3j%;<<^!Q(7IZM$u-uE9nvF z`3P4ZQ@y|e5myC~?3bI3Ldd3vw21+M>mG{~w!UZ0e+V{FsY`E(lu}v9nxBe7g#+m+ z!EpuU8iKPNdO88AQl8eImG%@gmd#6$G>MC}Gm4Ay?bLG`&trDG~VP}5` z!M`SgX@&g?Z#V_+GS_fZl-r(k0;0Iazu3+P;XMXH?!h%6J+U}dC65BVG}IqrsFb;o zyD#JYn+drVK<>H0LosA|u(`MD1m?DYJ%pwIIP26?;c@Kft>BJSqoZMI1PqX74C<%^ zuNl$(`KzTU^;*f?L){gx44vZDvWDU{!80@bFbldJ(Tbc&kX4=lbyB5HO3(e)f=_KD z_#7Zr^(Hp{wtpaXA0xOx9lAU`AWH$TRLa)h4r`)suP8kcwmlQo?aBw%(JBEWd`oL( zdZ+8rMBCV}w}+Zikvnzt1O(?}LLBAc`h<57UM&RDb3yW?PtR~5dHEWUI>dMxZv$2V zA6Q+ZRBz#)O8(ye0la4w#j|r&_f&W8$`?Nd8z`w5NmLo(M+7!zb$<4*Mpc8JpyaZ| zpM6-&PkK`v(&hV!cty#N7xDqPC!psgAh|OPNbc0?B=|TWSxN!YaYP1?@*{inBm>Fa z5t4Uxn|upw;I0H@=-KB#RclE7AP;eUAx}0krH+y)_%=X#p0Ni%iPBAxrOSaNX)O3x z>FSPKi8N=)GCK>odq8^XbrGeA1!};bll(&dj{&-Ye+@|S znLyaDt}FsU&qg-YF5JogNl`i@h6v3Nb>*4 zbRTqSlJ|BQ5auDDbQ#Y?mv5we{2zkp5G;}LKL|m^ovkVpqd^=}M<7cwA0yrC0MvIE zaXoZ(9Z4@ug!dFGLxA**0+LGo6wWGZQ`nG)L43@%|0tqj zdJC0wAU(?^FJ`ui*|1Q`m&o)5m~rUY2PDs1^%49~An`Abvh??F^yKtWnu?kXaaTez zswn}Oa;x`s=TmMbgmUplkb(X5X5g{2?Z33=E*p_bDXFrOG6x8LE|4DYKzAiDqXs5% zPsM$Ln8d@OQ#eq_eGjC^bx<$AjS(eHq-zF?^u|ESNA>kkeBq&Qe-AeDj<+cj@yij? zv?^ajROZoZZo4b4ae@9CrP>lrs&mxk(;9|y{ZK_|gRn{3apn191ic}!E-gkxIjDux z@8Dk&X$SvOhYROE2GaA8Rl6I^=jpgR3YXBQ3yHx%dX}-oyZ(GRMt`+THt5Mu7gGMO za#raFq(Tpp{4&W4M|8YG$r1Z6!bYJ?Z%$no&p06I2S!zH1kx$|MQQXr<6J5DR4TR^ zDHP*@^h{;yufpAxGAoMBlTuYPh*Oj|el+BjOkuDcke;_C|6c`2fPAh@KSS~+ z1cy_B?|CY!Gk}ca2_G*q7!0Imq2ym2%I^Oxx>BA@eU#E(N~> z(i4RJCskD_ke(rI)&ntunj6*D#*p`=I_yMGZ$bML@39$rw(E(@wC^> za946{Sm`1-WjN20|EOD^rtdUpIj8TEh4|~MMc5tG6xIaK7XHzK*M)LdQC1^w@=*^T z>8UL-3P|N`DftAT8~7BU7MKQf2WH50I>R746PF+o&t4!Et5oten6T#utU`N;Dczd^%v>v6 z%v~om-UpJ4CnaAqkNxszkRf*?PM8qxdx=WpJPUjjY$)7>V+n+Cy-49a>;5R%@BU`2 z>9*hvk|}~`(;fx2yN_tYRz=BiCb{ymMN5&c-B!_}f@fbo5)0s%%Q)FWGS%-jAU%fd zf~Nvhqhp~6oZ#S1Aiii9DtI^gAPP;$4=YlEIyXg!*+nsP};P*6)R zC1`?Qsc)uFx>I-#1e@)}`wQV_d)b$Ny`>4?&pMX(@JlZc>aM>?T3g;%Eo2YMU(v*L zW_=%b);xQUEq@$gqD3ezO!8h4QwvQOGzHMSL?b)Re>A7j@JGWKP2MyK(?UX@j<}H+ zWS~ofGYz%0KGeUAb!G+}z=9wjGPHmyg-js=Eo5?lc|-VQjN`fy5Q0KDLJSg85fVs% zrUz0U2E?K_9qBXi@5;?ZSd6d<;Sjz@Vx?}g(3UMT+Wh2sCe3&oiK*9*l1V>Idt z@5M15AN#6#?xs2cIR1Zvfdc5fJ|V0fh(meA6ShRy1v&wE1fldX#%f@TAgtpk9(WRg zt{CVVWqGiooIpI?gsiHK>6vIC?gzOpVQdJO$M*mr=wI3)`Zq$!K)YTxY>CE#t1(K3c)}>m{eOTad=9~1&e z7Z9VV=70m5DoSI-r<*{$k3dz5>rv%rNz*MvTr<=Jgc5+I6d*&WYc34wfwNj*j)jct zjRf6H#K*!O;t5j`_Jbx|D`~oq*w6~QzG5WggUD=+e(+4-J<#Ex>89ah+%Cj`E(Fes z6U~$h^lyjV0pi1fSqRh*a)4JPT?*8-hhva&y=9==hZ-F)ksuyeU#Sh|92o-ch)4T@ zrqlWvop8tFfKlL~6^S9Lzv)?m$e#|-8+V2cMO9*ebPP`2hp|*I=uDj4mYY`T>%X1iCGpjowqjYh03g=nv@t2rx18Y z2S)c6twJZPM-l8$pwrW_eP9TSOPqu%ml4uImjd7ID;)xA`@sps>w)e1qs*WafNu>z z7XwX4pPGS?CmG!c^gx12@Vh%7gO&ARa9+fnmceWUemV*qgwE3AOuOZOR z^G(7l2ya4$@E3#}(1gDuGE~yEzN&K?ApijA@TGFxe zMF;?$58VGM+6*);Oy`V12|&}Db0rq8g`jBxyD0-TR~7QWeORoff~H05vDYC7nij|x zv2ZN~O$*rDqwywtsI&++DSwPXRf3__t_G`P`p*<-mF!E)u4?ca7IfTrW8eF(Xr zX=R=G7MuW0E9?sh_d(Oj`_;G6SE{4EfsYYVLDR~77D5haTA_Q7N5QL`kO7EQ2&G7% zRde47s0mN>WZ=|^7%D*1(%g(C{5;UKlwX;R!45Pn>9X?Opd$qYg4uW2W~eKuYR(D}f)IdU2RUX=8G;PUrGhs^^f z&J}H$3Va}G`X*y70yS$MFwr7qfDa_C%!dpD$(Zs$BwD2q@PVY21!xfjI~;P|_|t(v zx((Z1Y~u;XBLslv8-LJr5I_e4T^6E^5l=V>p#$hl;3#9zoD! z4_vqjZQ$HR6Ve~jHbw&BPY4O1UH8+puQnqLLpFa-zA^b910y$a;bQGZdiD|iCQ6?eKTrdT= z5`jiT!h@0~ocS@@9EO$xuN^>#0(}EG?;vWT7KUWtP6VpO65t(4{{ifHNI04RoGCPZ@{vYD!hZ>4vwCUFG z0hmw4m6=#$k5E%IPtsRS>bpTv&YwRI=^+J*QkEpx^GO4Y=3gS??M7R8br?5V&lxRR zXCqJ+twIqNttvnxpc=sOaDt+cPFjq?_eDEo{tJx9G^q@kRJ-@ zIJE{oS+rXyG0&c@gRZYX^3*P)7@IDO%3%pcQ6h(yZCdYg_)|oe<+Bj2L5*iUwG-?7 z90zgh{WPoA!71GraqP4aS%uapMKZ&P(oY-lw9SZcI%tGMIsXiia9htZlC+>rd$Rd2}hyxM6lG+=hG zhN_7Uf^>RdLx`fk%{^bNG-DhQc>Rz zE;j8SVkW2lOOm^jiTumz?_F4pKrInl=8s zV==2!v!Ur{3<1XYQ%1|en0)vjf7Yq*3p?awq|uUsA1Z}Y-x85&L>^9pSei}y)lrg4 zi%ECt8z9Z9FM*}JOTG)2P&HU}sg%2AeavQJZQ<>?Gs&p$VAOYA)aZILP#Z06XhiBO z$PufqPJMQ+W@w5Rk9%3f{Txk}vqOzzT>8GyPa}P(Uymb{8CjR`Vo>?AStDIbjatNp z>*}VwTcju{wgt2C9;R3pw$BC{Ej@A_ABB^5eRG}qQ3p7+$f^H;DCUdoX-}MnV;1de6lK$eMXKnLQ}(l) zz5z`~Qk?ZmqxFJQKLGDhKH9%4#Zmj)v>9B}qXlA{MX)Hpy2kJJ@qG0koFbcgZ^)j} zzK&nOBmz{eQ-2mx#v<)_ilBD1>MkNzqeYj77$mfgV0nHCnuhz?aldAoqhJ7h|Kxgq!KXZX&TwPi!|Y(Aby+T~rPz`%27c|-f5rT2>ouG9 zvxc?f)o|~vlnhk|)NI)yighI9~;APFckJ(=VFYCVeSW$|UKxjMlpRz1{KTX(Pc2eKL zxD*L!qAqyDKBG764bC?yF`ED4Z`f4MoB!f(*eD@fVzhql=(Y&G_N39;y9af)Z&>%h zN16=Rfq;{}V zre@;Pn%Gm#6+F`!Jl$NuGab(pt@c#(qn;T1c&2SB)9Wlbw7JH%lf4>RPcv>OTOK-L z^jJN$Pd56IP3uQ5vPIjEqHMZL0H?my4zxQ)t8{A7Zt-U^GT`lOLn5;Kgpve0N+`vR zNvH0!44oR&QA@;n=-EqQb)(gNUH)>{X2RTLKwY~6#dOjLW^JRq{Bm1lB4Yn*QQ2mL$AJs_;%Il-)PgZi2<3rvmo`U#Eh z)PKm1Hi+;(!D;g*_Ctew4SN&mVJyGlXmu}p&~Tl)n=Om$t3G7k#bx&Fy^(k3XVXO@ z=PL)NW}KIUQ=||sc6j9|iti^U?`R58YrV^_*>if1<(8be*T1>G~?l^2%Cj z4BcE$cCPVYuOrCZssEeBHL2g?>N~vNiyhl}dsXnMej&sc+OumIi@HukKFXb1XbEJ6 zLFr>QuL(iKv*kPGM+F8)P4ejo{ja+pCpTl(eD41RSpmF=8k z4pvZ(eOH`LEQHF@dCq318Lj#OT)vCjiebN$Pldcy_Yp)P))ZpUz~aCqN~U)Q@p?Pw zs0Z2jvtl{l@@uD)9gA=6c@@KyBY-`MZ>;%HWwEWI0t2P^8%S}9ulR~RX%*4Z@*DD@ z6%qzbqxD|=rBqw5Qj8YMd9T&hCO46mgwB0CpL+FX*1L5x^%9%gy0K{jVvObrXHE-@ zvyh@`yxK~k5eNFfCP7ES=O4ZRjTKd-BX%}#Ocs;<@8%<#3R z(W!rt?9+^Zg&4hpUU*q(88O>v-4~Oqu$VRx5jUx2EIuffrH0Yc)7xk>dOP)FNYkdR zyNQi%vs1mmeB1WaR9ni1wvEwjSjy(NjZlxWEp5{RU$pVoPhaY4{qs(Jyp2^$7$4LX zFR{^j6{GFL&(!Q1hyBpvj#{s<+=SNZZ|swV7}E-j1y23gWi%rATJRE5kC^f&=KglE zH}1%eF&sQ~jFfg`L;QHh=mj+@>43kTPRG(OsbdsCT6TX3Q zMA0!k|5O_OOV3!tYwVn(;)&CFh^8w?tuI(^yG@#A@hqzS26Y5G-aaLEOBrm4Mo&t! z-s=|c>}{D_l4=`Jg26it**W#~Y=vuK{qe}aWX z1$8n#G5MiAA{+C3M@n>?_nQ*$Ht*Nv>2lup<%we6e=w4oJnvfe1Y?s2#uHC9#twhb zlK&1CA=poQ?04lh2-$Ufc#`LKktbTaVrg@dRvE`R-{gwX{FtvY_Hf?(n6EOn3gIhM zjc+11YZ3LSOzKlXBbis{1kJb~3zIvegsE@+UrN}N65UEzmw2}l*5v83gw8i9QIzn9 z;s0L3Yb5hOmGC%EtSsRk&R3Rj6X#_KR|sKV!kNg;t%P2~Sx|C!%?ocbdymkzb%fxv zS+tt4`fStnAdg&SGtOR@z5TL$KiA4)NI)7)`}&FvAY>1<-F zdo;w$f4oOn+r2{kS+TcrzB1btoR`_=xol5n{>EXLPp29q!oPc6X1D|0@VN|EvmM6n zn)Pq+5-xnBY6-JBUzycd&daP`6vD-hPJ>ud>fo>)17RFPX+lwww~BsWlvI-d@8xCo zaq1+~fp0mNm~b1B)~kH(X-YKKvgUd1vHPS6A{5(Hnr@?i!4Nb2Ga5HcP{a^p#MtrV zN0O%@CPD62M=Tcd_p$P{>IOm-VqZZF8iAFfK1Q~#XQ=uO`=n=kHJ#n-SyvNeWxl=U zn0j61ZiSz}C5OF}Aga!XA$a5I{X6tCeEQu^83jU14ttEtyAOMR;GHFT3*@c3J6E_* zlOYC;=jOvsL8wKN9RXR_1ULN{=EFC7HLK;%3wO>DLKzQahk7;El$Eg`dqo95M3a)* zu`)SYikb8xJC^pcX51jwsCQ$1J8ErfuShy8sv*)F3}O>|ZwY#rJ6JhEWTFZjQwOrh zJ|RIfo=dBsv`zzAdY>0f*`;877h?I1$un`|P2%!a;n$q#|Fxp1Io;6Oi%OvocHQZu zEesZ%R_#>8P>o_*8v_#UT&+0SmacK?(`I4?=>wKdL8gIm?7fBkHYQtxV@)`;Y`S*H z#n_=ZJKAV9`5B9l8F;I%K1EyfbqP>Dtz$=Biie_L*Aa_z&yzUV#FI40X#EApnOG@k z6TU(c%^}^eq}6>3kD%hau&WBfGAt%D{u*ZYlOh_1`@s@F$sEoG^=)VB{vCs?~Bc$*VXUq;0spFk3@cDsU&pN}9*jh5aR^>iLwRr~i1 zF5p0HDPkWIYtjBDV#^WhK&-ga&T;7efozrStlhM<<4!TWY>2TO8Fx{J}*Cnt?XZ4O=JiA4>UQh;Y~n? z)_w_s9{6iKX>@9fz;pWid5f+;)}FEpqi)de<|Fl41o)S$@K)`X>*TgQN5$IH=x1zV z^fsP&j;UHp`^mB=D3Ytv2~qk{(twA#*m=^LWO$aDNY^Dx1J&Z8 z|BK^!eO;7$`gK(BbM{qXUz@G5c%Ni_`vnIyD}l>Zn&;d#)?r|X$HAX44jKk`XB!7L zue0dl^HL4icLSqUAEp`fRmkfXDpOO(;JyAQ^%x7?vx`;I!Y^t;UKb4X~ zraL=6xSsj~yD|7iz?$>Vr?$DmB8Nw_`!9YQu;|?Li4DGCh7r+BGvwQV*`Gh382B|S z&4|)GzRBvmbTwe&+2_+ezvAh4N?HA(R|7JNpHF}IB`X~mrMdPUiywA1fQG)RwRHOu zPd|5qbsc^+AmPmO>0f`r?H~Cs8!+N(K-}r))6bNUzWNaxJ@VUt;8V{he{zv0uVd3Q zzYRD@^_zD#$D^hFPAWescZ9RdQSdpQdHC^xhFCtjDjF}rao7%yp+*g>reuZrv^P1j4t>8+MIpXSU?A*YNe@Qv|4f|~D zY`@Q`bueu85~grhG;T`ZhGU479q(C>NnrmO7plfG$GDXNS3a#25PfClS(ZOON*&7f zj{mvN!K2S74`zEN)KfdN3lnbC*?#2tRCKh7(P|U+{lstUtU3IAY8!U(<$7vF;oX

fZ}{f)E+3V=AxvG-|?wd!qL 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 ZQ|yAy0`8OaWuTMOtVOlK_=?l>{{Yu#xHkX* diff --git a/Assets/uDesktopDuplication/Scripts/Lib.cs b/Assets/uDesktopDuplication/Scripts/Lib.cs index 9fe7252..f3dbfbe 100644 --- a/Assets/uDesktopDuplication/Scripts/Lib.cs +++ b/Assets/uDesktopDuplication/Scripts/Lib.cs @@ -2,6 +2,8 @@ using System.Text; using System.Runtime.InteropServices; +#pragma warning disable 114, 465 + namespace uDesktopDuplication { @@ -77,9 +79,9 @@ public static class Lib public delegate void DebugLogDelegate(string str); [DllImport("uDesktopDuplication")] - public static extern void InitializeUDD(); + public static extern void Initialize(); [DllImport("uDesktopDuplication")] - public static extern void FinalizeUDD(); + public static extern void Finalize(); [DllImport("uDesktopDuplication")] public static extern void Reinitialize(); [DllImport("uDesktopDuplication")] @@ -93,9 +95,9 @@ public static class Lib [DllImport("uDesktopDuplication")] public static extern void SetDebugMode(DebugMode mode); [DllImport("uDesktopDuplication")] - public static extern void SetLogFunc(IntPtr func); + public static extern void SetLogFunc(DebugLogDelegate func); [DllImport("uDesktopDuplication")] - public static extern void SetErrorFunc(IntPtr func); + public static extern void SetErrorFunc(DebugLogDelegate func); [DllImport("uDesktopDuplication")] public static extern int GetMonitorCount(); [DllImport("uDesktopDuplication")] diff --git a/Assets/uDesktopDuplication/Scripts/Manager.cs b/Assets/uDesktopDuplication/Scripts/Manager.cs index eb119f0..d08dd10 100644 --- a/Assets/uDesktopDuplication/Scripts/Manager.cs +++ b/Assets/uDesktopDuplication/Scripts/Manager.cs @@ -52,7 +52,9 @@ public class Manager : MonoBehaviour } } + [Tooltip("Debug mode is not applied while running.")] [SerializeField] DebugMode debugMode = DebugMode.File; + [SerializeField] int desktopDuplicationApiTimeout = 0; [SerializeField] float retryReinitializationDuration = 1f; @@ -61,6 +63,9 @@ public class Manager : MonoBehaviour private float reinitializationTimer_ = 0f; private bool isFirstFrame_ = true; + public static event Lib.DebugLogDelegate onDebugLog = msg => Debug.Log(msg); + public static event Lib.DebugLogDelegate onDebugErr = msg => Debug.LogError(msg); + public delegate void ReinitializeHandler(); public static event ReinitializeHandler onReinitialized; @@ -89,15 +94,18 @@ public class Manager : MonoBehaviour instance_ = this; Lib.SetDebugMode(debugMode); + Lib.SetLogFunc(onDebugLog); + Lib.SetErrorFunc(onDebugErr); + Lib.SetTimeout(desktopDuplicationApiTimeout); - Lib.InitializeUDD(); + Lib.Initialize(); CreateMonitors(); } void OnApplicationQuit() { - Lib.FinalizeUDD(); + Lib.Finalize(); DestroyMonitors(); } @@ -107,6 +115,9 @@ public class Manager : MonoBehaviour if (!isFirstFrame_) { Reinitialize(); } + + Lib.SetDebugMode(debugMode); + Lib.SetLogFunc(onDebugLog); } void OnDisable() @@ -115,6 +126,9 @@ public class Manager : MonoBehaviour StopCoroutine(renderCoroutine_); renderCoroutine_ = null; } + + Lib.SetLogFunc(null); + Lib.SetErrorFunc(null); } void Update() diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Debug.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Debug.cpp index 41d6fbf..1dc2b36 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Debug.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Debug.cpp @@ -4,15 +4,19 @@ #include "Debug.h" -decltype(Debug::mode_) Debug::mode_ = Debug::Mode::File; -decltype(Debug::logFunc_) Debug::logFunc_ = nullptr; -decltype(Debug::errFunc_) Debug::errFunc_ = nullptr; -decltype(Debug::fs_) Debug::fs_; -decltype(Debug::ss_) Debug::ss_; +decltype(Debug::isInitialized_) Debug::isInitialized_ = false; +decltype(Debug::mode_) Debug::mode_ = Debug::Mode::File; +decltype(Debug::logFunc_) Debug::logFunc_ = nullptr; +decltype(Debug::errFunc_) Debug::errFunc_ = nullptr; +decltype(Debug::fs_) Debug::fs_; +decltype(Debug::ss_) Debug::ss_; void Debug::Initialize() { + if (isInitialized_) return; + isInitialized_ = true; + if (mode_ == Mode::File) { fs_.open("uDesktopDuplication.log"); @@ -23,6 +27,9 @@ void Debug::Initialize() void Debug::Finalize() { + if (!isInitialized_) return; + isInitialized_ = false; + if (mode_ == Mode::File) { Debug::Log("Stop"); diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Debug.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Debug.h index 4c4ede6..f53b986 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Debug.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Debug.h @@ -64,8 +64,12 @@ private: { switch (level) { - case Level::Log : logFunc_(ss_.str().c_str()); break; - case Level::Error : errFunc_(ss_.str().c_str()); break; + case Level::Log : + if (logFunc_) logFunc_(ss_.str().c_str()); + break; + case Level::Error : + if (errFunc_) errFunc_(ss_.str().c_str()); + break; } } break; @@ -119,6 +123,7 @@ public: } private: + static bool isInitialized_; static Mode mode_; static std::ofstream fs_; static std::ostringstream ss_; diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp index 6b4f667..8402c8b 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp @@ -25,7 +25,7 @@ std::queue g_messages; extern "C" { - UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API InitializeUDD() + UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API Initialize() { if (g_unity && !g_manager) { @@ -34,7 +34,7 @@ extern "C" } } - UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API FinalizeUDD() + UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API Finalize() { if (!g_manager) return; @@ -52,12 +52,12 @@ extern "C" { case kUnityGfxDeviceEventInitialize: { - InitializeUDD(); + Initialize(); break; } case kUnityGfxDeviceEventShutdown: { - FinalizeUDD(); + Finalize(); break; } } @@ -66,8 +66,6 @@ extern "C" UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API UnityPluginLoad(IUnityInterfaces* unityInterfaces) { g_unity = unityInterfaces; - InitializeUDD(); - auto unityGraphics = g_unity->Get(); unityGraphics->RegisterDeviceEventCallback(OnGraphicsDeviceEvent); } @@ -76,8 +74,6 @@ extern "C" { auto unityGraphics = g_unity->Get(); unityGraphics->UnregisterDeviceEventCallback(OnGraphicsDeviceEvent); - - FinalizeUDD(); g_unity = nullptr; }