From d4f02b4510699796a5091af175783591ebe4defa Mon Sep 17 00:00:00 2001 From: Kevin Reid <kpreid@switchb.org> Date: Sun, 4 Aug 2024 16:04:55 -0700 Subject: [PATCH] Store only `f32` direction vectors instead of full rays in the light chart. --- .../test-record-lighting-bench.png | Bin 4023 -> 4022 bytes all-is-cubes/build.rs | 19 +++++++++++------- all-is-cubes/src/space/light/chart/local.rs | 2 +- all-is-cubes/src/space/light/chart/shared.rs | 8 +++++--- all-is-cubes/src/space/light/updater.rs | 15 +++++--------- .../expected/renderers/fog-None-ray.png | Bin 7737 -> 7662 bytes .../expected/renderers/light-Flat-all.png | Bin 717 -> 705 bytes .../expected/renderers/light-Smooth-all.png | Bin 6620 -> 6589 bytes 8 files changed, 23 insertions(+), 21 deletions(-) diff --git a/all-is-cubes-desktop/tests/end-to-end/record-ok-png.out/test-record-lighting-bench.png b/all-is-cubes-desktop/tests/end-to-end/record-ok-png.out/test-record-lighting-bench.png index 9ffed279cbafc159f0467d5189ac55fe15680bbb..ad602cba96958b5cbb702ae98d427ed513ef8418 100644 GIT binary patch delta 3864 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 aCjSFJ8Rp}pYPuKz0000<MNUMnLSTYfc6+A) delta 3865 zcmV+!59aW;AGaTnZGSaML_t(|+U=SNbQIT>hX1PSeN(qu`w9{=2n+;_aZtc`;y7V) z4$e6C36o@EX3NAm_RM&hz$7PN%;JFY!b!*^PRNYS*d!r2#wH{P2V;Y6$<_iy0%2`P z2qB4<(7yCmRk`m~YXfX@d>p40-W5elUG=KoyWhL_-Fsh2It&S}BRO#3wd-lPkOY$u z0V<Oa0T~Pa69F$<w(PnBe7%!K0U&=5C$HUpY|`Jizjo_2+dQy##iYM?ZY$=WMI%3k z)#ROY?sfCu8_&7_Vch=1r*Z6||3=gC3ambQc&e#t>H+@IoIQ}}Q-KP|GAb@r;Mulk zuG#L+m4(nIjP$^PGyHRY|5l7d`k+hft`c<mX-IsWpIbA3F?`W5zJ2;6o>+fz7uFQ- zn@XyhdVsfX-U0tFvgx<T_?I%U*S8yMH`%VZK0n-n7vH%P8eNq0d=G|4g4kF18?5VJ zi|=Q>jkJ^uys^cDpw<nE1C|M|gq7<x=rkK<v^1i1!M!Mds|?FOZFq^2lEWx2eqySq zZ0Z1JaAnm(Mr(%cxdcRY204F9mZzic(<d>r;3&T?%C@(43Fqp%;LrIceWUX4{V$Pq zYEg8TmSB3`jrirlR^;U5Le>@R-#A2*0NgV$(4YT~4wu`7TiRPtG3|@!+PNAdE7x=T z?&=vtlFx;o?_E0;)E57M-*D%lv%d$mTOLL7e>{Y?NCZJyfiuZXXLWzb>(^o0;Z*dE z^g<752<s{a?tBh9S@y}Y>Byfk3m%sT<`O4;r{esDbI8e^iOy+JNRBR8-A)|L2%zD= z7GCxF)AA1?Ju?q(w;fii*_ba1Fg-Vn$G5JFXVt|&;9XK8%+xy*{eE$v7r|%*iLM0H zU2K6jHyiR}>tLpnX~lnu=nwWIboVYaeR~m7*Ox*zn^9Fd8(FE@u$xj)UEYD4%g&-} z>0;<3DlViqB0Dz=b_O`R6Lk;Gg{)Yv=);5G>O|XlI}W~j2)Vh*=<Mvok|npn>kYte zw_*GC$Kq9e@eO#xhOID3CivEG#D%T^dV@pAPs>7g`vpilo`io!mZVq}m`o;k4n|Q` zSq;y9S(tPD29yP=Vg0NP4u=aSngM1t3k@|L7(qKip(rexALfJ*vh%%=OcE6G2tRl_ z5yOLR;EOt2iFM|XHLTrWhS_Xo@f=$b=wB47YPfwxQMgMF1TJFNuJ6aA8siV}OUGWn z>i2K$e;G~x@*scaC8nZZjpDAK{Qvvj<Mm&iMbnMF@Fyq1Vs~KA?pF{Tj$mfaB2=Dv z16IX_qD7xW<~$Q@HWzQRW82914VXq~ZD#)XYyU>~@q6+7!z$`76~k%v<Bcyp3dMZ& zXRoNbcFK0$0)9WZ?;bvYaL)j0zWxYq%9(-2FWrs%i|&88>b0*NdKItzvKq4<Sc<gl z4A@*wloU6jp`igIY5*5|n#r>5$V$8scYL7;E{~Vn>{Cxlh=hj>xD({=RV_%%NJT<| z3%mY3M34{R-LLF`Br^++f5>qG_}RlhN0jnSOnAXlW16PWw*7P+hT8%ZL6bcNZR8#$ z+~)KcAf$g$Yl{s=QczM^g;3!%$QBb>uMIY<4U*X~w`eqKT*&Ulqa_o$c!gZF1T`vQ zI2a-q9>M5~ri>q*rr?VIMxQ4B{mm~Gak%X9t-)UI%C(8sPyd-^6aKYv<zHI0@ngYT z_C8H|QTf^mt}sHZ>Rj1<CmIQkhQV$LZi<KtM}~jLpt8b*#<eT)330Ze4Lx~jaC^Nl zTP?6UoqU~U68ngulP176R$g`+jXJ>iYIIY|!1(v<S`)c!_7e;SvE<-V?!iy=oT0WF zB9yYJWBs74Ti39y>yda+>t7!5#*I(FVk0Zd*SS&|NL^=2X2k}L2Q>XBo6tWzi2ifK z<Su_RF((o=EQW!g>r{=kF#tE6ZO3U-6uEi1<bD(2O7P-_{Z_ns;sE^aL?~qC4#key zc?)oMl{Bd@v+gUv!H)e%viiBjdL##Cdgr2UXFVj<3`IBbXB6(83&{#p_MS#a4O40s z=KY9r!YWMz3f%r-5SMzou=|CdUcZ2M9{Ya|YMX13)BPD(3KfKcVFFCflY%H_Nz9y8 za;u%y&1flaM)tJn@HpL=@1vB69Tjd2FR7=<I*jD{S=_DHyw{A2X+ET8q`~2G!{PQ| z<|`Jwc=*Q@EM=f@&sMa4Z3C8n;&1WXq72-c-#!U26W<}<2ll)CR2Am$n}<IPG@ySk zJb>!mIz{v}0j#DEZ1>8o-}vhX%%C#qElEM&%yPh{A-Q%L24+@J(cg;jKopI?8%;%2 z{%MB=i9RoUxkFGAE}^qF0eZ?wIISKu*AGG(@FHptKy8~vDUBToWVv>S6K0#0r#O~; zBj}+T3D|NhwU+U}JFN?lG*XE%J7#~m5NTs^)*>ht`2)vMQd5EV8f(x$Fo?)~3(5Uk zpg0J!DZU_otbjKi`38I@KmUDz0GD}QgiLwlg8o%#D|j7>N<oiiMtx-+^6^=&Y?-{C zLLsYfPAvw4eNd%Vn6-4+kc@`bTJ-e~!WGGfGm!$Dp4njY!b(xHMIo>j3#5PPx1sfX z2eDI7U8iEs4GxqZc^h6TH|EbOz%+9`KgUYZCdGiWAmbC1K3T3go}*_<De?}XVu{g? zRmE6fcP;riA%E-^yzan1BGr?Dra%+Qn@XU{QGEI4)%;xBz<E?1J;fp%WQ2+czG7G) zg{&q!MYri?1g{m9?{p(8BL#n*tqOeZWJuiw2>WVb>zhZgSZ?d2RLH?9A!ryWz@F!S zOBS7gFR#7>$9{hlHVTdXNeKvRRxB^*r-+y$WO|0hqF``n7>n~i3AfXJ&9NM*dmBSE z!Tzw!3W+u+m=#;y4)PrF1NmbEyyMs-P$_tNr?LWxauQT`7-mXkGIM`3aQ=7)zox#m z9uC>Uqt~Y6K@`pY8`!OOIQ>D`)6XMn3gFc7<7lWhQSbzG4|bwxStdo>GES9RP>{TW zN7+uh8y1I~Z#wKh;l|lBXOQf7;ijTFm@_*E2mbdN3=I!q)dSx}pmIMF6TRHxnKucA zgIJJ#6Y86)t~sU-lQDle$`;E|!n6)k<<0D{An;z}*fl(hyNZUZzxC{258#bko<Nts zod14F=|WfvA~~8hcE0gk9U{&UTF+fT|D}Fpreq=Y;(Vker6a+e0GnHa**%P!z%I}# zhn}t={3&+q`{@u?-kVH!2&1RJACB%-$Vg46ouCA=A_u>Bdo+IsFZ|y=BvF}j<=-tw zaOe^OeHK`(4tQ<72)9%qGm`=`vN{t>Zi&X+^totmeQ$gKngL0@Y+N<L7RrsSlt;^` zT1pdSNTsyQf$ruD;}@y8qIkmOmIgC^^uwp7KH$xpx3fjmNGOeZ0Rrv{ey+6k7+H=J zZ@yiMyS}&reSLp}NQioHkz$~<#7w04(+IE&mZbA&*WbjE-<-lt3o}vQ&;jy>sQ4YZ z+Pnc=IAwv$XU4sEKS(=AiLjCNDipBknv6~*AL|}|7~zN&o1a{dSBsC}j?XXW&u^lL zJ4tUwdU^`&7P$zPjdyWD`aCqX)fr&4aj=&ws{B$FoaBE>th8Q-LqXKtMiYzTi2nA# z*u)sGfJ~N8HduI!@bvc0Qy1{&%}*LoW#b6WI*rqfr_m7zz?ba7$;ukEHWMtfg8%&b zH@OCDPu2nr>B!B=gPp9<Y$BUgWE?!Xj;wSTGo~dXE6;)B6)kk$j<Unu`0D*LF;KID zEIth$vR;1+t-%tx%TPFqpS@g%`HPogaBvuADj@Iu*%myu<9{gqir|?w_u!xI{bzFD ziST+naItll-1P9!AZGZd^U4>?#dYmUO02;0=7mbQs1$0o83ElpH%7V34iAqQ?PzA` z6Pik~V^-+^@4L-n<FUfF#~+<~fH~Y)#xNS8UQB;~7hx(%?pX5z66et7y;sFOE5CrZ zDogRH!cWm`moQT4gD=5HO0$!d(kv(VL&F1TQ+DDP&o&@3AY<WYtT=t53!l5IfINU1 zBZE<7$@h~Ldf>2Adc@3|B4dsG>VW$ey!@+|Dai65!Rtf$TZgb}^;da*9SPF*WAqHQ zvB7^uindZfr^E`(&aeeh3duQKHG0MPP6TRbOVUK^cM{*RQrNDQ#f;*#cBqt(X=)7c z1nshUF3}f-$3yV@{4_QTpTKrn9=2@y?$iLhVZ--mz-Gg8CrF6WiKrT(%{D4##1x=W z<jG%^iMc{H*-Zq-Oq0PxgJ)|Sm5Hext5$!7dGSNjB*QvLQ5pqNGNn)wyN=qiNyN7P zWXeV53FSz3J>$d=YR3vGQ95+GFAJ<>YR~G-tUbFQdu}Ka;(()M>Gbe1Qd-P@*%4u7 zNqQFFHl%~)z!G&h92r4`CJ?KzsiP(wtC{m&#Ud|@$;zM2`e3C=+0t?jyLbO2egS`P z+_;SlM*${Q0A*H?(v6a$P8BL%rD7$>3BHTN(zyamwCS$Il&mPySQM)1;~@?!ez1G+ z{RSxpl9a^Ckg_Zp2PPLB`0ZmOHTuFVb9ARd;?LsBren1G>?J)0SdYyPJ?5JA*o<WV z^A|i~`@*~reEbqWAEuHjdk){&7=3?~&fX9kFQS+vqb-|QY=ZUn^kC-?KDu|lJ~F_Y zHf@i+xHfsg8C5Lbabfjk{W7>rU7B&Q^-GE=M~Myma$%Ost#|w_s@UUVKaw=|0^R$` z*ap;9)>c^_Z^v$<jjq8e-~NC$PRf{UKnxHAEb~Tef{jk9s6N`th}H~U=&^s^PE?ig z;sI+LCU3XxdmG{h@R~L2an)R4)DkABbrRdr{6mW=Rx<XH*kEPIAF?+ew%t|k6uXtC zX|b+O+87)gl@@!dG}>sw#MH;eKR(vc>2Y~ajcI9A)g<!cPd)W`d;q@Zp07a2M=!tr z^`7_uEFi}xTme`B7LcbhTmfxZ02Yv^GTc84U;#OP;0nM3uz)<3;R?V4uz)<3;R?V4 zu#l-P0<ZuqL;w~d01FX-g$Tex1YjWoumCJX02U$u3lV^Y2*5%FU?Bpq04ziR79s!( bi8uKp5Y6G^_iNzb00000NkvXXu0mjf+|_gJ diff --git a/all-is-cubes/build.rs b/all-is-cubes/build.rs index eccae6b77..5ae7ddc3f 100644 --- a/all-is-cubes/build.rs +++ b/all-is-cubes/build.rs @@ -8,6 +8,8 @@ extern crate alloc; use std::path::{Path, PathBuf}; use std::{env, fs}; +use euclid::Vector3D; + use all_is_cubes_base::math::{self, Face6, FaceMap, FreePoint, FreeVector}; use all_is_cubes_base::raycast::Ray; @@ -24,8 +26,6 @@ const RAY_DIRECTION_STEP: isize = 5; // TODO: Use more rays once we have a more efficient chart format that // deduplicates work of near-parallel rays. fn generate_light_ray_pattern() -> Vec<OneRay> { - let origin = FreePoint::new(0.5, 0.5, 0.5); - let mut rays = Vec::new(); // TODO: octahedron instead of cube @@ -36,7 +36,7 @@ fn generate_light_ray_pattern() -> Vec<OneRay> { || y.abs() == RAY_DIRECTION_STEP || z.abs() == RAY_DIRECTION_STEP { - let direction = FreeVector::new(x as f64, y as f64, z as f64).normalize(); + let direction = Vector3D::new(x as f32, y as f32, z as f32).normalize(); let mut cosines = FaceMap::repeat(0.0f32); for face in Face6::ALL { @@ -45,7 +45,7 @@ fn generate_light_ray_pattern() -> Vec<OneRay> { cosines[face] = cosine; } - rays.push(OneRay::new(Ray::new(origin, direction), cosines)) + rays.push(OneRay::new(direction, cosines)) } } } @@ -59,7 +59,10 @@ fn generate_light_propagation_chart(rays: &[OneRay]) -> Vec<chart_schema::Steps> let maximum_distance = 127.0; rays.iter() .map(|&info| { - let ray: Ray = info.ray.into(); + let ray: Ray = Ray::new( + FreePoint::splat(0.5), + Vector3D::from(info.direction).map(|c| f64::from(f32::from(c))), + ); chart_schema::Steps { info, relative_cube_sequence: ray @@ -128,8 +131,10 @@ use chart_schema::{OneRay, TargetEndian}; #[path = "src/space/light/chart/"] mod chart_schema { use crate::math::FaceMap; + use all_is_cubes_base::math::Cube; use all_is_cubes_base::raycast::Ray; use core::fmt; + use euclid::Vector3D; use num_traits::{FromBytes, ToBytes}; use std::env; @@ -138,10 +143,10 @@ mod chart_schema { pub(crate) use shared::{IndirectSteps, OneRay, Step, Steps}; impl OneRay { - pub fn new(ray: Ray, face_cosines: FaceMap<f32>) -> Self { + pub fn new(direction: Vector3D<f32, Cube>, face_cosines: FaceMap<f32>) -> Self { let face_cosines = face_cosines.map(|_, cosine| (cosine * 255.0).round() as u8); Self { - ray: ray.into(), + direction: direction.map(TargetEndian::from).into(), face_cosines: [ face_cosines.nx, face_cosines.ny, diff --git a/all-is-cubes/src/space/light/chart/local.rs b/all-is-cubes/src/space/light/chart/local.rs index 2f36fc6bd..f267969ae 100644 --- a/all-is-cubes/src/space/light/chart/local.rs +++ b/all-is-cubes/src/space/light/chart/local.rs @@ -15,7 +15,7 @@ impl chart::OneRay { py, pz, } - .map(|_, byte| byte as f32 / 255.0f32) + .map(|_, byte| f32::from(byte) / 255.0f32) } } diff --git a/all-is-cubes/src/space/light/chart/shared.rs b/all-is-cubes/src/space/light/chart/shared.rs index f2fb8a8a8..585f7f3bf 100644 --- a/all-is-cubes/src/space/light/chart/shared.rs +++ b/all-is-cubes/src/space/light/chart/shared.rs @@ -14,12 +14,14 @@ use super::TargetEndian; #[derive(Clone, Copy, Debug, bytemuck::Pod, bytemuck::Zeroable)] #[repr(C)] pub(crate) struct OneRay { - /// Ray whose origin is within the [0,0,0]..[1,1,1] cube and direction - /// is a unit vector in the direction of this light ray. - pub ray: Ray, + /// Unit direction vector specifying the ray direction. + pub direction: [TargetEndian<f32>; 3], + /// `FaceMap` data which stores the cosine (rescaled to 0-255) /// between each face normal and this ray. pub face_cosines: [u8; 6], + + /// Guaranteed zero padding to make up a multiple of 4 bytes. pub _padding: [u8; 2], } diff --git a/all-is-cubes/src/space/light/updater.rs b/all-is-cubes/src/space/light/updater.rs index a918fb8d2..88703b6e2 100644 --- a/all-is-cubes/src/space/light/updater.rs +++ b/all-is-cubes/src/space/light/updater.rs @@ -5,6 +5,7 @@ use alloc::boxed::Box; use alloc::vec::Vec; use core::cmp::Ordering; use core::{fmt, mem}; +use euclid::Vector3D; use manyfmt::Fmt; @@ -14,8 +15,7 @@ use rayon::iter::{IntoParallelRefMutIterator as _, ParallelIterator as _}; use super::debug::LightComputeOutput; use crate::block::{self, EvaluatedBlock}; use crate::math::{ - Cube, CubeFace, Face6, Face7, FaceMap, FreeCoordinate, Geometry, NotNan, OpacityCategory, Rgb, - Rgba, Vol, + Cube, CubeFace, Face6, Face7, FaceMap, Geometry, NotNan, OpacityCategory, Rgb, Rgba, Vol, }; use crate::raycast::Ray; use crate::space::light::{ @@ -400,7 +400,7 @@ impl LightStorage { continue; } let mut ray_state = - LightRayState::new(cube, ray_info.ray.into(), ray_weight_by_faces); + LightRayState::new(cube, ray_info.direction.into(), ray_weight_by_faces); // Stores the light value that might have been fetched, if it was, from the previous // step's cube_ahead, which is the current step's cube_behind. @@ -644,13 +644,8 @@ impl LightRayState { /// * `abstract_ray`: ray as if we were lighting the [0, 0, 0] cube /// * `ray_weight_by_faces`: how much influence this ray should have on the /// total illumination - fn new(origin_cube: Cube, abstract_ray: Ray, ray_weight_by_faces: f32) -> Self { - let translated_ray = abstract_ray.translate( - origin_cube - .lower_bounds() - .map(FreeCoordinate::from) - .to_vector(), - ); + fn new(origin_cube: Cube, direction: Vector3D<f32, Cube>, ray_weight_by_faces: f32) -> Self { + let translated_ray = Ray::new(origin_cube.midpoint(), direction.map(f64::from)); LightRayState { alpha: 1.0, ray_weight_by_faces, diff --git a/test-renderers/expected/renderers/fog-None-ray.png b/test-renderers/expected/renderers/fog-None-ray.png index 8b33393488ddf94e4fdfc7b56cd9a046a82eb204..363e8de89f41f26a947421a9347d50d016c66e71 100644 GIT binary patch literal 7662 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 PTm%(`kMeauP}KhbnH3JE literal 7737 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 diff --git a/test-renderers/expected/renderers/light-Flat-all.png b/test-renderers/expected/renderers/light-Flat-all.png index 3b41536d17803475a1f89348452b2ac3ac2e0c0b..02b34f4ab4714b8560a13fae536c38dd0ebae328 100644 GIT binary patch delta 629 zcmX@hdXRO3N_~f?i(^Q|t+#g!vu`^{v=`RT56Cf}5_0tAg*1(yYD>Q~SG)=m;NX#D zVr*nT$ZO7FlX7B$Vlo@Q?530#mlkeb<+gzBrsdxEp5fZ(n9t`N`k$_1Auk!3Ed6v= zUQxKKVVIe2om%SkouX?0gMHJU%vJ4P^*x_&@r#Jt6*f~vj;GfvGsrMJ{q>OH)K_-S z4+#b=4OxF37_R<ec*C$@o*YB?*I$2`Os@UsF38NC-nIM4RC$M+cgqvClUtrX=dP4x zd{nV<Yfh##BLgbfkj}9FODpS-58p}`Y<}wgoVWWR!w(6YWQOBkb~Ar4=3ow3C(pN_ z^zU6p?G?Q9BpXtGsWY1KS6tV2{XX3-;^XVtd*oO9+z6e;vHIF~hJyTEF;SI~*LWsR zWE9o6bPzea<!i-0euoH#lZ@&Njto!K&%`ori^+`B7yWBDeVgCYySF1|usiJEoR_zX z3#dm-n&F0`gW<>A&+|S%ufKaPx?23~meQRw-)Q~zX9UUDGyG=UFz<Tp&yowX*c+bx ze;8F+&8jd{u0es}(@Vw|(hnZ)t}n6)Hk~OGc5?n3h8zZ)s&~u}zRxaLmHCbX)#E@O z8+$>j@8Z`cg5SP=IWSkg;Z@P5tZR%6PkL<_qn5KPC^Qt*+B3ZU`e!<;!hE@ge~dPD zS-LCZSFQT4g<%v6i--OtH~Ic$(XTlYj2EA{agUqj!pCIyLtm|#ro?A4L@~%*W)_eE u2BaRt)nwTQbw-uf)y!Akhcaxddn3Pq<B5gE<j>I{V?AB{T-G@yGywn}Qw2o; delta 639 zcmX@edX{y9O8pd17srr_TW{~|&$=BT(N=ih|G!12;uY0MrxzEjPfp<GEP1ISz+of8 z!^Y2kZh_+iL+3U=Nvnzz6I7k2@y!iYWxDEd?&5dZmp8nA9Wa*u_^*fc_$K$2zS*g> z>eAMIs#)_!qrRs*Z&S#OKS66Zeo8A0DzlmCvwZojV~?FZ15Kps86PlcT;pdCSYz+e zklw7wFy%Enlg4%S1b&9AUl?|*y7pdt!M1<G4xgREXMOs8W2(Hv#aa~|<FFexo=-|y zIu@m5pH7Y9W<UiE+gU%Pd<cw;X!z{!-gs`B`8nxHii|6G;|v>;f9++ekZ559*?D2t zzc@|C61Md`4n}{w8O}1_i`RDTzaAFx@AvLKyQd14ZSH8D`nsAS!@M-b$9D2WMp1(& z4D*+(->R~?&#s`;aGz0~!Iq)KGVvN?PUVuyy&+%H^>X)4_@1DgD97;k+^styqCidJ zG8?oTZtJXF`ajb9YP*~G|6PBtMJ+Hr?PEC2X7gf@g8GJ7MicpSZ-o<TLrXtCt<9EW z_+)?B*H`PkFQdmYb_I@xnkt50Y!!9y=g*(F!pdUCl#}*188aAiYThwFU|sO@Q(5u5 zG}I6P@(e5*USGL3`}iTf{rifavoEN!xG9yHCXl+-hB0b6yMjVPL9IQ*+s8lui<f}S zXaDeH+mc-?SG`+}VU&PC!pG#m*Kd9lWXm!>@s2#ZbEC~w))VG$e{52I_)C^?Q3jg> zcSCX&Llg6sb@y2pM94FUH>A|&Hx$(}#8utg->iM~QT$fNe;|WBUHx3vIVCg!01&_p ArvLx| diff --git a/test-renderers/expected/renderers/light-Smooth-all.png b/test-renderers/expected/renderers/light-Smooth-all.png index b7ba73d41616a21396aeee71ac10c04cc8d07521..e524fd5bfb560808d390b60f24be2dbc1401f4b3 100644 GIT binary patch literal 6589 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 literal 6620 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 a`u_lRV4}~SE-h350000<MNUMnLSTaY)bIiT