From 35381fae657e9f52d71ffb5dadf45c9347028a3f Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Fri, 19 Jun 2020 16:35:10 -0700 Subject: [PATCH 01/10] Rename MaterialModifiers namespace --- Source/ConformalDecals/ConformalDecals.csproj | 10 +++++----- .../MaterialColorProperty.cs | 2 +- .../MaterialFloatProperty.cs | 2 +- .../MaterialProperty.cs | 2 +- .../MaterialPropertyCollection.cs | 2 +- .../MaterialTextureProperty.cs | 2 +- Source/ConformalDecals/ModuleConformalDecal.cs | 4 +++- 7 files changed, 13 insertions(+), 11 deletions(-) rename Source/ConformalDecals/{MaterialModifiers => MaterialProperties}/MaterialColorProperty.cs (91%) rename Source/ConformalDecals/{MaterialModifiers => MaterialProperties}/MaterialFloatProperty.cs (91%) rename Source/ConformalDecals/{MaterialModifiers => MaterialProperties}/MaterialProperty.cs (98%) rename Source/ConformalDecals/{MaterialModifiers => MaterialProperties}/MaterialPropertyCollection.cs (99%) rename Source/ConformalDecals/{MaterialModifiers => MaterialProperties}/MaterialTextureProperty.cs (98%) diff --git a/Source/ConformalDecals/ConformalDecals.csproj b/Source/ConformalDecals/ConformalDecals.csproj index 19d5ed4..b748385 100644 --- a/Source/ConformalDecals/ConformalDecals.csproj +++ b/Source/ConformalDecals/ConformalDecals.csproj @@ -54,11 +54,11 @@ - - - - - + + + + + diff --git a/Source/ConformalDecals/MaterialModifiers/MaterialColorProperty.cs b/Source/ConformalDecals/MaterialProperties/MaterialColorProperty.cs similarity index 91% rename from Source/ConformalDecals/MaterialModifiers/MaterialColorProperty.cs rename to Source/ConformalDecals/MaterialProperties/MaterialColorProperty.cs index f60d388..7a665e3 100644 --- a/Source/ConformalDecals/MaterialModifiers/MaterialColorProperty.cs +++ b/Source/ConformalDecals/MaterialProperties/MaterialColorProperty.cs @@ -1,7 +1,7 @@ using System; using UnityEngine; -namespace ConformalDecals.MaterialModifiers { +namespace ConformalDecals.MaterialProperties { public class MaterialColorProperty : MaterialProperty { [SerializeField] public Color color; diff --git a/Source/ConformalDecals/MaterialModifiers/MaterialFloatProperty.cs b/Source/ConformalDecals/MaterialProperties/MaterialFloatProperty.cs similarity index 91% rename from Source/ConformalDecals/MaterialModifiers/MaterialFloatProperty.cs rename to Source/ConformalDecals/MaterialProperties/MaterialFloatProperty.cs index 1dad8df..db5c987 100644 --- a/Source/ConformalDecals/MaterialModifiers/MaterialFloatProperty.cs +++ b/Source/ConformalDecals/MaterialProperties/MaterialFloatProperty.cs @@ -1,7 +1,7 @@ using System; using UnityEngine; -namespace ConformalDecals.MaterialModifiers { +namespace ConformalDecals.MaterialProperties { public class MaterialFloatProperty : MaterialProperty { [SerializeField] public float value; diff --git a/Source/ConformalDecals/MaterialModifiers/MaterialProperty.cs b/Source/ConformalDecals/MaterialProperties/MaterialProperty.cs similarity index 98% rename from Source/ConformalDecals/MaterialModifiers/MaterialProperty.cs rename to Source/ConformalDecals/MaterialProperties/MaterialProperty.cs index 0bce511..6416d22 100644 --- a/Source/ConformalDecals/MaterialModifiers/MaterialProperty.cs +++ b/Source/ConformalDecals/MaterialProperties/MaterialProperty.cs @@ -1,7 +1,7 @@ using System; using UnityEngine; -namespace ConformalDecals.MaterialModifiers { +namespace ConformalDecals.MaterialProperties { public abstract class MaterialProperty : ScriptableObject { public string PropertyName { get => _propertyName; diff --git a/Source/ConformalDecals/MaterialModifiers/MaterialPropertyCollection.cs b/Source/ConformalDecals/MaterialProperties/MaterialPropertyCollection.cs similarity index 99% rename from Source/ConformalDecals/MaterialModifiers/MaterialPropertyCollection.cs rename to Source/ConformalDecals/MaterialProperties/MaterialPropertyCollection.cs index 8698f88..ce464eb 100644 --- a/Source/ConformalDecals/MaterialModifiers/MaterialPropertyCollection.cs +++ b/Source/ConformalDecals/MaterialProperties/MaterialPropertyCollection.cs @@ -5,7 +5,7 @@ using UniLinq; using UnityEngine; using UnityEngine.Rendering; -namespace ConformalDecals.MaterialModifiers { +namespace ConformalDecals.MaterialProperties { public class MaterialPropertyCollection : ScriptableObject, ISerializationCallbackReceiver { public int RenderQueue { get => _renderQueue; diff --git a/Source/ConformalDecals/MaterialModifiers/MaterialTextureProperty.cs b/Source/ConformalDecals/MaterialProperties/MaterialTextureProperty.cs similarity index 98% rename from Source/ConformalDecals/MaterialModifiers/MaterialTextureProperty.cs rename to Source/ConformalDecals/MaterialProperties/MaterialTextureProperty.cs index e6004bb..e1b229c 100644 --- a/Source/ConformalDecals/MaterialModifiers/MaterialTextureProperty.cs +++ b/Source/ConformalDecals/MaterialProperties/MaterialTextureProperty.cs @@ -1,7 +1,7 @@ using System; using UnityEngine; -namespace ConformalDecals.MaterialModifiers { +namespace ConformalDecals.MaterialProperties { public class MaterialTextureProperty : MaterialProperty { [SerializeField] public bool isNormal; [SerializeField] public bool isMain; diff --git a/Source/ConformalDecals/ModuleConformalDecal.cs b/Source/ConformalDecals/ModuleConformalDecal.cs index 863eea7..6eee5e2 100644 --- a/Source/ConformalDecals/ModuleConformalDecal.cs +++ b/Source/ConformalDecals/ModuleConformalDecal.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; -using ConformalDecals.MaterialModifiers; +using ConformalDecals.MaterialProperties; using ConformalDecals.Util; using UnityEngine; @@ -48,6 +48,8 @@ namespace ConformalDecals { /// [KSPField] public string decalProjector = "Decal-Projector"; + [KSPField] public string decalCollider = "Decal-Collider"; + // Parameters [KSPField] public bool scaleAdjustable = true; From 4d2623a1c6f85cde2e1fdb74d7647d15f9cb146f Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Fri, 19 Jun 2020 16:37:35 -0700 Subject: [PATCH 02/10] Layer Test module idk man --- Source/ConformalDecals/ConformalDecals.csproj | 1 + Source/ConformalDecals/Test/TestLayers.cs | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 Source/ConformalDecals/Test/TestLayers.cs diff --git a/Source/ConformalDecals/ConformalDecals.csproj b/Source/ConformalDecals/ConformalDecals.csproj index b748385..b6b940e 100644 --- a/Source/ConformalDecals/ConformalDecals.csproj +++ b/Source/ConformalDecals/ConformalDecals.csproj @@ -63,6 +63,7 @@ + diff --git a/Source/ConformalDecals/Test/TestLayers.cs b/Source/ConformalDecals/Test/TestLayers.cs new file mode 100644 index 0000000..50e413a --- /dev/null +++ b/Source/ConformalDecals/Test/TestLayers.cs @@ -0,0 +1,34 @@ +using System; +using UnityEngine; + +namespace ConformalDecals.Test { + public class TestLayers : PartModule { + + [KSPField(guiActive = true)] + public int layer = 2; + + public override void OnStart(StartState state) { + base.OnStart(state); + + + Part.layerMask.value |= (1 << 3); + } + + public void Update() { + foreach (var collider in GameObject.FindObjectsOfType()) { + if (collider.gameObject.layer == 3) { + Debug.Log($"Has layer 3: {collider.gameObject.name}"); + } + } + } + + [KSPEvent(guiActive = true, guiActiveEditor = true, guiName = "switch layers")] + public void Switch() { + Debug.Log(Part.layerMask.value); + + var cube = part.FindModelTransform("test"); + layer = (layer + 1) % 32; + cube.gameObject.layer = layer; + } + } +} \ No newline at end of file From 7980ef479126f91b699e45a8762c9917197162c2 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Fri, 19 Jun 2020 17:03:17 -0700 Subject: [PATCH 03/10] Fix infinitely scaled decals with zero scale and depth --- Source/ConformalDecals/ModuleConformalDecal.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/ConformalDecals/ModuleConformalDecal.cs b/Source/ConformalDecals/ModuleConformalDecal.cs index 6eee5e2..48bfa23 100644 --- a/Source/ConformalDecals/ModuleConformalDecal.cs +++ b/Source/ConformalDecals/ModuleConformalDecal.cs @@ -425,6 +425,8 @@ namespace ConformalDecals { } protected void UpdateScale() { + scale = Mathf.Max(0.01f, scale); + depth = Mathf.Max(0.01f, depth); var aspectRatio = materialProperties.AspectRatio; Vector2 size; From 533b1f1cf48cbed2789acd8877ae67576b7c3898 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Fri, 19 Jun 2020 21:44:43 -0700 Subject: [PATCH 04/10] Consolidate config parsing and parse layer value --- .../Plugins/ConformalDecals.dll | Bin 37888 -> 41472 bytes Source/ConformalDecals/ConformalDecals.csproj | 1 + Source/ConformalDecals/DecalConfig.cs | 22 +- .../MaterialColorProperty.cs | 7 +- .../MaterialFloatProperty.cs | 5 +- .../MaterialProperties/MaterialProperty.cs | 53 ----- .../MaterialPropertyCollection.cs | 5 +- .../MaterialTextureProperty.cs | 26 +-- Source/ConformalDecals/Util/ParseUtil.cs | 216 ++++++++++++++++++ 9 files changed, 255 insertions(+), 80 deletions(-) create mode 100644 Source/ConformalDecals/Util/ParseUtil.cs diff --git a/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/GameData/ConformalDecals/Plugins/ConformalDecals.dll index 76e71bad3955ee7487a1894db8134a18ccd0481e..bcdc259b013fd2878083d474adb857341c2c112e 100644 GIT binary patch literal 41472 zcmeIb33MFQu|HhhJ=3#jG}4Ur#r7C)V=Z3f1)I%UY-53U*~SY*jHR(XSeh0+BilmA zkw{ofFu@5~fDmwiyf}GDAb|vuI6xBkhXew= z@0{=a&l^y6Ro&{kb?erxyL8WZ&GwtfAR-U`PM#!s5Lf=R3Vd@gisJB;FNEp-z*AEn z)K)(=b<>_yCN^MOyX{1OtS6C9TiMvoWXv8+$5QFo@^xLYeycY*r?@yc-BG=M1<`8F zpv1kue8#QqMLHu^q|GC`6&zD>cd}tI{5^s{qEf+iWj8Y%F<=@I`1~>G(yLjN|Ic3? zl3DnaK<_$69wB;>9Wn9qB2fsu^3M}(nppN`bd1PfQ0@o4s(_x8O&-XC9{3;t%A~E1 z-Js+XBf4~sow0jBiEWPn;g0$c{t7;==&m_-vd@Ab+e$Cuk9FONzk*LIQF{R?Xou6` zY@1GAn!bhTKQ0w7P85Ah^kh9=MHFmsueAr!AD)KVgYd1Vp+&cO(dZs0l*A39B=SOQ38*B*ww+Kfv7-EysRuGP-9MqP_dUu|V( z8sy77m1W+>$(3bhV>sdoSQrq&h*`C@%#4`6mfuIbK)n&KIsZoyk2Qk}J#1?k{B%36 zXi+3H6YNoTVtf`b`?Kt$IIy63W791A+pgtiQDvwx;`85X%|>C|2M_qGwubyZIN;aP zF;!J@C=UugB~nO~6%ymbY70y16cI~9$$dcCRac1FVz1d_&Z`wkhy)l%tMfg z`d+U<*J`K{R(P5&2C@ig`RJOuCus`B`oB1SyJnM)T;Q7J=GC)kF^xS2XR|4;2k<8Y1vJL_Ik>f9jtWNZ>xQy<8eNAn{@72jpU#EI zs264S4|61PfXDuGjzm;??2|bXf#k7Ebobr>le2SVkjWJ}5{7x~M2da63T5!4ANt*?N3AvycQF$xs2OP~JX<`Wil} z8}S(2t`8%nc$$iJeYgZj9KmKb=z1JnQxQCl_c-?8rZZ4*a3xn+dGLH(^w&)Ut(jQ` z-0B2SHrMI#3qaVuR~C~S|5BbS?c! z89+QUjv?x*POGj;se7C9Kyw&Qao(MIbqlVN4xG1 zM#}h-xtI$ofTG4>naCe`=ErWJ8=OB+gzlA_Y6~f?w9EhjDurAAU zc>qT|d3M;-lr;~+*B)yxq?&d+cQeP~_pyq80EbQkEi)a$V#4R#1Xp+>rpmD9u;fmk zqI^PS23Qqa(@;=N98qsd1q}#jb{KpcAb3DN`Y^MawmWxRj=Mbv8Co`j41iOVl_G}L zAcK8UB>kqm&i*zky_HJ7vMP?m9jt1oZ1^`G^q#7%qkIuOb}9TfFQo8=$dPk{F}~y_ z8or^&4@eD*aFa7TOdn>LtMg*qr?j71Cq}uxj-LgnA87P(a$2M>Sq@${S?AWw^w`JPLP(%yk6vUv`p9S zdr|Iq;3XDqhLd>>!^u}Xd718$X@2A^v4P=f@7`mc?(Qaim{%fLMazQ5A0OdPtb{{Z zkt`i79&jTprQ%5+t^{sf3mXjk56~*>_u|SjPh%|>KDU;6l^hl+h_l9-5d?M_27LgF z&=(B*Ee5re;g_E>vjS)Mf|)LG=EHL;!)E*#ev00-ZxxHFl1HFK|FhS={oBR&~r77`&ciwp`2$*gf?Iol|+ zty%!Zoayyi-0y@enm!x1HR$m;U)a8_$~-#Nn(J`isn(!>f(OwBY&kl`%)ASD{04yR z9yEPaid14e3?}xY8o@GWzGt_bI_pQ=SwDz&SS;gC^uIV|qE~y&Dw@1V&GU6w1KkV# zh|`E0EZlPz>~i8>ALj0}U?Ui4zo#iD$$e?T&eIsRs?ew+ndlIKIn^%X6xD7)PPN;X zPrpH1R@3IAsx8;+!>w#yjZx5bYDWbFF+8w>;x*qor_Yp>Cw?Ow-Be!SSC92>u$r|7 zqkdk%sGC!2)XynvFs20Olp9k*b4uI*$b|#@oOK)Yk#V|*3xcOix4+0C>|{r_v;j*X zzUp?3A9++Q=lGW4n*h|tQ)WP!8>}N>R$A`?bmEp7Rl+zmq~43Nf{=2Sk?e%rVv_CM z;@VrOEXmiT6c^N_sy?-*3Bfyl!CHqi48Kl}nQw50OL+kOk7k`8Ji)u=>f~MNkHtuoR<_@Q3L{_kI11HZ` z#n}#gbeXwz2bPw8zkB0cN6(J<`)~u+mw|v=RBp;0iw`$`#KCTD98(tiER1`MlU7)~ z^dqQ4kH4Q=+Qx0Vl3`^HSG_F$0k9RPs*ocYNv#XjvQQspe`G!gaqAYoXLuQC>sFvR zxS5Uh?`^`B8su($m~)x+Az|}?<+BYFg13Xy{H-4!jCx>= zSU*qfO-l>rU?r~?oEkW$D-ISv!R;A#yX^8CR1WIW79Y~WP%dK~F_v|6whZ`{|X|De%5A0%#lxmm=W=fd`ev-=C+7;?~W1lAy2i_;lK>$x!}ls%n%E6 zwIRX_Yx76^`jx`V*B0;<*5-F=3plj}BK|k6jeXFRg-WD@D`$+aEf_(2g_p0b2%@9Q zB1Q4fz}T`Pe_`E0r|u%B?xIL=T-{JLuBGhrT;1{Ub%!D${Yv5G>n>Jx7puC91BG>m zoVtshx{D*BH?5nyxM{c3?#A(Tha+MAO5x?}EUhk0WJ17j z!kBGEeVD=v(q*u53Pz2}mhC82RjQ z_tcZC&r>@GzI&P4IIxaoYTp196?1Oa;}1Yz!{iD%XJ}ZALpBV5Qx50z)aO_xSN3_P z);f}&%!44~4>50_y$tTxEzFg{IAYM$tuFvI;$M_fefUeb&S>_`EN}D<9~ay=Q$07r zQzbr%^)#G;1292a^eg!q|1#gZSP@42VW!-oN5&OBT3GazaYbJ(Ec)8GqQ?r09v@fq zf0$BpX$5>&%wr(liDqG@sEmIdrST_}h^$i)tP^AmIrfTw<4yEby#+m0Z$VG>ThLQo zs0aRD>H1p`w85l5p$(Y#A|+Zu1A`@6ftf`mT0v!@sDTmwO|%fFg>up566eL09`(Fl zfr!+io)WD@m#&OIi2~_HF!eZh;qX%c0f9SQ*0+SkFvogYSPa$DDb5`p@kq4j@n=Br z3A(A9N>%(><{%VJ-4_^UO^SoYnz}zQ%!(9e6*$t*2Azxcm!SRF?koj2{%;V%e9pM) z`VgK(ej7|&O*t-&e+N{N3Qu4B-$6hXeCZ(=!;hz(m~n3mnkAY9k(|Ru36#>Ft54Jx zVPkwYYDF<$;_Cp!Mh~5LdcC5G2TOtJN|l+{^$5!Ix=i|v7Y4G8!OG&s1$?42BT6{a zDPa)*E=xZLAZv)Nvc7f?cWPR`8>re^9H?n|f}eIKO7w^~{yoSRl^B(RL@DB}6dl`3 zjH(=~O0l+<7}YsmwZjXQXpR=C*5}{4Sg&kwADGs(+=^$aORx>265Xw%GGaP)=x!ZV zE^BLv?$&_^WKJEh4>((j+LV?O%4h?-kZGqdXT(!9{ z%=xDvE^@kZ9pUPFqsrYj@Ul-tgH z2)e;FF5p~UZ`JLtl6(jjw%m>OYFBN}?bS}3xNOQ1`H+OrkH}jRB#_eu9^KN&8Yh24+|Kw7Wt9@L{t7I5;gw|)e&X`$cx zF|K*J_zNJLC-HM-Jmz~5gulGpI)Upwtjqcdu-v;gpL+(U0H^5hgMRFGME}Ks)9PO# z`U9fh`YBX4RoXkShEyCmuFL!k>?;c70&i@`jSbi1S?bSmLvzF)f*wPuxRO<%9Wd*`He!M&{{C3v-dnJs8YEE;GAIH+v z)%+3*|3L|3Pn8qS@%dT1EBqfU{6{5RQy`q<$Fb{bbk-&B!n_PyBaWYg-lifm-in)> zI>Vj@v$@W`13mH#^wdct8gZ;PgX$5CdGOD`<9}i4I{VviDCaSwn)NbE>AnVUlL5uH z5ge!0l--6>E9)B)+@mH__b!69Kc=-@eA>H z6aLUEa>de&matQefK=1{ZzHebuE6A;;ymZ?r*Qsp3g_HH z{H9f~xD{gUcpNFJunAoQX2ULQ`WZoU`64fs@k>CShVL59MfRt2=IVz15D3ZIaSL_Y zUj^yh)yR%#FS7n(RS&;?0o(d_-u)>b$S{CI#H*)Xux;HF<)}{q8 zk7Y6?xPjl4a`YYa0j;!3!Bz5lJOk52uVTn^P0Xb7(fPF~_mO?eIGtReitSgpnGsRR zT&bhlse>7OV1iAdr{QsZcq6Wc6@@U8Y(){KJ$VjoF9oWebK|v3o&ZPWj;rK766dYQ zW*kNzU~6v$Xu#+gT_!%z2~i^-`!Lk#@p7n8fm#7fMXS_|4*Dr1GL=$?vc{@nnR*PE zk@YYRjbt0G8s<)7?glnp`TAkhf(a^OCqi#n4=X`EUxb8H&oFBM>qiqUJqmcB7H zr^qfU&daj_%|&{q7B-A9Q5kGpri&W$R(^oZ4`Qh@CAD>YI{>Z6;zJ4^Yf52+KzmWv(bmj`o&b?#p7ogbYVJ0yVy#@iouYkBKw=H zP-2naN^K09H}ITmSUi#)QN@xf3-GaO$Hpj_e714X{35}(@xKGg$iTbb7>y zw{q~Dp^}#~2b9^%P=SnMIchJ}8np)44{rwD_n|B8LC6@Vye?yoa2C|dRSGO0k#vN% zAfAz52;qZ$O`DvH~qgWnyqqV;sYXhZCRK@o*A@ zivvxif#Gdzus>j!)*WoIriR$luvmM&a@-Je#@Gg0bd5X4ymBUp$aieEZibG%>Ot9# zRM0RlDKbnvGB{ov?<_#xcgaHAgIhwH&03^QbQ)%h*MLPk!; zKT#&nXt==96Uxb8R#v?DyP*#_s})>5%S8f~+?CH4`DKL~olgH(Oz3~Zx*VF^-u}s{ zz3t|w7@g6se0PB^FGH$HJU6%RfUP_aVy5!&vP2)=0xW(fw2yEZCOj!>(TAC|rlT+M z@IVnWn7BqCz8EE#1PdheD=%R+Ga-;VMM7?KBxZ>O;w-0qZ-Mf?@+7Ar?Not7SdPR7 z=iWG1->&nSs<~I*XfXHg82^5jyOO&I))@BX2;ew|nmJRylACGRZ!h5RKr-wP6mU3F z4f_*$j>K+rRMl_T{K{M$jc0xACBr_>vYdXJsxVr+>p42*CL;Mp37 z2U5J);TvHCRetx-5!AyUyQUPW#kk?X_=F-^*XYJO4)$IMsJ*Qj$IEAU8CeRO3lP3*9QRh)hbL65j!GInQs8$zz5us~w;c3RZjf4j z<4a>*7qn~Gt?>sVpY|=BGjGm_XRp-ctg)z0cYSnm;;xbkQ9jnH`u6;#F+{FZ{Un z>+lCuzBh3XuJ_`P`7oa66T-QN&@o)G+UC4ZP59$7mg7I(FB|yda!i=y!5_Z-ht)lQ zOll2uR+#j!0-J-3KjnX*yo^%V+?n*U|Ffkgy*t2gKwx>0@h1iUxxkRX6aEI=`>?<+ zaDucIiQlAIfk?=tyZx-W4Uer%x}bVTNtlMTVxLJCy;l#@b7zE#?P!S_J!#OB@BNmca5RBLFzK`y&W1uE)UXT zNCqhYZFkW-U{#PFlY6O*?|LxAu&UqoS}wi0oNXIHxCQB2fmgvxLHb}7!*;|&k0x(1Q>2bL%fxS=i*Q?B^Rb5Q#q7hi zfM;vp6#n1EGk2rLFjaaMqpz{m@^Kq9+eQ0l(-c`ifUKagdhD?xN z3NyT0V)AnFRWiyx`D-Od&KdQLe*x`9dE97uLAum?Ueu(u@bKU1F>op=ULUVFX@f{s z0m3{wONNf*2Q0we<6ly_1|tnjUXEb|F{RTOs9zObR=EL`fxl8ZSaw<3 zi87+kg}Ll}yqm)Jd8=NmeIIq=8yrksI_U!ytypR85$Y$}y@rVYBkgo3%n9VxQlPMxA*>MTWlGUU(T+Xg z-}oXlrS2ub50$lQ^QoxvCEsG26m8WO(+Q2?cft&Nix>_Hez>0TS8Eu)9AfxlU8}ZX z^qHbA4Y{O*;XOs`wVAY_=4IbhdL{ZQ;KxEIar#tktkAg{wyuFs;J z4>N2kXLyg4?)R<-zS`RWxXTm3T_H~x@Poql6*GTC_#YF_N9&n$r*N(n&b}h%TrQlm z!mMp=lsVT4r?ff>ZPi7rc^_I~Qmx#zU1}^B{SS!FcZ!}%<=!t=R6+isl9v&)y9FK= zcvRq1#dRos1^PFPmXxw*)Q*@wN}M&680N?J@7x(#ex40@*0(d8Gbg}45(MM z0N!Q9{qu3gdnVvZW$n=UIcPBHg|d~v{}61@JoI7ok%wL~yP)ko(F<_bPkd_uU#-{( zI99O*@Cy|?01Imw39_E6#2b@J*(Xb-)rQGdRiOtp^7?;+{t5}F1YXi;n>PS>aSg-Y zqIC-(mGqnDY`s<6GWr88?B6o_8G#=cxKrTQ1wI3~KE|W;nrahgGa79jM_nq^`~9oJ zDb%{#p$?a&P*++})NAyE8qQH$G@Y&!>Igkwl<^x>K9%q}LR+E5L-z{xetJ|N@_T68 z8B$gqDrYJo)cfgkwIiT-%>c{j-*MXFrPk>}iJe|rCDakQ&r6%eQNL1>{%Iw%ao^e* zeBa~r1^p_&mkv18w`-T0CjHK#_TdD?N5Pp=1AP{Ump(enp&l11E7TY@8rS)K^oT>P zGfMG>{`VZ}%SEMlpPE-$ggkLqRVi}hO+qQ}7SUZf>fQb#dPY&SwfYu+F*VIrwZ9Pk z7eB_mP-FfJgH>iZJuB4X^hum7m#f92)1q<;&EfkVCyuEKDt9PuUj^N-D2>}!N!4>% z@}1OKd%wSu4mi|yP}Q`2o+|sR{w04c?Qy96wU7Jj>1z)4K^(hIrtEwr`EH@U=TKoB zc2A~%EKp@v;23W*-Lz0qEjY)UOcyUw)blv`n@r1>Fm(;R5Pil!neJ7T^z9UCI*ZFx z-%g>0LcO1^4n60eLhTOK2x=;=cc`D2J?EcBZ*!K^k? z{s#J#P}lf>Qts0m>2nVCr}9_)jr6cX#mW}xP4uKgHI_YSG|>+n>XNEOdNcjfp;A>3 z8qM^wL!B&Hq|YJ!Y-yk0SNfnahe{o4S=}OiE=_W%^Xnco=2D|WnMI5Ad9=i#N{Svd z=FuvL`n|SDpHF>4jrsqkJ!s6Qo18LDU!=Ft{Z3ht{-Du9-*d_;P_}^n;gn55*#eq; zjETVbmiX>fM`905>bfrVhs)_`b(06iFvA&dI z=dt7wT31;WIE!BF5K6}8dGzvfrruAhL$dSy7lffcmUp?*-^ z9_XZt9qLb27Y0^S#-V;!y(zGs4ms3!Yc2_N(VY$zso52{h(6~~Lu3WE(^C$Wt-d1g zHu|YU)mOhWkf2u`>SXniK$1#VD$9OM9}4WDSq^om`dFZk&UL7l@KYuhZE~m&S3era zP@hBH9DFjck38oqEuXFaabTD>In+M-L*VT+vy;mnCmx$)v|OlbXdTAwRdlmM9mS}+ zihiLe84p*{%g%jq&sF}bsPqD*PKcNsK?ZO8f&?hE5qk;FV}Y+{awo5DV7}~15aZxiv8P>r4CV%LtPg1 z(jl7TP=nEb7}wJhhx$SBS=#kLwH_+D{>h?+g z;9&}_Q<5J9btA2JsMqUDg72mQhnh2~GI)fpbg0>rN`mj94>?rZr262^^bd!+I$DYo z#)0)pXV^PE_6d&a}7F#SZo5;sx66^rWJsk3LK_xW-a%CkwYP?;=??Xbl&y5AeNwi^q262B>rrgr@7SQ+Sfe4@*Z=_9@ifBtOlrRCnFwFSy*eEWG5^nXjGtZ3mXzRJz(Z$+ng4t2=ybXqY7JVVGe^~;G(V2r zfljrM(WnrAq?Y-A!aiA}9k53y=4g(Fx4~MS-X_-mbKIc2BYbb6vWS@T58a{!lk7i`ex1sT|8r;l&xYf z{jcO(^%DE}EI<2`z3P1fuOcQTp0|c{_*V71ibEBX^Ce;naV2vqNAZv05DoDo{WTtz zmg+RAw6HYKQQFjq+wNtVNups?Mo@JTa~_Zp_fEktmAF#2ooY{^2G*m~=jCLu8lzRm zzKXSNsAl|0j5X|a3fi8>4eG%d^gvRF4A-L5(=`#AgfEEj9w`Fo#dArG^YQk>I5CqzhM4S@Rvx_ zmgz48UaY@L8?mC%YDe|{^7Yy={Xwlu8`FPQzXhEA<__&X z{Sk1E>hGypug%uJQJX-Gij%~y_#yq$>fKsB^z757!vpVt%;BmVwP*FtlAE>f>z&X! zolXYdp`Cy~Zv(slt=OOs`ahusG`8&(@b_tLTC4E|ty6n0^01~E6UPao4}RTb;ov`=7-6VYzRYCED`130Ah*4F}d_{;Sp zTD*8B@JZ!Oz-?m@;74m_>M8AH-PwA;xVNSQcv<;s{gAeA(k8$^__l%bs_#0(;w2WuGNfl#J9`g z+nL5gy3bf(tQO8D;cU>R)xL^v#-9w%G&TvmMf*YcZAKe3@6$SslffQigMOgi0(=4y z(j+mwLAwuUB}er3>Z^=^_HwX-It{N6lE${WTL6DpdxtTkJy(A>;Kq`V8%N;h`;3Uz z;C;}zSbC&adSt53p6``@xmfz;V%m;ZS~h5%RX;KML^3Oq0j<4$fDUQz#_II@+VPOj zbFqwLZx8$BD0no`)T4eGl*M`5Q0Z}Z4a=#3bC3H|3~SJ6Y@^m!8coJiJll+N`Hd&czN zR*iW!XfH($d2oP(cpK9eV+T5>wPEKurVV1pIi`(ar#YrgFJ-(5JIgWc66`3)v?O+t zW7KkGc=Ag9*;-Vc+@_FQ8}cQNAHGL zca?t5b40tl^hw+`P2%%);A0x^0Ee{BlE0yKcb4A)$P@kw(&!{-TNg6|1I6`{hHwH$?tf_^xxHU-asUK zzeBwK1E-SAF}*kBHCbm6_;0Y9eHN>dI>2FpheM1XF0V6hpofE#f!|v*3zA=|nG3iR zCrYz5-oI_oZYXXw|7e`R&gYNDZ?WUqpf~!~n*r@(WmSNmDf7}RGMZS!CFUU+eTQUJ z&X-JnNV|gfNr;3bN?)ki3;1oECp}O11+OqQ50AtR$X`{c_qSD}W5@r z`uCX6Q$^+7fE-=Vi&vjVgg;~c3=#fw^LKQ8@KxZPqn;OUKaY5>@XhyJ7M>vK!kP}P1{o~vJE{dEJ-!;m zOd68+Lh=~h0eHFo2j4ruukl@vXBj{HUY!J7$6Uv7 zDPV}s)xH6IGjKm<3C1r69;HFxe*C%|a}G=CP1@7o9})h|+ILX;LGAm1AJTpdc&GML zNFI}WKPh)TCioMA|6K523*M%4?P~z%;90}dfMxVA!8v%Ea4+CAdK$2iz6ZE~UIIK@ zUMT9>IGAzl+{W zZ!780xb_p;ZS?h!rZeopj`wNbsD2mytmsa_C80;bhm1hYV0@~;Hh~F&V*-x~d{p2G zftp9;1-1!H2pki5RN$imPYBe!A}_E_U_#)Sz@q{m6?j6RX5L0W3Tfsi=%V77$!(bm z&Oq^0aDIca!kjj6jBuOCTq>LdICeN8oKfM7f%9T`44kKZM}a@>dsN^FftpXO64)j% zA@ET@`zjWQ3S@k0;5J%a(i&jAE$~^ugupR@M+H7A@Pt4u$TCv}J}U5pK&?pl0^0;8 z1da(jD)3Q(Cj@FCmVYF47rhH-Iar3`PM& z0OBj8(0_3_iB;;6vdaKxm81dJ1#Q5;mhS_cTXrR2e-*=;Qij{=7}ggt{JX}mL}xfn z;J50o0)E0|J!#Q16ul1kkBbijo)q|9-+O`kqaOr(&G#X|kktEw5Z60e!|*$TUm^IH zE02QnQGtAyj~9glhHct6VX2GZ2|e6y<*^J0b(~TPyWsU#NH5X*YMt9 z1o$$HRy@4{KM0EfoB1A{D8?czj_12e0dGNTbo`+2xwx;JEbU6|Iqd~4Y}6X9#%kkX<8kA6#$Swi zo>iVA??v7{-XZThyzlmY)O+0ftoMZXa`SofkLI2S3C|Thqr8tP{9J~Bz;-$Jxyjdu z-S))KOzfj3e$L=fo$y(D8Xmup%imoHz|SGXUzyy~K))43zUo{bbFP}E_=a=!I@e-c z6PN`oYS!+e`*HoH_Gh{mYw>&akoI%@{YJNFt6@Q=O>0KE=J^U;f;s*Y?^h^|YZ}+L z7V8(8^YuINcdrTk=AS9xBaQ!luIu>o$X@`X ztd*ZLVa&E7B3q?hv~=YXQ%g^kXzj$89qPBS*3tHM&E?GXW zWy!piOII#h(7wEF;i8otE9R}3w_wSFg^Ly~ICCDY*q2OamnX7`OXpMPiu7QA(oXE` zOM=>D53NtwndI_hUvhUM%dFL@Otzq;!|Jo_1ufK-%&t!zNcLrbcc!y|d95wfk?8B& zndsSjX$xJL9NLoT8%(ZGq->DwiA-{3D%sa7dRu6DswbPW(g}MAg>Lm*l08|=o=7hs z#a~Ek2K%z9fxe;jRti-g03(5ScMdEB*4^EeO=MF&ZMK~l>P)Ayn}!CGU8yUQ=Pssm z)>yrReaZ9aob`5UADY+MKhT%#hcj@8m0q6ACQ^Nw^Kg>6qK&$HlRb&PHS61HAYo_u zx(UC3J!mIemecvkY-c)?O{9C0cqM4PZ4D&t?9e6)L^pm*TqxjeTUKmrJAVaT)VX}q zDq7i>*u8npo{c{i-edsy3GBfA=WIAa> zjE(I`q&FrLy|ga9+QLQk!kR=nu^SaznXGWzdV9%AOK5cLNu+ltd#O8>Y0G94J$rz! zOK(ZosYE*4HZaha0>hffV9#Hss$Y@jc;=fr1~XZ!pIzUDknYI}a{{SaGLG4qY41b$ z_96Ch2e%<@+5L$=#8EF@*tK5F%*QfD18n0`RdCKaJLN`|3eEHOc6YZ!BVI65BD;7D zP=7MJ$Lb|zFGk9K%U0F7;YA&Gk^|L=Hd@X>*@eF(yqKg+4(r;J=(YBDBr;i4A!Ra< z*RoWHmEM)wEoho)Zcl$=H^OQV)Jkqyc1<#qL4Uv^brsDUxgV%!Fl+7FrSRV5Kz5Hp z_a_s!!Zvqyuk5oDSw&d`iJnw;ND=GOZTk~@lW1XYXL_FntUb9qm3Hv+lUZj_Ns~CK zjHA2xC+9KbR4FGErPrwbHiw9ZnZ|6r!r7n^HizC4zMCNn`|J&v8kX0Vj;16>0c6i7{z&s37f)W3S&c zlu7kuoDzge)2}knFu2RcF>?7dC!gj@JFNblXkKBP#6k-^nQqvJv@(_MUAL2y zLT24A;W*yqA(6@2gOaRd;*!!NPmF@W)SMkTh7)|m&T(-T+`lK4O%^hCa`Gr-sO(Y5 zS(8YmU78zRNMms33)x~d3JQh?xg&$PFL)~7i4lRxl*3i^Rn|_V73I#Vlyzoz@l-0k zFNvAn2`i+^PD~6c+o<`q2f4&u2Vjcl=`NeXSR+iZb`}6An1Cz#cP4ugE=bmPYUdz0 z=$-*YqAjxkL<)+|A50Zc%ac0?ckku_HSXpusZ44duPu{F_V4T)+LX!`isslhBCkJT z@6Bu3l(5k^EAh{IB#~7M3RWD*Ces;AQh8Zd%}Ut31ztIAp~|9zwyYISy?1#s(_^Ow zc=pQ|DnG~_8@yfZ5XWkkTH|}7A`Er%Q{)_ z2*RmPkag+y1!5mW^ zN+o|@cJA5btYTC#C~33F)R)7QkGPX02xL^L zAls9$lfAAYC*9^qHZVu9C*;N)$JvB9R){_<&-bO0`|~0L6By!R_YMRZW)sy24oY4) ztrZJJ8CJRJy$-zw>$F0;8?#uhP}${3rZPEXog}yvdPCY+}}NldUSm z-AEy5fh@3cvdLY}{!p#a^7}yK@l{=>J(42(n_p%6tNZ&v@y9WiS*Eu zTydZWd4Xk+0`o+hy&G%$be3iFTx>?rtlo9lwu|-ol5vg7vsZF-XY;hHHqS}s>R&OC zN%g@F4nAkEjqee)4`#DqI^oL;V#=yTp5SY+)=Aoe4mbDl0|>Bol0NMalq*mVZMuZK!SH5z-;1u9bpS@OT6>G zGHFW%lA0VEw-=OTln_R(?ByXZ<3gf|@9y4d4W@fDIlA3Cki$EbH__GmQY@<`C$h48 zK=7QQ7_3E2C^@>or6P#c8xozE+JR06%Gu9B*<;wvxLgNS`Bg?w2TbJB&T*aYP6->6 zJxQ!SY&G0?sk{=WUj=@V;o}?{DV%GR`9aK37&6iF6k39%1{{EYctZ_LAaJPS^a!8B z*0zO@2uL80u&A>&Woi!R7C^b+W_2`{I~j9G>4sb?q5(H4iAlQ$Q)*464nV|lgDEH5 zI=pfFK!>-+N?Yy8J&AoOYtV6sJ5W29XQ*vwhR(MW1ADN)Bxj%LW`N}>96R8|hl|)h zau$*ybzG9{ZI>{SlGVI#cWCa$LRxL=ox)t33U1!1^h{V7;g}LbWB~oUFV&OGxHh@# zCU?)0D_46HtadoRqfN;yAE9KZJL9e*d!2Ttz@0d)O~_#^lADPOZiChW%Gu*%2=3)Q zQHItIawh1?4lz+sG4F=qT?{ydu`^}$oS}BC*kCk|4l$YyO95Sz>aneiwJVD=f!<_W zI?;zCfDCqa@Ja@mWLd6yuTI z-!;^a13nuwo1_*DWY&5*Cab{|C@$?uWZj8DrAD=Ok`p!#LWM{bICDdDu7!cETh zUWhK)jB*gE0}wIKLAkcwu+|~5Z06e$hH|yiYw}AcwKP^1h+`MDbRxWLxj{C4z;IN5 zI_822Oy1IsXQ>_^&*OE@c#br9Jd2w+o`derGja#P>JWfbkF)cf8F$^TUFbzly5kw{ zBGM^mM`3k_?YD%uis=Hz9#u9jNv`b6$;-x_S5mxnO5sqHB)F-wjkh4!0b=4MTU}%@ zpb=~nUqEA%EGORBnW?KsO+V7CDbEC?l2f^S?#KfXt5@glZp+4F0*63+I9R``k{@!ZhY#}1i#A#6iuKvf zokQ$SNzzC!d{U9xH6%vz%6uP&i2%?xa>= zQ#M2@B-ahdkw3?-i#qE{mvj!pS@DX?2eI7F;>$1?80n--u|u%{#2F)sIy1aPUuUoA z9{_~~zcWV)?hM%+3+|8!c_JUTt-}eVJH&JHh`mfQN4a;O!jN>AT-+$=Sd*{vc!}wJmGJ{)BhE;5$^-62Ht^pbynkve;5BNy~P=PuQx%xlq8#|g0DTG z`yi3PlYQa#ci?S+H0=Vk@h{JE>GGUh25%+A@Ge0T5-gp-+X5-zyTN77AZX_H37yvv z6HNo)W+8O|a1e4ySlmJD@J;HKfE#HI>|HI^cL;_rO)UH8)?i1E8hdkg^f>mXU=^LY zS=!P-Gih&5BH!*94Tv54P?p4d4l%hmhJTu3J#^Zz6L=N34O=JR?3F=Ky?950nq%V4 z4ES8mrMBFUNfKBB+)U1o)HqRkCnS1c)oElS-RQkR_-p_^NdQvSL{7Kr(IPx}g=8Q8 zqY{N@VZ$!`M>X9AJ+~HIw?C<_uw)(dvn46Ca0ov{R9Lo2TCp3xNu!jebtAIy=n(Wp z_+t-sfzLh3F_7h7pn%MJa4fnE+#c{!;uCHMOQz8KG^-2mf)9ezi?>Er!uAC2&H(40 z*#(MQg!;-hg3jPCo0FpE)zDYi-@BaqC&pF`Z>?zFS@>spwBo`x(WHqQ`k}E`>O@4Y z;fUk}k9WsbJZZ`HE#VadbcO|63)q8b;+UBV-v2-> zj9#6uIsuiZR_q3`%8L_S_djGt$tGl@t;nC7F?Xy$&R&VxV;yD=%yf9?be&Ke@lSnm z;PYUkvpdmc`=t9)(sgV(=ct&&RYTD2I`=*q$p%LA(iO;FJ-BB8_o%$aGYIFwOm1)~ zI*aUGkX0}~V)u3uN2kcM|9HZ%VKLvCU(Ipft6u--+G4WWn}vGW z2U^`Kw4A3Tp0CwvF@`riISum|j#c(OV+q&|Y!Syu z;b@wuL9N)_)+xVG9j|!Rnvqu@oDH^M&5L*9upZe2z4;aAY47iHr(w2;vq64bag_5k zu}6CNba$)v^2p4OS4^0jInlb4MGC8PcigW*3)x$4nTk`@TihNuE(`U!eNXtgNWQOd z-15}p>f(AhGI?r>NeMqs;b{KwIi?-6Hp z+dR=vZz|nAv3;lOxqNLL)l9MPcqhS`iM^^aC`WvLg`45!(3*+*CtCMry{L8>ZP;%l zB!^IB0Cg3{G_9M+i9wqCaStqH$T7tG4mEDr`aZFjSH|o;j(N^WIKjcRkC&yVx}$C4 zT;b}VMVle(_9l@30bB1hJ3UHnntQJsfAJTeue9FLUee%@}d+ zB6$;RP`XY(=cyU4A9ZpaT;urhtrpa$)(bDJ<6e8SyWE`UF74Rk92@KxHL{d;Cp#B2 zx7315n8CtNXTQQzHaa1(HHg~PXUOjc^ zvJ>8+4HNgs6SZ=V=ecDTvBuN4BZl|(-I-CtZGq^t1S*))B!Aw z|5QfhJtIf#f4gQP`p=%ZqYoXQyXLx!zf=16gWEn#MhtJs$286F1&CBI8fKvTVjld` z6aEd=n65>JbjXFh713>47=n5k;oFasq6vRRB&mhNW=sPS_Qy1l076_)MqVlR#PG&H z>o4Q#@C$!Fzdw?i6iG!l`|+DinpV%1dGQJ0in6gqI#g6Ui(aZ5aeus&oV@su` z%V8l!6DAoD)+hOb%8KadSakI2==A95A^aa1JsiRxzAO@kf%vDuM#pe5K!ov+IgDP- z;FuS`iaD7)K`lDn3zegX@O=_>dl;A=9h;5+z3@ONq?;ixGz@7 zkDAaBe^|%w)tX_TdRPqJCSu2YW<_)?p@sPZhq1=`YKIquK4G(u(8d%hh>rD#OW=#> z*kE*QC^|L*=tmorJ#5BN*grPHU@YL%*a2vcA1b#o;>%rC0k^Qe*5`-ak z_5We^Qj8*_kD_877a@-0+cd7|aWnx1l2h5DVqjEVXOI6lx{KN2U5{zz^-?juh)Twh<$!*R^(L!;1A z4k$mz6+#rD<@2hzbK#>Hn+gvV`3#qIP`EW<{UPr z`SFMU(S*@g^l)VKHK+#zRX-(T?s#PE*#Kv_G1&F*DlZ(5j=@g7zJ3yNmkvLaaTe8) zVK}yQWXesNZUi-5F+#!!fq`G|WC_18{9y2y-K0fQh|fq0T?BmeS@a5^8>ojJ_F-Wk zcG*uj>?ef%gx9BsCzC!I-$g=}tFK1{A@zxN^nHwLEu#`&5DlD!L4a7o2Syuy9u@u& zew{ZQ8T);7?2n~>j10eSdi}Voj7rNiANnH2o{8y`!jp{1*vl#aZ}FIsu~&keq{kxg zW5mQLoiv#^s>ULG*XV1J6aqyUT~Fm*8&|XjFjT9St}#(N+|1g*lkQHC=qEMHBpMD#&iKoB+w; z6dk<>@r4W0*L}s9DNvW$a4;){b)+)f#b}T`SoMH~l@0TRz{rEkg**BzECyRh;U89fe2-T6ObY)A z#ec%#GZ`t>ypypm3Ud;XOi)^?dGyi(9-P2aUy4)zDjAjvwwm*JO2tA>kFG*2Vg_9m z_6bk*jl?N?>{%oW4QT_>teo~N7h#G+2&2!UV*ySx(XnFg9$nCY#}8@4Pktj#Vf^{M zab9i+d_v%HPn_o>fYHYoT?MHSBb%l8Fn);!agGmu^H!rxdgVoUe`zhAal5baZQ8?M zlhYu_!H)-Y_?g|@bLyD97?C~up&e|25a$k^Wa^4$17r&Lh z7)}V6=Zg4iC3t_0->!-BJ+WL#46{$kUK7wZg?(VLhUwE*uj}A< zdij;wM4$3THwv3G@|Jw_F1$Ij@&BF9X>X_#Z&xI|j8MS_1|M=>rykT|f zD;)pL+V+mGZPFXo#xK?Wx9VCsFQQ^FKhCs(`Y{J*P;ZMbJ4V`?^_-zb@weym_`Ag& z?`rJxH{)mF?^h`MRY4g`l`<&!Z0uUz^}b`z+_3fA&t35F+DoVY^`z0qRn6Uu_a8HJ zIkVv_Vw|ex;*|$}Vy&q3x^Y!+!m#LZ&mUe_qe(;9o6p%lPR^ z8mH82ah0b&km!)wlF($~&jbxYMq5O&cUg+yqhCu z;ToPu<2!|-f$tlD57^7Qae|5`XJY?&UJSoc7{e27K1)~Lh(U^sF4xCQsh)YO?Q6vd(VRDb_*p4G3(I@y zbbV9kC!&SYFX}0Zd;i4VnbOv`Twe3_smE#$L{9;{l9O& z|JYq!Rj*#XdiCm^-7{Lf?eEASA`h||fOE1Ahyx%l=}+#blp)0ued+V*&#)tzc8DGAPURIgi3v`RDRnRA|b zhg;h7bVfX+%_BMtj;Xk3+=Y7_*TcAo$^_Sy-OO;rfN4bF^T(j8u4hsHU${FYv+#NH z6GUqnd6?*VcEtG4^F(3ro;gm`F+S~$=s1zTDBTZwWf9$!OYO~pPP_{MX;N3mZcy@x z6J6D0XYDRfV%x(&xS?*sRrFbk=4!H2y%q%7R(c*6>v|8aqR&#IWksZ*2KyBswoNB5 zm8~cG@)q%;@c*k|nx3d83f8&zNe9p#p1K9PRReayiGWN@r00O9)bn4XvltVHw#tZBf(nvPrJkDrUg^ix$R zV6qhl;|IR#Eg_$IQ+mPY>NLcGPBSUqLJ_W4`8+Qj!5zX;doBt|prl|;uqG7K;rUe7UEp+*?1bs@$xPL_Glufgg;T z)mzHVsOekqQq&978}*v=pN)E~*_`NMpOnKV>u^U%Mzd#vJ;FXqoCVDO5c?wmENI@; zaF+d$Yq=S!3fD({{@biMNKBwhnEvW5VZRTxe=*?$IRfXRF%Cd0{Lg+<{`b&FIR#}& zlK45eco4i8iK|2Qt0={nfOt^6*=K7=v6}%C4Q}${3z649)Cju7Kh%Vq z1x9^2954?=)H77Y)tL{x+?(eiavYu+^;RSnAhp5OzjdtsXW^TuIZoz=u`&-rCgwX; ziDuAHB8>4gTmfVu5UU67DEG$#pkbcJz4^B#kQ|KpqJg1BV(I=RNEUqCFmoj7?4l&b zw+#!&w9rcR(6yM0IG2UIE=x-7MyZPL*i#c#c`W1z9zapSsLwhNH#nXH`n;i2uf2wt zrs9}JD>S1kpezdEItoPT>z00G`Yuq zBu}DydhBQOBqGRTznCWxK_2^0dD72hx$de8FgZ6*2ARApPr^=*4OckjVwh4kZBr)E zfeT?y!_)&8;g+}Q$VPJDFMcFBSM?SA#LM1|Wf%DmZ`? z%|fHr!=MVzg&{jQyaAx@d&Tu}ar7!vuNvmsk2keStVB4;cmq$%M>mGrp>3!GKs+;s zA?m76tFBt9dz^63t2!4#-I*}zNX-*bs=q*WsY`W<89U{Yo&&k9CP1IB)tT`lOr%zEn zp|TdMVr%M(ib){qO(~!b0nHABZv%wN%SRt#R>L+YM?Z3V4luN?VSqq#Yn+uNhE|Tj zfFwz~DX+7?jVf=IQdL!**bPQ?T~*!J4`AH%RBsvKo8a-Q0z~t|3SR_Y&JD)-R*$I7;~{EilQeZq=Tq9*Jb*&_CYDn zNoZMyj^@esT!<@?LjTGRL3p1&gr4Y;VYA^ZT}_Fdx;@PL=fSzUt$SRwYM5ut`lT30 zTEu$Js>(!zp-hJPGFKp<(mt_FEd87^Bd95xI(!a5k!qGusyRU)VwhL`9#PFA6IIuO ztEyA(*r|Htx!@P+XECLp6Z9d5dHv6eeioUipIxxzZiJU^pW}5KL254ZddTN!nWfve zA>Hx7cUV+LwfXE+$CFpO!0J{OH2%bXG)hAi9LkDh z>0oh(8)hjLPx??La1L?Pu)hnfvaT+vD)-b+!ougaa<7uZA_Z|)e`XYcU5-v4z=H9I zhW+Aca$p+eh{dYqbUA)^njGlzlEY`AQ%opB^TDcNm>twjiEvZR>9b6IKgM`Z;sDYb ztLzZuO#2c*@v9TfO62VjIfF-lbIaX&b5;v|)~t`~Lud$3)q-j_jY)l|o+b8h>qvB~ z?Fo9a`CPQzuiKZQq^O^lpyqR=CLT52LmpY3g@MnRjL--IZ|| z<{3uUVth8^hzQ0Lj6*$E`@ELpPY72EeZC(T<_JQNYFNublIKo?-pfMx==SyO2ObZU zO$!c;zy(+ipa3&F3f#ID;J`Z+cNTN6WA63L5c?fxBv7z|{7%TC>SrNaot`+8Z*1Qdv5sh>H8&vNL~Gv3+(T^ADHDxiW^V+}8{%Lt zg{qH8k{TEfgIPBjYuHwl;g$KG-Qt+F5vk6sA9ZK_AnL)JB-5Sfe>!2JSMz)|O*>o7 z^SlrJH1zvfzm%&Fam!hIxhRLh&1Ve?1NHYbh2AF+JE+VN4Go({kV{{J{1y8wd-^n428uRGL zmeyej#CP2`{1`{oa*neMy&FJnJUQak++h73m{rzMKqqdQQ7w##A@v@l6@`?ujASR| z7n5x7Cf8nNQBg@saZyRC=!qqb3*NB{*2y?;_yHDs=weRP$SxE$n2L(?z`NXZOsK{k zgNYmg?81EjS4`7otE!->HmdbIUAB3-N|60){d$Z$v{Z4n0Ux>8+;TaVi+;bGajv81 z^2E(>57vx%CJ%M2NA40QwvhRbq^?uGXgsq^*`T$TIoXo+R_EzCa36fhMTE-H$ z37b11PirOwKL}3a*Pc5N^PZ{-=NI&<9gB-B#<#GwOD``jpXdCBB}Mb9lGlq)0vyv7 z=WGoGY~mluJLu2q+)rMGK3u{D|`38DbnYT~IT;6y{>|=1JDV zQrH}BW`?v-BNni{+>*75&bw%JDp4nAZuh_<43mgO_IP87p8b0;hMA}jInD4PaEdyk zg*mF;`bRK>^;cpv`Y^DNPkN(u40yvzwZyRy8o`7I)-;~uv(OgxVZWL<8qf4ww-&lOSeC zeZ!wp_o%rw>fLqu@ZBIWeIkg>EZQ?T{Ap&0h56FrV@vZ#{rZ046-o>Eic9l5r3IYQ z0#W}Pmc~A4$Z-&XQD7!?JU82e^2^5zdcFHbs$}Wk9->__M;)Wil-gCy59f?Nt z{lY7hU5eN)YSf5RT&YuBX*BW%#c`kY$b^9Igg(n7Fs9|A;WAi19lb`4mP?VU`mJ>z zoNVyQsd>(iyWVsiE2JQ(j7G+@ieROrt9dSF%d`PDZN)eTY%aRN#Jt z(HcR2$tXIs2NOC6y)F(PM)`sgF}+lV%VF*Z5aa%&pYg=wk6$=Ey;zJKvA7cBFmtp) zN0GLRl{SttXyb@rF}iqowu?%kju;07#JKTT?5oR$v1BP|`|2{KjoVI2`yw06Kujmf zeun!QRu3M%a=3wS)v{A|OvAK|d`~>S>LRrT;M^Ch9RTaNSZx4+qF`Rw>50!mU){7y zIWVX@2d8Bi%1t?CFHoOjnS9zmF}22#^knY`nRtMCyX{Z_t0$|4IT-m(-FgtHk@&o% z>O=pG`|L)~nHBZkp)UyTJ5xQI!6Ta?Wb@RWfs-sj7U=u=o_L7!o}&mO@h?odNnae3 z^l)*~i7`q4TAcKyF-c!8PI_ca(xXht{E6VB5{~=CC8!luXiWtseTK3s^5a1nzx{*rdSW$-Rinq5Y)k>U!x9~>!PJvQ3ZpgT9KKd zQmv@4aLhoj{x{SRr+#wN<(A+Dl^*k)s>J$2i+M`5Qe9dy@$X2GRs>T|a0?DS4iFG{ zxyyP&SPb*5uL+BxS}rBHy`vrp7CrGKh{Q?`Ia8@hJjI-4%<%<=Sd-$QvZn4246!1` zSpg3E6SpB&091H9jExSMk9nfL~%kcv)U;u#Q71zjGx z6!)@x%(xkYW~nAYBZ^bkhg)9Dpe+*gWBSE|f{ zE_Qc8mr3{WW|nOXR+ZE*gW%Qlm24WSQPU|ycgv`DSzAhVw+uY!a>{^xz}ZrirnHn&K?_2i(@LpG z3j$v83R=e4=R8lXy*TySYp<2&?Wl2UpSPmg;cS5suC-N8SmCl7b7WUA09mbeh6l6N?LXbrlMCIImZ@Tc<+J-6k$B+*Mof#pw!n zbrlMCIO7U;BVwZ4t6a53Zm)LL=EE@WpQ5

&iETtLya&ck7g|dA>D^YJQr+T@#B7 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 T+|QEV{(N)s|1a^s%LD%h@kJ$; diff --git a/Source/ConformalDecals/ConformalDecals.csproj b/Source/ConformalDecals/ConformalDecals.csproj index b6b940e..fd1d246 100644 --- a/Source/ConformalDecals/ConformalDecals.csproj +++ b/Source/ConformalDecals/ConformalDecals.csproj @@ -66,6 +66,7 @@ + diff --git a/Source/ConformalDecals/DecalConfig.cs b/Source/ConformalDecals/DecalConfig.cs index e446b94..b0b8e78 100644 --- a/Source/ConformalDecals/DecalConfig.cs +++ b/Source/ConformalDecals/DecalConfig.cs @@ -1,13 +1,15 @@ using System.Collections.Generic; +using ConformalDecals.Util; using UnityEngine; -using UnityEngine.Experimental.Rendering; namespace ConformalDecals { public static class DecalConfig { - private static Texture2D _blankNormal; + private static Texture2D _blankNormal; private static List _shaderBlacklist; - + private static int _decalLayer = 3; + public static Texture2D BlankNormal => _blankNormal; + public static int DecalLayer => _decalLayer; public static bool IsBlacklisted(Shader shader) { return IsBlacklisted(shader.name); @@ -22,6 +24,8 @@ namespace ConformalDecals { foreach (var shaderName in blacklist.GetValuesList("shader")) { _shaderBlacklist.Add(shaderName); } + + ParseUtil.ParseIntIndirect(ref _decalLayer, node, "decalLayer"); } } @@ -30,7 +34,7 @@ namespace ConformalDecals { var width = 2; var height = 2; var color = new Color32(255, 128, 128, 128); - var colors = new Color32[] { color, color, color, color }; + var colors = new[] {color, color, color, color}; var tex = new Texture2D(width, height, TextureFormat.RGBA32, false); for (var x = 0; x <= width; x++) { @@ -38,11 +42,13 @@ namespace ConformalDecals { tex.SetPixels32(colors); } } + tex.Apply(); return tex; } + // ReSharper disable once UnusedMember.Global public static void ModuleManagerPostLoad() { _shaderBlacklist = new List(); @@ -55,6 +61,14 @@ namespace ConformalDecals { } } + // setup physics for decals, ignore collision with everything + Physics.IgnoreLayerCollision(_decalLayer, 1, true); // default + Physics.IgnoreLayerCollision(_decalLayer, 17, true); // EVA + Physics.IgnoreLayerCollision(_decalLayer, 19, true); // PhysicalObjects + Physics.IgnoreLayerCollision(_decalLayer, 23, true); // AeroFXIgnore + Physics.IgnoreLayerCollision(_decalLayer, 26, true); // wheelCollidersIgnore + Physics.IgnoreLayerCollision(_decalLayer, 27, true); // wheelColliders + _blankNormal = MakeBlankNormal(); } } diff --git a/Source/ConformalDecals/MaterialProperties/MaterialColorProperty.cs b/Source/ConformalDecals/MaterialProperties/MaterialColorProperty.cs index 7a665e3..5b770e6 100644 --- a/Source/ConformalDecals/MaterialProperties/MaterialColorProperty.cs +++ b/Source/ConformalDecals/MaterialProperties/MaterialColorProperty.cs @@ -1,18 +1,19 @@ using System; +using ConformalDecals.Util; using UnityEngine; namespace ConformalDecals.MaterialProperties { public class MaterialColorProperty : MaterialProperty { - [SerializeField] public Color color; + [SerializeField] public Color32 color = new Color32(0, 0, 0, byte.MaxValue); public override void ParseNode(ConfigNode node) { base.ParseNode(node); - color = ParsePropertyColor(node, "color", true, color); + ParseUtil.ParseColor32Indirect(ref color, node, "color"); } public override void Modify(Material material) { - if (material == null) throw new ArgumentNullException("material cannot be null"); + if (material == null) throw new ArgumentNullException(nameof(material)); material.SetColor(_propertyID, color); } diff --git a/Source/ConformalDecals/MaterialProperties/MaterialFloatProperty.cs b/Source/ConformalDecals/MaterialProperties/MaterialFloatProperty.cs index db5c987..6745dfc 100644 --- a/Source/ConformalDecals/MaterialProperties/MaterialFloatProperty.cs +++ b/Source/ConformalDecals/MaterialProperties/MaterialFloatProperty.cs @@ -1,4 +1,5 @@ using System; +using ConformalDecals.Util; using UnityEngine; namespace ConformalDecals.MaterialProperties { @@ -8,11 +9,11 @@ namespace ConformalDecals.MaterialProperties { public override void ParseNode(ConfigNode node) { base.ParseNode(node); - value = ParsePropertyFloat(node, "value", true, value); + ParseUtil.ParseFloatIndirect(ref value, node, "value"); } public override void Modify(Material material) { - if (material == null) throw new ArgumentNullException("material cannot be null"); + if (material == null) throw new ArgumentNullException(nameof(material)); material.SetFloat(_propertyID, value); } diff --git a/Source/ConformalDecals/MaterialProperties/MaterialProperty.cs b/Source/ConformalDecals/MaterialProperties/MaterialProperty.cs index 6416d22..6d792ab 100644 --- a/Source/ConformalDecals/MaterialProperties/MaterialProperty.cs +++ b/Source/ConformalDecals/MaterialProperties/MaterialProperty.cs @@ -22,58 +22,5 @@ namespace ConformalDecals.MaterialProperties { } public abstract void Modify(Material material); - - private delegate bool TryParseDelegate(string valueString, out T value); - - protected bool ParsePropertyBool(ConfigNode node, string valueName, bool isOptional = false, bool defaultValue = false) { - return ParsePropertyValue(node, valueName, bool.TryParse, isOptional, defaultValue); - } - - protected float ParsePropertyFloat(ConfigNode node, string valueName, bool isOptional = false, float defaultValue = 0.0f) { - return ParsePropertyValue(node, valueName, float.TryParse, isOptional, defaultValue); - } - - protected int ParsePropertyInt(ConfigNode node, string valueName, bool isOptional = false, int defaultValue = 0) { - return ParsePropertyValue(node, valueName, int.TryParse, isOptional, defaultValue); - } - - protected Color ParsePropertyColor(ConfigNode node, string valueName, bool isOptional = false, Color defaultValue = default) { - return ParsePropertyValue(node, valueName, ParseExtensions.TryParseColor, isOptional, defaultValue); - } - - protected Rect ParsePropertyRect(ConfigNode node, string valueName, bool isOptional = false, Rect defaultValue = default) { - return ParsePropertyValue(node, valueName, ParseExtensions.TryParseRect, isOptional, defaultValue); - } - - protected Vector2 ParsePropertyVector2(ConfigNode node, string valueName, bool isOptional = false, Vector2 defaultValue = default) { - return ParsePropertyValue(node, valueName, ParseExtensions.TryParseVector2, isOptional, defaultValue); - } - - private T ParsePropertyValue(ConfigNode node, string valueName, TryParseDelegate tryParse, bool isOptional = false, T defaultValue = default) { - string valueString = node.GetValue(valueName); - - if (isOptional) { - if (string.IsNullOrEmpty(valueString)) return defaultValue; - } - else { - if (valueString == null) - throw new FormatException($"Missing {typeof(T)} value for {valueName} in property '{PropertyName}'"); - - if (valueString == string.Empty) - throw new FormatException($"Empty {typeof(T)} value for {valueName} in property '{PropertyName}'"); - } - - if (tryParse(valueString, out var value)) { - return value; - } - - if (isOptional) { - return defaultValue; - } - - else { - throw new FormatException($"Improperly formatted {typeof(T)} value for {valueName} in property '{PropertyName}' : '{valueString}"); - } - } } } \ No newline at end of file diff --git a/Source/ConformalDecals/MaterialProperties/MaterialPropertyCollection.cs b/Source/ConformalDecals/MaterialProperties/MaterialPropertyCollection.cs index ce464eb..b61912b 100644 --- a/Source/ConformalDecals/MaterialProperties/MaterialPropertyCollection.cs +++ b/Source/ConformalDecals/MaterialProperties/MaterialPropertyCollection.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Runtime.Serialization; +using ConformalDecals.Util; using UniLinq; using UnityEngine; using UnityEngine.Rendering; @@ -163,8 +164,8 @@ namespace ConformalDecals.MaterialProperties { } public T ParseProperty(ConfigNode node) where T : MaterialProperty { - var propertyName = node.GetValue("name"); - if (string.IsNullOrEmpty(propertyName)) throw new ArgumentException("node has no name"); + string propertyName = ""; + if (!ParseUtil.ParseStringIndirect(ref propertyName, node, "name")) throw new ArgumentException("node has no name"); var newProperty = AddOrGetProperty(propertyName); newProperty.ParseNode(node); diff --git a/Source/ConformalDecals/MaterialProperties/MaterialTextureProperty.cs b/Source/ConformalDecals/MaterialProperties/MaterialTextureProperty.cs index e1b229c..fbbeacf 100644 --- a/Source/ConformalDecals/MaterialProperties/MaterialTextureProperty.cs +++ b/Source/ConformalDecals/MaterialProperties/MaterialTextureProperty.cs @@ -1,4 +1,5 @@ using System; +using ConformalDecals.Util; using UnityEngine; namespace ConformalDecals.MaterialProperties { @@ -9,7 +10,7 @@ namespace ConformalDecals.MaterialProperties { [SerializeField] public bool autoTile; [SerializeField] private string _textureUrl; - [SerializeField] private Texture2D _texture; + [SerializeField] private Texture2D _texture = Texture2D.whiteTexture; [SerializeField] private bool _hasTile; [SerializeField] private Rect _tileRect; @@ -42,24 +43,17 @@ namespace ConformalDecals.MaterialProperties { public override void ParseNode(ConfigNode node) { base.ParseNode(node); - isNormal = ParsePropertyBool(node, "isNormalMap", true, (PropertyName == "_BumpMap") || (PropertyName == "_DecalBumpMap") || isNormal); - isMain = ParsePropertyBool(node, "isMain", true, isMain); - autoScale = ParsePropertyBool(node, "autoScale", true, autoScale); - autoTile = ParsePropertyBool(node, "autoTile", true, autoTile); + ParseUtil.ParseBoolIndirect(ref isMain, node, "isMain"); + ParseUtil.ParseBoolIndirect(ref isNormal, node, "isNormalMap"); + ParseUtil.ParseBoolIndirect(ref autoScale, node, "autoScale"); + ParseUtil.ParseBoolIndirect(ref autoTile, node, "autoTile"); - var textureUrl = node.GetValue("textureUrl"); - - if (string.IsNullOrEmpty(textureUrl)) { - if (string.IsNullOrEmpty(_textureUrl)) { - TextureUrl = ""; - } - } - else { - TextureUrl = node.GetValue("textureUrl"); + if (!autoTile) { + ParseUtil.ParseRectIndirect(ref _tileRect, node, "tile"); } - if (node.HasValue("tile") && !autoTile) { - SetTile(ParsePropertyRect(node, "tile", true, _tileRect)); + if (ParseUtil.ParseStringIndirect(ref _textureUrl, node, "textureUrl")) { + _texture = LoadTexture(_textureUrl, isNormal); } } diff --git a/Source/ConformalDecals/Util/ParseUtil.cs b/Source/ConformalDecals/Util/ParseUtil.cs new file mode 100644 index 0000000..4cbddd3 --- /dev/null +++ b/Source/ConformalDecals/Util/ParseUtil.cs @@ -0,0 +1,216 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using UnityEngine; + +namespace ConformalDecals.Util { + public static class ParseUtil { + private static readonly Dictionary NamedColors = new Dictionary(); + private static readonly char[] Separator = {',', ' ', '\t'}; + + public delegate bool TryParseDelegate(string valueString, out T value); + + static ParseUtil() { + // setup named colors + foreach (var propertyInfo in typeof(Color).GetProperties(BindingFlags.Static | BindingFlags.Public)) { + if (!propertyInfo.CanRead) continue; + if (propertyInfo.PropertyType != typeof(Color)) continue; + + NamedColors.Add(propertyInfo.Name, (Color) propertyInfo.GetValue(null, null)); + } + + foreach (var propertyInfo in typeof(XKCDColors).GetProperties(BindingFlags.Static | BindingFlags.Public)) { + if (!propertyInfo.CanRead) continue; + if (propertyInfo.PropertyType != typeof(Color)) continue; + + if (NamedColors.ContainsKey(propertyInfo.Name)) throw new Exception("duplicate key " + propertyInfo.Name); + + NamedColors.Add(propertyInfo.Name, (Color) propertyInfo.GetValue(null, null)); + } + } + + public static string ParseString(ConfigNode node, string valueName, bool isOptional = false, string defaultValue = "") { + if (!node.HasValue(valueName)) throw new FormatException($"Missing value for {valueName}"); + + return node.GetValue(valueName); + } + + public static bool ParseStringIndirect(ref string value, ConfigNode node, string valueName) { + if (node.HasValue(valueName)) { + value = node.GetValue(valueName); + return true; + } + + return false; + } + + public static bool ParseBool(ConfigNode node, string valueName, bool isOptional = false, bool defaultValue = false) { + return ParseValue(node, valueName, bool.TryParse, isOptional, defaultValue); + } + + public static bool ParseBoolIndirect(ref bool value, ConfigNode node, string valueName) { + return ParseValueIndirect(ref value, node, valueName, bool.TryParse); + } + + public static float ParseFloat(ConfigNode node, string valueName, bool isOptional = false, float defaultValue = 0.0f) { + return ParseValue(node, valueName, float.TryParse, isOptional, defaultValue); + } + + public static bool ParseFloatIndirect(ref float value, ConfigNode node, string valueName) { + return ParseValueIndirect(ref value, node, valueName, float.TryParse); + } + + public static int ParseInt(ConfigNode node, string valueName, bool isOptional = false, int defaultValue = 0) { + return ParseValue(node, valueName, int.TryParse, isOptional, defaultValue); + } + + public static bool ParseIntIndirect(ref int value, ConfigNode node, string valueName) { + return ParseValueIndirect(ref value, node, valueName, int.TryParse); + } + + public static Color32 ParseColor32(ConfigNode node, string valueName, bool isOptional = false, Color32 defaultValue = default) { + return ParseValue(node, valueName, TryParseColor32, isOptional, defaultValue); + } + + public static bool ParseColor32Indirect(ref Color32 value, ConfigNode node, string valueName) { + return ParseValueIndirect(ref value, node, valueName, TryParseColor32); + } + + public static Rect ParseRect(ConfigNode node, string valueName, bool isOptional = false, Rect defaultValue = default) { + return ParseValue(node, valueName, ParseExtensions.TryParseRect, isOptional, defaultValue); + } + + public static bool ParseRectIndirect(ref Rect value, ConfigNode node, string valueName) { + return ParseValueIndirect(ref value, node, valueName, ParseExtensions.TryParseRect); + } + + public static Vector2 ParseVector2(ConfigNode node, string valueName, bool isOptional = false, Vector2 defaultValue = default) { + return ParseValue(node, valueName, ParseExtensions.TryParseVector2, isOptional, defaultValue); + } + + public static bool ParseVector2Indirect(ref Vector2 value, ConfigNode node, string valueName) { + return ParseValueIndirect(ref value, node, valueName, ParseExtensions.TryParseVector2); + } + + public static Vector3 ParseVector3(ConfigNode node, string valueName, bool isOptional = false, Vector3 defaultValue = default) { + return ParseValue(node, valueName, ParseExtensions.TryParseVector3, isOptional, defaultValue); + } + + public static bool ParseVector3Indirect(ref Vector3 value, ConfigNode node, string valueName) { + return ParseValueIndirect(ref value, node, valueName, ParseExtensions.TryParseVector3); + } + + public static T ParseValue(ConfigNode node, string valueName, TryParseDelegate tryParse, bool isOptional = false, T defaultValue = default) { + string valueString = node.GetValue(valueName); + + if (isOptional) { + if (string.IsNullOrEmpty(valueString)) return defaultValue; + } + else { + if (valueString == null) + throw new FormatException($"Missing {typeof(T)} value for {valueName}"); + + if (valueString == string.Empty) + throw new FormatException($"Empty {typeof(T)} value for {valueName}"); + } + + if (tryParse(valueString, out var value)) { + return value; + } + + if (isOptional) { + return defaultValue; + } + + else { + throw new FormatException($"Improperly formatted {typeof(T)} value for {valueName} : '{valueString}"); + } + } + + public static bool ParseValueIndirect(ref T value, ConfigNode node, string valueName, TryParseDelegate tryParse) { + if (!node.HasValue(valueName)) return false; + + var valueString = node.GetValue(valueName); + if (tryParse(valueString, out var newValue)) { + value = newValue; + return true; + } + + throw new FormatException($"Improperly formatted {typeof(T)} value for {valueName} : '{valueString}"); + } + + public static bool TryParseColor32(string valueString, out Color32 value) { + value = new Color32(0, 0, 0, byte.MaxValue); + + // HTML-style hex color + if (valueString[0] == '#') { + var hexColorString = valueString.Substring(1); + + if (!int.TryParse(hexColorString, System.Globalization.NumberStyles.HexNumber, null, out var hexColor)) return false; + + switch (hexColorString.Length) { + case 8: // RRGGBBAA + value.a = (byte) (hexColor & 0xFF); + hexColor >>= 8; + goto case 6; + + case 6: // RRGGBB + value.b = (byte) (hexColor & 0xFF); + hexColor >>= 8; + value.g = (byte) (hexColor & 0xFF); + hexColor >>= 8; + value.r = (byte) (hexColor & 0xFF); + return true; + + case 4: // RGBA + value.a = (byte) ((hexColor & 0xF) << 4); + hexColor >>= 4; + goto case 3; + + case 3: // RGB + value.b = (byte) (hexColor & 0xF << 4); + hexColor >>= 4; + value.g = (byte) (hexColor & 0xF << 4); + hexColor >>= 4; + value.r = (byte) (hexColor & 0xF << 4); + return true; + + default: + return false; + } + } + + // named color + if (NamedColors.TryGetValue(valueString, out var namedColor)) { + value = namedColor; + return true; + } + + // float color + var split = valueString.Split(Separator, StringSplitOptions.RemoveEmptyEntries); + for (int i = 0; i < split.Length; i++) { + split[i] = split[i].Trim(); + } + + switch (split.Length) { + case 4: + if (!float.TryParse(split[4], out var alpha)) return false; + value.a = (byte) (alpha * 0xFF); + goto case 3; + + case 3: + if (!float.TryParse(split[0], out var red)) return false; + if (!float.TryParse(split[0], out var green)) return false; + if (!float.TryParse(split[0], out var blue)) return false; + + value.r = (byte) (red * 0xFF); + value.g = (byte) (green * 0xFF); + value.b = (byte) (blue * 0xFF); + return true; + + default: + return false; + } + } + } +} \ No newline at end of file From 7487d3fb046544271f8159050f24609d82e2cce5 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Fri, 19 Jun 2020 21:55:05 -0700 Subject: [PATCH 05/10] Fix color parsing --- Source/ConformalDecals/Util/ParseUtil.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/ConformalDecals/Util/ParseUtil.cs b/Source/ConformalDecals/Util/ParseUtil.cs index 4cbddd3..fcb1ecd 100644 --- a/Source/ConformalDecals/Util/ParseUtil.cs +++ b/Source/ConformalDecals/Util/ParseUtil.cs @@ -200,8 +200,8 @@ namespace ConformalDecals.Util { case 3: if (!float.TryParse(split[0], out var red)) return false; - if (!float.TryParse(split[0], out var green)) return false; - if (!float.TryParse(split[0], out var blue)) return false; + if (!float.TryParse(split[1], out var green)) return false; + if (!float.TryParse(split[2], out var blue)) return false; value.r = (byte) (red * 0xFF); value.g = (byte) (green * 0xFF); From d8087cce3a49aa50006fa1f3d5f6cf3a29910be5 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Fri, 19 Jun 2020 22:09:25 -0700 Subject: [PATCH 06/10] Disable collision in flight scene --- .../ConformalDecals/Assets/decal-blank.mu | Bin 4892 -> 4972 bytes .../Plugins/ConformalDecals.dll | Bin 41472 -> 41472 bytes .../ConformalDecals/ModuleConformalDecal.cs | 117 +++++------------- 3 files changed, 30 insertions(+), 87 deletions(-) diff --git a/GameData/ConformalDecals/Assets/decal-blank.mu b/GameData/ConformalDecals/Assets/decal-blank.mu index a2e687d35e2d2daaf991b61445ffd7b5db30ded6..3c13c113692cacdfbf5512fc19c9be00874f06d9 100644 GIT binary patch delta 57 zcmbQE_C{^PTCUBfxV%_}7=VD!B{exQN7p$&Cnqx{b+Vw4=;Q`2w#nUGLKFLWC$Hs_ MWn|neD8S7O01n9zlmGw# delta 21 dcmaE(Hb-s4TCT~?01^`|N2Pyyn diff --git a/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/GameData/ConformalDecals/Plugins/ConformalDecals.dll index bcdc259b013fd2878083d474adb857341c2c112e..9a4e15ecd4156a552f31c260b1e182fc494087a3 100644 GIT binary patch delta 13689 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 delta 13698 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 A`Tzg` diff --git a/Source/ConformalDecals/ModuleConformalDecal.cs b/Source/ConformalDecals/ModuleConformalDecal.cs index 48bfa23..9b67eea 100644 --- a/Source/ConformalDecals/ModuleConformalDecal.cs +++ b/Source/ConformalDecals/ModuleConformalDecal.cs @@ -17,45 +17,21 @@ namespace ConformalDecals { // CONFIGURABLE VALUES - ///

- /// Shader name. Should be one that supports decal projection. - /// [KSPField] public string shader = "ConformalDecals/Paint/Diffuse"; - /// - /// Decal front transform name. Required - /// - [KSPField] public string decalFront = "Decal-Front"; - - /// - /// Decal back transform name. Required if is true. - /// - [KSPField] public string decalBack = "Decal-Back"; - - /// - /// Decal model transform name. Is rescaled to preview the decal scale when unattached. - /// - /// - /// If unspecified, the decal front transform is used instead. - /// - [KSPField] public string decalModel = "Decal-Model"; - - /// - /// Decal projector transform name. The decal will project along the +Z axis of this transform. - /// - /// - /// if unspecified, the part "model" transform will be used instead. - /// + [KSPField] public string decalFront = "Decal-Front"; + [KSPField] public string decalBack = "Decal-Back"; + [KSPField] public string decalModel = "Decal-Model"; [KSPField] public string decalProjector = "Decal-Projector"; - - [KSPField] public string decalCollider = "Decal-Collider"; + [KSPField] public string decalCollider = "Decal-Collider"; // Parameters - [KSPField] public bool scaleAdjustable = true; - [KSPField] public float defaultScale = 1; - [KSPField] public Vector2 scaleRange = new Vector2(0, 4); - [KSPField] public DecalScaleMode scaleMode = DecalScaleMode.HEIGHT; + [KSPField] public bool scaleAdjustable = true; + [KSPField] public float defaultScale = 1; + [KSPField] public Vector2 scaleRange = new Vector2(0, 4); + + [KSPField] public DecalScaleMode scaleMode = DecalScaleMode.HEIGHT; [KSPField] public bool depthAdjustable = true; [KSPField] public float defaultDepth = 0.1f; @@ -77,45 +53,28 @@ namespace ConformalDecals { [KSPField] public Vector2 tileSize; [KSPField] public int tileIndex = -1; - /// - /// Should the back material scale be updated automatically? - /// [KSPField] public bool updateBackScale = true; // INTERNAL VALUES - /// - /// Decal scale factor, in meters. - /// + [KSPField(guiName = "#LOC_ConformalDecals_gui-scale", guiActive = false, guiActiveEditor = true, isPersistant = true, guiFormat = "F2", guiUnits = "m"), UI_FloatRange(stepIncrement = 0.05f)] public float scale = 1.0f; - /// - /// Projection depth value for the decal projector, in meters. - /// [KSPField(guiName = "#LOC_ConformalDecals_gui-depth", guiActive = false, guiActiveEditor = true, isPersistant = true, guiFormat = "F2", guiUnits = "m"), UI_FloatRange(stepIncrement = 0.02f)] public float depth = 0.2f; - /// - /// Opacity value for the decal shader. - /// [KSPField(guiName = "#LOC_ConformalDecals_gui-opacity", guiActive = false, guiActiveEditor = true, isPersistant = true, guiFormat = "P0"), UI_FloatRange(stepIncrement = 0.05f)] public float opacity = 1.0f; - /// - /// Alpha cutoff value for the decal shader. - /// [KSPField(guiName = "#LOC_ConformalDecals_gui-cutoff", guiActive = false, guiActiveEditor = true, isPersistant = true, guiFormat = "P0"), UI_FloatRange(stepIncrement = 0.05f)] public float cutoff = 0.5f; - /// - /// Edge wear value for the decal shader. Only relevent when useBaseNormal is true and the shader is a paint shader - /// [KSPField(guiName = "#LOC_ConformalDecals_gui-wear", guiActive = false, guiActiveEditor = true, isPersistant = true, guiFormat = "F0"), UI_FloatRange()] public float wear = 100; @@ -126,7 +85,8 @@ namespace ConformalDecals { [KSPField] public Transform decalBackTransform; [KSPField] public Transform decalModelTransform; [KSPField] public Transform decalProjectorTransform; - + [KSPField] public Transform decalColliderTransform; + [KSPField] public Material backMaterial; [KSPField] public Vector2 backTextureBaseScale; @@ -139,10 +99,10 @@ namespace ConformalDecals { private bool _isAttached; private Matrix4x4 _orthoMatrix; - private Material _decalMaterial; - private Material _previewMaterial; + private Material _decalMaterial; + private Material _previewMaterial; private BoxCollider _boundsCollider; - + private int DecalQueue { get { _decalQueueCounter++; @@ -171,43 +131,22 @@ namespace ConformalDecals { this.Log("Loading module"); try { // SETUP TRANSFORMS - - // find front transform decalFrontTransform = part.FindModelTransform(decalFront); if (decalFrontTransform == null) throw new FormatException($"Could not find decalFront transform: '{decalFront}'."); - // find back transform - if (string.IsNullOrEmpty(decalBack)) { - if (updateBackScale) { - this.LogWarning("updateBackScale is true but has no specified decalBack transform!"); - this.LogWarning("Setting updateBackScale to false."); - updateBackScale = false; - } - } - else { - decalBackTransform = part.FindModelTransform(decalBack); - if (decalBackTransform == null) throw new FormatException($"Could not find decalBack transform: '{decalBack}'."); - } + decalBackTransform = part.FindModelTransform(decalBack); + if (decalBackTransform == null) throw new FormatException($"Could not find decalBack transform: '{decalBack}'."); - // find model transform - if (string.IsNullOrEmpty(decalModel)) { - decalModelTransform = decalFrontTransform; - } - else { - decalModelTransform = part.FindModelTransform(decalModel); - if (decalModelTransform == null) throw new FormatException($"Could not find decalModel transform: '{decalModel}'."); - } + decalModelTransform = part.FindModelTransform(decalModel); + if (decalModelTransform == null) throw new FormatException($"Could not find decalModel transform: '{decalModel}'."); - // find projector transform - if (string.IsNullOrEmpty(decalProjector)) { - decalProjectorTransform = part.transform; - } - else { - decalProjectorTransform = part.FindModelTransform(decalProjector); - if (decalProjectorTransform == null) throw new FormatException($"Could not find decalProjector transform: '{decalProjector}'."); - } + decalProjectorTransform = part.FindModelTransform(decalProjector); + if (decalProjectorTransform == null) throw new FormatException($"Could not find decalProjector transform: '{decalProjector}'."); + + decalColliderTransform = part.FindModelTransform(decalCollider); + if (decalColliderTransform == null) throw new FormatException($"Could not find decalCollider transform: '{decalCollider}'."); - // get back material if necessary + // SETUP BACK MATERIAL if (updateBackScale) { this.Log("Getting material and base scale for back material"); var backRenderer = decalBackTransform.GetComponent(); @@ -319,6 +258,10 @@ namespace ConformalDecals { OnAttach(); } } + + if (HighLogic.LoadedSceneIsFlight) { + decalColliderTransform.gameObject.layer = DecalConfig.DecalLayer; + } } public virtual void OnDestroy() { @@ -601,7 +544,7 @@ namespace ConformalDecals { public void Render(Camera camera) { if (!_isAttached) return; - + // render on each target object foreach (var target in _targets) { target.Render(_decalMaterial, part.mpb, camera); From 5fc9394908b6b4a2613c2930a36499aece34a0aa Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Fri, 19 Jun 2020 22:45:29 -0700 Subject: [PATCH 07/10] Enable selection for decal colliders in flight, change layer --- .../Plugins/ConformalDecals.dll | Bin 41472 -> 41472 bytes Source/ConformalDecals/DecalConfig.cs | 2 +- .../ConformalDecals/ModuleConformalDecal.cs | 8 +++++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/GameData/ConformalDecals/Plugins/ConformalDecals.dll index 9a4e15ecd4156a552f31c260b1e182fc494087a3..c43accef8fc9478c51838114d30f0deace3a85b4 100644 GIT binary patch delta 16695 zcmcJ0d3+RAw*R@ex~qCiZ|QWWvk<~sbP^;9VON7Fii#!!G6WP^TtIv_B#2@XI_(0Y zh=xW+HX$yfIF1``IHMyDJV{+RyI-#X`e&pqef zbC;^R9XfW(j-B$F%N^^Eso&qZvPAys!Oq*Jh@Ub-40JjkAex*hmz9|&F;L9Rq(v%T z`yi>$aX?8<8Zw3Gg_%Sm6IwrfTZ44VXrHpO4vol>s9Ea3MJ9U@c@mkV<1;ZVGs`(x z9Gws$6C}$B!Z=n=FMFPx3rKJLd!q$;A8vk*g#9)xd=cZ}iWH90(KxD*}Je z9JD+0USMJ=H(r{^u%285fJ<&i5(%kjAD@{N9G)7w^m4d1R{&xr21G9_JAL*{^9tx4 zTw>R_l8v}Hxe`($e~3m?$@(l!v)PaOK$Nyz3^{ofVCkh6JAm2Cm|ex})fPLL*=r!j z%ue8j0g{nWYB=hh%}GJwRH->kzAAM2+v9#1?LGFYv-$MzR92kw$XC7ycS?q zFjT9i@W693J<;S^pls#QS42z^|JHT$H!#cTIXly(S*b8Vl$n{IKTgGN?e=ZC%JFRl z`*+_tSTBh3xmTgAk38P$KIwGO3fAdnG`)Upvoaue5S9Sc2qJ;Z!x z#h|d$+^pDf)>5$+&v-W3qIe$bWCQa=VitzOfH7p zj%nq{5*ILWj56lDRz+is7za-~D-~Wl zdpCl~nUzT|JSA@i>8Us^Oy+MPc?~rSlea*wJkCgBGI^4>X7)u(#MaD@(ZT>b3^|gw zfk&0!W%|eJQny2CehO1Q`FltRp@^5Vgx4nC&Jx%ymBr^-BF`qsW&6l?Af*^SNAeDM zG-NA=%#vNQ75kngyJahO3`a^Cg^*M=>Rh8NlJB$}RGzgIsllAXzUEL9Oiko`J*3+l zvhT4tLr>lXWf4YN^bhIncSGqPGTQI4t|7fCZE%!oBwcp2#YGZde zO!wSyu8>Q%DXu4++sF;)vctLUaPE-n(BbT8oQ29oa7me$3-eOEI`cgtbhJN5?up`s zNym{PuX#UPcwMNP(p%Yab@~n7yR=hlS zZakkIFVBvb7xMj5yv(EV601}GkYBc8yUXoV08=n$sQk9yfbBOB^8b=wB!L%;_mcN5OZMNaSoWo{BO|?#*RtSk;V}$$|p@7InfvqPXVzwV>-hjw@h2{%u7?x)tg@tvI>SFR9 zFT;)>3vg2tVMjm&Qc`8k+>H{IHL%j;jI}-oa4VdirJh$5V>k78MKMlScPW$e8*-?@ zk>(3f%;PckQny^0FEWFvq)Wry`aDIUDQY}ZE_W+?GGELTl$D+Q5=3mG*m`k?p8)iQ zrTH>QTy^tIHhcx(wFccVUxkuDuJSRf5tD*Et9vSDE-5P)FJ*2ntBbM|Y})~$I&XzA zU&?%177;r$&fZn2*Vy^%0JUjORk!O99+2~~=f`Vaa>u6Tx#KlYMsW|G6_6pPxd*o1 zfEHCkm_p8|$v&n9v{*M4v#6;7t+1Obv^ifu*j_kn=I-8QDRvpAXh^p`$*iYXmYN!n zSx<%C99jXHE5oPNovVO9gFMnV!oa^xxB<~Lt(Zv-Qi+3GZoRY&5GK6 z>FHiH+hepO8zNhir>`B<_SK{kZn&lnlhH&#^)|&BD73xwbT*dto0IWFM9;P{H+t4r zPjs6(M0DKI5Ix(gp1x#C%Vo2EP8etrT#th(X8K`%*V2RyC+t6 zhH~aWx3BK8$ol$)=!LOVcIsuPS@($M^!*Ugvu(_cp3P8C^h0Mp+jmZUN-d%8%xA}# zXI<7T+tZ$Tn4Mu$bH_cKq5o^U#_ucm5D3xdl-e`*zD-41GrmyS^iS)k1y_-93kI^KUSX&E2v4NRZ~6P|FIFZ{gyJ zdMl3BjrBfPav#*np|0fHxc1nY|A1Omx|DsolKY{!B9Y`fxZcdZlJ7z?VpF|_zG`00 z{kty&m-=~ta}fZKaw@>7?n4GRMg?%I0Lg#CXJxecT|CcQjC%QP`4{Mma_ro{&=3z= zvMOiHcT%<4kZ(Pi; z0hPtgGu*UbH)(0s1mnk0&ZHS>Gh zvn%;SX4Rm&)Q`~Jz2@X;?%qG4!s*YqC7xm z3`p_h<5b~Er4LbR+%&5>Ms$7HFtde5Y<<|(qZO_XySp_lWMnIHi?om{t8$aIkUOh# zVz{~I;H^VPQR;FKp8lo*xz|k7m8q)e8@Uo((gP-5Th#nMM%B`p3 z#){&RCvdN(mi0cZoh5ZbAX}BV5|)WkvQQOBb33aXa{)iRww;*yw4!&)iwGBKvh^g? zm8~ZNO&_Ra9stJCXjBbn3)=2!=VEC#qk4{?i6FJ+!5&&*PC?0l#Pyne@ak6zzD~{O4E`-+q8jAd572NxJX{ zm8Ay6Xfh1eBBa@Zb}L5~p^j1U%BMb(&mOaf&ou}6`BL;InXg*KO@GOk)OlG#^P>@Gl^i_pQwjC1g)lcUg9w(@N!21%vEGDpJB^CJ6&%G~0T zakeSJ4%PlEctq3Kak7|Myf|01Ps*$s98Vq6Cs%;a@xE@Kt&=Qj?$4-I^JFVqubMa5 z+q^cXkb_luWlIU-wX+iSR2(Ul8+|>WZS!H+WJ+<4*nz&@NS4CZI6sUX$mgmIxLTXQ zR~pjQ&Z*I3Q$09~vVzszpLnSGD}pg;OIS5m zL&*-Pnnoz#(Xk6u{(7N}o{9)wZ_6Ng@qXJIS7iaNJoDvYuCHtU8rMG!X9>zdT1G5ZC^XMyiAJ>veOiJ6-qErYy zfhk@tX(XIsCp_3$dDeB`Oj&hd=93}C1v#M(Djh8vGt;XpfXk~ZMM37?YIC4H8iv(m zYb~9HIGAD~&8+7{_Q9IUXf@@cU#5S}fN8wGWW-urk#;rDtzkgc33JeHUee0xz@Ozb zXCh34qe{c2@d>o9(tLAGU5aN#_wIAFA9?DJoLywCq~vul^)%lO+9ojey1ue6FQ2c_ z*qr5~8sM!kF_=84{Fcvysv3~zt_-?cr*i{bZcR^a<`xLETu`Q|whjrpx^^^9o_5v7 zC-6om%?n_#)B}6X+WA&Vb1_q{ZpyalAri;iHa^QHQ#Eu{o!UvQ5wjCi@UsMI$%Wh) z%sK?FdixE37{5N$Ml<&e4X4zO*u7Dn2EV+;oXS_+6=dsFNahw)Z|5@XFsi6Vwz8TW z0EalevXp_WER(G>P*R1BwZ}rXoz8Ad7|c7^;zT%6^=y+t$^=8xU3q?v_xUYDF(8Ta z>==gRQ(!$|*G*)uu1lnN_G!)EV>nGrT77_Q<1T2;I7sMbc$#R-<xZ@;rpIXO6&nXQ7&1e%9|PmboK@Hrz>xVLLoUd+vzH-;6Y5-`CT zoH+znY(v(eto5r%6KKwOlll=>cbL^|Ygkt=9P+T?Co&#Uskf`RMmskM+oXD`?8KEn z%{QSdQd_y?;8lawj*}7Xbo{!}{1qqcYhL}jS%WwUY3&7?R*6!afpwR1f)cXXmqXPu zWe!AbykZQ6(%;T!tho?oxsk1Rmc$KqqGOyh zl;SdJQS-d>&c=-#dOgvCAh=T|(TUhXAX49BPnm!tK{^%sg_-k592P$Z+Rgahg|EOD zad^j~Gcym57@69QrOqFn8r%yCbo!&h!#ynTb?u4d(=`QL>U6&r)M>NA4u$C^d9SQbzje&Ty&W zp&AF#bm|k~v)ZM^%s=u877pwx9!jF07Z843Lg}p$E`1g^2tUmzEH(Tjf{g!AwbB~f z&(Vo~L!H>9Jaif?Jv0Q~Zlv4Ltdxg7RFwzjbG0XYjBR<0`HG34aeg|ofN`Lo@e8>2 zQ?+C~4k10X8qE#U`)ImOJ3{jV9=bvW&Qrlo!DE=8#=x6S@gVoR+F*Q!JDkE>2^aJV zb23|8T<~6;u_14MAWR>@sh`$pj1yJ=mch|?DmOZQpyQk^1h3P4=X~UHo$7#BHLDkT z9HtkP|NruFvv#PQ)faK2|A6dbXxb%TmMdJ1M0w~>c&hNwQJ52R#9GyZ5yi}$rR2RK z?oFPHU7VB0X`BHZEk0NLcPcl#5YkUk$9RnQR+W!WqwE1&A#G4T{j?f6ewN0jP+6xo z^xIDxyzI0@1$zXh9{SPGc$1o*X_d5a$=D9fqTskW1G2-8S&=mx^eEB%0Z{}}>U8g4n{6!W3sg@N#BLqRxyM87wN(b3_0F^u*J#{GWAMPA0slzeXq%jHFk&OAl~Ok>Ae z-bn(RN`Ub`Z-W>>)8d+|oOsqPnR&WMKQ}2v&_rPLd6{K=UV57nYmms z!wY+(uIXhDn~Lkf7pYp)oNUui`QM{_uJI;Ppq8u3eROv8c0qqsdn=#;FHpEi;S&n) zR=78B5K6y6u*QyILC(x#gb7g#GA!uq*kI)0ec1pxUNQ{w_pldK=4X5@JQ_HtpdNUm zHq4c(rlVrVxT>ij(g3G>;X)@pG8ytuo`i7F^%x`v{isiZyY1nrsP?&WDzH2{6L@RE z8Nhu7^MJWwuJW*-)hahf2f1S-RSq-uPf^2=G(kN->RbS*CS6@2E)=mk1-FM@97;8I*=NOm_fQ&R zm0>6f+;ueOaMdNcJNkiRI9+aQC&kL#Bj~MEx0)wMQsohB+DVI}{oSMJ!*NPei}(l< z$FR1RPW9EfkDz|G_EF&x?xSe5t$pb~)_n~9%GN}@!99WI+FHD@$$cWFY%M=N+ucCd z9)o8;cKSnnzIzhgZWoS-FLM8y9<#M2)b5@}uiDy%!pq$==o4ETSGd|ei}dl9mjUt3 z?lY;x*507o+;gec*6u2NzmfshyP3Av+fqU&@Q~m^O}1x1&_6y zzE=35yOn0z+G6^_ouZlvT=qEe5=~Qs(w5QbSiTq27F)X;OYLI%+|tylxR}K8Rz1^k zjq746frj{x)9jL3aS2UOh1QO8DV>pHdMTxBjV&*uTXHOy(Vdp&+M^G`Vtl~XKGK8G zp0nx+4!E3S;HLstw4{Ysu!|Az#zOc2o4G*;bID_U072zM`m2{laQtygtY{Xa6T}pjd zj8j_cL}f~M;>7<-y4}`z54@5_oMe^7OM{*(>C$d3>RCyUTo@`nE3EC<; z)zQ*HW9U`JFYMwe&Ar z``S6u^BdaOXjy*k94D@$&u#6ol6ud2isBRky{9&By=McBvbEHIh3h>VX`-$2rn`ye z+S)UDwPF*!VrgoauBQ(y&9%%p#&bP=VQX&O60fK4Y^^X5gchBo0=i!ECG^dBXSTG} zan^>|+FL1A_$yo8qzV_=+C$NW#%9Xc+LKDV)7E$lH`Aj^dz^TBZKj!%IfONxx6r#v zTSnuMr!M-$)(Z5Io*Rg8KFhf%&{M~IZlt+N?WEPlWY5jy#K|HGRex_`5$_7DEf!hr zak10!opY;Q_PF?yW4h;e-P(PQd7e9=2|VI5-lj7i?qCcWJ@Q7p8sh$UO9@ls13$;| zeE#eC?ReW3R0JDIvm@M;VK@rF-vjxX{~?e0g?OmfXoO_O3Zq=p<9HE}lz@#mNd9LL z^Kqb{)O@r^5>vu351*<3K%bB^ zjgEJ5Mmev}U&t$Fp$i+hpt(MY;jl*9ntIkW9IGa2u58)-J7e*?aU_NrqlWBY3BLy-4IGmQGO->d zUXfV7u#n}yVKp7x)t+u^)Phy!fTe^D`;_!mJVd3!P5ibK0y^DF z!Z=pp1ci+$b!k#KOW{0V0WDPW5`}4C5pIiIxf3YpJzyUy7c7rdxK-gG$;>)s(PxZFy=!R^qeTrZUSwA*N*oE*K2_L1NB04QY zl6yZ-4OWvFUtpwUTAUQilTG3ec)SUTop`3qxAt;;9OO}v6XgoAsdO^%C!-0B$2Al3F2`KptoU45Rz;F>ot%pU zo_V5Q;RP~5E)U+rgw9v*anE<&G|z zXsmLiWw>ySqfr!uH#&si$(REjHo}G%aq$i)UJ#fEUiRm=sL0aw*<0 z(_$swEYo5N-YC=Jbi7F}5z~XWICyg1;aDQh44#Ndca-A?OhZlZH00&lX)RarDi-Y$ zF*^JJ5_?tfNk^yH6?_x5YSrZJA9~Y~7W_iEL^K6F&L-`zk$Yg-6u2NISE?j;YQsxR zXIgvHSpz&!Fxn~P9dZE)c|P|{`?Ta3=XUKkc;^uEdC$qtl}Pmz;FOYDm5CsBw+B5l zoKI?FU2~jkR4$)`yvVsx$*)4b%z2ZNZ&!G)!qgz`b-K&>N2LtXKA^ukcPg2a`A=tB z=9luuvcKeG=L^J-fnZ|!dRi{>73%D?6!N!ts(p?QmxF<=3OD&!zBe*hUrEn;sv*A| z9|g;Q#E$|t6bY zs~vuYxPo7lFaugpsuwK*{vC%%duWH}a$PuhaW-O8OCVUdaFy;>%pUqKwnmRTjxE`u z@1Zf#dw?mPR(n)3_h4?nq3_4s{sMn?x8CD2_N$q^M#c#7{5pZb1~UE+>7;}q{gV=G;6Twsh zm_7>At#l`Fq5R3{M8P2AI{cn7f^IQf^ff&L{GR@9;C3s%0*{j;+;U4HOWXw+M*@9x zxOfHfDUe;bd$7C^a+uCn@>NRigzTa<3a=BXy-+raw}D&4KY=%i4}rIe&ro@*s_=VN z`7cU-QpxWq`8_3%l^lK|a4>#V*bB_3`#gj3yTK#CzO)xuLGJ=<>3iU4h2uzi2jh2v zf)p;3C;^8jX6r5qvRVYL+1v@2@bzc zY@nBXLNd<5Ywup8L*7WAd$$0``*whbjY6TZoGMqBu?lA?Oe^eCxI^JSg~GuV$`y`P zI7?w#VVA-k3il}#PGzrftio9e(+ay3?ntT2K7~TxKp*&o{yRD|ueZ* zQpyg6`xFYFs-SSJ!bg2K;)h0opVtWIvLkVm*+PG&o#I3Bu)JE^puMH_b}VpoIUaEQ z-SN5OM@P{4hEvlg>3`OD>3K%jC@~Vo5M#8_V9Yfx$N4!QO=~!2&aC`(Bz3O81<$Y# z=3fXL9%uue?&$!Q7T{0MXiEMSz%?<(`XFORF=M5d@jGlqL;=azSK)!;YaoB7v!A8P z&zA67$RFoz00#Vw?;2ge!@|D>=GC}v!=*$8e&5G|Z;3PRS8|t<--+G{=4pkfwykk$ zsYpGqy{i4B8IEy|>5g8`bDXWtmCm)!8=TvnyPf-;UpiCz`}$A%)CcjiDmgm%c|P~k zi6?)&^>%-*H_pZT=g&VA@%HfZPYsU(QJ;hO2^M(}cXB2$ZDDGHs1iwvI3A+~xVbEF zK1OL=)3~n2bv3S=aNUIKZMfcs>keFZ;Q9)#uQ>DNnR=bP1K&sV1N4ag1;q^fnJT{T zNQtjQePbBadj5q2bEF=lTW_^w&fXO6xD0<^oW9vhGMwIO{mVSO z@}WU@dkezp`((IdU$~>w*<0k3pUu<)1mZpF8mL! z^o~&aMR#ve8cvH)`c*ecINyPPnM+r_==dz0K9D)>>b|aT^xi^*I@WEw>gs{+TB3r6 zNmrAY*dWov4t%FRfbTl1yNo={I6a_&_`ZU&S2FKh*Eg77`nNZa_Iy0ywhdp!*WGo; zBbmZ=Ej2dTl(0#-4s4uOJ>tB!liI%R9lUlR=1%rAmgU}^jLU$Ej*Q|{W>geh#+6YsBR*FgN6`^P-}l_AP8yf@d+(3w5B;sP-E;0e z_uN}mw?o@gvh69k?pjyknMu3aR~5_e9&W#TlDNkbqObe@hltLy%4L-`Mf4Q`D=kt5 z?>tQEa|%$Bn_`oQHqIatR^x^tTPH}bjQ1#L(}-LZwM$&M$Yc*9Uj_AzrH=&FD;-H6!Aq6%rNOkGK?5A-+C zDVJ;+Y}EyZ8AB93#JU1BdItGW>p{@N6g|v32zt1phg)?y$BQA>{G8(r9*AriVLg&l zqedH*-{ti}syt>Z$B!c>n=C;~Uvdthm2-lQScza?`0&Px+1)|2xAaLIj2A|aKnCs`B2Lkja`3wJGfEdrRB5k0vAR0ZbGdLrCI zthC+<=T%(?(UMgF`JLV$HqEQqdJSOyEcCcdsZ{dJwN_cADXQYO)Uso=)w$E(N8%b^ zcSHvKP;Dr6KKh;?9U)^a9Ce0IZZ9x_JT*-E8W3(|<52qC}(aKlZwArA! zj?p!2c|E|aWT;Vbc{rKCaw~iO8nIdj@IZR{Uh6edwxH84Q%RZPbd|mf*P;5IFz;U#$s z$Xs`2zo^^XsH7*@%F**gyTOp}_;q4_+_jmCCQBkrCf_=OiR_65@ zk`>}uG^!ewRo`}xNtt)aV4Rx{84G8GKxXmACxE8I-4dJ zfNmYbjU2&37ND%)h0|Ca$1-L^iA5n>SfRF;3Mv{P={_XWM-;KsQk^54H$l+KIjZzK zxw;LKx~w8h`r#>gJEXqKbE9P50m`pt&X?Q_y6O}oi9Gs}cUni{#pYcgbG-JhQyn+F z%|+;7E_%m7BCh0bp@)~>S@ns!)D|#J&!Xs)cZ2dtQwd(p2>g!V9~l95F=g@Zj3CDm zkjL?n>q1g7fv)5|@My@EvJCB!E!dB2xmULI0i9At5p+(?JGUr}<+^PLRTnS$Jp^(w z_8XTfF;&XBdPH|*$g|Iu8G7;$VCG|r#4!=Q^?mmMU8lFOQ!pyM~>_zgvZ zKj#-C=SAb93CI-IKNgKzV4@;xQ}I=nqL??9s%ccqQf=|cZ4hY55~QLJ^tW!kv2eT) z4_faPo#B0m9rws<8)c0wE=u7E!&fm_Y9>lYH@7o)y2H7e9|3DV%CZGb&!WO*66@J# zB89q4{t2XJKBly?We2XuRJ;1bD%~xAR zNwFtkb_t5T3C*0%>gTMtOG+}9qDSx4bL;^_`$cAGilE#9I{jOfHbp`r?zn=jFC;RK z!TCcXzgriGYM7*mYckX!q8Lz=i#>d^1B%FC)Fud(WNfZ7`;n>SnMmz9lsgKa}v++-q35qI2V z!>J)H(IraQqRAmGze|?y$O0h|aVx3$y7gRHdCK+^kLZpcnemgzh$e?*#!r5i41EC2 zjp5PmO^CX^pa57GqAV{c16$VZ1%0@zyx8eOer70L;S!EyGNNU=6?aC`J-B#gyy!_L zM5ZNIq7&5dHAUsr@Jt>o;}sz_+7xFp-|^Bt*hI!}R=$5CdZv%r(KEifqdStHh>m*` zqGv|cJ@(9uWk=8W?aszeMbG%^j_yc)5Is{wsUK%Pp7EQN`9#KVS6OvsD60m#e09x5 z#@Ek8&rhT>rI#tQt{Kf5`%gsA^f5bnCPUrPe>(G-v2)^igPGbr@0mH~s>_&VM%rD6 znF^bnJ@1(e{l8}3c9P=gUG?qsH@oJ$s-r9OnQGdM-aY?!AET%WtuCEU3MsAT;-ZEzM8<9T#8RUwNW#YzTOgZ-cEGGF4*dlCG69a>;&V9#ghNP^-lJc{3j?QG1+hEYi8Fzl-i58haUyF90Bk&rUFd& z{$zlYQ~<9EkbDn5tKv=X;{nB%s5jQ;{SaT7W#|2IM?#sNtf^QjwdDJj-nVD!eRk)U znk%^kR70X7UNKc_vG4T%4Yv6MfXi*>;GLvm5{$CtW{{<}@rP{uk!>8xGVYR_;cnxP z+4vLNxNjuOx=Ue3yRB#9hS>b6^+Ml7>Ql5aW8ErVw9N->M|oL(y5wfO+xRm!{+Df> z$TIGdn|OT7jOTMU#)AzHz93`l#prE?^-FU^iVHs`O<}0KZy#tgjZ`KDIoI4anO)!MBMndAt|j56@5}%bethP zo%F;r_n4`6cZ~Rks9|Q5Mq)$M)6L~?hl=nBfMoAAO1p^D4KEgzMlGj>omDT67u`*qCCGQL6u(J;W znsguDuUnXxEqFY|iDYTnxvfm8<0xBbpS2B_`AQ+phhVRIg1rsz%%@p_s zSaC7ldYC}R`C=Z&emQu>t6H_cX*dSf?6vk)6{nQC5^6PYc9df~@U(ajdF1Eg5u7&tOw5jR6{A4_2Q{gMr*&Ao{^J%^@^sWly$xiGe-B6;FmCwk6VR z#<-PZTTsDH@s{H_JsbAU;co3wPFW#a7@L;yv_+Il=9d_Nd?yAA_yuYLUw6qCVqvscq#_YE{Qx)c3rfvITAR>j|9e*xm2=bf^CYiN3}M<1YKjx zWC2S{Sb8Q{Cq<8AEOG22O`pJvG=DNq1Eo};lLK9WTG$0*&-#IA&1~7iG1tuQ?{B&> zOKJC2HW#83t<1!Im7}C`qi^5?Wj_64x!qphU?huRYFrV;{uD@gszRQY$xv4r($mTb z(-V_@IB2qi)jm}5Xwz2+_cJ5-QFM%+Pvhob^w{`uu#iM>T2zZYi?N}0twFHKvQGW)YyD_RY=baO;cV~6(&nFqGp7cU@fev1m00oC33C3HD+IDCJei~_F}sjF;H_6%^c0k ztS45PRa#pvdRq0heWvn?lQDa_#adP6+fx7qp(vfMIr;4SgM8Xmpo(A$990<}jgO0U zmExVXbt$e0XDRxdP7ESPy^yaf?X{J>8K%Cb-$U#OFz>p)suypuU!b#D>q&LMUuj|@ zc|!3TuO?J=Ajex3_O?vr4tTtpp4`Me5N4?$>xzMONYFh4N6dVXtHx`tfUaVVG#B8y z#D^xD+8m{c=e=w}myPF#Hr;}XQyo7z17knd*g?aqvWm({THX(mrX}Zb2e}IG8&s20 zJ7?F1IvuWf@0rF|+^b~EIiSqj(4v)f*m;zyR<z=xb6c?e^ z^etx9#Cp~H$i+MatqI2qT@tPqt*K|0gr`qy8r&^W6Iva$U29FZ>u8NWu|Lj$)^rNn zV!zX?64**vrjq5!WXqa9xHPlIc`!~L#--U0V^rB}IuAaYE5LT&c-6QoA?msn&p_j3 zRkoy21v?*TRzsc~!Aap$L>5&H$F!-un47FagY(WbVS+<8vp=rbiR?pI`*)8i5Oc<- zs2@Ldmw7DP8uk^B`mH=|_z{d}RO+oNuF*QfY8+B@(XWnPCTe+W=i{e~rmr|N2hpc0 z-5dai71Cb&npOoZg}b$!i3-^i$P(4C$n49@MN8INokL>Bc15yZT`F$RN})6dqJbK? zLpEByhYmQ7Pv(0qA^HH<-PlNaO`P8}d(I`z*j8xUXrj4c$j+Wfy>X`iNxgn?_E;R| z(ID`%toEVD7R&~BC%*UNEAT}e-jV1+>y4qqQcvKyfGuk&eM~>^*&WNJ zwmjAz^gJ8ZX|0!WuELm)>D`LnuP~sn(^HSOk1L!AiI3FpUDVeb3Fx%h!=CGLT&YuI z{{p;MA98Kh0o9K%PoE~04^jqwi%ONb>e=MpTw^dp^gKE}C_#^cTzq?==` zeH@#AkWSCfF@p4Yi1DAQRa#^Fi8|3ul*WeRqw%oxQ5n45K^uzsc$)U9#)({Rwmraj zc@CqdBr$X@NXO&9&n2Or4+#^Cv&EU6>k(Uj?S4DiqhZVG)OmSjK`_*Er9)Dl^Y$u zwsFoHA=l|L_cY{kg&M%&1a~Wl5l87MWJsrT1Kh0#RL%wzvi2Ti*GH*V$(L&sE=8hz zbRV7=d~^b8Vy0NG(q$I0WRjwvkML-Y80=zd4yW;S;0W;#B|ofk^CyH1QrtBd^Sxf> z<6S(1`3QR)-J*Q%p&GQ(>GBjt9Hi^~>@J|f{24|*IuK;stO|3UO4s5jXC)`WcJ!izngSI)s zI$};z8oCes>39P;4c{>RIyW6}#gixbmGZ6_E8P@Q%66FcMxw)t8&<%&2o)*r#+-Eg z*XT?S)y^B}2sY5kR6|~b_$by9JP2+GbVLsYS$7J4VB&zqiLVQPO{da@id$H6Z{BE1 zokp`1yI!&5=rT&f^kQ%YVmuxox#6KOb7xSq;!I_E4z;W8WDLSI&;@imNl-^n_n*^D zhr=y^+~QJjc%mabIMPA7l-q<wMx=AKkCs_l<#NPt1%9p3RSbIDr8Ir z*sYu{Q;rs@#xLb1V81tX5QTe*!qp15E9_ACd`=N;zCoCVwmxCb(8cf{p_$0EpmP#s zcsKt@P5_NSu7ja?a(R&WZz0RY}{gqB|ujAx7 zmbqm#qi~xiPO}_t9=LoOG{DwUXJgrNtu;jx?pj>Qo}4;oizb6?<4q6ZBc%G`4LD!SLxgKo1qRY;{& zJe+m*oRv~<#ob6(2VV1(Qmw;Pf=iXtXovka_cc#1I^E$;ioD}FhAvQCJ56wXk;0rVIJ@_j`4aX71haODaYZ?E84CdOGOT+`|IQY;$Lvt zGUVT`4WOY8_o=9pH8fpuY0uYUyH-P~Hb*IBovfwJj?yo;Yqj)ON0$fPK>Ebdl|na= zf+Ot^&lSbwAc`w4?ddEc?;t9(b(jjnTSsNbDNE{zzwR1Bmpk0?iHLV7J(cQWbL21z zAJ3-kba6c49Zq}4C{C@{<7xki%-u-i0)4&5ljkIx`+NQX?+H}uaPI|&c~7Fj4)=Nf z3Er_Z&f&cIr+LTGOo!77&hk#6MJJ_fH=h=q>zzpJ9Hm)svG*Lh%i$JL(mR!QINWvl zS9;H*mmO|k{xWYPedKWQf_CpkgqywU=-af>JBtzycU%4z@8wkOa0h6cH%TX+jDs#7 z(}Vdtz0EY;QQqL&?Oi}$I^47QZ+lzl#9!D>7tm+k6vf9fw~Kg*rfHDkmeUznzDsGD z!*yV(Eu~j&POXZiwBKoGx|VvD5}rIb{w_MRc%Zn7s=;P9y=8QY;&u_6E~A+a$Cg*q zby=3n$+9`mZoMBC<1G&NcRdX5LA#w`FW0bpe0I6n%eC||>r%8#^=$=x;WV7;OXw@; zu)|&IbJGgyfm30w=T*^fwUuN#+?zSW#Y$T2aEBGQ$KjqdzV@!9*BtI8<6Cf;e&wYo zdPH7FRfap#X$rgR_9$FHMx4##`obyR%1t@D;h-*q&ri}Uza z(Kd(MR^sukrf(hYK5%Pj^ci-$ypoV_EzPjG6rEHO_qEgIj&d}V*V8J8n_N=tyMaD& zxQ$Ufqtc8Cwws{4x9>*U?Qs8bSNd+Ewgy}GANLq>Grj6?e=M%`ZJMEpK}I^-_T<=r>5yv+GBH`1;!BHt@N71eG}|Qx6(Tf z=LvL54aBp#RyTs$J@xFVyxCdR+eD{G9c&cUGpfeulV#KY!i(ZAd zLEQgtDrOPRhkk&OT>cC6EjWV1F$8QRof+e<^ugP|i-reT{%H=&=fST=LnTY>Fv>OU z!n41mLfD9-=+_Ea?gip;a~gUiiABP3aUS|B={(in|C!e4PZ4gLZMk20`^?Ak{{ct- zj8T~y@g-_Z_bPWsR5ERR9V3=>y484UBDGErhc&t`7!JGWxh`)~WkREMUCEcA{|lC> z|Ay2551*<3!kCaVjfQ(Tqnuaw&*T+V=)ne#r}luvbl5X(m!4gQHL6InY1`(<5?lTR zPQg$yYRZnra9GlyaJDuhIW1H3_A;C5W}_12;-(_5l6*f)cB@skOwkKfCE1-jszcV} z;}WSCa593IQ>;fxOVt2o?m=^dg06U?Fac+_)Vm=tE#nDi=%- zQ@BN8Kgp8y%BDeni#v1x&tU^;C#}sp8CX~}9+D9LmrIQ53oinldQDym<`+eCX^P~x z&qjH5U@5%_7uV1h;9B5vxZFb5;C2{LuII^4?QWVUPmJGBo%EgmVOk_-g&(7|{4&u= zE99g2OAe+FkPxHfLEv2}GZpRFcqiWr<{q-0tgpU9C@#65VRiHL1@zK)3B02hgt;zHmU zPfWH8Gp7&eL9r^(O?J|Z_33T-4tyg;0Y z?Do+fk%l%<8>b{^DM^DEUU-PwQ*uiFd74)|lk27vk?=m+Sqj&SH-i^y^$4>-jMcvP z&DI*^+TtsK@1kO=R8=>K2XN@&6$gEJG*)vPu+iogtq1Ct`77xiL~=NZj_Z+ijDHy+@b%ul--ggd&zg+myWURsRD`)68A#(QU4titGz5 z=w>9gHT;mPUHmD$8?Ab&Qq7C(cBKWs{w)$?LtkTf563paa%^a!T%~fnLhD8M6WlkbWIhAB(Y;a8FM@7zZ&vj06>d}5PkW1g<9^JcKc;Q&)KiM#WWM4~ORa>r z5mdGN72=0JND`!{<%I#a&Q5)xKf*KYi*%eU0=6hz9bkHMtVmx)kNbLn{!2k$SiW3v zEbsyx74;MR?$#hy<&4%p*E;de^SSmh-gO#MveKBKd&T3q3H=+jsJQXD`Uo3kNI^7HsV}1wAZn(|fi1KMcol8%kHH)09%Bqn0QVR(6+KhYcaTNrg~kXD z-zjdPzXpV4oQYT6Jw}_ngWmJs1{@mL2{~*O3XSPoHCt9Qx3`8oN`D$ z!eU`bJtSJNUfIl0l150Hf{jYjrX*=d-VLT9*<*Bo-ec@k*r`w$s#^-{6*ekN8!1+F zdN^ri-l#&RM|&CTy|>V~P@{J%=(NHPg*z2?Dil7}mMg4R*r`zXm0V%H!bXK@g&hia z`nMLMai?NLKs8YKMBom(&ids!iJHaQwc7Jqj_X|48rNpm6Rvk$AG?mYo^$`peUkp5 zzC-_BcNsyW*yw3g8z&f3jVrAO&nZn!4_<_a(%06aN&F>qOe zaX^@HZV_X#pYgC@3`xdb3ilT+1>LE$pE=6Uy6Cl_-_BVL{9fU!h6TDbdNc4yt+5f8 zfC~I(fCJxD!1#)y+ZFw{cn2gq6r$PIt0$L;GalD=X`g6cY6D!Sxcu&O+_T(^+*i5R zy67VPa?Svn^Ty6Y-p8ZMVQ68_cU7vN<=Tq{II}VTkKm7E>3&RgT z!+t_G${I6u-X&v1wMde1JxS-fpThS^nuF^cTvNEFa9xS(N?dQk^(I{J#r0lXpT_lR zcSxS2*T~!OyGf*C4^){ZiuVQeW@ZqG?0)trs*Fn&BJHzq7LUw@;pUebecA zzL#@f+PZ4Rd0N6DR*6uD7xfEpc z^n+f=A7Od1PiNBldbKHbSY>NAls^+mKkvc+dP?tzq+j%wiIQkqMACorl7#ae_-DPf z=5MY~qv_ABZEJhw9MsE%h_tPD>5=p|Ti;pR*PC}} _shaderBlacklist; - private static int _decalLayer = 3; + private static int _decalLayer = 31; public static Texture2D BlankNormal => _blankNormal; public static int DecalLayer => _decalLayer; diff --git a/Source/ConformalDecals/ModuleConformalDecal.cs b/Source/ConformalDecals/ModuleConformalDecal.cs index 9b67eea..466ea57 100644 --- a/Source/ConformalDecals/ModuleConformalDecal.cs +++ b/Source/ConformalDecals/ModuleConformalDecal.cs @@ -57,8 +57,6 @@ namespace ConformalDecals { // INTERNAL VALUES - - [KSPField(guiName = "#LOC_ConformalDecals_gui-scale", guiActive = false, guiActiveEditor = true, isPersistant = true, guiFormat = "F2", guiUnits = "m"), UI_FloatRange(stepIncrement = 0.05f)] public float scale = 1.0f; @@ -78,6 +76,9 @@ namespace ConformalDecals { [KSPField(guiName = "#LOC_ConformalDecals_gui-wear", guiActive = false, guiActiveEditor = true, isPersistant = true, guiFormat = "F0"), UI_FloatRange()] public float wear = 100; + + [KSPField(isPersistant = true)] + public bool projectMultiple; // reserved for future features. do not modify [KSPField] public MaterialPropertyCollection materialProperties; @@ -245,7 +246,7 @@ namespace ConformalDecals { materialProperties.RenderQueue = DecalQueue; - _boundsCollider = decalProjectorTransform.GetComponent(); + _boundsCollider = decalColliderTransform.GetComponent(); UpdateMaterials(); @@ -260,6 +261,7 @@ namespace ConformalDecals { } if (HighLogic.LoadedSceneIsFlight) { + Part.layerMask |= 1 << DecalConfig.DecalLayer; decalColliderTransform.gameObject.layer = DecalConfig.DecalLayer; } } From 5db788ed3725e8b062d1792903e55268b6c91631 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Fri, 19 Jun 2020 23:24:01 -0700 Subject: [PATCH 08/10] Allow selectability in flight to be disabled --- .../Plugins/ConformalDecals.dll | Bin 41472 -> 41472 bytes .../ConformalDecals/ModuleConformalDecal.cs | 22 +++++++++++------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/GameData/ConformalDecals/Plugins/ConformalDecals.dll index c43accef8fc9478c51838114d30f0deace3a85b4..2286ffcdff0e6dee52a4fd265e2674e929c15f06 100644 GIT binary patch delta 12971 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 S>w8T$_d5{U^QCAhHU0~K)MbbO delta 12836 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 diff --git a/Source/ConformalDecals/ModuleConformalDecal.cs b/Source/ConformalDecals/ModuleConformalDecal.cs index 466ea57..9a997c0 100644 --- a/Source/ConformalDecals/ModuleConformalDecal.cs +++ b/Source/ConformalDecals/ModuleConformalDecal.cs @@ -1,11 +1,13 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using ConformalDecals.MaterialProperties; using ConformalDecals.Util; using UnityEngine; namespace ConformalDecals { public class ModuleConformalDecal : PartModule { + [SuppressMessage("ReSharper", "InconsistentNaming")] public enum DecalScaleMode { HEIGHT, WIDTH, @@ -54,7 +56,7 @@ namespace ConformalDecals { [KSPField] public int tileIndex = -1; [KSPField] public bool updateBackScale = true; - + [KSPField] public bool selectableInFlight; // INTERNAL VALUES [KSPField(guiName = "#LOC_ConformalDecals_gui-scale", guiActive = false, guiActiveEditor = true, isPersistant = true, guiFormat = "F2", guiUnits = "m"), @@ -76,9 +78,8 @@ namespace ConformalDecals { [KSPField(guiName = "#LOC_ConformalDecals_gui-wear", guiActive = false, guiActiveEditor = true, isPersistant = true, guiFormat = "F0"), UI_FloatRange()] public float wear = 100; - - [KSPField(isPersistant = true)] - public bool projectMultiple; // reserved for future features. do not modify + + [KSPField(isPersistant = true)] public bool projectMultiple; // reserved for future features. do not modify [KSPField] public MaterialPropertyCollection materialProperties; @@ -100,9 +101,9 @@ namespace ConformalDecals { private bool _isAttached; private Matrix4x4 _orthoMatrix; - private Material _decalMaterial; - private Material _previewMaterial; - private BoxCollider _boundsCollider; + private Material _decalMaterial; + private Material _previewMaterial; + private MeshRenderer _boundsRenderer; private int DecalQueue { get { @@ -246,7 +247,7 @@ namespace ConformalDecals { materialProperties.RenderQueue = DecalQueue; - _boundsCollider = decalColliderTransform.GetComponent(); + _boundsRenderer = decalProjectorTransform.GetComponent(); UpdateMaterials(); @@ -263,6 +264,9 @@ namespace ConformalDecals { if (HighLogic.LoadedSceneIsFlight) { Part.layerMask |= 1 << DecalConfig.DecalLayer; decalColliderTransform.gameObject.layer = DecalConfig.DecalLayer; + if (!selectableInFlight) { + decalColliderTransform.GetComponent().enabled = false; + } } } @@ -412,7 +416,7 @@ namespace ConformalDecals { // update projection foreach (var target in _targets) { - target.Project(_orthoMatrix, decalProjectorTransform, _boundsCollider.bounds, useBaseNormal); + target.Project(_orthoMatrix, decalProjectorTransform, _boundsRenderer.bounds, useBaseNormal); } } else { From 4cdfac8ccde384c97bcb05cfd1bf05f9efcbc07b Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Fri, 19 Jun 2020 23:54:32 -0700 Subject: [PATCH 09/10] Global override for selectability and kill part on detach --- .../Plugins/ConformalDecals.dll | Bin 41472 -> 41984 bytes .../Resources/ConformalDecals.cfg | 3 ++ Source/ConformalDecals/DecalConfig.cs | 7 +++- .../ConformalDecals/ModuleConformalDecal.cs | 39 ++++++++++++++---- 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/GameData/ConformalDecals/Plugins/ConformalDecals.dll index 2286ffcdff0e6dee52a4fd265e2674e929c15f06..a42d00a0b889d231e71639e0f69c0428da409bc2 100644 GIT binary patch literal 41984 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 z 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 AIsgCw diff --git a/GameData/ConformalDecals/Resources/ConformalDecals.cfg b/GameData/ConformalDecals/Resources/ConformalDecals.cfg index 72c6e59..bed0e9c 100644 --- a/GameData/ConformalDecals/Resources/ConformalDecals.cfg +++ b/GameData/ConformalDecals/Resources/ConformalDecals.cfg @@ -1,4 +1,7 @@ CONFORMALDECALS { + decalLayer = 31 + selectableInFlight = false + SHADERBLACKLIST { shader = DepthMask shader = KSP/Alpha/Cutoff diff --git a/Source/ConformalDecals/DecalConfig.cs b/Source/ConformalDecals/DecalConfig.cs index 9304988..ca35d8d 100644 --- a/Source/ConformalDecals/DecalConfig.cs +++ b/Source/ConformalDecals/DecalConfig.cs @@ -6,11 +6,15 @@ namespace ConformalDecals { public static class DecalConfig { private static Texture2D _blankNormal; private static List _shaderBlacklist; - private static int _decalLayer = 31; + private static int _decalLayer = 31; + private static bool _selectableInFlight = false; public static Texture2D BlankNormal => _blankNormal; + public static int DecalLayer => _decalLayer; + public static bool SelectableInFlight => _selectableInFlight; + public static bool IsBlacklisted(Shader shader) { return IsBlacklisted(shader.name); } @@ -26,6 +30,7 @@ namespace ConformalDecals { } ParseUtil.ParseIntIndirect(ref _decalLayer, node, "decalLayer"); + ParseUtil.ParseBoolIndirect(ref _selectableInFlight, node, "selectableInFlight"); } } diff --git a/Source/ConformalDecals/ModuleConformalDecal.cs b/Source/ConformalDecals/ModuleConformalDecal.cs index 9a997c0..c5b06e2 100644 --- a/Source/ConformalDecals/ModuleConformalDecal.cs +++ b/Source/ConformalDecals/ModuleConformalDecal.cs @@ -237,13 +237,7 @@ namespace ConformalDecals { public override void OnStart(StartState state) { this.Log("Starting module"); - // handle tweakables - if (HighLogic.LoadedSceneIsEditor) { - GameEvents.onEditorPartEvent.Add(OnEditorEvent); - GameEvents.onVariantApplied.Add(OnVariantApplied); - UpdateTweakables(); - } materialProperties.RenderQueue = DecalQueue; @@ -261,19 +255,39 @@ namespace ConformalDecals { } } + // handle tweakables + if (HighLogic.LoadedSceneIsEditor) { + GameEvents.onEditorPartEvent.Add(OnEditorEvent); + GameEvents.onVariantApplied.Add(OnVariantApplied); + + UpdateTweakables(); + } + + // handle flight events if (HighLogic.LoadedSceneIsFlight) { + GameEvents.onPartWillDie.Add(OnPartWillDie); + Part.layerMask |= 1 << DecalConfig.DecalLayer; decalColliderTransform.gameObject.layer = DecalConfig.DecalLayer; - if (!selectableInFlight) { + + if (!selectableInFlight || !DecalConfig.SelectableInFlight) { decalColliderTransform.GetComponent().enabled = false; } + + if (part.parent == null) part.explode(); } } public virtual void OnDestroy() { // remove GameEvents - GameEvents.onEditorPartEvent.Remove(OnEditorEvent); - GameEvents.onVariantApplied.Remove(OnVariantApplied); + if (HighLogic.LoadedSceneIsEditor) { + GameEvents.onEditorPartEvent.Remove(OnEditorEvent); + GameEvents.onVariantApplied.Remove(OnVariantApplied); + } + + if (HighLogic.LoadedSceneIsFlight) { + GameEvents.onPartWillDie.Remove(OnPartWillDie); + } // remove from preCull delegate Camera.onPreCull -= Render; @@ -332,6 +346,13 @@ namespace ConformalDecals { } } + protected void OnPartWillDie(Part willDie) { + if (willDie == part.parent) { + this.Log("Parent part about to be destroyed! Killing decal part."); + part.Die(); + } + } + protected void OnAttach() { if (part.parent == null) { this.LogError("Attach function called but part has no parent!"); From d557df49fa92bb7549a068a51172f35f5ecad364 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Sat, 20 Jun 2020 00:10:03 -0700 Subject: [PATCH 10/10] Update version and changelog --- .../Versioning/ConformalDecals.version | 2 +- README.md | 2 +- changelog.txt | 17 ++++++++++++++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/GameData/ConformalDecals/Versioning/ConformalDecals.version b/GameData/ConformalDecals/Versioning/ConformalDecals.version index 7b3078a..7289185 100644 --- a/GameData/ConformalDecals/Versioning/ConformalDecals.version +++ b/GameData/ConformalDecals/Versioning/ConformalDecals.version @@ -6,7 +6,7 @@ { "MAJOR":0, "MINOR":1, - "PATCH":2, + "PATCH":3, "BUILD":0 }, "KSP_VERSION": diff --git a/README.md b/README.md index 02cde9f..18e5179 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Conformal Decals v0.1.2 +# Conformal Decals v0.1.3 [![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) ![Screenshot](http://pileof.rocks/KSP/images/ConformalDecalsHeader.png) diff --git a/changelog.txt b/changelog.txt index 7cbaa7c..3d730e5 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,12 +1,24 @@ -v0.1.2 +v0.1.3 ------ +Fixes: +- Fixed decals being able to be scaled down to 0 + +Changes: +- Made decal bounds no longer collide in flight, this is done by repurposing layer 31 (which is configurable in the ConformalDecals.cfg file) +- Decals will now be unselectable in flight by default. This can be disabled with the `selectableInFlight` value in ConformalDecals.cfg, or in the module config itself. +- Decal parts will now destroy themselves automatically when the parent part is destroyed +- Small refactor of node parsing code + - Colors can now be specified in hex (#RGB, #RGBA, #RRGGBB, or #RRGGBBAA) or using the colors specified in the XKCDColors class + + +v0.1.2 +------ Fixes: - Disabled writing to the zbuffer in the decal bounds shader. Should fix any issues with Scatterer or EVE. v0.1.1 ------ - Fixes: - Fixed flag decal not adjusting to new texture sizes immediately. - Fixed decal bounds being visible on launch. @@ -14,7 +26,6 @@ Fixes: v0.1.0 ------ - Initial release! New parts: