From f42e0d78d63b8667b7ebdd66064b22f28019d855 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Wed, 16 Dec 2020 01:11:32 -0800 Subject: [PATCH 1/8] Don't reuse textures, and don't keep them in RAM Hopefully fixes #28 --- .../Plugins/ConformalDecals.dll | Bin 82432 -> 81920 bytes Source/ConformalDecals/Text/TextRenderer.cs | 20 ++++++------------ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/GameData/ConformalDecals/Plugins/ConformalDecals.dll index f519f6acf5a1ee2f3390261e5efcc6fc08f67a2a..4096d2d229b76dee2d345c07405c6dffe7af68bd 100644 GIT binary patch delta 18099 zcmb7r33wG%(srHhyKlKmxXH~%Zq}RJtdQ*n5F#LiMcG6c5EDTpEQYW{fSU+LSv549 z;KHVYpre8!BOpO!WCQ^P6j3CI3WKQ3-~bBvS5-HN&i8-M|Leos^;XrXQ>V^3-F>?| zb+h$#b^52C@OEoj@C#`F{RBygRw)mlwDGwW`m+NB^jlWhR7iYUv)kN`+T&r)TD z2%>VYxYKZDDZo!nn;p`~Ar(8&Rt(^htJ?}NWb1X_K9QMnbtfcpbtz(GAR95OeCA#N zovLy}_1^?ovI-5U)!oo&Ger%o?v8?isW&gqP<ds`$#8f?b1_*90tIQA&TT2e3!r-#5sICF9RF?n* zJvO7u$|@Y9WsS?49f1m|b`R!Wy&q$*F}bWRTXj#g213|?_zJ1^eX<`wyUP|C=z_+q zaWBouy`ykOW+hL0?h=c3BE?~Mg`uZvY#Q@ z6A=s=T@fp)zd`0}x0VO6V-0%u8M37n&YNy!_Y zocK=`y;0TYQD8&hdv>b6zz1dQ@Th!eFkTAa`n9;6)jyz`7YwaVRA6|g%c+{He?()e zBN%$?@I>oRNa|?SkH4s#9=<~SOPTR-n)tV}?%^NAB}Exg;`kXoGG(duC@r7=D91-M zh|5Yv)g9uB@_bc`NRXLO_FLqN2luRNCKs}#%Fwn z^rrSVp?p0uJyP|oJ&u-a>$rhl7(4!&k}xXHsTn9jwpAJrO1Dv&LMRhQ;a*i<8P%($ zB!R^ejC4alM#<_H0UaK>n5fe$aijaA|M=1Qb_43OtmCdy@L!eJN2g>8)EF{x6H9=b z58B~*M@?3)W@rCRW>kI~9g6sGU9|GRn3lq%gvYcKW@X2iMdH`Zy&h>VTB%v3|0%19 z$pDhgloesBJ%t0xGMeP-xmb5jw5j@mw$#iT4B#MWFgCZugW+a&bC%Ow+f2<&X4z0Z zpW2Cl9{sWpo^-f{a;V0uj2rt%`6ZgEKqcB|I?!FNCPn5#DNsQw+bxym^SdImo95$G zeUyxvnW^eXTKs7way6dUIdAI!wBjG_QNF6F2wRY5wvuYU#t79`A`MdQ86?>@P01e8 z^lwlXu%ScMe|c~-&BM+f({5`!>bBsc#&^X%llh3&g;7#=j_WKOif;TTB0~9Wd{;#O zgm{k=qu{nUf_+N0-%)BVrT2uW)^5~S--994Ei-O{1;z$EsLYC$$CdeDthSXRQ5ARq z{i=UfR!%5M_+MTAqgLZC_50?UX4YEk` z3>&JYK(bOXj$%=bwpLT8Wnw2~gU_Bla+o0Tc!nmqO9v+YT2tIfM;7APW z?(GZDtOdaJ1j$|QE$@WKO~^YbtEU#5SKzHc3$iH9Q#%j39*-3NGr*b1#tZ|DZ9#a9 zabzT9c;Mp<%m@zRb=3fyBlCO)*wNzSL<5vEUXCO=lI5ouXR>BT&Q_&#eFum1 z4#-Yf5@CUM7K(On-k{`;kQkttkhC?y0kwjxwse3|&_9~=Zs*nn3-nC{m<&5{2Rq=6 z0Qp20lKgVck_ZQkZb|5nNZ$u{odpagvMxre1tcqkk(`brr)qR^z}3_x5em%mkZT0G zTA&caS)hGBVG35v0X@>lGbe^y>6SzoU`5vBSDg1)vu)xI3LCH8CJGGjf zPM*CmX#*_bQofXaJ{Y#ZgV@XfZEa-eEe`1oupjH{fK2XYb1Zc;G=ngNDH>oPSJ5J< zD*airfoG#6nJOLSp*YTb!k=TvXK@j=ZO4^(A%95(-j>;V%5JF4M+`%5>ad_21~axr zbb!x94F*M$>#J^ZouMQB1EM6`4f8FeIhN8>cEG!+aljXhDH6%8*ym1rPuT#kV2Tzv zQ8*~s4QrBm$`)v4rg}_@qS{o;BrA)jyNyrtT&-1JnI0AX3GX3B!89zH0X|OJEPLUS zjnV=3`8b>AtulE~atvf*tsIboBXZ#F-I9nd+Il&_HO#Y}4|ahwxH=rL1KS#4ua9an z+)u4O;Cf#3Es02gE4*rkq>$%_VGL)1_j%!+^;7=agOu&_dcywMgsX8!1f?T9+j!N6 z)+{?98rM+*oW^DRA$*J5%m9fv84lPSMKOEvI>K8Lj1Wv9+`{q(j{GlPoTCfFWQfBW zI3NkfgvE-bfk5|VfDiaW%(JCoLqC;8)Wq6Hq$qTILPnnqWgLjyd?I3klm-w2Xs zHHLP>i-BRmBp4N15;0Ufi%GlTO+C%?@p#;|aGVSKILa1y6eq$B4T(MFU!@$}5)Sa< zda*#hZ7;5ZpJ8wEEYTk;iu=KmN)1-xxl$2daFKU#h*;F)w!>vPO7y~w*imHoDbcN% zN(?+yydRgSDVeHrHe#kP4VIQHEwMmz1}!sJ)}Uku9P*GgEYoVZf~^d2*#BZ;7r2DU z;npNg80O>F!AXTJ5~0BV>xC1#MH_=5W&%%}pQRatGr$B9Y}*wen;AT4cfuWU#$Y4L zk<8wWG6o}|Gh{Fe6cOtR1^oR z7(QaUf$1DL!E99m85h7QX4~1;2;Va6#$h(Xb!OY5$n&pY5mbvc1$zrOh}Xc%ETL#` zVFpIP6Oy@hG;H^^a@mbSNW25g6L9@B|>a{T~GnY~a*>?62~*|t)5=4?0&J(>N$ z>|^MqvJlxmfxe<1yI+L14dMvkohCBLPwW^BW|qtCPQrAWVc3C_9fEW4q(NA5E_6y+ zedo}5Tzn3=0#6Gm(FqHXxsk14HVv5<*-B=kHP2_5J*T`|A1ih%C+ho3zqD5J9!(3k zj-Tmp!NS5v5vLW-LHtizvgCr@d7Gttn3%N)HSb$$1$)T~XwJ zFQ#LFW-Ix;heI@g-$tJMxR*OZ_Aru79PTWKXtI-2QRZKZO=7L#RPXX^{?Q{q@XV{GL<>I|4Z$*CrpEDZLKEzfxqL%Bz z2AG+^1&X4M|G^{pf^ke7X;wv3z9$)y`ZpTO}6 zIFx!EyIh$1CE{2{UuiSS$3x#D9xOfY5MgLyvX%%;FZ~g5mj2&}Ba1FO(%{?NEe=0; z(|$$7lUsy<`>_K*-Y)C$+;xDx1<#H=TqAM$$!706Zwa|<#?FQfx58kmo5r-!f-d46HekDon1({ zh09(Q+ZV@OZXbZw{iqS}Nc{aMtKBpvJ&5uo?yMz8o5ONzmfI&$t9-@>80(V4q#Da) zA#x5)C<#(Dxt?? z!*^ml0au;0uxhM!TM=*HbwMw+>&YjKxI~&|;M2((-1GPl61Sm%Oc(XD zku_uRL?R&3MkO!6B`Dwx-0iJ#Ei~a8cmhX`7|wVl!eHp6OP2cAeJH=+=wH``u|4A# z5^2`5yb%$1Bc2*@fUWmph|`(-5E~K>AkxMuf{oH)EaCHT>{iSp5fdZ&*Zrr6a6k#+ znk2$JJ7GI}m=4EM2=}pJL_Ep=N+$dS^=hUR`V@wq1K(g(ZcpM-`;WJ2=p1D*P@PWW zIk0OY-FhrFdE(#3pNaQq?7Or&yMX>GYirt=cL@XBuNf<|uOO?^*ti0L4-dyOYc$O& zFd&jwL$(V*2p2GV(ObSAV z-;i~}A6)1eogW}J25+9pmR5M#Y=-H~8lZC_KHz{}_wnb74aZ47*8@ zDR0fWGu*K-;Iu*t-hl$_#fP~8rwy*COk5}t_*1G5@4*3P!>g@xopv~-v3HS0z@{A4 z<~0^OU2sTamVz>;2ZFh(t(UdCvjq%bwntcF1YXC_YD@|wZ=VR|cKdqirG zm=iDc)cxyO#OVH%Z1-gn+g?Ph0p!#^PA>%TdHKzON5MM$L3p!ZQLu?wgQ+6nbBF>r zJ>|mTwlZ{SsgHuT8l_r9!)qF&(fi;dW)09BMeK&gE-@>?r+5JM@R)I+(r%uw%lA>y z5DVXH+M4WWh=YFkNZ@8t@i0PV@L-XEcsQo9;&ft>ZP^oIlxOFKDl42VVZt4%W`=u= zGZntq*a&3lFs!}iZO?UPfU|?jEXabeU1Q1aTxT`}%E-1CXgs;Fp4lFdl;ZgrVGrh! z3z;3&*2|oeoVhTV*&d+s=fNJ0QNia-wbiT=^JM*Be%HYGC24^c+ewP|k zPF?IQ0#lcpo=@pQKu_{1qqoDp&+%bnooa-)eT`B(2y|5&76w;4?||9Nz7>VRR6~1M z&ulLg24BJvpV8QPbE%;WEciqnQ!_10*sCvt9vWMg@S*-rSjlXu>8{WwXD4_;V|_y5 zP0qXEb&cN0+v4mBhii?$V?smeQ;J|H2MKhj8FFH>~>e^OXpwUE{*j;79I?JG2Og?yQ7WDuZ*25YQc#wP1zct~USr78L;Fiv9+ zrX7=~K%K@+*@}KDEYMhF_Az-Xtkl>~EfxJVSg)}wEsx35;4O_gixqt>yl2vAw9@?K zjPSbRar!#=M<2?*-t@QPkgE=kFr%f@!Br1O`jV{yW&}?fWhjqrVDFINN1{tJ1k7mvB{^dMqOVX?2mH5ZyRHYA)|R+HM%VKAFkJ7o5sx2QP&nYq%nW)Y1iBEt;PzZ3$AzIy2grfe{sDF zk@u^K-tX1Bcf%%)bBaOLSlNC*XRJJnNw-`hNFO$YZt_wj|9n9fQBCOyow-GkprDG}Z#yXK;?0dW}C0 z?x7T=**r7q1D`B8}tjdXtv?%~wB!SsV%jVz7XQn>D(=sp7vsW#|} z?=HWE2^uSRKdy9K+%a5>SHANwdIY!UJC^fM$Bf!9bf1UAs*T(K04FuJ)40a{1DL9~ z9Ta-jyMKi5RmM?%g5OkTswjBF{Sz2Rsu@-ltU;E-tR5yQ`Xv$et?rAkQnh1c{7d4+ zPNn@4Uz>HY(QpmMk5c6G3-lW-(+e zwXcT@N^oiHeQ9_TV-`=0Q+2h`#4c%UJF|-M+#ip^EJiR}YC5Mo>NbmNjoI|XCTVP~ z?x^zYQeXJTq7$e+G?Cgj!eq;7w?$mN#lCmjMBF6RHo|t=?GUeNtb5XFw^Mwtv0W+u zapUW>$*Sk>r2n{EhzB*+zex5(i3_Uu|A;!<(}o~;WLGwL#nu+ zwRq2nODI)5q_NSC7M@fwMq_<3sZ=phW22(iNvUFn#x^l~Ok)=~<}Q_C`W4Pp5m|dP z;kKTjSiuYv4r9Vu;scFR!r9_4({Cnxrzcws)mWd2tTF*Z!LIP%zu^!$|77!8> zH1>#onkOVW;4^f(Dzz<|)qivB^cmHfyY} zAsB|X;vJ^-rXhxba$B)SGafJop`F;T*-jV-%I(Ba&9*Zl2zQ7tHQT<3f$|;VtZKt# zp7gXAp~uuj@vS4=Delx5?bAC&ca61;ndA)LDJoQI8t;70(@~6IR&NSB*CMOYY{!fG zn>vZ9n(a){22UsPsAl`Vpw!S=%+=U01$yW#6qR8zuX*kg8<_2d)|Qs~u40eI-YD@( z+OeYbh`5aVw1>?xMq=6SbRr!rIbh|l3} zu}NctBchSf#=;R}CX5(_Z2`ja~72rQYHkv)Me`eZ)mAjLBPS=p(LbEZVDw zJ|gaMF1|^ZlBnw|QZyD7+~(;k3N-dYT)fm*JQLRFUZ(Jb+VHsZJ#;l`?3{BSvQmw8 zPhKbW6N8z3E863)vwmW|#(FawIESOaB)lf~6Js?-zlr*ZYZ`kqbjZ_Bbe*fM=Ql&2 zdhQjA=c*0OZ9et%7hh;hhwMI)I8U{WDeY<;AQo%PPEl`ci>>E6lqF~`omL@$Y=4vb@ z)DMPQp&4m@M~cswsrz80Sk*{D_W~`_QDVR%mC>>sEnZ>PfS-<(n#PE? zG`0n6_=x!67W>&#E%Fp<*9h~Rzje_$1VU?cv(#xhe+$TP+CKiFn7n+4&wAR%(*A2JQ!N@kvQ zjl2F9Yp|w7K6;Byx8_AY_J?*2w`}vQ70xGau?A~#tcoQGgG@*DN-~>U91#}%FJ_H#Y-#2O3g;= zVx?H4*{Fw=Vv}auoZhP-a;5lDqc_rbp^@H;zUn3Hm_nEop`rv5WTr^Cpq@~Ct8-Hi z#*n_ujGtG5D(4lF+&!Q4rB0IblrgL0! z5-d_$u8SAc3FaynUdTvPN2&U$c>6+ovIvLZ?Wn49W2rGYNw5kRi>$3idN?fLNybt5)LMc! zc_nvb{{uYSQOc7qMmRha|58+V8?IE`rr4o?|CZ}fk8AxlYa?rR zv*z}c7p7C4YoaI)ZCnY?Ws$rjnNZyc>K+K^k@X6qfbi|)_Hh4m1^$;nw*`IFP92=! zRcPg^Qe|Y2x#quXXkOfu#gq8mrUX?6mU&hqfA_lC?k!reUgf#__$s8sMJU9Gg>V)BUBo|bXodeSh+@dW<5m235w{k-v~nTp@ns9i zenk9e3DJq)iv$DFP{vr!*qd=6VmX zT(h9dwG9ed7olv+BTWHbmW4#EG7zz2ma7oE!c@c*m?JH2c{gle{p*PRpi&M77Q$eT zGYsMbZ^3anKClbIqhV|2M{rKA#h+Uf@cHc-m<~^Pufk}?i}J>7qqvHVqw&k3e`h3# z4KSoILrlOBt;B2&Hv#T3l%Y(C3fW#)1<2qRQ7F(50@4`C{>B?5=Kb*IvTN0+!d-ur$yGO(gv94ZImv`FNKy$ zA>HJhl~TUY6|Y0<#EkW*-no*N({6Tt# zHS1VYC64EREy{Gq@WYsL-H<%1N8ZHdEojb_tHfXnzR49yaiwyN?nYjF#=B&{?#-N@ zvRO#Vl2?+8qY{S5^_cEKX^!rScc^?${;{MQ+b+nilehCU?cr(K!xMB)?t>ND4l|S= zUx^Br6mOLqb=?bh$mL>1XgA`rgb!ptu9$x)Yo|*k{ z8Xvn_i%#5%!&CHgb@@2aPwD(3 zs2q4TzVeft)w*l!sS{K_zv!O5Rku&KFky%8oOlFhMklU#bLGQWtUbEJy8XD2&dC{` zBRaF7<#CRSxIwHieyw|5TuVBun<~>c2K(Sf-oJDx z6~s$4!MM;L|&D3V!O1DYmYSukPOP4*W$xF z1LF+)@bgr{r}czOb>j?X-4)+N#BPj>(_AU?jT?!B7f`OBSrTJBEKb`}5X&>e*~W4y))0hpsS}Ruu;>#i zHrD7bJ3dFvJa3sX64zy45h-3QIRjJ!I;YlnyBh2DlU+THaTxTVz`_)!2jNFrJ2@b3QX(l>Zu9uDgim!mo^j`3HO>2Koi{&*Ni` zi}K(spXs7}z?Wc(6m+V;C|mNAQL_^to^0S*kAr#EGEpz30W8c6nu_mmxPL=D=I z6gJgM^b*O3WnW}!l6vTtqi24>b0}A$jA$Mx*YiHwr&mwZ9$e1*#Era-rZPdx*({E? zJS&Fr=;Pp<)ZM0iVxf||IVy}VuE8(QD~g80`on?KCfeO+O=hv2cDH^;BA8Rq-)-K9 zr@0UHDL6>HN{ObH?aiY(S{7RSnF}~(0heF`>&=FdB@4{c1zk30bLEey!y|S;(8hhR@9Nxxr#VX$kqImO=0v*2Vs0_8S((UN%3&R=T%<}m`so~)5WrFwP8VsAZFC2ejm>l=zhTf0c$?=EUCga*F7YKk zo!^5M#k+FGe!Ld@@meesbb2on3(R=SCsr~Byn2*_ffsSRmgJY(_KRuWa@z);hu0bR zi#6Hzgl%TS!jeH~rklO}9C|+&e?KnjM%xiw)Gyh-5FNZbP^KHX{d|(zj~n_pwxYAd ze!O^|f#bR*cn&$PTZNBE^Tm>wb$A=JDsLU0d1eH=8mGbwSl2SqlCM(9d1-k6b)sav zDSQ!cJHEmb(8bix@vf>SalC0N{2g6utm@ zp;7)ItG)SkIF?moKZ64(6aCn_&v0H}XSd;<^%#c@F2Fd434VeVsJVz5Qy4D6^L7VB zigl)gO2=lVO>8wm~;aX zZMq?dPTf$%NZkm;F}kUkM3tV#JrOYntk4G01G*MD_}!QtF&VNDgHVXr8u}x)fmMhd z;Z4Nuup6;297G(%`k{zJVLU8|Uxk0f6K>)}sdN$C_2B`PjRfHEUV33pG=sn!>DVX8f8B!pNg%EMu%>tT3&F^ynrNb<@l! z%kWUOag&H5(BW=3IQf5tMz4zXpHu!1>OBKbbH(n4}Q%B$n*Ewf-${38i=4)B7$1^8Os>!BYq8|YBiH4 z#%4z0WLL&A#(Kupj7^NqjD8n+mN8Z`u5z6~%_9g#wNyQ zMiI+hGBz9*ar4{RUXPT4NnuGn<;ID4_ZgZ*y%5c@Fu zZ2LUrg`E$C)8hw40-R5)K>TaoFvN$lM<704P=k2A#U#XG3DXeYNSJvG%Q9x6JUnd< zVstiRB4J4}VQCbhS4Wu1cn9Oo;wMqlKW7QzI`2xvXTpZnx5zs0ODG%Ujfgtk>xg>_ z-a@>fdk4{}Cwz(JW;-P`DT46fye7oej=hM3&HEAe=?PzmAZ(XKcrKQ#U&NApfYB01 za$a1R4h=;VNbT$c4m6a_PeoHghZ!#xlFw)6Lx^(GQN&utY6C_1%E+O)%Ouz5sQFLP zSBN(XsD2fkXq=a1Q_44p!Qej;H^f~EFHsojE^xTeDOptx{UBf(DlSh~6V{Th*aT^?b(E|0ct zfYG*>;DGIjME@G3WBBhg{&&FEe)Cs*=S6L@PhyM%S`Y0pXL}?Uv0BhzFMaJ0R}X>k}m*ZS9aD zdK-;~M1h{ewyww%J1s3X9V$N!qGvC>LBjX{0Br{fXuE7o8xdvLjpFV$%jUKbNzV9v zllEnIIoj>j&hLM^JuUH-W!u|`si~T_^rn`AU4K2Z>DQJs&ALZ^4Q2uUFjLAz;#S8U I;$QOr0qmy`NdN!< delta 18368 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 diff --git a/Source/ConformalDecals/Text/TextRenderer.cs b/Source/ConformalDecals/Text/TextRenderer.cs index 6c1206a..f40f2b5 100644 --- a/Source/ConformalDecals/Text/TextRenderer.cs +++ b/Source/ConformalDecals/Text/TextRenderer.cs @@ -123,7 +123,6 @@ namespace ConformalDecals.Text { job.Start(); - Texture2D texture = null; if (job.OldText != null && RenderCache.TryGetValue(job.OldText, out var oldRender)) { // old output still exists @@ -132,7 +131,7 @@ namespace ConformalDecals.Text { if (oldRender.UserCount <= 0) { // this is the only usage of this output, so we are free to re-render into the texture - texture = oldRender.Texture; + Destroy(oldRender.Texture); RenderCache.Remove(job.OldText); } } @@ -145,7 +144,7 @@ namespace ConformalDecals.Text { else { renderNeeded = true; - renderOutput = RenderText(job.NewText, texture); + renderOutput = RenderText(job.NewText); RenderCache.Add(job.NewText, renderOutput); } @@ -156,7 +155,7 @@ namespace ConformalDecals.Text { } /// Render a piece of text to a given texture - public TextRenderOutput RenderText(DecalText text, Texture2D texture) { + public TextRenderOutput RenderText(DecalText text) { if (text == null) throw new ArgumentNullException(nameof(text)); if (_tmp == null) throw new InvalidOperationException("TextMeshPro object not yet created."); @@ -209,7 +208,7 @@ namespace ConformalDecals.Text { var size = bounds.size * PixelDensity; size.x = Mathf.Max(size.x, 0.1f); size.y = Mathf.Max(size.y, 0.1f); - + var textureSize = new Vector2Int { x = Mathf.NextPowerOfTwo((int) size.x), y = Mathf.NextPowerOfTwo((int) size.y) @@ -242,12 +241,7 @@ namespace ConformalDecals.Text { }; // SETUP TEXTURE - if (texture == null) { - texture = new Texture2D(textureSize.x, textureSize.y, textTextureFormat, true); - } - else if (texture.width != textureSize.x || texture.height != textureSize.y || texture.format != textTextureFormat) { - texture.Resize(textureSize.x, textureSize.y, textTextureFormat, true); - } + var texture = new Texture2D(textureSize.x, textureSize.y, textTextureFormat, true); // GENERATE PROJECTION MATRIX var halfSize = (Vector2) textureSize / PixelDensity / 2 / sizeRatio; @@ -275,11 +269,11 @@ namespace ConformalDecals.Text { var prevRT = RenderTexture.active; RenderTexture.active = renderTex; texture.ReadPixels(new Rect(0, 0, textureSize.x, textureSize.y), 0, 0, true); - texture.Apply(); + texture.Apply(false, true); RenderTexture.active = prevRT; GL.PopMatrix(); - + // RELEASE RENDERTEX renderTex.Release(); RenderTexture.Destroy(renderTex); From dadf38acd58af8c8a447fc818f0cdee879ee703e Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Wed, 16 Dec 2020 01:28:57 -0800 Subject: [PATCH 2/8] go back to using temporary rendertexs --- .../Plugins/ConformalDecals.dll | Bin 81920 -> 81920 bytes Source/ConformalDecals/Text/TextRenderer.cs | 5 ++--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/GameData/ConformalDecals/Plugins/ConformalDecals.dll index 4096d2d229b76dee2d345c07405c6dffe7af68bd..32a5dbb43ea67cba3bff1183924d04aeff1f90bd 100644 GIT binary patch delta 18571 zcmc(G33OCt@^5|jc6WM9uc4F9-bqM0dji=yz+hN}u*nh?6pRw`;ng4s|ymQ`paPmw2s_LuyzWSDX zyYEd^mA0x%yW|0Fwk zDf50K!00sEjovdTc+V0v5`2r`3iW;nD4!$QX-!QHvRhY`pGW3y<<_I@D*p$PL{fX7 zCeQDX+O47eomRUwXmMGq1KtayF?ufs&J6QLULvA*g_i#l1@A?I%ZmMq2&4>;72gNC z504Z-1V#)`GF?SW)m{M2glmCS!+QiS4(}nZ2XdcG6h8(AKKX6nQ!dWH+SNToUstU)yDJ1Ve0lM;E1J9Oa`nmOK zZcRA8WeXTrPPwE?;v6kZjm8R!7TQda5-n98M_tNZsqz&5mdkHp>-326MHopgPsD1C zABLhg1*HkM(KcO@XL5_DByXVINMFJoRw~WQe?#Ie1W28E0;5T)_FsWjBfUk6W93OS zq?^VMaKX3<%~Xraq)KYDxGcjo{^@2$>Q=f*ns8SH@4aufuo}y!Un0MvxBv$Pcx0bMS*Vz%0?%ke(~sVE9*V?2Coa; z9UT@pINI}H^!XwvkUyrK&<7@sc~0Ekq95B{IF$}0HSa*+k@9Gv2}~=0oUNu*FLsN% zXLd+lIdHi=2Cb%Xi;923T1nngoXuGl9HU%Lij>8YcQC2UO)Ayr4@F8h)yJmz1RBT9 zidA~jqIpj+r(BMkOUJeFS4?efKvhaBsq!2)EH@IVkt)w4NjIxX_K;@$19e^#I+O+U z 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 H_)-2}Cwey( delta 18600 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В1KQnZM9DL(qkL4juqolnrXM)gsuhpp5ghX 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 diff --git a/Source/ConformalDecals/Text/TextRenderer.cs b/Source/ConformalDecals/Text/TextRenderer.cs index f40f2b5..d91821d 100644 --- a/Source/ConformalDecals/Text/TextRenderer.cs +++ b/Source/ConformalDecals/Text/TextRenderer.cs @@ -249,7 +249,7 @@ namespace ConformalDecals.Text { bounds.center.y - halfSize.y, bounds.center.y + halfSize.y, -1, 1); // GET RENDERTEX - var renderTex = new RenderTexture(textureSize.x, textureSize.y, 0, textRenderTextureFormat, RenderTextureReadWrite.Linear) {autoGenerateMips = false}; + var renderTex = RenderTexture.GetTemporary(textureSize.x, textureSize.y, 0, textRenderTextureFormat, RenderTextureReadWrite.Linear); // RENDER Graphics.SetRenderTarget(renderTex); @@ -275,8 +275,7 @@ namespace ConformalDecals.Text { GL.PopMatrix(); // RELEASE RENDERTEX - renderTex.Release(); - RenderTexture.Destroy(renderTex); + RenderTexture.ReleaseTemporary(renderTex); // CLEAR SUBMESHES _tmp.text = ""; From b634eb1e8eebe066d46b3205ab660349ca604b15 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Wed, 16 Dec 2020 13:04:46 -0800 Subject: [PATCH 3/8] Update version and changelog --- .../Plugins/ConformalDecals.dll | Bin 81920 -> 81920 bytes .../Versioning/ConformalDecals.version | 4 ++-- README.md | 4 ++-- Source/ConformalDecals/ConformalDecals.csproj | 9 +++++---- .../Properties/AssemblyInfo.cs | 2 +- Source/ConformalDecals/Text/TextRenderer.cs | 4 ++-- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/GameData/ConformalDecals/Plugins/ConformalDecals.dll index 32a5dbb43ea67cba3bff1183924d04aeff1f90bd..0cced2bd70436cbd5c30a462c520fb08c5f0451f 100644 GIT binary patch delta 12664 zcmZ9S349b~^7pIynls59Imn&KeUm`0;W8s<5QG@e2#5@a8U-}m2r`L46o^0=ASj@T zfQsP3A&R0BhVg1VU6W?U=ROnjKH)0228_Y{@qxCmv#h6pNz%u9Y@FK zA|3viQ0Bza9c8oMHTrzPcBn3#Pkf+oG4YqwM9B`D^0rI)P?_x~PrY${a6T-`oF7~S zPbDQvMevm@Xo?eD5FuC+D;VJxEXo&rIZALxvEW{3qNG9hIQ*n_I~8?Wt;Fr-=3osp^DD%)?B5wB{Fm9kg*|z0;jvjn$;Iqh9U(j)a+&|c zh-^oagy#l(%5%3+NmGO83lzh8jJvIDg@G)YK zv~P%s%yNUsa3`~dhKKN3%4urRSC?{*4v#RSy8S@*Y4-)<(QcQBpRm1=?Wek3CC_~I zSK{EJ8^Nj2+WDPe7X+u?CWc302*Lx@fD6pB7NWs^p2hkc(Z!lL!PSc3U;RzKqCW!& zeKRbSBE)o%mfQ4fTSz{vN{b>-pWHa&rtoHJc#D=q_6IcK2oJMAHBX$&ty+3VnfBxy zvR9e&iA|Ye+#hH~92Mhkq@{|mzKA9tib{OlDbSu=`u|lpr1j+r1BnYbQD%uKdBQHz zeWwi((YUinohTG+H~4x5$I=Q0!>3i@5Hh#BpR#=C&mE)Fzku$Q90_ zI8ju~VBW`^#e9TWO=tJdq(|uNB8;aMKn>Hmr*1J@X=NaM$NW%!gtBeXCK3HbQ;1?F z5K8C-A#99nRP3;n7NgG&W9VA6LxOr1?QmNW+)dQre%lPHb|FYKd|%!ivft!}uS6dU zc7f=Si%01K(IFRi$i*FUafixl%poH4%z`-~;qZNqkGL&oK}dN`1o_Kr9JF(k`)XWt zftAmW2i5O~{pnf3;RL3FtyWZFgZTi7#{HXMWmt2i|g zv{Vtc)2`5!*32igR-W}y^K^M+ycwcteUwD$-kLAuSAy@Y>Ce1_c}5bR4Qy{ABGl1_ zijdUxAf-5+`8jc3+!3O zJd!Nf!htcd!v05+;1}elo>E6e>NZNf2!5hj`D-Vh4!ZgmkJ!pIP0Z72+A9Yn0R3BS zw8Xw^K^UT|?^A1o5bpKqa%tXgl;8nf^~t$Os!CVG3nUxD6RaAH4;2_l%?iZeq9Mp8 z!NLx;N|Irvu4+o0HU$ppYFR<7%>dv6`quzOosw)u_|?@lAfu^oCRm;*)M{{RU^PLX zB#w2;NEd2Sav)|ZyzWm~lo1P7GmKCDUkNi9(uArtUJG;kA6pci6{nhEXO{3CfGZ9J z3+&NVYGH=W0?FBdm}bcEZ(9`Y&a(x<`5fU}055mVvxUIc+<*!ovqsn=VL>-hq82tAA|MLZ>FURb2#AJDx*C=f;SX8T*B7V8LUPYQ#;xIT zY8-6T)igTe@zA4}h}FSY4zDd9rs-P@XLVY^4EZCY1$y zbQSH$v*kd#N5l@m(Gv83y(9xa_Wx%|G|u!#)))JpvgJXKzJa=L=00QV0&DsO)UD)I zwjwb0XGQb0OmRaxs{`b9}uXQll8K#7c5})6Xs+kYj?nFtPVg< z)@#(!A9eM!$?elTU@qf|#=5xuss{$?YFXUp>YcEb)oNpZ_Zzl8ut`@Hr24@&UA5)C zV;cZRJJg4^GPu&A_S*)+?;Yx}?Jj_UqP^A7CLOl<2EjC4u8{ZJ21Dr}5%fbPoUq*u zFS8P>WSKGq_OS|#z5-$fi;{Ib`U=>mD>3?EkZ`w%1x7y{`mhR&{$8lj6^&lI&j+ut ztmDz&2Y=U<7=0xa4-sj^=+D_kKtEkokQxQ|=&CL6C);SK?ohwj9)#r`>bh+Vtm#ny zwRxc_px~nPU)xyl9oOYK`MPZ!gbw8fVRxiv9}iW!3M#PLCqTWfu0~!rJp?ayD2M%F z*s7~LDOLp^bts4ZQ8=Wl`n2n&iEyq%IqZ|*lJ8IHin2crN_n99dY8*y4V_puz&dl5 zeHs+$Dkr3?eFh9;RcB1e_=h|bM(L_BV~b@bOwiSk)D`M1n4+r@sVC%FP@}7#vsb9I z;kk03Xt2)sd-e%=Hmucye~(|GJ_)bs>T3K6`AOKNtA7=(Q0Ks>y1G?#LY@Q1boG1q z3Uw}=(-lOVkmtfBT^W@X>Qi95N3>UKbSNj}r=Z{-5bf6)V<Ztf zvM+#Hq^SKmSd{&!x)AnpumOI|EVtLef)S!OT@CL%*S-qWQGt4<+=ccv5TmPyJ1@1bgDyh(D5)dA(f$&Y>B0KWP4*4& zpsr@%X8S8JLswUFciLZvdR;w``;q+(*r2N?JAYx{2D^1-lD@I;grmArI=9>3gP(L& zApK(h0RF?uw;Ccl-?D!Up$`OlIy_u+d;(i_mD@SeaS(3nYHV7T;|uuv=s?M-nB_PO zt}#N@8B=q+I=+MqT@~iKNsZA}N%%}aSWE|!8KYxQY%>< zz@etW{=YSN-NPJTgMBQ}zgo!cG}>_j@>m^!t%-|`-@w6u!n96{jo-p~T?KVo?DwsR zb`OSA5H(KJt}}|RoPtDMiLRW2Q2_3ysxWrhui=4ioWg*(pk7?e4zH7;T3Qe zrUew2KL?j|^}Qnk&O^=wE(zt13V*r3uX}>y2e=;a8E;B2ntuTGp+K&m(Ll?C3O4wgS4QJ|{ts71_pg-y2|GC=+Wpw^FX;SO zAY-W=;WiA{)w<{iQd4!cnACq@xvsu)MEK)ZMf)~5{($il1GU@jbm?JJhl&8if9vXZ zib+^7DNyovdj!b1Tvxm7l`=gSPY%RhC8gpMy84uqhUay)!%-<4@b1S0CG#AW{@tq{ z_kH6q;p0<pv+(nB2)72TiQxJoz z*+=_suuvOx)i2NPjKM9sS|1!vYKN{WO_@}3udep1LLJssbBIubLSDMq9TC^#0B?u^5svqe2|lke<| z$E~aaH~9oSqbqTfcVUkwMM-fVFLVaEu&*vF+=c$%8^w&I-~;TdFO@(QVLGj)woU@q!fHgR~uO^)YZ{Kk#lcAQRlt36bzm7XLox#v+xC0++Ck78$Z*f z=x+{=nEPjcdpmP*oUSU|y`7!$aaIRlpmvutALp?OJVtlLI=$q6(|yjaxG|vMdf_Ni zXLR*u(L`qvhCanDKxWZ&r$6rbbl)7O8%qOsV~8(W;Ovf73q+AX>K<6lDsVsQfvW;B z;}3;PoIP;8u0|9IwMkbMS|;?sH(1pgM{AXG58S244jVF|Cw`>IzB5#2%02O*9{h-w zQ!o5d54MI>%DwPpAVyQU+<)cyjQ%ricjC~6+(F}1+e^;gSjno^=(BAk<<(<*iiR8e zV3i&_SoFHH4^GizUlzFi555rHf19%(KF_`b(A6BL4#1tdT2&Gzm0??;Jnv}(@%CRz z4#bE$(T4*-CH*ZgM2EzwgK+F$d_TVs?LGx}<2v@$8ApXgkP>yMmMZcO!Cis!DB2#1 z-|FgWc$oi=wbAJIk6ar)JYK25&}T%gI%7!I`_2kX*46r$7^wp5b@dUetGYU6+eamD z=<1^Fb5fbl2D0={+Tj0UZC~Fp=P)c;%s$xVKIt5e3v^}fe$sg_9@3Rc>OQnB36z}N zt-qlX7wF2+?R)3_xKUSwyIpXO#J6=dfMTQYsIJCz`^7mL2h<0$Sd$}s@E|5X7mz0` zZsQnSuB*nN*PUKWUK)rs2Bk=2@kw2!xGP{hzNoAEhzgj1pXlm9QUyGOCv_E@Men^Z zeOVw&ZA_T-Fs=zGKB4~L^;X|Y&PQ-Zz{%_95!|DzT>2HX3is)%XIuoS?{)Q1lv{fg zFX`&xJfUvt>IsfTFXv{BQ#jUBSM#z)8Xv_`x_T~aq>tn*UD9ch9>vdC1(xHZxV%B6 z;YB7rh67dv6fF>GBCcmu2WG3=I0;|T)lQnb$@pG}y6$`&6a1oH11zyYXf?jdDsXlC zJH41r*W5I8trSJtOuM>t^ACA3+TD$O!XxuGa76l39l#})ONJSG>;TqT4570+)LcuL zf5VFvKCsTiiJURe%siaNYCi0O_|SR(C$q1k_7ckmM{S3yv!sMR-J#}M@ zJ?-NiYn#H%`4QlOr1S_VW0o`TXL^}c%myO8iYLbS+g^|LCBZekpPrH0u&FQ;tPs() zknAhed>ck|?FJ}`@)<as+IKpEF#z89asQIE_-| z;{r}M4Tfl?WQ&fXaz3^nP9)DgXj1B3Be0c*G#O_TXAtLO4e|35q{hSmCNit#{iX)2 zmJen&;wh-?^dkD~%CLkDIG4k7VOiWg7^%2JzCpw_^imk{obm%!;g^vY(1c>FRd`?g zKk=g6-+db+F)3Y>BJr*gD>1gaRdOlM=Tk}PDs2%ash#%G45c%D2=U;{mK5nGx6%x$ za*pIe@v5lYCx2z?B3+bS&R*n-E%ZvXHN-tED9t<&U}a`{}7x`5<~hnTUE|bNnbwx7$}PCN;1KN z*~#%rEoMb!Du-weN+~Lqn+q)&gOy8A7x$pz#j)v?)Cp^%Rr2DD^a+X^$IyFrH$Km- z$hS(r@+@vvW@yuu2E~@Ji$?5M7b*F)VwNc`BGN~Pr)Bya=us{Nzo4`zi{(b83I)rQ zUAaxlZBC(}I1w()&Do{2Ds^#tl#BQfonr;X^d6&${Zu)o9HONv*3j3A3B>}u$P>O9 zUoiZjY{Op@FDSER@jkm1+VZX`R%-r;bWIsxHmkmy@K#8OdQG{9#AX;2-ig_tMl4=z ziV7KOE7nAp5qCMu)M}namm;nOJ74#al6duCk|xt?x8oD^Hp7m06U*?Ul9|L>d$sD4 zPDIToyIcAqvVS+MAby)SU$y(BYsG6+x73!`q}rvt^v$XV+q-QehT3y?KkZu;)x@ap)ob#toEvJSI@B7DdDfql9D850oBFYt%?z%i)YlU6u)x;Z-g3qghtCecaq+E@hM!b_*pEgZvfh1r0 zY-&EnRzv-|l~boxVOr8s4N;t}NNEDS{EC#GpqE~elAI&#kQ`yBB?!B7g0SO@g`HL` z>`@WIo_T#?~jZ%hGO6*bU824cun3#&ug1`HN?OYODWb$X;!*t%58bs zMmxTjKNz;Dv9vW+OIm{4SS{I$1%JvNZp_C~5hIO}G*A207OA^yq;a=8G{{SSVMpQz z2~&&>%Ga<*-liT5&xBf^G{Bk(EmCvhJY%gSUIazbiD)pkNQ0C{svKIdo@_7KL{p_) z%a>fM8o0GsXyvzJTi)wN4~ms1QYb)n;$={NvR=UqBHtc39>DC5B6`LF6#X;SPxp}@j%^oc}VKlM0 zV4OKaK3_E1?3VA2ooe>Tb4;_$$E2Llr-;LC3(R8lOQ_7I#L2|6Ai5q$XFGcM`K*?-NHlTPWw@ys73gIfAm4$qLaeUksn>Bk@nC5OWP8{5{#V(qqnp zW|TivkDKi{!}PFZm$w$!X!M!%J4!h{BO&b6r~2u_U(H@kTtRkOoXTqYI%Bk4lee2z zNmbhGCJk#Wf6*-a->w`++uP0q>oBIpeL4HA=s)Xa@c_P(qEW@5j=PWJq&n5q`pt`&BO-r*jp%|>q z+WumNxYRA|(@7TVBK*0)t$EN_o4t*07%vxvT3h7P;c>*jh2ONyhVrart9XFSr3x1) z1w~74TI|^0MBhchLbytHQu-!~2cz@5 zTMyxs@PXFN8m<2b*v9AY5H8FaYBg!qC8H=T9+nSr>O(y3hv;%zVLeWl(`(it5DfImMQOOkA`{=tAZIBmJPSL|>7425D;UE>QmP758L6LYWq`@EYZW6uh zYLK^N_cGDD`s^t|KT;PdL$+Jk zKE?J~vV-C8(xD&;ej`sX+>m|?a==aU8{xK;PDw$|Au4hgN*yMPY>~2v?qt3v_aJ+Z z>>=)z`w{oacLn>5@R>Z6#3e3tl?plNR~S+4S1Rg&-`Kvv6>d`nBY+~xE6Q-9Q5iwB zDi0EE%6MX^QbnAkJV~9XQpLEZ6LaYkdJm!#)UaIo3>{2Nf}F5iA7nuhiLOvV><;UR zyFdq?VDuxmMxeW=Vg1GEK1h0-OOxZwlPuR zx=at#%dBP2S45|q*=}LBDRX?}YUcpbcf20KvMLI>*!D2J%vxrXx&%&yHM6~!?2Pah zvM+XOQRh>wHnPV>wz1vLc~F}JXCsk5wNXy82SvHq_K^L4l!t6zk6xH5b#vtYtPcTbON3v~fwM zhgr*PX0|Zfm@d00>GAQw%WSfLN3JHj==ENv%fW@1US=(`nc2c@W1^EAW_p-jW?Pu> zV>m~d9;TOxkv`FwD^k$I^fGIiEzCA1Msdj~?hw<MxcsZkWQNbRW(QRB2Mt*h2k>#YsZ z9?<;SW^KRrqjpu33`Y#V8Z=|6ae?uWG0v1~$};7d9yU!em6_L=H<^!^Pno|r|IHk1 zaas~A$(H*qUdvSLQ`S$dt=6xtZPtHUZ(7x$kl3J-AWzVcpa+8{1T74z_jmuu>l+mc z(4OiguE?7}9FS8*e6(N+@wc#<#8Gi`h_A=_I_S<=K=$a=#l&0Lg0=*~=wiVx5rW~0 zU?#H{v$=RVdEB|HiR;4G32HBkq`C-yjciTcN>r5X#8(U6C0c9z0Q{Cze+zc7>GO8>{Vo6F7%?mI`Y!{#_8}BETq3dS_d294cJeg z+^;}4{6sn~{ae!H7&%3LR$eZjk=x}EB|@oC9#dXZ-coKVHbaGBf?=lNX~QzZtA>va z#|=Lk-ZKs~%{Of|?J%7&wVQ64GR%4ApUs^tnHG=rMe9!MlR+o$7cX^{#2WE3S)va8 z`R|WRS_FRzI z$|PY3*~!Xdct&Z2OUg-#os^Q*M#xtO;t2Y+dxT*iPNd^RI?kixJUT9><6=6lq2n4l zzD>us>G&BPKQlD?psVpiX@~Kc^e^Mr(oN%IXf>Uc`qIx>(_=WvbWwW6bcJIFOdm>L zknb4%{KF*6!hXb@Pse=OZ*Byk-!yyW!T7b*-*Q$G9SxxYy=1v1S6Oe#ldPLzlJ!+M zVm&U2pM}yl^kX?mI7yD4%HSO{4+Pzt;>moCkzU$?T0b{^yedefYMXjBRI zFfBpG;CEk-L01^YG#<*wsK$Tf<75-PB~|lsyW|$XJFW}PHg=+U?j82sdceU$=~0&c zIEO9~Izj1;*ScYZ`X-rgHU@RaB-_AQUs>BG{?zB$>)(~EyYq5UV`+DsouYexHR@iG zt0k}L+<|BIzVXoQrn+oM0F&Q?1&zTyuvgFx(T4u-M&tcGu(KiHF*GjgK`*Z>8*kF< q5-J_r6JL_EL2LZDC&rrcAQ!sOPw~4Kd*Vp^pKcs{2kvOdQ~nrL z2?z>-fU>wCT##4rCWuG`Wf2fimIx|bQQ%$`5q$mX)U>(2-|(BK>tA*DK7G39bf~G( z)zs(~y`a=*&;55p{UT|Y+~A4Qog9Wx)>zsLdjw`+IJO5GFa?JNcH$7cw$&=_8HM3n z50A-4I{Z1d#EE^jmdw~;@YjUcp}N~#;=|n*5`RigknFH7cdL{K!!nnUr{3^-NFK~j zpBqvD&n6^D1#narG{y?f4Hqnm5e)YV7UT)8i4xpeDA?jmkW}cNxJ*&uANhg@q6DYL zEc4T$Bvpvx9Dc^Km6AFwR^of6H6bdfrZ85Zk5mv zrwjL!c!x3|9A*A*(r1+I*Kjc^(_(qJ!bQcOau2>{j^&;$ix53K!F;knq$nWcJBLT_dbbq`^G(pOZYzb@$<9Ufyw6<;9xwD%J6aPg1CJ#06#{cQ1d z^32iwLL69dGb9<>a<+$fASC$@qAN-YMR=Gh@PJ9yhpO-~k79k6XktyQ;8I2K@BY>P zg1-U?cc)pXh*0Bxnr=^J+C%f;l@vF5`eeru*SXeE#hcVbvOk~!M|hO|$+_ZOZdTJe z(p*T)Ci@jr7vk!4(eDq`LXL`lH_}u^c&&g29}0^6Jt%M?(f9vlIH=yk8SW*{<$}_S zM9SlKQQTMRU=fWyi`0m2f{i@vmF}U`?-J`n6n%$02;*WNA-jO{&hI>i>`7dg#Gcwj zpPyVV7KNQfwlwC0%<0U>nALQ4|0?uzI=cvCXa-QlbndBH%r=@C2wyRG%T-j`CUp`q zP%wokMgpOTP7p$Ki8;H?-H|Zy=$waKv!DC6!1@^wjdN!H3&Ct zV*XE0e~0X!)3y?`(svU7esLzaL~(b=hC zhzNDGpduu6-A_fFPCr1L9eaoCgviP8A4tFA{vUvtX{( zFAhDef}bY}wsK%(jIjTeAb5cM)KY4wDEb>JdOmzlqw@DgJZHWBH;-7#R8@@AX<94$ z#RGko8q6{8n-T8Q)Vbv6tOyVIHThERuT;Rpn(CAFJE3?574Ip3L+A12Kd?2H7MQGHX|(REYwo) zs%SAnp9GFYq@@ZqF)Qsbh4Wd$Hy74)&9jBV=Io$y>Af~P9M;s2 zUGK6vAtNUk8*CmJ&@HI!TV``XYN7DeMI@xsT!ZE!p&GdT;jo!ionct)X^J_#BDN2@ zsByY*=%FcUSKzG$g&D(bkubMdq^N}r`Ur@Em72O39szE+qN%d1h(PGVyZv#x7)b0H zEOE0dP8SQ!nwm;yJPvx?A!2oK)G^8y2U9imlw-0j39e{rB&ie_(<_)V%9>|O1KXWJ zWg?XUyENr?RvDmNrz*NE+4Rx{mbUqlMsh499=z7BnR!a?iy>Hw4z&cG0A$1RI z(Nufxc3VF<+@U_SmB7^wwa?ZcZgi;6ZTAB77xgWLcIk7Qe*jF?_j}t2sP0f#ZI8gB4t2ve z5|(wSKW&w;I;h~X^rvkU_>XDwtbD^Z8o~y1g|IVHZyy6ynzH6w?PH-{Q`aJI7{|fu z9m;8c6gF$BH^r*p!w%)NkB5Vrs!zFLoB(G#l+!*DuK53w9=ClmD5b&b>ph+A)eym| z0alta?NgyZQ(2+;_GwVYs?Ly<_JjO1RA{PO+Gg|9FjiCdB?olV;Ym$Blzc*-4mFzk zAv2(x0WX&NMTK>S8<{8M8L&bNUWyCoo`E+tbuI3M{0wZ@)PD*Bx|#5irfwCSkY~aX zP2F$>bhF^BrXc);JPWR9%Af>v&w}lKQD3dWp`4JPh5Y+L)L&NCrUjEJI2&fM zsx#zL%nz%zSTV)?ut$qMU-+c120qnduN8K;*TAu0jHYaFdo3IrA}Xwdr!vl}b0EGf zsOD!5u+N3*q^SNnn4kH$ZXWFAU;|uCzu#U5a~~2(gDc_!SUy~+rBEL^%Dw&H0NdeO6Ve#p9*#4EwitJ5-nJt z(_~)@k7#NdZnUq5X_~s4{SW&_sMplP+5fb^1#30+OwK|37TBpNqx7YH8ywb@l5^4i zK76OCeCewF1NeiLe_|U&47!StAw( z{EOY*L2wG9MvL5a2GNvL&{fQ8MuE;Fn4cP z8JvNsLB;9M!WB)Ob40*-$QsKjq0~_pC=J~09q0H4ehvBzH>FjkZ$LLLSk`y)1jhw% zXzC}qnp85YrSOa6>A<0YJ9NI|JJ=RX0W0mrftvw0Mg%%7Da1vAflJ)pX2(xps0!AY z<=p7F3Ri-PZ|m3K&!95gmA}n#4fNxKH4n&d4m2%sI|Q$h8#>7v7gH#^i% z4hu$43&tL^Ty%usyPCSI^F@aZuW0K1#NVPF4orPInDl=-|K{j~qcr6$&;>qPn&v+Z z(YTa-wC;uowN_L229)*1enRk)@SqeUz=sAxXLh+={Yj#$&2u{d~!$R}>{ zxz0G;%qn=3kH@byC2sN_?D339DemJ1POAs+*5nXxLEuKC7?C7=n0<9TRg-Y6rY6uB zB;iC&-AheM!lyJfI-*%h!e=$r%xa#d4tEn}wgeS5ev~ZY)Om)@f>pngKoVEmpOL5o)>I1Gj6j&-5A46F<~qU+K%!<(~M7 z7W|N=(;aw73$}%p%Xi?(V2p;cA#inhTHoom-Z*$3H_$M}w%U0Y4r5ho@Y~jrs?=h; z3LY@@!745GNx>#(AAC}a9m+2bJo2i$?|aUBa5?+-L040pt{-mG)GI|UsRY}D>3L1- zkGKDpvOk8`i8ky5N*QQ<)g2nA8-Sz!=KJAQxA!y*!j+)mrj&_A8rq( zM^X1+{8CfbT&_T`6>cmJ3}4|M8m|n&u;)dtIzwp22hJgwsHxYYW27Niuc;4NUDMPl z+sBmhH%(o(9UztdLa>y(5}E@CR^07B>MX;e1?+?E-c!z@I9F4q?x&m&;6Y94NIi(Q zg~61Qiu>t@;apAWi_bgDu~}0Ci!V8cK&H zgYvk!*f0_oX{yn>$ytesF9lAsG368lJakYjgIo4BCvok6TC9{gzK%}jBVoacYV~jr$u46epBemn|ZW&;K z@U8`9U#05XF}!PcKuM%eBU1TnR}uTc3}Pb8m+IpN!3OqkA(laO_6jKvzb|N}=)|-)$^TN;Tar&%kh+z4JY=g>qTK4bU8<)l4@paCoZ88g zqW?)+$)0BRRH1)Y-Uak2JLzRmi88|Mls9vD8-;V^Dy%Tkt|Uf97t7U3du}i0J+enx zmOW55;_t~in4vtOFPDvy;1amzYL}Xs+lV=G1BS+qkZY+khot$+HP>kQvV62?GL`&9 zR*k$1I{E4B?&Y()m(S~Ec?b>cE}kHih#zkcyUOMH%8Q|+GRUHURpRlcT_{w{bim=sqQ zWq=Pe6XTUy%!tZR4$>I-C@Q9#2hC}Nlq*mdJ5s5{QK{wB2uo+HREg74$0=SMN&DQ5niY7~PSGQAG;Dc^^zP+FA*@-n3g z1xu9e*-grAESA{*mvJ1OV+FICTNpH}nDGm$`FwcE5DJaJkMawdXeJ>{4#(Mx75Y6u(Cdv+p2Joc%+x zf6194d8x8RN}4jA-lEv0uj3~7Y{bFmg8pIQGo=#kHUP)ZdUP)ZdUMY_GExogA z<1y zL|=NAzC?1KZu`VXi&a@-SQUQC$0>r^-KLM8PF;^hu zl(dF6fV^}qoCc5VpHvV5M|5qe-x$OKa>-!CnPLIaJrxheL@L5zY@;RifG&|T)2$YF z#`Q8z;0iJ+T4v1WYVvuUrn29t4lH`nI19zSe=a>k6wt_doV$#d<+=2`1?4y6%4L){ zt0#^1Nb{fWPAFQ6@~SvmXw{YOYetW{zCXZZ}Yd1A0 zZzhBj>xklf$CCfk>_k&D=i1C=dgL$3Q!71a5es$`rSz)(qKZrn@&aoQVs@_oE|X7n z$3H?W%pYS)lg}4SHhJYiF;h)Gd8ToO>4=mSHk&xqHqRt_Ur%Y)b)HNtu?j9p6da~w zPtjyko9?-kRaE6-(?5uro)3t_oqMRv&vK`lO5|`VtwdIcUiq?Xs-MKaokGmgi|{$J zYo*7X`%NhC)*Uz5ahmZl$u4isw^Q%a={HI#JtHA((}w!FZoil+RdEH`WpOI2>Ftcs zd|iIexKyfAHyZU=s}qZxojHIP?_HSd^5I^d^8USaBe_UtC`FwtSF5)|^Uc+2TUIgg zl`NlmgPf5($V`h2JhZ4- zodMfz@0;`Jy4Y=wq}l$Fu)~WDJL!TvNS>qn+p({)o5hYTlzA_m0)$;m+EJw`T*g;{55;ZChc6oGi5XWg<6Szk z6H?dHYU0l8VL6CTy6&}XP-*^0z!pA#2XS6jsl}*P7d=d2@vwZ5i$2K1evmGwfaMrn zP8%#=W0C8hWQzxrgJKaS*2R8Bxx^xNkWc6-5js)85YLGW&_A=65edZMFMQWlC%Xo6NsXyqRvs&mE#^ewS{0LJ+3~&urlIJ>k z=nXV9SwkQU*OSMGBF){*5~2io(u|N0=q3S3Fpz8sN|{we3rv)X$TLrx;irP;vuL7# z1J<#=3vleP)&57xIL_Z_=+;2izpT0d7laR4B;VL`CjOMR$@#X_2ys zZezYL_au9l+?&`U_a*L?2ZZ+YcE~ zNTMqYBX);1#JgYz@m|T9Lm*B_V~zlwl8owsLq6okw~xFs7$hlM0wcuk=+{QBir9I zq>@CId$cMlu2C1#kF#3x&;YV$HF=J?n%J|JJuT#UCcKqB?aT}8M?LqR>0?$hM;cZ@ zT12Zs)Y8sGBc~Mfhxq7_<*sDbGMhvoq?OsuL=$IV`iQ;VK2w0wRFeIZyOQl%ve!n} zn&!a7nAK*{nO3Xdd8?TSA%dQeTf{rr_Ob1+43V)erjkVs2U?iz?14~`4MRmX57Wo2 zWi~Nene9xpaZ09-S<7r`CB3nz+3V1By&J>YmB(sLOn%TlU z&xBNwCZ5^CJkNwQ_A~D!()=IE;(W#mSQc?U?*L_kE`oP5M>1=eE!~9wJTtz4(=bOe zS2J6fP$;7D%sZJQnKexM6D!&&D}sN4;*G^W~%w>9cmwSusT9rqHa|8so$#CRat*X|BGI4@EPVAJ~PA_Q;eC$JmX`=DaQV$ z<)-zfL#ETF^QP}iq2@5N$DCw-$UMqC)iT?%*Yc_5nB^PGe=NUSRBLFg)obl-9c&$G z9cQhxz8L8KVWt1!Fn|lmqlk-h#}WHwjVF%JpF;el({y4*>@4EO*qRP{)8>&qB6%V4 zR;HjWUeH}A*d<)hr3j`o?_f3+Hju}g-AG*NdQDJW>;JECZ6I5f-y$l?R^l7^?-PGi zb`xzn!8h1$w~7W$3l;32`w_7zWIwUO_&KpnC%7(Duv?~JyIVw$xrO~PQ;HULDv@6M zR27JVf|c#(f`)VWg$U80Hs-NzBF#zTQQ~*qz9fz)5S*-vg3jp$KjSJp+rK9JR6#qj zJztF9NN#ADOW2V3JuxBU3b85r*D(4cggxQ_KiX~+`zDAggGKmw*q@IQ*=FSmPGx%< z+Z!^(05&j#xeQ&TP5}2X|89SjC(0Lo36Qq4CHkkMuMB$P)@3bB>&_;HW@;IJR8fhY(q}WL*N!JKnbp3HS{p=pD?~fDdIFXKiI{N9j zkd6!KxSWp5>9~cCTjmrEP{I($9u3q~8sXqt$pux`)1_jgR9b<7Md$ z<5iA*V%#kqB;Qf`{$P}4VON>*=$I!jF*SnF@0cp(LHLE#&wNG_4Yg5+R-13h<1M%3 zNtO*T$?^sqvK*7dw@x}iU-L=ANpkd525o(MpY?&{X9_cJ{;T4}{#z#6k8f*#^J|df z0hM?}gN|VDq>ooH#IR#SG?&G(*}V)FFRNK+fmU4XBav?dhzWQ zfCC59!z@h%fJ{0?nToVyW`uQI2;=-z0f3+Tl~k0cm5w|PiNBr diff --git a/GameData/ConformalDecals/Versioning/ConformalDecals.version b/GameData/ConformalDecals/Versioning/ConformalDecals.version index 4dfbdd5..22d2b3b 100644 --- a/GameData/ConformalDecals/Versioning/ConformalDecals.version +++ b/GameData/ConformalDecals/Versioning/ConformalDecals.version @@ -6,8 +6,8 @@ { "MAJOR":0, "MINOR":2, - "PATCH":6, - "BUILD":1 + "PATCH":7, + "BUILD":0 }, "KSP_VERSION": { diff --git a/README.md b/README.md index febd796..11dcb47 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -# Conformal Decals v0.2.6 -[![Build Status](https://travis-ci.org/drewcassidy/KSP-Conformal-Decals.svg?branch=release)](https://travis-ci.org/drewcassidy/KSP-Conformal-Decals) [![Art: CC BY-SA 4.0](https://img.shields.io/badge/Art%20License-CC%20BY--SA%204.0-orange.svg)](https://creativecommons.org/licenses/by-sa/4.0/) [![Code: GPL v3](https://img.shields.io/badge/Code%20License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) +# Conformal Decals v0.2.7 +[![Build Status](https://travis-ci.com/drewcassidy/KSP-Conformal-Decals.svg?branch=release)](https://travis-ci.com/drewcassidy/KSP-Conformal-Decals) [![Art: CC BY-SA 4.0](https://img.shields.io/badge/Art%20License-CC%20BY--SA%204.0-orange.svg)](https://creativecommons.org/licenses/by-sa/4.0/) [![Code: GPL v3](https://img.shields.io/badge/Code%20License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) ![Screenshot](http://pileof.rocks/KSP/images/ConformalDecalsHeader.png) diff --git a/Source/ConformalDecals/ConformalDecals.csproj b/Source/ConformalDecals/ConformalDecals.csproj index ab0a0dd..c05437a 100644 --- a/Source/ConformalDecals/ConformalDecals.csproj +++ b/Source/ConformalDecals/ConformalDecals.csproj @@ -5,6 +5,7 @@ false x64 1701;1702;CS0649;CS1591 + 0.2.7 @@ -35,19 +36,19 @@ - + - + - + - + diff --git a/Source/ConformalDecals/Properties/AssemblyInfo.cs b/Source/ConformalDecals/Properties/AssemblyInfo.cs index f2a1459..e73f444 100644 --- a/Source/ConformalDecals/Properties/AssemblyInfo.cs +++ b/Source/ConformalDecals/Properties/AssemblyInfo.cs @@ -1 +1 @@ -[assembly: KSPAssembly("ConformalDecals", 0, 2, 6)] \ No newline at end of file +[assembly: KSPAssembly("ConformalDecals", 0, 2)] \ No newline at end of file diff --git a/Source/ConformalDecals/Text/TextRenderer.cs b/Source/ConformalDecals/Text/TextRenderer.cs index d91821d..0704026 100644 --- a/Source/ConformalDecals/Text/TextRenderer.cs +++ b/Source/ConformalDecals/Text/TextRenderer.cs @@ -241,7 +241,7 @@ namespace ConformalDecals.Text { }; // SETUP TEXTURE - var texture = new Texture2D(textureSize.x, textureSize.y, textTextureFormat, true); + var texture = new Texture2D(textureSize.x, textureSize.y, textTextureFormat, false); // GENERATE PROJECTION MATRIX var halfSize = (Vector2) textureSize / PixelDensity / 2 / sizeRatio; @@ -268,7 +268,7 @@ namespace ConformalDecals.Text { // COPY TEXTURE BACK INTO RAM var prevRT = RenderTexture.active; RenderTexture.active = renderTex; - texture.ReadPixels(new Rect(0, 0, textureSize.x, textureSize.y), 0, 0, true); + texture.ReadPixels(new Rect(0, 0, textureSize.x, textureSize.y), 0, 0, false); texture.Apply(false, true); RenderTexture.active = prevRT; From bf8e98caf015279941956abf3bd2cf8fdd60d167 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Thu, 17 Dec 2020 16:14:33 -0800 Subject: [PATCH 4/8] Fix text rendering for some non-ascii strings --- Assets/Scripts/TextRenderTest.cs | 2 + .../Plugins/ConformalDecals.dll | Bin 81920 -> 82432 bytes Source/ConformalDecals/Text/DecalFont.cs | 4 + Source/ConformalDecals/Text/DecalText.cs | 4 + Source/ConformalDecals/Text/TextRenderer.cs | 84 ++++++++---------- changelog.txt | 6 ++ 6 files changed, 55 insertions(+), 45 deletions(-) diff --git a/Assets/Scripts/TextRenderTest.cs b/Assets/Scripts/TextRenderTest.cs index 6e2fc85..75df98f 100644 --- a/Assets/Scripts/TextRenderTest.cs +++ b/Assets/Scripts/TextRenderTest.cs @@ -30,6 +30,8 @@ public class TextRenderTest : MonoBehaviour { Debug.Log("starting..."); StartCoroutine(OnRender()); + var thing = new GameObject(); + thing.AddComponent(); } // Update is called once per frame diff --git a/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/GameData/ConformalDecals/Plugins/ConformalDecals.dll index 0cced2bd70436cbd5c30a462c520fb08c5f0451f..a3b191fd2a8641bb7bc1b1f3b32d95fe230b7534 100644 GIT binary patch delta 24009 zcmc({2Y6J~)<3-VIWv=KnaoVWq=$sGNrME^hN1*Th=NK{K@fl|YAzVG|J|L=Le=L-+Nvwmx>z4qQ~ z@3YT7C24N9HZQW?a(&?a^`pKb^XD7tlJ3%qiF&tgSZ8%#u4wq`A!n=JkvS^f*{PQz zN{46f$U0S^&Wh|+{cJz2B8q!%hew-aRaZx@jk-pS-|=PCjk=n-W45c0QnMnDxHHtX zk;Cra)Yu(wMrUe;vlZF2rcxq{)>Hzlnbt0K3=#6?2h=K)-(cCuNw$sT^MjiaXu?<-f@2ReVx_%9Y3AhPpJ(%dY!jL zsoQtFH{cdc-4>Z~{_|>cr2K*!wI#CVg3Ht$k#8=zTiv;1^`KK$b?=UqL+^=F+akR$ z@2$4)m~;7i%JKlJiVPoJ+Pw>c2X`uR7TOy2`)EeK7R-jKFrWq5)bJ{F4Tk~2hv5Wk zmmN=xb|{q}*>lCVFvS*IX}LL@8s3LnXZOt>B9$FzxZF=OHfP6cO*>K7=In%qt3{Eh zH9ahfq=p7jBx_BNK(Vv}#WrWBG&GAgRcm^bwP+}`X$>ny+u5NtJ;v(IqR!~-Z1{&^ zK++#?Hw2Fp+S)VF_&}s_Oipeo=<3C{J| zw(Pn=DCvrdA6YjTf=y_kILGj-dlFtbwz|GN8Qk^-FQ9O+8J#M$*@I2oIaH|822{vD z(z!Up!P#&ay$N1}In|I78(A{8w{~f4WY5^l@TIXdW5H9Lq?yQG@NcL>+=9CyHFFi{ z2!}n#h)P=1b5Itl{D!?K8mvc1t-%rpu?;2W?}1TkVvGw8;I=s%D%r?YYw`2Btda0# zh*v>jWW4Sy^ry&b2@H+PZ+HsMdR-rAjJ9xmz3x14y{6P_bl3ZCe`7n_z{w8-BvdMo;+-^#WuRnLR5)SYxofDX?zYPoVGd) zV}a|B3G&A{MwxweHTXKg{Xw|TjneCa2w3+J2;@wbqZzgviY&-_U0C!U$m8l38ipKp z+GEJMEI-e3eBEB-@B$wKbuSu+eSApQG@`nfSnNXdV!yik4C6ofP`4jwtHX&@;I=QT zy&0>mie@1QAvSFBTYv9_u~mUsPvt8Z6T8o|t`1pu)}j9eu`v#xM^sqjotu50A}174 zbuT06W}n69@x{~)h9ww+vnbXXqhEIb9=;eeF_{e`k(fV1W1V+4)It>wBH_-)%K&o` zc-{ZxzX|>w+|ib3E>iajYKpZMc>UIP8hn*&_r#Bg^`QC7YR}F+efqTD8gxL76m9Gq zJjjJ?{;u0Ii0*jCAt2nY$?)FJ8D#r zBm1Mo$Eeu|+@TOxXjUg$6p|*Ig^U1bR+yYq%$|%g{h4!DM+LVa8?ko3@Apm^FXi|7 zY(BdrE_fLB;1RCF=Zgxy4FOrDzQK1`e-z;J#d3E$G-JUooce)AoI}o7XM3SAj|G?d zqde+hMXU?sr69=g_*_lZC^_=K(2Y2w<3_{p{EmJdbR$qj^D_)*2j7LOG%v9|O#xX2 zAN(8Y3Vsag^JA|0eSXKX z+U_q0Kj9eBK6mg_Hc8)zJ4j|qrkqK2<6Q_42n6a*h+`nW?lTsmrC{*$eoWlKFL1EQ z3h#6J9L79J(}EYHZ2q#&XEk$XJA0dX6>t0!zRi4DY5a<%y^+?dFS+^=%&hq@L#YK} za%%eg7nxYHi`+RKu5@iu>gQJ+wJBUDf!#M%WdR(4tIr$G^8I{X}tKp(Rq-|ok^NRKo z5j80z|04JrS6^LgdY#+V^ct}4BsT_~@8CXYQf}(EtcK?s?DKCXJ#n=;#N~olL~fbX zPmPQmnpEol&M4mWCM@}9b^g8a(MV!#QRsW9=fA_=O^gd%fI!_3(3%SWUldw!4BA`w zT_jxFEi9#vN@>Q18nnHRTckBHmuLxQG*NK0_zntmsOc@}^7m>@Z{w)f{fN><$qn-n zNw1UDauX*{7R#St!=7Zml(Ye8mp*GH-*r{{goN&H#djlgxkfCPJD zt)71v^RcheE5i(C!2{zbK{R%_yd%WAv28lLN5kueqYH<%81+XJ4V=w7_un)T6v@JzGlJ&Zg=&@POP;t5N)WjGmmvJVfCGz#ugvc{f zGyV&Gg~Q5q^w)wlk#5sEsnL=C(>g0#WWuzYOBT0Rt2f*OIX)0vjY(W+*KEN$RGouk zKeQ*?Y|f}i=JbKu!wHdT({qwOM*(bjb>8d7C$gMq+nk-$Ff1{0-}Gwjvc$+w)6ed1 z!mu=82QK^4a0SM0H_i&W0&GkO+O`OCE6l{hZI<{fjA zPdzO-{?CebANOB<{!rwfZ^pqjjpIZP&gc|hgE)2QAm)b0R)^Km>B3#lyvT1es!IMi z`8)K*S{84ugje$-+DM3u{C$j z&7Y+OJHe0Ji7QPf%?Vi&h^tQ9HIpj?FwVv5{vGUm*^1{%aZE6eiRST)K8bnP#!Zp& zv&vKcfgU$UDWfD`xbx35F9v#Y?QVsnHMvltE;(}HwTYdR z5iYnKEpS=I&<@{Zr^3N;iU!BBlg+ns_~J*vy;`8k=of=DiB#VyC6Ru z&OKaOV7|CH3t|I}kD|v;Op_QCoX=q6WIYx6aCTmwfw<4eTtKuFM>obObJ)y=+UXM; zdD88^p2(X5-6g~5)jJ_WmpR~)>T_{?AG|bDJ*P+X(~4*v{&#{lJ#xdG{^4IzLGfdw z<8jS-Hk#In@sQxexUYk;)Ru?5(>mM>+310|qC^`#(dm_R8&wE?7ss+s`VmXNhZ=L)a{wA`qZQKcRk?2$IH@;E*{Fvb`Y;WV zwCqEwJ(MHWJdn)Q49#N&Gg8k)IYiS@T-f zVBJH{K;xmKf>|2N-Nh#qJy^#>12oY|cbARG^wS+(2J24h?%;f2V};z*=`4?uK^cI2 z`)PPMmV-9R$gM!{opg?sUHf8II;qk}^rZR{myan_AI(X7rOOUIK%cw0xo;OSZU-h& zKCs`L3F$2u`^s?kQ*Zp?E06LD@%VH*a$W{7p^ypp zvzR8|)3cciRk5Vhmdyoj%qNPdM?~|4gouY8rzNKC6g2=R>NzSWgB!XNO-Z8SiYGCJ zt(lya_hOn7bEu}WrqW5T=J7P7LY^z(mt)x+mUZfT6tmHRj4kN{=pi8m(8UdfF;1{1WJVET>Ni-70JzJuhr|Hrp1_0bzFu zyMf*jc6%DzZl?EzJtnqR`dHX`5@j3xChU=T_Pn2*iaR*3w6$!jdVpNQPK3)^%R;o1 zx(K}}tF=F=`LFkJ8&D|^03y@kz?atCOju+2SH{vtX^7YTby*lRS@ zU?H|0qDxc@qBOy_RlQCl#CAG8%=AqfBQ!w@9-{?3#Pk$KJ47d_Rk<(}Ut)Eyr_aDN z*uHWQy-Z(#>9E}@p8qykKg^MO`hix9XFR;~)KARPz4SaLuZMo3^};6h!1?b7y-nzF z7z1Fp3p>wr-5_i>SQ2b^C_TeV>#;tBz&1)1590EZr+%R=O3T3Xj5XLjVmlne4gH0- zNkbdav=G@8m>DG;q9}Er7+0aCn6v5usql4Fm``r?h}f#6hi>(#iiOu4uzK>UXOxeM zQ|EeoG_q^~uz%TN;J^%|>Tut+v=`dnx0qNsMz+8T$qqkBGJ2{SZ8z zZZ~kN^EMB56OK*56{3GUiS-|eels*!{}Mv1igK}Qi#V;1XU$G=(o#9xYniP1S~LT@ z-VIMrJo~4kaW*>aVxQa5V?>jR_ewRn5_zjc`$!@@7R^4{`P)!-VCM%sxc(nZ!-0Mj z?7}K?3ErCWFyu$ktRc<6b?%}KY5u&N6Wf6FDq36kgh$Z{+e46_t#}slPWUT&OHj*s z0i}M8=d3iPF}@nl6}L$T4hc?9VNLk<1n${8f|r-G>pi7wQ1M>ReqfK>gTO?=AyHhQ zpWtHjPtpGDH&Eq`*++m=1+|{FtRUp2&O+eo zeD3#?wi2;&zi-1-RkXOAlb=>u4*e%tz5e3A-_}?B`vaRKj$b_A_Hnd#Z0EBz?cFdI zo{P%f1um1cU!8mr`rS8rILvoLqi9O%NXSMt%est#+#r>GR>2i77WsFPdw1bdT?I!A z&KH~}I1+<%l1tiIJ3w*`25Z3{f4S*QnAEel&NH$i19+)GKVQz#` zy^XHTyEDdSJJ-@hyR`YA`Xx9_7Cfr4W{b$%fQoLy`iYG6cnT2?=I;hBOxpwG z^C?_T+q4&v+B@jwKZ3^8$6VUnR?e7N$#_Q>#@uMeQo+}_^}106+HIyPcX^v7p3VYG|aE}M-Lbr6f=z;s-wXqDZYT8&%zi%j-r&OE$6ywqfi zi$6zzD@@j_=xeZAlMO2U32cV2R{IsDzk$s*Y;+<@$Ag!}?d(=9tkX)9PO5ZxEwtZc zOG;zCQAD_?617sVgha2MzB5@mn&zNey0C2(g>0JJLFeL@6rKs`L1xo%_rSK3r9U_v zG*8$P^75k-x)_&iq9qAQctPq6(+HtPLEJ+AiACkIYm5DdP9Ym^9fj?sDaZ?+A(^bZ zEe&@+J8@e=w3oi~D{|2;lX=QIdtH=;4LsXyQJuYR`pIDGF}$Xarf@UvVF>%Y>wDyQ zqv?Hb!hryYRLQiK5e4)!qOFD}+hf;^|Io z$-b(_gf#K%)IePOZ-isC7ShT}2JnSo5DNd}{$a5=6j^rlI3@T4r2;(CiK zIfM-twwHM5QYi~h^SPl92GXo)bf?L9kULZFvy5_Y`7iT!rkN(2>%YpIO<$O70$46x zb++N@iw@^_^T^xRpej1YTR^)^mhR8-7E!Q@ZANCg(Y?a<5D!*2vhxlWxp*wV>_wBU z@I3=|*ks2rjk{6)IqbQFmU*XnyU}Q2dkDiCrefM-QXa@++IX(G%Fq>4O#d^i(OXQt z4Mul$o$u{VYtA!*p3b_-TTb=?XFQi%Ld0*(xY-XU9-%(eY}mkV(fUwupiwTXV2w9? z7A+F`vC1mQvYk!$3foIr1sjl-k4*M~BV?;0r#!b^V!tWvd21C7GTF+sm#qD0y|7jG zZlNvSbLlRV^#VJO9yHnE;%(l6^lCfX;jIqS*X{I4@A>p&JA2N10nz!~(p7X^d(JzE zW}0k;{-k#>^&P~v2#uhBdM~8S!g!rnZn=o|2s3&=j8X=(=Mw4tFxq1>?)`AwTVKdV zqxYB4xx$RzUrNm;$k@-zSz(<`4W@BO&Kvq{YBt#ig)6Lc=w_3BRrrQJht`|y%g!sTbLn1_ec$;F zeJ(v>vUkc?SexiMlYLnJhTcR6O?E12+Z|ttxyi^!hNiEupCe@7fkp`f!6a7gqTe(d>3M*}9na2y3Nx@(1{q(4x!P z)3|EgNNYziTScvjm-%j_Hj`C`yN&ZLqr)amORM#@($^*%)UCmHD_KVy1*vP3Zw;lG zY)rRBzT2p~$s8p&`|hA>lP&DF%D08anrxQ3!*@5$GTFyn|L*%cEj8KjuHl`&`)G?v z>$|o29;C-j=Fs;0cG9aR`?c#4-(&Q#$x5}4d{5GECi8YXiPbOe3ZtQy2Tu8(rR^rm z?iS;JflirhWNwE4pY-V%!?RIkg#9m5#yF-+?5SPz{I5`+$qKu60~=?uK7mp8S80;T z1_VN23r)7zR_;GYH<@gWtvA?8VSCj8$2tDjXqB*!)pp#TAEGrTTLl(AMC*j^p)|Z@ zI7AN!YoU#K%-l7EAFSE9)EuHDVJ%dE3-ciwWU{D)^Zkd&cO`qaP>+P+{x_&t7%o^{ zZnVEiFBnV}CfsO$i{3YxAM9|LP6##jI!DMqp2Hk>G?40Xy-!6GIOr0()IW@l(*?p>Xc=Cfd_a>;#ua`*OHG!G zJ;w+1PS_|Y*S!zuD}&ijYNPxg&<`g2S=-?JfUH+b750zy8vlpnH`!PE)nGZoR?#p1 zss4{>f?=cnK7}W4Gfj4$e}VsF+G(;)zL5O{ow!<7!X@aF!o#bqiAFEhp--RDIAKN- zKPUSnwzbe?Y)?L?sltq`eNN57xcbHZ&*`9Hlj^^sV@9Tqce=x5Gq6KDO|P5mCI4FgX}W5v z5%W_YRz$V2oyC(~Ue^8l?&u0f(9-Y?b|lWxwB{>P+UgGMit@K3sYhk#) zdW}J+JCFFC>gRU$q2H}iW*N4z?jwGWdcb4@yBzU*)fXn)mGz|`Ut3&jcs|qROMfSI zrO7hNfAJ@%1;UJplcJV%VBr+C%%JwyqmNLET4l1YJj}M3tWR-NY>L`uvXve;*bb9j zP%kh3KJGQghF3i}krK_VR{IE$UC2Y~M)nb!v6?U`99+RLi8Vvot%$u!Jn$GmFM{I%GEX?R(p?cM1+`}Su z<-9W;48<0yDJJU`3dMF)v**czX7r*&#m;Bfy>z~pkgtgem z*hc8R)n3!~a#TL`Q3t?KWsCits1bS}^_FRT7<2Y4^`2R9cgzU=EcK~jL-Lozo~=TQ zrD@cF3syhX&t$yN^ivm@ER;0O+fR)%n0>PM*4T5@Bw;P~S>APE^~}PU-FKE>Vn0{S zF^%_^Z;U-xU1t`2v@~SvuWmHi^QBhmuObFRWA4H4p==elm-3xy)`4n|$>vvf(yG& zV1+H^Zya=qow7PxhN&!**$N(r9i~c6wmBt58>VhE*>l3^dZXMi?-TH}n=Jg5cQq77H0g&F7laCNWA_`DykM&2M{WUn+_%`h2XR)(unCfg8tA$GVLc%$LDA#@=2 z61CD~-}XEZd#O5VvMOKM)lQR@^?WyWl-g~w;+}8B zj#lrRY+%oiV#lZvON}VrtayBCP1%^_t0E${a>lt4~eF&zdHx%H>9wB`KY>iRxa1$q-IbPZ~^S{v`FB z$#~{ZQu|HTBkf3-YSrr|?Uxo0_O;2TB!z5~)hUyWDQ4!lMJlvkBenvQ)rxKK8C$_9 z`(!oMWQ&AdZ!#X<$?C8$<2(pYRvTM6sBs=lQ6p9ujHl&Pb)T>$q}(CbT*gdJBGV6QbZtUfjA^=0`qQq7bZ-<6ryCsYpy4K%< z8!D5|cO}PN*KTZd<;LObMzL{A4`}#U&-A>`b(#12b~fMDHEvlu<8rIi(hiMTtyY?i zd4a0pR;zo28O>g!cC0imIWlM0s3%R=6>wdnUTzO#rM2p)Fk{r#srOCBgSJk6dMh{1 z7_@cj8-vN9ty4dmHXgKf>a;K;`Ri2FD(OE{D~uVdB#caq^(xC`T*Z17F_`13?kU=O zwcfPxyjZU`n>Mauz1nWtHs=nATd%%0*_XM`z{a0jYzr`+oyC|KgZ}eD!zaBtSsEtP zwRx-w$1sj^{#CvumNf=eIq)?x?N4G&NBP%M)@PTnzQoHiYZQ%lG0w6u8j%qv4Dx;@ zt7fGA6%8i?FD&Ok>k&w&2R!(QkgiDK2QxP&@P{S;1S%@GvdYGlPiS}OZIjEXgi(^+ry=A|SrUVz=VI=vFR4csS<3<>`N#@OP43kEN{NHNu#o(WuG~!=5!^N~+um6Vzw`DR| z#!UWyhabw|mRM!}2W5VC9H)I4U5&0l+I1OA3$2w@^JLWMM-Pwm<*A(H)&Mt`8==Xp z)?sDM|I(A^|NqkU{}WFv$p3#aZTbRrhutuZXv1Z^hE&hKK zG|KkJ+Mv<$u&ii(rNBKh4cTyJl`fSf^L~vrTuj5~BphxprkI5$%L;f(RzN#?8HF!W z@cWi@2p5RtCj6mEo~o8^o! zJUiQFZL!{9K*~)8n}UV}3kW$Z~5Yqj91dOX@vM9ZYWk-`VVtJ4u`$J<4kfP=Iy&sKgZQLLuqyITe z{wSp*{}RZ!{QReDF=o3)M%p#2(vR`>5XCT7>i^j%N@}rlEhz|URMRYpGSKMdO_9*wFAMV>v5$C%mTSW@g`!c=pO_QqZ&Oacr%SA z58_-!?%>08M0W?Dp{aCt{>yYiZ@_bdnRr?DAr8VPnwGVxruI2z|0T-%f;6u1g zpDCG`Dp;@YaIhwtutE7OBh$C2d19SME7OLCRidRh=1ry48hnMN)G^Bk z3b(9@pD2gozSgSIoxfEl^lqV3DiH~^X^E;wr5kAN<<>GRx0JwB`yO}54((Gsh{&_V z<15E1wbqrb{VdgNq8zP`p*0$31fm^hb`YoYbwUA{<*L7NndZl~|tXJjT1O4Kn?OK(kCHN3jd3M?A9!E8Q*bA+tKO>O(yq{3 z(3u0;4VLc%SL!G9Cn~2S^2DOBzDovoj|}b}8P*eexEB(;OC|`MkRpeABQQe0!Llgk zO1;&hS3Cj?lxZO~7|@7POb(%8Cz|wmo#Qr_+0SG zd7r2?7f!Z1v_{N!pBjM|<~~&ptX6kdUJG2}tG8xoZznB;ToSwi@{ds~fCq{fT7BA) ziZ#}dcDQ&WDwXJa1gb3GQ;@&tHd_m!vgMXM%Y1yb=+j(XpNBQB z>r2)=OP^fU49I;Inu~MavMOtC(tFmE`nN?tSre_7cuxaAEwb8t)`t^aHa=5gA!ijN z+V;u!E%n4t&P%L(#)Wb;KAS@tpUojHO7LZTB)d;WZlAg@$ntNIf(KH=_XX>1`{=hs z#Ss0x;2Dp;dM5ZgX)Mo6IhuaE{v+ylJVHRTI+?L9aOzSrCIEs1%uoKFDLDvP8ZC@{FiLkxK=83x+H9i{6SlsjmsGww%P0d@O3TJP~U}pr4_?4bKfv>g9zA_LKTciK+HD zWn64ND((W!lW9k2tBiUIUFYhnS~Pyge?mW8Txj>H`%4DXgI0dCU$42+L-u;@=W@n( zyIx{1Q8n?S?BPTt>UnFM);D96{c-Dn=o%PUPE@?r4HJByI$ZpBdzIn| z?oe-b{zP3BmV~6x@$5GHK50q_{eIP6h~B(qKcd}(_wpgk`6HB}Us@hd2d%q<$L+jM zd}4Q~23{wubJI`Tvk<}O*oT$$C2JPS;)<%C?tGSGs>CmZb(o`6YAKaG%@n=E7A~t? z>X@ha8ovm8g)*crC-zCl3B3t#1C)MW=MlQnx7*%wER_N)6*pArcXrOF4BMvUuN@h- z<;g!dZWC*Uh5MAD-(I3SefnmP!ze7jQzeD5ifxym z8TtXJTC@w@yfEJd*N|;+QiZcsZ;9>&%r5Tdtg@x2j{$Zq9q-K3Uo4;Q4C%vC8=X~p zgJZVypw>NZK5&qCk&}CW6MX*OWje5LG~=2q#t~M=lFI4Mebza-;SH$r2Io#-NyZbv zaj|U(x~I6&S*@oaT(#~1hV-ujtobpP<#|yoe+0Qjn-TkhQ|V7xUw8V{G{;2Er*A3s zqW9hKBz_3?LiiHeO!efl@0>L@K7)KRl=YNVU=O=a>RTPRYPGga4x4JR@+#&N93+eM zE>#xjtM1bWxnrf3+sm}zi=t*1KoagZL$rn(A=AB_f^<{vqCH%%Zzs4 zpbp`UT9ukz_#mzeH-%i0mk z+%VpQl&BR+Td)(HTf7CU;nacwQFG`vjAfNFuAIMh%f{C9?#c$NcfGJap47k0K7xJa zbSzMFXg@sb^+eyW=tT8u43;A_SK%IoF-x#euvD-`@0)alTJ_C^XE`3E2MWW}qCY|p z`l{h#-e>#VIxpIdn~qwKo4%y!9y@(QtDrdv4Zi)R_0b-RQyZbFQtZ=Tuo|dQiPq@x zP#GS5XfznIMneQ^fo__nb%$m#WIOITSl*;HhCP0|OUP3&__4gQ;fToZLiW(7+6(w& z1>Zx1UmMfDiT2aa(A(*hmWiOG2Z0v72&Fpd93fF>>rTPP^a{wk^xnYTdKGYweje~e z{Q}?@@Cl=TaPs5sg^PU$S3i9(@=sFWloTKf7qD0^2HGu`0Ns|$fnLj4V4USD;55rM zXhf}*`+W_tD?UN50LIdna&=q{C>RwMFwon2c*-Xz#2cwA6fq^w|-V2xml;6e*G zdXva)g2x3v6uq)Gg<;mM?396zIx9R?f;ECIf*Y+j(LXzF5_vb|&Ve?_?uoc6EPw8OUe+r3i1OQZBDhJgP4Kv&ij|55s|0HVk9T6d z3W!y(O0Y&yC30OEf>nuOCN)A@1lt6U3#ue>O_Bx))(Ex;ZW3%0JT9n`rAomz!Q+A| zMf8GIf;ECIDZldk-(1$PTlIa|{O#|btIZWMf9kSZjC;5fl% z!Ht5u86%sXx+Z(L>vGq0_iXpm?mg}U?xXH6-QT$>Iw878bnoc%qc4vh7u_8Fw@9z2 z$A+^~hsF`TopTxRhT>7cvx~+8Yf2{pf9W)h<+OU>{b|>So|VwH&xewE`Eb2yltI75Fz5UX8=` zYAtZ3S`S>MZU^pAcK{z&n}AQKEx=vsF8tAj*{ToaQkI?v%+U*gLA?l=uXh6$>LvJ_ zE?2^eN4l_<(bce)(Ii;QXfmu7_$zaHzy??=Xr|sjfWs`9D`>Wu=jsC>&x@>muKtQb zS8w-P_x<-x z7radPYXswOQ2g1y8(u{H_2*ww_Rrdy$a{P0`yA1Z;x!P_JLd6S^Y{sl6KF8T=u5Sl zVzhgx5)W%DwWC^C`&j-j);^Bh{Cu+YsCJWfG;-hbxAs`!dRNP`Oi?lLyxaAoewF)2 zeUf`CO>*Bu``m{${=Zmz8~=~W|9$Szj%)UgaqKwy%C%9}u~$y5nZD!vw+{GsB!0F* z+p*`1rJfyQe=SJ}&uPLhi_NE=l#ah%Q39z@r0(sy9__l)c3oM!uDo4W(XOj(*M-`3 zC4Z`g>mk=znn@EU&}qP|{AuGFXen_l zuom7Euzj5Y-FRUW#WJ2ILDTSO%cIL;)sO0|?4c+!9j_TUAP1O;-p&N$MsNl=7gRL7 zT{9R`BLb$=#niC+bSD*fba5wj+UEWBv)|S}Wyz?zrR;;bP1|ni|LDpTmE!Wgq5L!O zp}7_nrTb^v{e4zHovTulFg5*stoVbbLp;_f4Tg%SSby_kf6I~8Kjo^7IDgA=yT5s> zujO4|^IE&rso0VoR5`0J4yxIYz7kYJ^*G(;AL6ie^7q&LS0MzXmNy>lS*ULF1iqOb z+D2;d#kd#3?@SPl!(XWz*L(F>JypQ=G31YXuXgrQUA$%QRZJUt>yC4F#yxb`^AF`6 zUfmmC(Po?4NU5nsw1V!F&PsabqQAdCWO+g?&j<(qLH7Gsk2_lpe$>-jeXIW;JffmF delta 23706 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 z z^goLc&|3P7%_aI-@B=up3(M}tA;6m+#$kLG4CAw)OsI7EDHBWZCa6rTV@&cIQBDbL zwv~yvf^PN$qQ-lzeG8A=3ycTE!rZ}ji&9-W3azv!KER<5aM};x*|frb6wjt7?I%U4 z_f3>(yL*7w&;xjqe}biG5j!9*s5qi03`=m0J7JiQuRaRIlGshSE1aLd30KBx+5Jqj zU^Aw)OlVh8B|i!(POxEp;ugKj|-YJ(M?vk%T+$|4q;A_cu<-thKv(p81a^sy075f2Q-S8vJ zm$<;MSip>TsN`=j+<<5{+>B^9j6rl7ZbOVRR3T0_%*IAk8L8jX5cBZM^6rQpFm}kp zub~}?DUjPCPlaqKM$!c;5WB%ch`r%O!~yUYVg@{Yf3df_V;5r! zV~Y3?RwVRh94Dx<`HW}88CaiiMtlP=CR9rGsBdK4$k;5Yq;1}@83##qVN$T;6Xjo!#|Gh>UPUPaXzHVFJa zv%5n!l9Qk1GR8{AM#c@s``}oIjV$j%In&#W^10|{<9saDg7UbS7M9O&9HG?1sThHu zXJSm02gdqYE<^dX*fNyW?v6?%>2c!}s<=V959W9qQG*F&%?8vQ^loI$Cf4jiO|7q) zH7$&1ST9W6d&V-xO2)C~b&wq0Y^GXT7=?vB2~|fK9@66~85<_N;m5jI3{5c(aL5qq*+#L zWYWNfU5qWPfk-MQBB_|4v5c{iaU)|hV+*5jvL|C1Vm^MN=6Z*Qf2-a!ZOB6 z#zw|w#ui2q%bu~^AjV3@M#hbd&5SLKB95zMY-Vg>6!ENQEQ`NP^S_cwBjbj6s%9h0 z&5SLKB7utSN?Qk&(LFQBXDnj_;|9iEjHekPKt4%~yBJS1LMH1Odm`feAIs!)_B#9` z=XAmQSPVK7_GBE(*uc1}i1eo!lZx4gaV+Bo#$Ak1Le?b4o{VD|8yN9-mhkOpDPCDb z_~08=X(Mcvwp#mK`#bji_7CkX_P^VIu^S^2B1$95BCd}Z6EQwwVZ`F_$T!ER9TP@H z0h~#%L|lSk@aXC$$J>3c#;G0DjlkdDUep#yBugF zo9~IH2JL4&T0}m_Ek_W)D*6a|#pdJ_*0DUDVw$K#Oc&!2 zGsJkrd~pY2S5bx7O-w}WE+%8t9*7ct7#2eLYD5YDa7H!C^b7tH{&IXR%KZ=}=r5+B zT#hK=M^`gY9-!hu!rz3Sh2$ng34aZ~9_3pQB^WK{B96gd<&j`4{_ea4m0~{Ptzsei zj6=j%i{fs?IbsoN<|0ZkPuz#HiYP&YSc2FnmLc9HmLtv=VZ;SuCE`M%uEs-?co1=g zScmw4cnI+Y@d)BJu@UhVu?g`tu^C@q&J;Z$1Cr!S#AG=eF;&h*OqV+$2IK<#i@2lF zS_EU!S_HSE6(9SewFquUYY9w3YY9w2YYF~QxxQXJ)S$Tp>exJ8?uYWs@T>1s-;!l3 zvp;O#Zl4`-Yy>^JHZ*}S|18Hx>VN+6hwt89*dXY1_tLE{%Sahbec>@1fwE0axQe?Qq0s74F7k z#w2hz8jbkJJ%>0tGi_izuoL^*y3tDn>&`>DnL6x|S+w&foCa-n(}_bNjCwnpQ{j5W$xnSBbyN{|ClgW^w=k diff --git a/Source/ConformalDecals/Text/DecalFont.cs b/Source/ConformalDecals/Text/DecalFont.cs index bf422ee..683acd3 100644 --- a/Source/ConformalDecals/Text/DecalFont.cs +++ b/Source/ConformalDecals/Text/DecalFont.cs @@ -105,5 +105,9 @@ namespace ConformalDecals.Text { public void OnBeforeSerialize() { } public void OnAfterDeserialize() { } + + public override string ToString() { + return _title; + } } } \ No newline at end of file diff --git a/Source/ConformalDecals/Text/DecalText.cs b/Source/ConformalDecals/Text/DecalText.cs index d6af8d1..d02c23e 100644 --- a/Source/ConformalDecals/Text/DecalText.cs +++ b/Source/ConformalDecals/Text/DecalText.cs @@ -86,5 +86,9 @@ namespace ConformalDecals.Text { public static bool operator !=(DecalText left, DecalText right) { return !Equals(left, right); } + + public override string ToString() { + return $"{nameof(_text)}: {_text}, {nameof(_font)}: {_font}, {nameof(_style)}: {_style}, {nameof(_vertical)}: {_vertical}, {nameof(_lineSpacing)}: {_lineSpacing}, {nameof(_charSpacing)}: {_charSpacing}"; + } } } \ No newline at end of file diff --git a/Source/ConformalDecals/Text/TextRenderer.cs b/Source/ConformalDecals/Text/TextRenderer.cs index 0704026..7a527ea 100644 --- a/Source/ConformalDecals/Text/TextRenderer.cs +++ b/Source/ConformalDecals/Text/TextRenderer.cs @@ -44,12 +44,13 @@ namespace ConformalDecals.Text { private static TextRenderer _instance; - private bool _isSetup; - private TextMeshPro _tmp; - private Shader _blitShader; + private bool _isSetup; + private Shader _blitShader; private static readonly Dictionary RenderCache = new Dictionary(); private static readonly Queue RenderJobs = new Queue(); + private static Texture2D _blankTexture; + /// Update text using the job queue public static TextRenderJob UpdateText(DecalText oldText, DecalText newText, UnityAction renderFinishedCallback) { @@ -69,11 +70,14 @@ namespace ConformalDecals.Text { /// Unregister a user of a piece of text public static void UnregisterText(DecalText text) { + if (text == null) throw new ArgumentNullException(nameof(text)); + if (RenderCache.TryGetValue(text, out var renderedText)) { renderedText.UserCount--; if (renderedText.UserCount <= 0) { RenderCache.Remove(text); - Destroy(renderedText.Texture); + var texture = renderedText.Texture; + if (texture != _blankTexture) Destroy(texture); } } } @@ -97,6 +101,8 @@ namespace ConformalDecals.Text { if (!SystemInfo.SupportsRenderTextureFormat(textRenderTextureFormat)) { Logging.LogError($"Text texture format {textRenderTextureFormat} not supported on this platform."); } + + _blankTexture = Texture2D.blackTexture; } /// Setup this text renderer instance for rendering @@ -105,8 +111,8 @@ namespace ConformalDecals.Text { Logging.Log("Setting Up TextRenderer Object"); - _tmp = gameObject.AddComponent(); - _tmp.renderer.enabled = false; // dont automatically render + // _tmp = gameObject.AddComponent(); + // _tmp.renderer.enabled = false; // dont automatically render _blitShader = Shabby.Shabby.FindShader(ShaderName); if (_blitShader == null) Logging.LogError($"Could not find text blit shader named '{ShaderName}'"); @@ -120,21 +126,11 @@ namespace ConformalDecals.Text { renderNeeded = false; return null; } + + Logging.Log($"Rendering text {job.NewText}"); job.Start(); - - if (job.OldText != null && RenderCache.TryGetValue(job.OldText, out var oldRender)) { - // old output still exists - - oldRender.UserCount--; - - if (oldRender.UserCount <= 0) { - // this is the only usage of this output, so we are free to re-render into the texture - - Destroy(oldRender.Texture); - RenderCache.Remove(job.OldText); - } - } + if (!(job.OldText is null)) UnregisterText(job.OldText); // now that all old references are handled, begin rendering the new output @@ -156,28 +152,31 @@ namespace ConformalDecals.Text { /// Render a piece of text to a given texture public TextRenderOutput RenderText(DecalText text) { + var tmpObject = new GameObject("Text Mesh Pro renderer"); + var tmp = tmpObject.AddComponent(); + if (text == null) throw new ArgumentNullException(nameof(text)); - if (_tmp == null) throw new InvalidOperationException("TextMeshPro object not yet created."); + if (tmp == null) throw new InvalidOperationException("TextMeshPro object not yet created."); // SETUP TMP OBJECT FOR RENDERING - _tmp.text = text.FormattedText; - _tmp.font = text.Font.FontAsset; - _tmp.fontStyle = text.Style | text.Font.FontStyle; - _tmp.lineSpacing = text.LineSpacing; - _tmp.characterSpacing = text.CharSpacing; - - _tmp.extraPadding = true; - _tmp.enableKerning = true; - _tmp.enableWordWrapping = false; - _tmp.overflowMode = TextOverflowModes.Overflow; - _tmp.alignment = TextAlignmentOptions.Center; - _tmp.fontSize = FontSize; + tmp.text = text.FormattedText; + tmp.font = text.Font.FontAsset; + tmp.fontStyle = text.Style | text.Font.FontStyle; + tmp.lineSpacing = text.LineSpacing; + tmp.characterSpacing = text.CharSpacing; + + tmp.extraPadding = true; + tmp.enableKerning = true; + tmp.enableWordWrapping = false; + tmp.overflowMode = TextOverflowModes.Overflow; + tmp.alignment = TextAlignmentOptions.Center; + tmp.fontSize = FontSize; // GENERATE MESH - _tmp.ClearMesh(false); - _tmp.ForceMeshUpdate(); + tmp.ClearMesh(false); + tmp.ForceMeshUpdate(); - var meshFilters = gameObject.GetComponentsInChildren(); + var meshFilters = tmpObject.GetComponentsInChildren(); var meshes = new Mesh[meshFilters.Length]; var materials = new Material[meshFilters.Length]; @@ -188,7 +187,7 @@ namespace ConformalDecals.Text { var renderer = meshFilters[i].gameObject.GetComponent(); meshes[i] = meshFilters[i].mesh; - if (i == 0) meshes[i] = _tmp.mesh; + if (i == 0) meshes[i] = tmp.mesh; materials[i] = Instantiate(renderer.material); materials[i].shader = _blitShader; @@ -215,8 +214,8 @@ namespace ConformalDecals.Text { }; if (textureSize.x == 0 || textureSize.y == 0) { - Logging.LogWarning("No text present or error in texture size calculation. Aborting."); - return new TextRenderOutput(Texture2D.blackTexture, Rect.zero); + Logging.LogError("No text present or error in texture size calculation. Aborting."); + return new TextRenderOutput(_blankTexture, Rect.zero); } // make sure texture isnt too big, scale it down if it is @@ -265,7 +264,7 @@ namespace ConformalDecals.Text { } } - // COPY TEXTURE BACK INTO RAM + // COPY RENDERTEX INTO TEXTURE var prevRT = RenderTexture.active; RenderTexture.active = renderTex; texture.ReadPixels(new Rect(0, 0, textureSize.x, textureSize.y), 0, 0, false); @@ -278,12 +277,7 @@ namespace ConformalDecals.Text { RenderTexture.ReleaseTemporary(renderTex); // CLEAR SUBMESHES - _tmp.text = ""; - - for (int i = 0; i < transform.childCount; i++) { - var child = transform.GetChild(i); - Destroy(child.gameObject); - } + Destroy(tmpObject); return new TextRenderOutput(texture, window); } diff --git a/changelog.txt b/changelog.txt index dbaba71..b9077f1 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,9 @@ +v0.2.7 +------ +- Fixes: + - Fixed certain non-ascii strings not rendering correctly under certain circumstances. + - Yet another attempted fix for the planet text glitch. + v0.2.6 ------ - Fixes: From 5feb16dcfb83d281ac539108b27089bd12972902 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Fri, 18 Dec 2020 21:14:34 -0800 Subject: [PATCH 5/8] Only update text once per frame Fixed text re-rendering several times in a single frame when pasting in text --- .../Plugins/ConformalDecals.dll | Bin 82432 -> 82432 bytes .../ConformalDecals/Text/TextRenderOutput.cs | 2 +- .../ConformalDecals/UI/TextEntryController.cs | 44 +++++++++--------- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/GameData/ConformalDecals/Plugins/ConformalDecals.dll index a3b191fd2a8641bb7bc1b1f3b32d95fe230b7534..9c632579cffea1cdeae81877f563bb56c52af25f 100644 GIT binary patch delta 22780 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 ZlBG5 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 diff --git a/Source/ConformalDecals/Text/TextRenderOutput.cs b/Source/ConformalDecals/Text/TextRenderOutput.cs index 210e14a..8dff52f 100644 --- a/Source/ConformalDecals/Text/TextRenderOutput.cs +++ b/Source/ConformalDecals/Text/TextRenderOutput.cs @@ -9,7 +9,7 @@ namespace ConformalDecals.Text { /// The rectangle that the rendered text takes up within the texture public Rect Window { get; private set; } - /// The number of users for this render output. If 0, it can be discarded from the cache and the texture reused + /// The number of users for this render output. If 0, it can be discarded from the cache public int UserCount { get; set; } public TextRenderOutput(Texture2D texture, Rect window) { diff --git a/Source/ConformalDecals/UI/TextEntryController.cs b/Source/ConformalDecals/UI/TextEntryController.cs index 8a783b0..d763217 100644 --- a/Source/ConformalDecals/UI/TextEntryController.cs +++ b/Source/ConformalDecals/UI/TextEntryController.cs @@ -3,7 +3,6 @@ using ConformalDecals.Text; using ConformalDecals.Util; using TMPro; using UnityEngine; -using UnityEngine.Events; using UnityEngine.UI; namespace ConformalDecals.UI { @@ -35,14 +34,15 @@ namespace ConformalDecals.UI { private Vector2 _lineSpacingRange; private Vector2 _charSpacingRange; private TMP_InputField _textBoxTMP; + private FontMenuController _fontMenu; private TextUpdateDelegate _onValueChanged; - private FontMenuController _fontMenu; + private static int _lockCounter; - private bool _ignoreUpdates; private bool _isLocked; private string _lockString; - private static int _lockCounter; + private bool _ignoreUpdates; + private bool _textUpdated; public static TextEntryController Create( string text, DecalFont font, FontStyles style, bool vertical, float linespacing, float charspacing, @@ -74,7 +74,7 @@ namespace ConformalDecals.UI { public void SetControlLock(string value = null) { if (_isLocked) return; - InputLockManager.SetControlLock(_lockString); + InputLockManager.SetControlLock(ControlTypes.EDITOR_UI, _lockString); _isLocked = true; } @@ -86,8 +86,7 @@ namespace ConformalDecals.UI { public void OnTextUpdate(string newText) { this._text = newText; - - OnValueChanged(); + _textUpdated = true; } public void OnFontMenu() { @@ -105,7 +104,7 @@ namespace ConformalDecals.UI { _textBoxTMP.fontAsset = _font.FontAsset; UpdateStyleButtons(); - OnValueChanged(); + _textUpdated = true; } public void OnLineSpacingUpdate(float value) { @@ -114,7 +113,7 @@ namespace ConformalDecals.UI { _lineSpacing = Mathf.Lerp(_lineSpacingRange.x, _lineSpacingRange.y, value); UpdateLineSpacing(); - OnValueChanged(); + _textUpdated = true; } public void OnLineSpacingUpdate(string text) { @@ -128,7 +127,7 @@ namespace ConformalDecals.UI { } UpdateLineSpacing(); - OnValueChanged(); + _textUpdated = true; } public void OnCharSpacingUpdate(float value) { @@ -137,7 +136,7 @@ namespace ConformalDecals.UI { _charSpacing = Mathf.Lerp(_charSpacingRange.x, _charSpacingRange.y, value); UpdateCharSpacing(); - OnValueChanged(); + _textUpdated = true; } public void OnCharSpacingUpdate(string text) { @@ -151,7 +150,7 @@ namespace ConformalDecals.UI { } UpdateCharSpacing(); - OnValueChanged(); + _textUpdated = true; } public void OnBoldUpdate(bool state) { @@ -163,7 +162,7 @@ namespace ConformalDecals.UI { _style &= ~FontStyles.Bold; _textBoxTMP.textComponent.fontStyle = _style | _font.FontStyle & ~_font.FontStyleMask; - OnValueChanged(); + _textUpdated = true; } public void OnItalicUpdate(bool state) { @@ -175,7 +174,7 @@ namespace ConformalDecals.UI { _style &= ~FontStyles.Italic; _textBoxTMP.textComponent.fontStyle = _style | _font.FontStyle & ~_font.FontStyleMask; - OnValueChanged(); + _textUpdated = true; } public void OnUnderlineUpdate(bool state) { @@ -187,7 +186,7 @@ namespace ConformalDecals.UI { _style &= ~FontStyles.Underline; _textBoxTMP.textComponent.fontStyle = _style | _font.FontStyle & ~_font.FontStyleMask; - OnValueChanged(); + _textUpdated = true; } public void OnSmallCapsUpdate(bool state) { @@ -199,19 +198,19 @@ namespace ConformalDecals.UI { _style &= ~FontStyles.SmallCaps; _textBoxTMP.textComponent.fontStyle = _style | _font.FontStyle & ~_font.FontStyleMask; - OnValueChanged(); + _textUpdated = true; } public void OnVerticalUpdate(bool state) { if (_ignoreUpdates) return; _vertical = state; - OnValueChanged(); + _textUpdated = true; } private void Start() { _lockString = $"ConformalDecals_TextEditor_{_lockCounter++}"; - + _textBoxTMP = ((TMP_InputField) _textBox); _textBoxTMP.text = _text; _textBoxTMP.textComponent.fontStyle = _style | _font.FontStyle & ~_font.FontStyleMask; @@ -229,9 +228,12 @@ namespace ConformalDecals.UI { private void OnDestroy() { RemoveControlLock(); } - - private void OnValueChanged() { - _onValueChanged(_text, _font, _style, _vertical, _lineSpacing, _charSpacing); + + private void LateUpdate() { + if (_textUpdated) { + _onValueChanged(_text, _font, _style, _vertical, _lineSpacing, _charSpacing); + _textUpdated = false; + } } private void UpdateStyleButtons() { From 6b7996fdd71d25c84f905dd17120b6524335e6aa Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Sat, 19 Dec 2020 16:11:56 -0800 Subject: [PATCH 6/8] Text render simplification and small optimizations --- .../Plugins/ConformalDecals.dll | Bin 82432 -> 80896 bytes .../ConformalDecals/ModuleConformalDecal.cs | 45 +++-- Source/ConformalDecals/ModuleConformalText.cs | 4 +- Source/ConformalDecals/Text/TextRenderJob.cs | 35 ---- Source/ConformalDecals/Text/TextRenderer.cs | 158 +++++------------- changelog.txt | 2 + 6 files changed, 75 insertions(+), 169 deletions(-) delete mode 100644 Source/ConformalDecals/Text/TextRenderJob.cs diff --git a/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/GameData/ConformalDecals/Plugins/ConformalDecals.dll index 9c632579cffea1cdeae81877f563bb56c52af25f..18c06f8ef0b0b7f8a3545cf165ed4b616124d307 100644 GIT binary patch delta 30031 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 diff --git a/Source/ConformalDecals/ModuleConformalDecal.cs b/Source/ConformalDecals/ModuleConformalDecal.cs index 64bc2a8..12e8875 100644 --- a/Source/ConformalDecals/ModuleConformalDecal.cs +++ b/Source/ConformalDecals/ModuleConformalDecal.cs @@ -89,8 +89,10 @@ namespace ConformalDecals { [KSPField] public Transform decalProjectorTransform; [KSPField] public Transform decalColliderTransform; - [KSPField] public Material backMaterial; - [KSPField] public Vector2 backTextureBaseScale; + [KSPField] public MeshRenderer boundsRenderer; + [KSPField] public MeshRenderer frontRenderer; + [KSPField] public Material backMaterial; + [KSPField] public Vector2 backTextureBaseScale; private const int DecalQueueMin = 2100; private const int DecalQueueMax = 2400; @@ -101,9 +103,8 @@ namespace ConformalDecals { private bool _isAttached; private Matrix4x4 _orthoMatrix; - private Material _decalMaterial; - private Material _previewMaterial; - private MeshRenderer _boundsRenderer; + private Material _decalMaterial; + private Material _previewMaterial; private int DecalQueue { get { @@ -132,24 +133,33 @@ namespace ConformalDecals { public override void OnLoad(ConfigNode node) { try { // SETUP TRANSFORMS - decalFrontTransform = part.FindModelTransform(decalFront); - if (decalFrontTransform == null) throw new FormatException($"Could not find decalFront transform: '{decalFront}'."); - - decalBackTransform = part.FindModelTransform(decalBack); - if (decalBackTransform == null) throw new FormatException($"Could not find decalBack transform: '{decalBack}'."); + // Projector transform, where the decal is projected from when attached + decalProjectorTransform = part.FindModelTransform(decalProjector); + if (decalProjectorTransform == null) throw new FormatException($"Could not find decalProjector transform: '{decalProjector}'."); + // Model transform, containing all visible elements of the decal when not attached decalModelTransform = part.FindModelTransform(decalModel); if (decalModelTransform == null) throw new FormatException($"Could not find decalModel transform: '{decalModel}'."); - decalProjectorTransform = part.FindModelTransform(decalProjector); - if (decalProjectorTransform == null) throw new FormatException($"Could not find decalProjector transform: '{decalProjector}'."); + // Front transform, shows a preview of the decal when unattached + decalFrontTransform = part.FindModelTransform(decalFront); + if (decalFrontTransform == null) throw new FormatException($"Could not find decalFront transform: '{decalFront}'."); + + frontRenderer = decalFrontTransform.GetComponent(); + // Collider transform, selectable area and shows where the decal is projecting onto decalColliderTransform = part.FindModelTransform(decalCollider); if (decalColliderTransform == null) throw new FormatException($"Could not find decalCollider transform: '{decalCollider}'."); - // SETUP BACK MATERIAL + boundsRenderer = decalColliderTransform.GetComponent(); + + // SETUP BACK if (updateBackScale) { + decalBackTransform = part.FindModelTransform(decalBack); + if (decalBackTransform == null) throw new FormatException($"Could not find decalBack transform: '{decalBack}'."); + var backRenderer = decalBackTransform.GetComponent(); + if (backRenderer == null) { this.LogError($"Specified decalBack transform {decalBack} has no renderer attached! Setting updateBackScale to false."); updateBackScale = false; @@ -244,7 +254,8 @@ namespace ConformalDecals { public override void OnStart(StartState state) { materialProperties.RenderQueue = DecalQueue; - _boundsRenderer = decalProjectorTransform.GetComponent(); + boundsRenderer = decalProjectorTransform.GetComponent(); + frontRenderer = decalFrontTransform.GetComponent(); // handle tweakables if (HighLogic.LoadedSceneIsEditor) { @@ -278,7 +289,7 @@ namespace ConformalDecals { if (!selectableInFlight || !DecalConfig.SelectableInFlight) { decalColliderTransform.GetComponent().enabled = false; - _boundsRenderer.enabled = false; + boundsRenderer.enabled = false; } } } @@ -440,7 +451,7 @@ namespace ConformalDecals { // update projection foreach (var target in _targets) { - target.Project(_orthoMatrix, decalProjectorTransform, _boundsRenderer.bounds, useBaseNormal); + target.Project(_orthoMatrix, decalProjectorTransform, boundsRenderer.bounds, useBaseNormal); } } else { @@ -465,7 +476,7 @@ namespace ConformalDecals { _decalMaterial = materialProperties.DecalMaterial; _previewMaterial = materialProperties.PreviewMaterial; - if (!_isAttached) decalFrontTransform.GetComponent().material = _previewMaterial; + if (!_isAttached) frontRenderer.material = _previewMaterial; } protected void UpdateTargets() { diff --git a/Source/ConformalDecals/ModuleConformalText.cs b/Source/ConformalDecals/ModuleConformalText.cs index 0d6d027..c5db737 100644 --- a/Source/ConformalDecals/ModuleConformalText.cs +++ b/Source/ConformalDecals/ModuleConformalText.cs @@ -89,7 +89,6 @@ namespace ConformalDecals { private MaterialColorProperty _outlineColorProperty; private MaterialFloatProperty _outlineWidthProperty; - private TextRenderJob _currentJob; private DecalText _currentText; public override void OnLoad(ConfigNode node) { @@ -253,7 +252,6 @@ namespace ConformalDecals { decal.charSpacing = charSpacing; decal.lineSpacing = lineSpacing; - decal._currentJob = _currentJob; decal._currentText = _currentText; decal.UpdateText(); } @@ -267,7 +265,7 @@ namespace ConformalDecals { private void UpdateText() { // Render text var newText = new DecalText(text, font, style, vertical, lineSpacing, charSpacing); - var output = TextRenderer.UpdateTextNow(_currentText, newText); + var output = TextRenderer.UpdateText(_currentText, newText); _currentText = newText; UpdateTexture(output); diff --git a/Source/ConformalDecals/Text/TextRenderJob.cs b/Source/ConformalDecals/Text/TextRenderJob.cs deleted file mode 100644 index 475de9b..0000000 --- a/Source/ConformalDecals/Text/TextRenderJob.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using UnityEngine.Events; - -namespace ConformalDecals.Text { - public class TextRenderJob { - public DecalText OldText { get; } - public DecalText NewText { get; } - public bool Needed { get; private set; } - public bool IsStarted { get; private set; } - public bool IsDone { get; private set; } - - public readonly TextRenderer.TextRenderEvent onRenderFinished = new TextRenderer.TextRenderEvent(); - - public TextRenderJob(DecalText oldText, DecalText newText, UnityAction renderFinishedCallback) { - OldText = oldText; - NewText = newText ?? throw new ArgumentNullException(nameof(newText)); - Needed = true; - - if (renderFinishedCallback != null) onRenderFinished.AddListener(renderFinishedCallback); - } - - public void Cancel() { - Needed = false; - } - - public void Start() { - IsStarted = true; - } - - public void Finish(TextRenderOutput output) { - IsDone = true; - onRenderFinished.Invoke(output); - } - } -} \ No newline at end of file diff --git a/Source/ConformalDecals/Text/TextRenderer.cs b/Source/ConformalDecals/Text/TextRenderer.cs index 7a527ea..a807873 100644 --- a/Source/ConformalDecals/Text/TextRenderer.cs +++ b/Source/ConformalDecals/Text/TextRenderer.cs @@ -3,16 +3,12 @@ using System.Collections.Generic; using ConformalDecals.Util; using TMPro; using UnityEngine; -using UnityEngine.Events; using UnityEngine.Rendering; +using Object = UnityEngine.Object; namespace ConformalDecals.Text { - // TODO: Testing shows the job system is unnecessary, so remove job system code. - /// Class handing text rendering. - /// Is a singleton referencing a single gameobject in the scene which contains the TextMeshPro component - [KSPAddon(KSPAddon.Startup.Instantly, true)] - public class TextRenderer : MonoBehaviour { + public static class TextRenderer { /// Texture format used for returned textures. /// Unfortunately due to how Unity textures work, this cannot be R8 or Alpha8, /// so theres always a superfluous green channel using memory @@ -22,142 +18,55 @@ namespace ConformalDecals.Text { /// Overriden below to be ARGB32 on DirectX because DirectX is dumb public static RenderTextureFormat textRenderTextureFormat = RenderTextureFormat.R8; - /// The text renderer object within the scene which contains the TextMeshPro component used for rendering. - public static TextRenderer Instance { - get { - if (!_instance._isSetup) { - _instance.Setup(); - } - - return _instance; - } - } - - /// Text Render unityevent, used with the job system to signal render completion - [Serializable] - public class TextRenderEvent : UnityEvent { } - private const string ShaderName = "ConformalDecals/Text Blit"; private const int MaxTextureSize = 4096; private const float FontSize = 100; private const float PixelDensity = 5; - private static TextRenderer _instance; - - private bool _isSetup; - private Shader _blitShader; + private static Shader _blitShader; + private static Texture2D _blankTexture; private static readonly Dictionary RenderCache = new Dictionary(); - private static readonly Queue RenderJobs = new Queue(); - private static Texture2D _blankTexture; - - /// Update text using the job queue - public static TextRenderJob UpdateText(DecalText oldText, DecalText newText, UnityAction renderFinishedCallback) { + /// Update text immediately without using job queue + public static TextRenderOutput UpdateText(DecalText oldText, DecalText newText) { if (newText == null) throw new ArgumentNullException(nameof(newText)); + Logging.Log($"Rendering text {newText}"); - var job = new TextRenderJob(oldText, newText, renderFinishedCallback); - RenderJobs.Enqueue(job); - return job; - } + if (!(oldText is null)) UnregisterText(oldText); - /// Update text immediately without using job queue - public static TextRenderOutput UpdateTextNow(DecalText oldText, DecalText newText) { - if (newText == null) throw new ArgumentNullException(nameof(newText)); + // now that all old references are handled, begin rendering the new output + if (!RenderCache.TryGetValue(newText, out var renderOutput)) { + renderOutput = RenderText(newText); + RenderCache.Add(newText, renderOutput); + } - return Instance.RunJob(new TextRenderJob(oldText, newText, null), out _); + renderOutput.UserCount++; + return renderOutput; } /// Unregister a user of a piece of text public static void UnregisterText(DecalText text) { if (text == null) throw new ArgumentNullException(nameof(text)); - + if (RenderCache.TryGetValue(text, out var renderedText)) { renderedText.UserCount--; if (renderedText.UserCount <= 0) { RenderCache.Remove(text); var texture = renderedText.Texture; - if (texture != _blankTexture) Destroy(texture); + if (texture != _blankTexture) Object.Destroy(texture); } } } - private void Start() { - if (_instance != null) { - Logging.LogError("Duplicate TextRenderer created???"); - } - - Logging.Log("Creating TextRenderer Object"); - _instance = this; - DontDestroyOnLoad(gameObject); - if (SystemInfo.graphicsDeviceType == GraphicsDeviceType.Direct3D11 || SystemInfo.graphicsDeviceType == GraphicsDeviceType.Direct3D12) { - textRenderTextureFormat = RenderTextureFormat.ARGB32; // DirectX is dumb - } - - if (!SystemInfo.SupportsTextureFormat(textTextureFormat)) { - Logging.LogError($"Text texture format {textTextureFormat} not supported on this platform."); - } - - if (!SystemInfo.SupportsRenderTextureFormat(textRenderTextureFormat)) { - Logging.LogError($"Text texture format {textRenderTextureFormat} not supported on this platform."); - } - - _blankTexture = Texture2D.blackTexture; - } - - /// Setup this text renderer instance for rendering - private void Setup() { - if (_isSetup) return; - - Logging.Log("Setting Up TextRenderer Object"); - - // _tmp = gameObject.AddComponent(); - // _tmp.renderer.enabled = false; // dont automatically render - - _blitShader = Shabby.Shabby.FindShader(ShaderName); - if (_blitShader == null) Logging.LogError($"Could not find text blit shader named '{ShaderName}'"); - - _isSetup = true; - } - - /// Run a text render job - private TextRenderOutput RunJob(TextRenderJob job, out bool renderNeeded) { - if (!job.Needed) { - renderNeeded = false; - return null; - } - - Logging.Log($"Rendering text {job.NewText}"); - - job.Start(); - if (!(job.OldText is null)) UnregisterText(job.OldText); - - // now that all old references are handled, begin rendering the new output - - if (RenderCache.TryGetValue(job.NewText, out var renderOutput)) { - renderNeeded = false; - } - else { - renderNeeded = true; - - renderOutput = RenderText(job.NewText); - RenderCache.Add(job.NewText, renderOutput); - } - - renderOutput.UserCount++; - - job.Finish(renderOutput); - return renderOutput; - } /// Render a piece of text to a given texture - public TextRenderOutput RenderText(DecalText text) { + public static TextRenderOutput RenderText(DecalText text) { + if (text == null) throw new ArgumentNullException(nameof(text)); + var tmpObject = new GameObject("Text Mesh Pro renderer"); var tmp = tmpObject.AddComponent(); - if (text == null) throw new ArgumentNullException(nameof(text)); - if (tmp == null) throw new InvalidOperationException("TextMeshPro object not yet created."); - // SETUP TMP OBJECT FOR RENDERING tmp.text = text.FormattedText; tmp.font = text.Font.FontAsset; @@ -189,7 +98,7 @@ namespace ConformalDecals.Text { meshes[i] = meshFilters[i].mesh; if (i == 0) meshes[i] = tmp.mesh; - materials[i] = Instantiate(renderer.material); + materials[i] = Object.Instantiate(renderer.material); materials[i].shader = _blitShader; if (renderer == null) throw new FormatException($"Object {meshFilters[i].gameObject.name} has filter but no renderer"); @@ -215,6 +124,7 @@ namespace ConformalDecals.Text { if (textureSize.x == 0 || textureSize.y == 0) { Logging.LogError("No text present or error in texture size calculation. Aborting."); + Object.Destroy(tmpObject); return new TextRenderOutput(_blankTexture, Rect.zero); } @@ -276,10 +186,30 @@ namespace ConformalDecals.Text { // RELEASE RENDERTEX RenderTexture.ReleaseTemporary(renderTex); - // CLEAR SUBMESHES - Destroy(tmpObject); + // DESTROY THE RENDERER OBJECT + Object.Destroy(tmpObject); return new TextRenderOutput(texture, window); } + + /// Setup shader and texture + public static void ModuleManagerPostLoad() { + if (SystemInfo.graphicsDeviceType == GraphicsDeviceType.Direct3D11 || SystemInfo.graphicsDeviceType == GraphicsDeviceType.Direct3D12) { + textRenderTextureFormat = RenderTextureFormat.ARGB32; // DirectX is dumb + } + + if (!SystemInfo.SupportsTextureFormat(textTextureFormat)) { + Logging.LogError($"Text texture format {textTextureFormat} not supported on this platform."); + } + + if (!SystemInfo.SupportsRenderTextureFormat(textRenderTextureFormat)) { + Logging.LogError($"Text texture format {textRenderTextureFormat} not supported on this platform."); + } + + _blankTexture = Texture2D.blackTexture; + _blitShader = Shabby.Shabby.FindShader(ShaderName); + if (_blitShader == null) Logging.LogError($"Could not find text blit shader named '{ShaderName}'"); + } + } } \ No newline at end of file diff --git a/changelog.txt b/changelog.txt index b9077f1..a53a127 100644 --- a/changelog.txt +++ b/changelog.txt @@ -3,6 +3,8 @@ v0.2.7 - Fixes: - Fixed certain non-ascii strings not rendering correctly under certain circumstances. - Yet another attempted fix for the planet text glitch. +- Changes: + - Small optimizations and simplified text rendering. v0.2.6 ------ From 5f6712f4763bcfecfa3ff531fb4861f9680e5e0c Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Sat, 19 Dec 2020 16:58:15 -0800 Subject: [PATCH 7/8] Revert changes to ModuleConformalDecal.cs --- .../Plugins/ConformalDecals.dll | Bin 80896 -> 80384 bytes .../ConformalDecals/ModuleConformalDecal.cs | 45 +++++++----------- 2 files changed, 17 insertions(+), 28 deletions(-) diff --git a/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/GameData/ConformalDecals/Plugins/ConformalDecals.dll index 18c06f8ef0b0b7f8a3545cf165ed4b616124d307..fe26fc21e85202794958bfc489ff29deabc2c9f2 100644 GIT binary patch delta 22595 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 delta 22844 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 + decalProjectorTransform = part.FindModelTransform(decalProjector); + if (decalProjectorTransform == null) throw new FormatException($"Could not find decalProjector transform: '{decalProjector}'."); - // Collider transform, selectable area and shows where the decal is projecting onto decalColliderTransform = part.FindModelTransform(decalCollider); if (decalColliderTransform == null) throw new FormatException($"Could not find decalCollider transform: '{decalCollider}'."); - boundsRenderer = decalColliderTransform.GetComponent(); - - // SETUP BACK + // SETUP BACK MATERIAL if (updateBackScale) { - decalBackTransform = part.FindModelTransform(decalBack); - if (decalBackTransform == null) throw new FormatException($"Could not find decalBack transform: '{decalBack}'."); - var backRenderer = decalBackTransform.GetComponent(); - if (backRenderer == null) { this.LogError($"Specified decalBack transform {decalBack} has no renderer attached! Setting updateBackScale to false."); updateBackScale = false; @@ -254,8 +244,7 @@ namespace ConformalDecals { public override void OnStart(StartState state) { materialProperties.RenderQueue = DecalQueue; - boundsRenderer = decalProjectorTransform.GetComponent(); - frontRenderer = decalFrontTransform.GetComponent(); + _boundsRenderer = decalProjectorTransform.GetComponent(); // handle tweakables if (HighLogic.LoadedSceneIsEditor) { @@ -289,7 +278,7 @@ namespace ConformalDecals { if (!selectableInFlight || !DecalConfig.SelectableInFlight) { decalColliderTransform.GetComponent().enabled = false; - boundsRenderer.enabled = false; + _boundsRenderer.enabled = false; } } } @@ -451,7 +440,7 @@ namespace ConformalDecals { // update projection foreach (var target in _targets) { - target.Project(_orthoMatrix, decalProjectorTransform, boundsRenderer.bounds, useBaseNormal); + target.Project(_orthoMatrix, decalProjectorTransform, _boundsRenderer.bounds, useBaseNormal); } } else { @@ -476,7 +465,7 @@ namespace ConformalDecals { _decalMaterial = materialProperties.DecalMaterial; _previewMaterial = materialProperties.PreviewMaterial; - if (!_isAttached) frontRenderer.material = _previewMaterial; + if (!_isAttached) decalFrontTransform.GetComponent().material = _previewMaterial; } protected void UpdateTargets() { From 3173dd914aa82b4add8b0476cf1fd4498d57f9af Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Sat, 19 Dec 2020 17:06:52 -0800 Subject: [PATCH 8/8] Update version and remove debug statement --- .../Plugins/ConformalDecals.dll | Bin 80384 -> 80384 bytes .../Versioning/ConformalDecals.version | 6 +++--- Source/ConformalDecals/Text/TextRenderer.cs | 1 - changelog.txt | 5 +++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/GameData/ConformalDecals/Plugins/ConformalDecals.dll index fe26fc21e85202794958bfc489ff29deabc2c9f2..e1786fe344134d392280bf09b7d955f46851357f 100644 GIT binary patch delta 2155 zcmZwIdrVVT90&08y+A2%mdm@aIgmFhgqDIs1c&nQg;b3%C^E62Jj*&{gH@5Cj!K2= z#PM*My6nXtx{|<>sc|znr`uo;VNsL0pxY9c;Up3Ek309=6YU>s()N7L?{|OacWzJH z{j;w7XI+mSb{)*zHPvk!a@$u7va$EF4w+Ijf^k6VMw1(Phmd^^A0f2_8>AegMyfVW zV9JqI7LEXwNb1$k`S#T{5aL-ELto56QteL7{{_}bgFCOG-eD^57K9m5`gd29{Pse{ zizt(FDl|AQl~l9@hX#`RxKo6vViG=c35d(1HIux|(b7ysIiekg-Ti=G`rB0CZJ>!R z%9>45Zsl5BmwGB!2NVR6`o>uh&)0=F#tCs<=G5^KJp{mo-Vdi-0c6A{ZNwGD< zXmH%F=>cu3uFeGfB2Ct3>K}&C?oZ0y3oSp>)m_X_oMtB3OmOJ4oGCVwC>1s&Vwv<> zLm8r_$%YOXq*8M-9ox+d>3G;Y45L)l7!gn%_?m@QIYV+;;BE;mNX zT};2)?&T6jvn;d=y7fkj9+LE_B@x#gla^M5PKOZ^waGvR-Xp}H&~e_Tf?WDOMS=}LbVr11bb*PK|bfO;nm=35* z{gzT4;IRd|HR^O6;ju(rwwR6{9^0Cltja*2mD7~!Mlx_lQOIOWp12gBGmVirk3hFf z{KPe%<|8Zv+T~_CXeLM&!kLuJEa7?D$R@PSk63Jfb! zXZuc&75GB(IH|GTR4#|yQZ62I{Tk>ati(K1J8Nkb@D^)OJr|IyS_Ka-b)Xwrg(R*E zkwLC`&~lB&7m0bu<*L&J2zeOdI>zL0?NEx2`E8@AAzU~8%BTvtd?WjWd{i^tM{E#C zK1R7Rn5qu3DrB#x9NW*OrN=BE-iMV~Sh`8f$Cjt66$^0ouvH1xX4Hy>c)){IRI8DE zM2Y>7p5?v`A7ML26|s+S2d*n(M|=lQ1OVPrW#&lAal`b!TzNPqs1(g$DigR{(3FR0YQF%;} zd@RdwfvJN$p*L|S#<)JF_plsOPh}HdL3X!%T{qd|cS5YdRVL*dX2LzD9GPy!gjvSB zNc9J)#2iM!B%wxuw-$gqfA9u73u8Bmmqf?W;jQ+sc=TOGjc;P%iCgzCW_{Qc zGcp~7@rab!N%2pDwM7DLSpNFopnvu^w2<3p4|ycgXDodd8$gPC?`aX`e{SK!@-N*A zU%qt9Z@1TMTX=7X4$TYrY}9f-D;F1@_gYtTRO|hb-@ Cb`#bB delta 2211 zcmZve2~1Q+7{}-TxE>&fzJ&$BLJ@F5YL{{oRJ1AxBFJGyxdahZE*FSWrR#w!;<_BK zN-Nd2)}&TxBV8J;ZKG+3XoIb^UWsXnvC*b!)6~*b6QiA(H=1qIP4>O{&Hw++_kHtb zUv|f&^Nva9o=#_Dk>$Hy>!8c&e2~Kaoe4-&+n~qiYA?39_#PzWJ-e3_SBkajg7P3= z)2(Tw$;q%6#KW+e5LdONd>l{gb1H(Ni&03EJk|SfBNaRvBk9GIrk1S@`ahvXJ+SsN z4%uI;?3E;co%-v#ne66M{UR)CY;_RMsX5i#_4EBmli?`M6B+%flg^Mq*NpKrWvdg_ zmB_Zgx_$sCRe!2kI;D*oowS@s)cD#Q{HgA$&DJ&glcwfLTI}o6wyT6VzvOA^RqxaW zumgCA8l<%;FKUjW)>BY zk#`C4C3Kuov~&@@U$d8PX$>(Cw$m{=L{7vTlmrC7q0y1}IZ7ff?a~OYW1dM^znf8S zz>krPc5t%D`929s5;{5Ul*@clDfJ31G+~*XjJJh0J0V?3#xbE4#~EEyaMCQWCeDSV zz^+li&BzQT6_+_(BnEdsmo)q==ux7VG#67lSTPpr1eu2zPMUKbG6XT_d^9>Z)3L?D znU21WD7MT+!mJDMnS*s9Ml_Psy~oKyjH!?MgUt7|aIlgV!EFzZ#)O}jv>5K3I(SJ- zFqM-W2>MmVR}-4!u^`|jfYV##D)EY<+l*)lys#Cg;q_pPMIOC#7RN>k_yNw zd@E?Xe*r1R13`Pk3dm~62ei10Q6OuuN>D+Nm$U|#G~$o21h+NfN4x}gDbf5Ee#T4i zn-CubkCReN3X*5&Df!rV3OP5>=vszgLB20DiV{@JwQNB_T&ou}D>`2;gH=!>rxT3K zG(CI1Wq8O%?ZlViLN`mO9piFr?a_!G%L-iKWFb%KCa%Q|K_AgQti&(R$*NQ#ub0L3 zl8ruxlxp1Mr2WEb@HeLg3|&YKocoyd4&r=4Y9R}Xj*q6aLL>L`*i=fzLTj7DoE2*B zz+(0EfH6*6*o025KcgN_+B?RCcmAUtSN|DkHxD|@?Z+^u-DH&9QTAihA=-)`9Gq6% z7S2BEwBq;YnhQCA$DFioY#^%E8|%gf`Atr|8ykGh8iKWBgI_TH}cH^AT*qYrK5n6fVeWe?22koXK%fc{ZKYxCFd3Z!V zsU{6%9le^!20E%Cp`?YDWN!)Q0ubi}u%`KkjTHKwMZaBC>+1hF9y5Kvwv1(0N(t#_&z}0^ vi