From bbf87bbf58c0c1f6538b553568713477e3f51de5 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Thu, 19 Jan 2023 11:51:24 +0100 Subject: [PATCH] Implemented backface culling per face, by adding plane and center point fields to the face struct and checking the plane's normal against the camera vector to the center point. This eliminates the need for per-polygon normal clipping and reduces the amount of redundant vertex copying, for a measurable speed boost. --- ps1bsp.h | 5 +++++ qmath.h | 4 ++-- test.ps1bsp | Bin 138479 -> 162995 bytes world.c | 55 ++++++++++++++++++---------------------------------- 4 files changed, 26 insertions(+), 38 deletions(-) diff --git a/ps1bsp.h b/ps1bsp.h index e385a10..574f551 100755 --- a/ps1bsp.h +++ b/ps1bsp.h @@ -71,9 +71,14 @@ typedef struct typedef struct { + unsigned short planeId; + unsigned short side; + unsigned short firstFaceVertex; unsigned short numFaceVertices; + SVECTOR centerPoint; + u_long drawFrame; // Which frame was this face last drawn on? Used to check if this face should be drawn. } ps1bsp_face_t; diff --git a/qmath.h b/qmath.h index cba16a9..4b2ac13 100644 --- a/qmath.h +++ b/qmath.h @@ -3,9 +3,9 @@ MATRIX *RotMatrixQ(SVECTOR *r, MATRIX *m); -INLINE short m_dot12(const SVECTOR *a, const SVECTOR *b) +INLINE short m_dot12s(const SVECTOR a, const SVECTOR b) { - return ((a->vx * b->vx) >> 12) + ((a->vy * b->vy) >> 12) + ((a->vz * b->vz) >> 12); + return (short)(((int)a.vx * b.vx) >> 12) + (((int)a.vy * b.vy) >> 12) + (((int)a.vz * b.vz) >> 12); } // TODO: worth a benchmark: is it faster to copy these vectors and use them from the stack, or to do six pointer dereferences? diff --git a/test.ps1bsp b/test.ps1bsp index 855c22c371816ad4f16d498957d1bd0f2aec55b8..4d79a12dd325ec1df79ec5495ce4ab86f5404bad 100755 GIT binary patch delta 41258 zcmZvl378bc`NnJRtEXpoXLn&ao5NL!D1xFAk5-Haq9VEq;xQOl6;TOz61Ce46)zM~ z0VSgm6e9k?1H};29?@vf-~kaaI`P1W7fQUZ|NGWd^?~&BEX)4({f_#oy1KfiXZEv| z*@wQ(?H3b59Eh*##X`J?uRH!AgxfPFzL_V)1&_tV>i+oszhmP5U4+`78hmfXa1i@3?wPsgecoT1uUzW`(wZiu+14!UKU~vicJaG zHiKCyQLcnybOoz8X;GdMf;|Y~FknJhU^VDwg>?PF8gkLVJBYM!v!Z-PD4CrVYYo}% zrfiv@qg%YED2OgF?g$Bo!?+_a%A-Q;P#9McIGo_&U>0;ifp38#yBdM5g^QG~3-K(l~WOqq6y?2=1D;-w)&Q-bu61X3_nlZ|69od7> z)r^n*#*sZLbwT6EoWDpIw2ts;WLPtT){#9Y8G@+Rk^MttpnInGnW}YUugJh-ts(e7 z53+wr_H18WX|gw^zhzEeT|&Z|OeUxT*+$8NDv*6F9R^iMf_=`i7Dx3GD!~+jf2o-o z3u)-Sm8{xJ$fQyK41_;QC=?VT3t=pV!9|Cvbvdw9EG^ci?0!o^tN`5_Fx?R9O0kp} zo3;DRRmqSwLsx@NcPCj_he2{t*aJ)$QD!0VrhGJTJ9L8zL10*k0kJGjJFkzf0@+~b ztX#zkv!Rk%eVi~H23X5j5#xO&iy9wL58^w_qa`Dd;2PuHK0*ylvQf~zW_;W;%*Mdq z8pGdcSbBD1}EJ};Hh8(lkY_WUx>hil7n<$ zOm{+D9K-y(#u(AZRap~WE?e?K&oH}2WgTYMBbn<`JM{~*o574+l-&k@!Wa5Z0sC$_G8LX0XeOrgd zf0a=53Jaf>ENc85g6w2O1Fx1W8u(?{3L~&BBF0+ij!s+sMyjOA-iW0f@oFv#-&tU5rR$t9Z=*}(B*~#yGTe5E@n+{tih989>{29h} zGB9pH;6yx$Q^&R}{GSI|MzNZj1IP+swTx|rSqaR|Ms3SV=lgSD+(iksaU%kC2eWfl zpD^n!S;Y@RT|cGM4#~DxI?bBEeii50G_CK*SiK=-utD*Ra0V8x=p$6?2=|ENnxFG5 z&6@GMeI&E{xXQQ%Y&eYFO!vOy6l(<=5toyX<*CY$jYcxHOeMmOmCWh`U48vQ;qibL zS{yb$NwUDW3v{P|iLB>Wp(~Q^lseaEZO~1UO!yV-2Hjb-MdNf;yK?*h%o=$PPwcwUUm2HnJJ-3J}3WvLjf%>B|<^dXb=X9<@{==wsAg@+~cETN29 z!pG1DS}*>>5S;M z&=@mZ*!FAm=j7C^USak#Y-_1$=-C*&3&9x4L=F|aptoeKKVdO}D_|}vY)WLXx*Z*H z*p^^m*LTQOPEW8}0t=N`JqTAreKb=G5H51IlPp-|a5d!YD4|{s!5M@D!K!qq&SQ8M zyMlQotE_{N?T)0qQhRy3R6Q`+FvYG?fywqupzBIj%d(Ka-$>mMr$sLmDI8G`(o##- z9im3!2rxTl`L|AFqhV~v+ROK=7Ly&PbTxI)KsHXYYO}uWB0Cw$*s-?Ok|?$0@$w3wS{z8Y(Uo@-xy(+I)Ihf zt<5?}9|XRVt;@Qt?W%-iGr`8@z*GszZiKB1ot~D-W}_iw`UZws+I(piLa#5BC6G$ekD}f!I+1OPx zx&CVgOy>jGAA#GFtW33QRR!4&L3)xE0@e;)A22st>0&G0_F&t=-^(e{Hbk)%Serc1b23VHM8nswW!GghP@EF{v;YTQ&85CmRZ5wnQ^l=GO>31=Z4nkZeEA zlr57Uo=n5v;5L2xPIf4CvkIMUwovOoo-T(2;?%(=NIfvGc1MAUoam|h?!2z9W?cXM7OgucU+bc8kJ;kWk_ef95*NdI zGBlo&%!oz#?YiEq7%GECqmj5=CdJYDwzB?wn6S`Sow$iaOcOmIq8Wl{a^sc88BUg!(>jiX)n;jHkuRyn3CeSs(@jCc(bG6or^2f>N zO_cwkoZaO*HQSQ?2ezIAs7u2>ejmc_`A$D;vP}?n$>S7LS=0Da=-M!wtyk3|+X6Nu zV|SUW0<*>6pvCW}Cv=&h0+am=fB#L_{h|Fr>;lJ$R7xz$u5R^|L*7VaQ@jbO`WF~3 zuMFtC%%WC(Bhd<7V~Q7@C9R$c(gV6K(9O**YSl@11M2~QBDc)<2Zr-s!dX5X1c&|M zuqEgDY*(-W(79RY;D`s=&XU2QV(1$&nEtXs5VE0?1u+IgKTO&>fGTUkeYHcyn9Ko^ zd978&hJYO;Sx^}+Vn%GmXnO>zurcGcu2x+_b~MGfq*?zKe2rlVA@r1RH?Wf+ zwA1b7w<*Ly_FDw8(^!V7ZX!EXv1*8&A#JxbZ&688Hw7_Z+j6|}w>y|~9)zOMUfvjj zzgKLva!8?zAfjNEEw$DoyCRhZ8`ENibk|ASEzPoZ&`@_%-PT{$4MnUuNX9E#P7C(b zAVDADYkn#tHWd4p0~Ql^Z^ib2@nSGhw9EaKE!i>zu}XHiSBO1~WagT7dEXFQnM#Nb z*zPA8>c1z9SHa;u2y83iUP$I?mdo^7T($lqdmcfmrCM{Cy(kkL7-6r$c4i?Tv3-NK z1+N^oeanHcVho7D_mK4vEUUF}7y^F?W)$t__3DyJ_G!Jv&9xBw0?E8*+Rg8(E}`yQ z*e)vB&HdEaBKrxta}2xL85%N9r4!;?1o>CUI1A<$?B*pQR!C!u9c*_sxahDkjq-yD zRFj8+uapDvlyH9--wq~1x&y%GgL#F(b~tPofVl|lh63M(hWxisZMj3S1EE`( zPT>4A0%Hcg55_e()PaA4Ab$d@gj#YC*aIqvtsHWna5+lt8H-xPz$puK(VGajiJZcQ^v<9m$sY>@cv6=yzeFS}O2JIQ$qos~G6W zHcJ-xD}((H%tZ`+dXjwu=D0A{@NhW(K?;|(xGHNhk*OPN#$=L`VIV2p5pbB5tm-Ft z1a!t$jJ6HRw)V4H{}DE4_&Q+FI?n0cG8u6*=5JG-5oCQbayBdfRs|+&&m_c!nA3ky zV}Wc(Ft=cr^~6QC6Jl6klhj$a2iO0Dkqx1)0);~ncpt+qAF2ZL&UGK?Rv2DcD0U=T zygwY;nA3G1kAm)Cwyxxrw^Ioo1>Ip_a_(0Nj)v|?*dFMZUimTwd4cIb>mJH%iCj#M zXOR5b2&;g3+33Zj6G7~JlugRy#PUpwe=T8*X=vP``Tmk|{UMGgPL-BnpB zyaPgu!Vs&XKW#AGpVa*kww1KqJV^B?*<#p|>Fy+33R@3M+j6R2#&MK!MC-?@p9mj; zvB-+n&FXw7TM6OVd{p-YbT*jQaSDD4%*|F?Jmv2g*gh-$SuOhRnCu1k8=2qId^8)! z`Zwb1pLCe3w&0Y&Pj&XHVjhe%`0Nrdb z2M~TFSuj~}4){#zT-7?VElQ^uXSlD?C2rPhnWJ<(wSSb%^;rjWi7dJ}yUg(?3&Mo2IA?Nuz2JRx6>oZQ@-NBe(-5=^thyle+9NVqaEU0hi(_ig1}@$vaF2T@{xZn5n?Y#LeGc1I_;-}C?O}L;n@_7 z?Q*+1BghWPX2iI(UB1wt%`mCJ7NfuXS;+Qi#K37+J|d(W3musg7M=+B42&OD=PZMa z2iqG$%{UWI1Vah^neaHU)7cPAKFzA%$DlH2lcl}#clbSzvG_U{wly%dHgE**MlJ-j zICH7Mha#6T|rA|eKe?)>6FnzxBJiZq}HpSOAS5$&zOQkM2-&w)s@V6!r?Yb4v zO-|Y6WlpHnj{|m%+vUX}_5_SOV|ID3P~Sa`z#U*~RnqK|=b;;xT<>=YXT6uQS+O~3 zHy@}HBwLqFhz$u$%ZfRK>tVbpZa3?_IkLCdl2|YWp9J;}0#}kt{4;_VlmCM4p0Xl$ zI-kO}A%*T#3DVye2<)bUDVXfbY}(-?5s~@(dl-`mw2H^c`2I73cyQRE23G|vm1CC# zV`e;94(yt^SDvUU$RNdB0Xr>B*}>6Dm*#be#}w_xqCt;K^yrkoeR)+d6s9@!wUHZY+YawzBj-I2|pWH5nH zxEELzLOuC#=Gx~M3=0sMOfY{;fbGH1*@<9wBs)y9U>2PSe@B8jA{ht?j|LRUK**Wv zI0Uhh!EDC4|3v7j2%_hHvhk7yYe(8nlq^^$mXXZq$`)NL*B^rLOl7S5ozv~_B&+&W z;Iw@1R*XR|lnnO_s!PZ&X3~iuX%5!Q!46GS{gqTFufNxzPu$p|^1CqN!9jBaggC{T zpHhs*w?Ow^GPo`0z?_S~Udk%#{v^8-Ixp2;Zc_v9RIt0@uWvkbDP)PQOVpd4EQn8A9{*Su9D5f7!JRR&wuw|xIwxN^t zC;S_rTdYI;D9D}%8)QV;i(qSz42^kkhI<(;S(LNO_o^oz$=2nvVhWbzUP$+rV%0$B zh>gnldL^6$};^@!Pq4=RjspO`>U-O_y2YQv$1!mt4ih!(NMLR3&lOa@RGbg;K+Whm>zIs z`zcmYfyss|rUx7=b1)co&LfpMOtJ>Yhf|Qvk@=LEoVCiXa>%vbF%Z_W4Sq6YVl~5OoyS9CTlF^Z!*c!&+0gT-Ut@v9Y_P{n&v!T-17kiNX4e)( zrrwa>!{1$C!(!Lvzf$9a>|P`@ICf)xj2c@Pfjt17^S4qUBzzdc7fXSVkLCOs3x zd`_J@WS(SW&9b^NA^RI_z0x(NhyU{+Ta6%IX_M)xGl%RIX}hTLjUUzekMLg-4rzKg z6y!~`*elIycrV1>lR+jlouFDm+mBE|uT*Q)6B5~Hg&f%OhTo|wkbNU{UXwnXdU5~n z2MMi`r_Nalg~7np;_IQ-WerxLv)InxtJW0_26@-qHDuc=bz{xhA=cesf|gkc`Rh&Q zl&r>Z;C^-E#!hvA#$UL&Hk8#1R@4oXNmm-e{ti&KdNE4f!BTff6LoU^ zM|h+Ptc9HWk3ojD(ujhd`!9xWjAX*FRawbS&`fm+S;a_*wIw{Xp{j5R*l(4;CdGPl z|Lar(yPGj#j)Z^*pg7aWfQ@Syp&XK(g9Po^>Lxuql3fUgcFZp6{v^A&ZfmB3AmR!c zqoc7ym7ltq(x0=j@x@S(8|w}msv+aqQYad9Wwj~ZOLTn4z5a>P+ zv2Rep4PbLZ?0W>Zkf5bs|E0s9S!xLDFA8H2fyIm5u@HvdG$u7M89OfwC&&hCcOtlA$Agy5olbs&Kz0lQvjKbf|7MA;UG1`vDA~4!yzGdHcGt`$%IRN zArib0)zYsA(e@%VZdb5_L&;oT#Qxu0l<e*Xs@-UHYH7#@W8!uU-DK1mr5g>GrF zQ7kNWYX~M4obOvP7vtlfXo!ffr>q;qr6#l!&iAEIX z_{Ml-8paQqqNtzurR_&xt|5x;O1C@MX4s0tqy|$lPH^9%f}a$xDd`FBaxh`y`9C*N z@moxoG%?X6YCgLH4zpy%C^IB$i0B$5o8mK0X3ZuRsHLj$gi7X0ux=(QV|vE=lvAHZ zuSAgEKCH7DVEw_yn(GZ+uB*UyL=exc7(Xe8SHa=Htr%^01*<`~kJ6FtE@K?+``eRq z`Y;NUHA9zXPq2NFHSTmG>_F&5wi027z~PYm(Ghkybk%%AgdGK)SBTmkix^JD$VY@H z$RN>VDiC%Q0>%<{nw+>iW2s+OT(-AjSEC{4z@Hrts&zGNF9;ahkEa*#brDOGV4vtN ziHS?MV%I=71ID#@%`YL@Ovx${b^~nNpG$hmBwGlFc6wUlnQCe!TO!%|#$$YkLj0eZhi*`*s-|@6R>~M&V|eT3FO1=& z4{WHRBs?g5Mmk*Gv?#=$m&v%MP*+9j)}Tx5wA~nH>*@_@)QcCMif=$C3Y&_{RMKQM z$*SfHh#~7wxKYBH#Wz%7vX4!k$B#996f*u2$%w*I^HtS4>V81dqVN#c^Z2R$%vY?0 z!CI&^>D3T*sS<7NhJmWmV2&_KH12Gws1j1xD2?4l{YGK37HQnQX=q?9denmy^|G2e ztHc)1EG|^lB5Rjytz7ZqNBL0NPSVz~B5;s|mcN9i@oqA~u?>3pO}1BwPrmJ0Iwurl zf2GswMCuMIv4S0q`l%PPBkQ^*sbl>Kk5NzuIRk7gTAVYM8n!AwcRVZGV5cH!t6&ua z9p1dK4R$tc&oj@9_;b$N2D})?E^nFrz(QR53l!<9gKw?!1fN=ZlXT~zD^BR>NZ1nJJ?sD zWWI6Wa35Sg^@Ao9{*1s_SQPcbf-K%3S2RVvq9IE)$VEwUy&8lTm;v^Qd5wRUL{@G{ ziqp($qrP(@>(aoDh?XWN40|HToZ{MsFtgzBnPT^d@%GTQ6hDvX27rw)H$~XM2AtYP zXC#@y@aGw}_UDM1DF0qCUQ+1rPrGZ8;ob~VTH@awUkBZOQs*|!Q7yh6x&tIz;-AJh zfc-}4HYweWusuYw4qr!qhc!41>^5kJvtWEg-Jzch9UfJ8*q|NW1mk1CT1p*$f;WR5 zCz;!*{mq8$@rr5NTfk04m$-#N=4tx*zd0}-Uw7zlMBEDD1j&~8j6qJVJ1m8ROj1k- zxec~w)@}VwhudL0MY0Z`IddVLRyQ_hs+H_K2+vbYKjS$c>_V_5g|+^4dk1VUl1%uv zcS7eVrfvDc#bs!*RjB#bg9XsdXu$eU6mjWQrv%|l4w|Cy_ksQZb|Z}KqHPLwik%CG zvspseddjv6b{lNh7v~l&r6aoo$xJE^FvIK*U<1q^U{3vtbr*u%t%Q2AAX}(}VRoMi zqS@UDvJ`B!*;&*H{t@g!Bv>&A_(|UbwgRjgYRE#)|BnNTkZ=*$6S8%lUzvNso|3wt zTK6HrXQj@L=w4t2&7gvdq5CIvm6B-ERp84qui{j6HkfXc&YJKI7$0PIHfpv6>}?ni zGHVUm_)kdYT}&Vg%@K{iQl-8hx)1BgG*(rY(BCJL)%+MsVf(pc9>)UP&(G|Li7!!V zPAWPu**8dLTCvSfhU`b^I7w;U17M;Ntt)zdg8v7fNiZ+OmO+;Vvx=L1-D2+l8Gvpf zTAGGNUV4Mda4d9z?mlCde=%7O*1ZvHLc{g@y^6q=(&=hF2-Y7ApL*br1vX>{#PA$U zg}NmV0qz1})mZCi_%PTIFa&AT4%w1Dz-mU&Vs6*{x)Cd%BHk0Fx`b?hB-mD(>$5y; z4+4A4F!0$mYW+ue7#yxJW=RM;!DsZ2ghRLF8oa~NtOGhSy=}v%Ajd*y7jPG-u6AT6 zvoeJl#%?N^(eN>$F((c+&ox{%Eg!}8-(P!xexx!C|Ff`3@h2!#QN7 zfZY!^mw}6RquzSq#C0baCoau+%HBnWQ&BUH{)N)kt22&&PLGQLIX!A2=YXYkVNo*% zSx$$X_0&?EK^`G91ID$%O0X){5L(A-{e}K;C#)G8=R66>)@jH|BxA>d$O`#>m_~V>SjtOcqUBGt4thco8wv9!fAKT7SXt z@eNIUji@7{>$45Ez0*{GwJQjW*Xg&x_Gm(X;uWw!hnM7k!SD`9uw_{*)M9MwZG#<* zq*rFG1}AVR#7G6h>?jyFIbgYjR%syWeMVXo#u_B2=}6EHr4{Tu>&`2meB zY8K_wk}pb~+h{A>abPb?e*tr7yjB{|F|{$-1_-^pSJE2{E5Y8bJ1psB$lk3x^x5NJ zA4nZ+Rp38^eI#`OV=|vL;q~8t=hha(&v<@`Wcp?TwhF@UQLaTp1|++1gmj;sLL#a>@5SkrH4Xn|1w^b%nxW7suKJwbR&?om0!|W39(V|=U92W zq#<9oJ%+6dm6hyx1__n*NhEl(a#&Rk$tJ=f{e{`-(BZwIjbU~+bZ%Da>gzumPlK?Q zjtVbii_?L_79?|VIfHjf4sEzd1tzEcP=%*pJQr+o)+Vrt`G9c{zK8F0|2)V(VvE71s22YX{4+2MOgH3N zKL5D|4%^_cS@kDd@(qKegCG!!A7vGUe;-GOv1WOV@Evl+n`-9ty~JPfk`)Ff%=NiLQ(#PRj$Cm*yfD*DmTFwJ_mLpbd|j2>;4WlURKNY8BfKDWLWEs z3MF$o7}tN{CHa|baHiey;q%C5DumT^5QLY{^S~;&mg}u^vgy>}lByX`u}k2Pr!#k5}i~FlIIwEc_1AS|Cxcbu0ecL#zm>XRF-mr-)CKHR*q(vF?eUR~?P?sY2Ak4?{l985 zSQNepc#bp<7|-_$(7Kg))%s=CcVteBe72*g-^oID8G?+BiQ?g^s$^HuADG^-AiEa2 zDM?Y>K8fo;55idxPELv9G8Keb-y)N-O}&KXHR5)Z_18(1RkfrOwhN$hW3G``fywSx zOa~qh+eKj4#9c$bL8amVE@2RiV7)EEhfp6t5I4D`R8u3J>|r`g+D)2qs(uWNT^F8O zSD{)%Q&;#iD|Ju9AIDZ$_dKfLaByjO4uZVIz^S#S4np=C1E;Eun!N<}I#@Ne%-=oX zBfD?H)=PHyNt3+;otG4T(*K0*M%pI5BK+0Ye`_GzBpq7*t5YvS_$e}U~))%7(Y*#5d-zq)yhqgdii~&`!1$o>QaRMAk>K zGDg5&h3;4cS!ddXPt;jLc05?EXcsP4wy%Mm1ojnlHKn@>{!Rh&z<%@@_WwG60r8xV zVhfbRtKjggZLq0|g&)N@Z!2~w0#8RnM5(hdQaxM1NAn!$YKDW-D0m5km!s5&nI{x} zQW+M&W=f%5a8)u3V0;6ZK#Qx2@tspQlO+R2+grgbFm21g^AwYDS^u>VE!=SOSG0r_(9%RqbA=oQwbAngJ7wXL4u-FUQmo!r=<9|W-3Ieys+=lh|KaZ98 z`j^zXj{oc?NBRZ{g9lDonYR_w4~<>`_AU|>4R-b)DhSz!(2>nj30??)pP;HDHah!& z(vkg-x|r6X{tWyLGTb-z@03tNvL9RV8h_kQhgk}r4t7Eek3fWU#V&9d-yG33cEM#f zZbfvhVC5K|y$#uRce>yK^Z2+3>5zOl>nBjcn@T>H@qNji+=wvTRZ^5{xA*;cSSNTm~Jtzc0&=QR`jy^ zYDYE6z+!K(-%r>r5}JXI8S|(7j@QmfEb6d6o13Azc%A{OZ=^dm4fr28LHT zllO%j9s!4^n}~c;>dy>X58LC=kdi5qzfso+vXfwYU_m4=OxMdVFUPQT zJab4!KOoA>?5TiTv&krzXS$h(RbU!V{RP7^9f3WwDWe}!q0ZR`n}K9J(@ynDsr4TN z&kP`b!nz$_H^^iOLlW97&7PtmJhnFxg+poYIJtz9k}j zMhaJ_wy3c{_Pk^dr9M|xAbSacMQK1@Dv9#o8F;o#Yov_%@8wZFuuY!A|a>M(f)!&TWGkZJ0)jc5;ep zF>RZ+Vr*eou(d`d9e&qDFUgz$vI_m%lH&WKh*V(*1Rh{cO6gOPRrnRyDsyF|3OmF0 zbaPy)qAG*diNR90Dyi3#HL%^8VCnPRVfeqSKjE(x)T@{OfbHLw!E3lf^E;@UO0q)` zq*}7``eCzoz(yj7RqDte5GwVNsOsTn(JwXUfMcK=j(H)b5+rkugTv8)dbDz+j{}B3WiH_BdTDbGWy*MG@gyXL(T4fzti@1#q>KLINMhdTMglIIK(L7@rj9BlllTf_7a3^`s%+#RN3^kC*UI*)*6RAld_BQ%h7=2Qg zgxLE?=4?bzgXqDLvhirMe}=nZ*@Jj1Ve>i?3`qJpYICX9lQJ6Bb}B;%k!naeNN0hHjW04LkXT zGUniF-UjOm+i94P^c9e{J%7RQS^-!mbRGKjUkbO^&<}$5{dCLY9nQ9Y#bV&0+hBG# zJoS>Yle_yfAs#;71{>K851~S*6LjeCn5`h$322>_u#*cy4lBQ4c%}#JMCkOTmkl{> zD>e~qGMGpvQ#IAN1&A@Fn|%H+fIOYff$;9)t;z99$h+PP!0fn{(#i0y_o81g^eOt- z4s|DWmv6;**E<7jQi7{1r#=|u!~nQ5t|x~2ZTWQwG7e`%MJ4ktjAuc&3OYTfbHh;{=tT*2 zFN2K$(~B3fbx39@Y;}U{_cy>qGH4vj{}ya(ak*%9@FPFl9S;-&J|7RJR^I#n7i?If zdr~hf-UIst?7?_&Wn-6o0rn0Y>T3jTzXqEZ(lPK4NXAM8OZRp1`rAD%#v~@C^=1== zY2>kEJXpJv<-4cEz<98BCo4gBYdlzzla;$CL|Z&q&T{~_!q$%4sqIvkaA0;PbGCvO zjP3X;|0+h~e%oN}-SOs;_=ZecbrT&9+=_8Qvl|PV5dMOOmEIHnhR0XRiBHeL7oYEsV6uZz!CZW_zY1pH!=ba{L0}i`C?qK2D>8b= z4aqoS3<7tL2MbCHPXrV3U}ek%PeG7A@pjBz!Tfz1f{3{5-%inXvSh*Xo3>NnuNV&& zqio!{U_Ikbu<+#Inl6RG3Uw%i4jk4D+3>y|9 zHXH0ZV_KcD{&aXd;6rI#%0j|B!G`3c>~1jIXpiXbMS|m!w?x>VQ0h~YNBWE{eh}=H z_`u|DY8gi6tVBzu#;;H6WfpLV%^}t0ZS;^}l zAA;q2B*c-)AP5JS0rod+Iqa+wBrEkmf{7`~bs^T$19#TxA<2hAteXS4C?AEr!8RJJ z6X%D7{lP{RpHBQP#CAmBe9=ve2(g_IxKgYoyQ(T|LehiL5I1e7bwkL8f{DDHcEWHN zp%Dn#;(ZZh83vLrD@(mUt6&7|Bd`NuJIWOKH&rrZhkz}M2aH`e63jE~{Dbub9l>q# zQGi%pZHYG%tO#Iwc6tW?(SxaP#;S-=|4tXD6y#vCqKISFD?|-3;CD zd*I`@OCP4XDIM8m(2?m6Ghh{FfO$qG`=DO`nQ%B0#-4Fx@(-$npM%|mtcR7nR7KtC zklltVw3}XPUWna6R`gPyVodNZ20@GSD#14pcp+HL5b3I_phLJA5Pg@{eaBZgmV)6G zj;t1b0k&M~Twlj(J%Ye1OIN4=q=N7!^>OH`B|CkQV(iW*q^+G^r5eYsd#VTi{@Z$E zOGft{;d5|^&!P&SzTQWW`R0bK4I|Aqp-YCB-ixr$p&M^5jj*r4Jaa*Wecz)f3Z>Bz zmhG7qN10~?jPt+Q6K|z0-55ZymYxYQu=G@fb?uoFubN*(SWmF+OV?+@N%xhyDBB+X zE-RfGu^rGeE1Y{vUq*}v!}u2S?1*p=u*1!Agzb%%bdL7?AWxHX75o~)Gm+uhrH<^CYAldVLxP`}uVy|Du?t{3u+)_G6#E9> zFM{qpb5Vv*Oz`*?UzfsP3tnf?{=Ngd3c9&YX(BavJ}s{iv57^H-Swq z4b1AmKZ4y#<5K^u4)PQ1=OdZnr5`dpV|Y;a2e9Ky?`L#^WPgNh_tK&a-!*F zXa+*E`yuQ!`}+y9CCj0E#SB_Z_6T&d&Cz~>Y~ABB@I1dVWKYPz>;0tBI7d7U;XsT` zogrKN9LlxH{6D|^KZCsp<9%?J=*kFm*DGM}nd|)o*@ORrzu~3Jv$_hLgEm0dRJz|! zkgO&f;sk-|@IAnVW{`CP?7v{E%*(U0kOU9ToF6NugK*WhS+bz~^!Gmm?li~wElz`d z3-*+`IU^gw`ZJrK(BfI<0Kdf<2$Q|I$6LwhD^?b|d@npaSh8~Z4d*%NO1%=|-jc}9 zP;)<7Q?HD;4{ULWwZZl;V26j8(+k4m%&2fXI2;2OcDMtK4*=7~c_cFs3EHLiv--0^ z$cFU7v|JK7y+K(3+XJ>^OJ4T>RA2*aZ?MkN8xB6h7(d}C;@kc(u9nth8$;|jV3(Gv z*>{yOb%!GGU8V8aCZ!t%`y-)qaT?#EbYw>(h+CTL2R30l2DS@Ju1Xs9Cp-zp9-z*; z1a=D8ayWciIphS=35V6vkgP6$14?}cbhDtlL+SQ{?ra39lqO|e#TesU=xj5HL3W`7 z;qidFge;ANAU~QPWcgGh53(zun`_px4T?1)@Jw`*Yc9!FRgfm=u1642`rJ>N<-bWX z&#w&G9K=|J7pENECs)DoJV4LB=~QEm;9$*PNAoTnSsi9!KDlA=E8yMb;j4N8oy( zyM(%D;Bbt&k6$hNdtUkr#sUMs2v&ow?vgI>_i``1|D$3C{n-`9>mZy0q3%zP>NgO? zF3rg3H5}R7NYF0L%jm9SkoRF*Db+GMNE`fp2wRN)jIJ~X=BHq8X=CR9^y|MI)ms4P z0fx_rZ&2zbr6m~)&UtWQ`8@)6mi~~@m0{pmZdx3QznU-Qp zTK91oYz%a-8(u;vTe1`2uSfC22pf;2Hx=!a*7b4_>r_IclF&C2y}{0e@s7peiQ~{x z9$ei{1?x20vfHax4^Dd?6FYmZbTIx!6S=)OW^QkG-L@Ha<-wj zFs?~7=)eEg7w``-w(wkzzS{Ax6)lAE4(UOODfmARvc;&v$Xt73a)>Jc!r+1Sp)r}zsNSnnV$0n~1 zvEDGgbgO~X59|UA);B|gYkT-R+So7gUWn}kott%&)sVkIh%r6s3`*)P6$Tz^;ZrP< zZX&OQ{lWHvF)kZPPci;omwlMDacEM%X}KN6H~=~?q&p8)IEW05)3&{!8v$meD+v#N zWc>+`0IcQ|gdy2zFoDxa3KcunLhF*1#30qW?V%e7R!g-f^ha@$RnR&+XC+!fx=!fQ zMxfgPI_C@onUW07cLqKitN}sxR>ox06zi(0up_cR9}d?iMkb~z-2kwQzz&Lio%)Aj zzk=R)Mu;hGfF*N%&ivvm@*|=sHuKzU_%PBUU?TiAa0tnsPW0f!DwoXH+K4 z)qt-V6wNNYskX^obw=i7e7`qlYGX{8~TuO3trmML3W1z6TnKr z@{^(Q=Qtxgj2rE67nJaS&{b1`j#tHRm`q`azW^co5v(n{I>O?8*bq-MM^KpV!*@9d z4e?|mk^>W2H*>G53|WITb~9DQb_Ht&s}-tg%?2aEuCN`FdMK@JEyU>A2e;tq-6L1U zetjJLaoC(4fjjoWMJ?s|mr5G%1czG^!e==I-W3i2k|Emz4BeDHL$M)9W*^v2 zOKwRYuh?(l?*On`d}Q_*z5e5=b1>juu`Q`{Rp0T{8OavMW~N7mPNz|d4O2SqiW~zb z;=yhQ*%-;9yCNrmT@^=z5s!yMVFmC4TzWO!2sQz%0;VS)e%SPBU^bZEDcK!9CM%{l z8F}M61x&;%nNh06ym37TjWgm_PFI0DZWs2!-(Q*+pA*>}a{J)D9jbVtRw4d>L$z-*SH-v`E{TW-t1UWrB7LrCVH z__zK>6>T2}8yTM;VNXhbe~GYXq`wg3_4hfz%i__!xfjs7TVl~|xPO8j9*b_ny@tS} z;-5u=Y=CY;EV>O>lQE*(aPRiP{@;VK+kNAqD8@%Ho{dMQ^=1> zOFY=o+5_x6*v`en%z8tM>}Rm<@nFw~EZG;EQgOM|W9M zAP8TH1r8}30k$v}Y)b79b_Cd}Sg79QC+>91Y|S%1Ql znN2L%wPg7xfPE4Rc05_a)4{sO>zjuRav)-zB?AW)WYSY*;9%$LH(=+3Jrz?sU$8}k z9dQxLIx80Jd~x^cG6>Nkf3u0~s=nB$0@HV{WHYp)Be1b}azfwd({{6DZ}?k%)O`tmBJMf}YYbDc+A4lbXK`$IYe;*p^syv&rZuFGPNVhe6lS5Bml&y|0A&6Sl&5Of1+$ zVusyeye#JVn^H`$H*|Aj(U$b@hex%c(+iN1&}|RfBXFhEyCR*a)~{ge#)2*;8{|Of zLa4W1Sk~QSkf5yW8(MrPaK@8pR9MmJB z^I|hHPWY5KO2P;Iy&MkAW5L{buy4abI1b6o$K0PqvOKs&Gaf;1kI%~N5MmQinVIn= zc<7_9Y zSM|$aq`&O%ka2uGjmA}C9cgaK@xb5T!Dl-m@N9evu$sZf>_b%9r`DY@woBHwdpR;ZRe#&xXMn;UcfQ?N}i?DCdk~!%C zk-$G8h>`engr)k|AI}IUnC+htlap6K=hR!*1+6Ug$IrNb_eV8ajK4mJhdu(f9=a}I zE*_=Rx+CDCdw)FBgC~U2s#*hKYe}7()Ekt%i|!9yJMOGED%}o@zaxaa1=rhaJECs} zLbxt5Ji*WIrhr>6=3L z5eGr%G{k}@9k|9Hp^WvD4t!eSi2k@L8k^$F)V)79mW~0llL0fJJ08r8X2o>i zV_|zMSPeSuuLHL8z^o7(g+v$7*2zW#-%ZFrBCC>N;6-3n{3W|^;3bObz!MSp0WcBz zGkp_a`yiMd`YU)0yh7U6W=Bf6Gnie9>IO>|=vb|x%Ac+R*)ZiV%=WGOa~i|&0Oe4# z!N~d`FgNS9>NgYaimXRyhX3>6^nC=Fpbiz`(G6dt$#MZ30^PCFwyJcfe+Tr(OIY)b z4}tI`uxi3;@l==W4Tq;_rh-fZ>!fWGI+e_^_}wHhFCH+yjB}Q>6}}EPE@G-9q3uHk zK93HwFb)Ntu9*rv7T+(SZ6*kEJRDvIR>=j7foDit;m2U$nUdKpj?S8aZy+p21K+Hf z3Oo+qZw0FwL69zRI1j9128@9hNZV-OyCt)AGLGP+vIx*l2!B!`TSA9;Y*$wSl@<@w zb^hr@_F!G-GcLJSY=`*+S9EPlwhB5o7L5LrVe4&&{XZ`i2nnBs(8FgxXk(rxFKma2 zCf*h~Oa3X72}VD4uR=F171g~i6AW}bBi>a0YI^-g_#fr47MgtCR}RB$lX9rp=?MHO zSr(t1{v#aWu<-STX3Ad+bYFqFncx%Fokj@11GIAi1QI_^+8 zDGlc08X;7WRj|$1S;-9rHpw!=v=wWDuBn~tzgz&Hg~QgmapZHpx+zvs#yz0x1t##= zg^mC7I04`KD#oiEj}!5&9c*Ihjm+Pb?j-zf0N6Z}%&7}c#b4#N4FmIX0b^zM1(TIgy77=7Aem=s+q3!pkAozv6>F;RPJwWQVwN)I zHti8$-^E7w+qAz$OGYa;2!41>z_(+;D)IL-dObN2?0B#_v1M7!I>Al?b1Lxwo(hMj zNMT^iQg?#6*}q%5)ThCCl4A1dB?NB9*IAO;eJuFlaXP+Fm28xy*(9*@z#8BWjMqP` z{h*%?xVa7`%W_&Fo0Zg-71AHqSsqOHc#pT#x7Z)bT*vxAiG=XG~;JUECO?Jdg`-e3j8f0I~GuX u{tFk64*=G99;<%m;_*Q`3^B;W3h6LM-`j^Sm(Ff)c3#&rf`%wSwoN+L=^Aw(ppluM!LVpW86ieghsE+L{QiZ%XG zv?M7?tS+pS6h)~hY`T!-f6nS(_+Y|7H}OoEt^2^+}1g7e&#-<5HsKO`@oAaZ2=KwJ55(B_&F&97Q$u zrmSr9(zsY^ygrIjBQvT@`C!q5OJuqm+!~ z2Ak5&lZ-`CE5>EmPGV;buA%#g_qFf<9E`(K!U>GP(elUXGXWpx|07WsUq70z!E6ch z@daF}pjh52e4YOWzJ;4`i@fc)gZ~Nrd7O#$qx}L0E%*Z-U!gicnc21!8jD}#t|jF z|05Y=@F5(J6LGSIr_-}=E-olhCV9zTrkCR@_!|BT*T+0;#Lf6VZpV+Ez-}kBm%rbM z9HI~7QF$lm-);OXKec4(xiUC+1)`zaiR!!#H!ejh%-A4flekMSqtRQ?S8o}uR_8NYuE8H;f#7UN1> zjcYaD;Kbggx8X;)3-_q|62Hc86HMIyA0!?X_!)oWpT;OPj4BPwU^Z69YNUEJso}L9o*M4jsMM0- z{U0MChL1{kLW8L|183XNe0re;U*s?2ui&qwSL0g!H>SqICwos|n;q_?cWd~CjeX7k zmOe}$rBC2V3!D`%nHENukrqaiMOTQWg$?8~YDg%=BJoD_dDs-2V=KH2+hGUnjNPnr zEyns-;19P2*yhqc*Y@g&$<3Fu#URs#>B3v36i(ZlVn!>ed;WDn5 zxJiSp@;>12;(yNHM}MQw4|r7kXLYCee`xcs=$_)Ftl!ZHzncZVm3&aI8i#`Z4h*ZFnk9$ER@) z&cg+`P`|}-oqYdZ7WgNwz?C+%2H&voJMl?E)_;sy;K-Mtx{n`^-6^iH^j#BnwIkW-&{d!joM1+NO!^R{OdHn zk?xO!&TF=U@}OFeA*o zCAQ(W&j_>clo9SicmB2VZb<6*{l8gY01m=CB;JGf^GD-2{ses7f>Y?3^fR~sUr_&2 zA}{g&6*E>!SVOPF4g5_SZ>2xX2wyzAGs5lO!{4Xwfc)?ADF0{qzsCLK`+r*Cti-g^ zVP>VVZ0WE-dAf4xaJ1D*hodbl9Y#=(e-56H7pZHBt+8$C^yK0Wf7z*y8*U;qx5Fcj~`5jaxbSUQFia1uTt?y@z0lck@}W#Kl%Q($qbjTqd*shJr(xh_tjtkJxJc2@zec}d;f?q%f4jV${7>-<3w$H*hz%Ue3_r^!=|405{zqBi1TwP1 zQI^dLi8*v$Rygtktix}B=Vp~n{tc>?KJEA&>F#td^?k5!%tQaI@D+P2JtQm4`mU@n z%lkAKEk2I_sJzMIQ^jY{bLeOBdF#A@u_Yds;&PvSHEvM&4!(!m@I%~*yDhwz-j4_Q z-`nufpkvVqfs;0HTESVmMA>jMX=TGnWR(pkQ?YFLV|fkn0`Yp{jj?IjFuLaSrS#>= zy7>KXuduU(Yc#x;zM*Wm6SpWFh=Xyc_&qi>TK$9iP7wb){)0a=k(YS?W@|Lhf(tcx z5ntjLm#vVzWE=1!4R_%leZDLkF7F}!5j@U6Wdl(;fB#R7KP3Liz$`3}mCJ=AuU;;k zL;)6ILwV=o1$dEoEBZ2huAn=WOG|$LL{~Fn{t6G_kLAK>epUBpOrw&!>bp?JEehs=XJB*|rHs+s?&D6Kd4qt3-=?>Xp1KsIZFAq0Zpg#`LXc*qZ zABp4mkKkk3S;;#z4d?S0;$mEi#o5Vk%viK8JVaY;WV=ta6Fhl@BMKTRw4u@%xuAu~0&Nx)GjRK8&KNcuW4J*aq9-mDmZpU^nc6 zy%J2^|LYky;>~tAfW8ff;845^hvU6C5=Y~M7{l@UPmDA9{!R7?rwYu#+5Be}K8K5N zF}^IX7+0xZgX?euzJu?T_xJy83O^F~kE8yazn_0FIkWixVoLvn|HWTz=%l(cbW|bC zJQXuAtAh8xe1&jHas~1#gqau8Mc6=I6Z%4IftOSWuVq{H9k7ddck%1!8)A%p5^t*z z-p{+}5jaZ0So~kzV>a}pylLW3<1;uP7vf@!E%i{0D{(ch#W(S7d>6Ok2e<=2!9Dn; z4IaSnDkQ&{V$rei5dALkG@f-585P5cRHzt6l7o2_!%^45`W3@BT@!3kG0glDY=iBw zW3o^D{&&@|hro4s1Kx}SDu#cDdnbxefHZ;a<-GrSltt>pK=ZKW{d&Kg}Kp%;Cl#{K9);&;&Z(D%}#>2a09 zXdYGnI8Ko_vy#96KO?X};6)8y<`>f|={54!^EcA(iT|74LGQ-B_!WK|lXyglKVkA|Jq)IsQ@^lW?kXMLB2`1jZ28_mdJ~mU>O2anv zl~uygccpuZU$5>a?1#7F5F93dcw8sn|N8_U&^T5lyw~F;P7;5Deu|!nb8KV*y$F}! zGF&0=HTqvw{Qj@E@FodcE%YJ1OTlOO1^)nj2oK{?^(W}x<)5)mYEBqgMvnKtETaNe z$q6&8PS?cRST84x;9P7bzomHVoNyP~=Y%h|uHrqgx4au;9&W*bI2ecG-8ceA;usD8 z*JpwaO%|Vm({UEg#n=J`iy2EbT!F9hU#Hj88-2p}=xz8R?v(#2y%+c6!B8KIeqj7$ zBfromH8_(Ke%I4-1Iy-y*;U95Bg(d6Mz_e}#fB0^RA} z3U0~`GrUd1q2hnb4S(Yqr|yy5@YXykZ!$h5KGQ~?%?&^EOA>zK{aYsS6^XCW>*x(O zuq8MA0c0nCw}$)Z19%7z`vAw}{Z9X>e~GGo|1+wFqbyrB9C4MZ;fSkYe${ZaMe%~f zKaJ=M)HRpaif%)*C({MHiTAAP_y2kgZxI-%a0uRM;Sun}Kuq z&*Jm=VpV_sf0?lyU$M{{dYwjZ;bz>5AIje)|1pI#sEAduCKgo-qiZ1l96XQTl)gxQ>=F-ctA!bNlGs&ZcN^(NUoUU%|NlwP3o|K` z7iO1DSIP@B%;D!@A-@jR%k$>}Y^MHV@k`WQPPZ5D7|RQ@yqeKNgFXsw#)0x~mv<)) z7r!6JU`%|1y2trbaK``g=6INoi|{24{%J$2aIJ=K$=ghC!;j^Cs(!Ceyifi?@xviM z79E#xLf{XHXEjW#5k^zGMi@mFX4eQOSEWW6S#>PHB5WwXvHYg`HBT~r|64IGlh_uo z;CI5Vcn$W#J{G!}9)N=^IE=mr@5NCGCf>iXHNxc?FE9}&^QUPv+d|LcLV1gEDHh{O zTrGbcy#e2e`^oozi-hgCL&7H(-iu%Jzm<2`2LDU{hNo+Ue;byOA4XIzKYYL{`C)`r z^TWvU^ZowUX4IF^C_j9oHRZR!OEqjqca-0me+~b-{BUP(z?*RZ4#GR~{r=yj!Mz$h zAmKs!5%Ed%lQ<1$;XHNE;S2ni>E-lFdUcGkjL~pV12mGD*srX*{EBYJ!9)HB+ z_>25g82iftsWro_%GC4?SToG3V$CqSYW$jXUGWC|bJbs1GaP*j{-xNKe0vKf0q9oe=&clg;wCJ{MYIA1+j2s8wEDw`?y`=4*C<^!{2AYZ*1T@ zqc|$>XZ#KSz`xX`#tOqXT~=Y(NO`PW7-n3pFpQ>vUkB@pH>S^**Ss*?iI)7<^4ifI zurtQGdFY9~72JgVH6Bb4lXnl^i=)IJ#7A%@Dvmx*vTT-hp?=B#dB;!Ut_+JUyv)7}1p4;Sx>b&%$~91?pbpFU1w=SIhgCbz|!# zyv=x5gMZT>(Vx(J~i>d`~teD zPB?-3{B!u{)6M9X`n2J<=XavJCUyM&^$_TdHz^z-agYUXr|*>aH+iFQ9DlsLiS!fr zl)PEua}!M5{{@Ui5?{jQxKeyIuC<}{b;6z4r14hyAByjg|B1XW@E{(J$CK~hQH3Y) zq=tV3GQ%q|L}s)V_iR}@~iLb`}rFnikO4du_o5Wde{ih!=~6ATj6Ec z4m)7yz*y9c(Gz>)jd%+V#KAZe@5T{0635^}I36eBR*2a3+2+zZ&*c@BoW!MfoU}x-xJ?nY@doymtTW}x_#-VsOj=+&P1|P!l tI1wk~6r5hKM>wKcjJdb~7vU0IhAVItuEBNnQYVegPkDW8eu<0w{Xeo#21)<` diff --git a/world.c b/world.c index 4490687..d5bf477 100644 --- a/world.c +++ b/world.c @@ -65,12 +65,6 @@ static INLINE void drawface_triangle_fan(const ps1bsp_face_t *face, SVECTOR *vec gte_ldv3(v0, v1, v2); gte_rtpt(); // Rotation, translation, perspective projection - // Normal clipping for backface culling - gte_nclip(); - gte_stopz(&p); - if (p < 0) - continue; - // Average Z for depth sorting and culling gte_avsz3(); gte_stotz(&p); @@ -127,12 +121,6 @@ static INLINE void drawface_triangle_strip(const ps1bsp_face_t *face, SVECTOR *v gte_ldv3(v0, v1, v2); gte_rtpt(); // Rotation, translation, perspective projection - // Normal clipping for backface culling - gte_nclip(); - gte_stopz(&p); - if (p < 0) - continue; - // Average Z for depth sorting and culling gte_avsz3(); gte_stotz(&p); @@ -183,12 +171,6 @@ static INLINE void drawface_quad_strip(const ps1bsp_face_t *face, SVECTOR *vecs) gte_ldv3(v0, v1, v2); gte_rtpt(); // Rotation, translation, perspective projection - // Normal clipping for backface culling (TODO: should be necessary only once per face, using plane normal & camera direction) - gte_nclip(); - gte_stopz(&p); - if (p < 0) - continue; - // Average Z for depth sorting and culling gte_avsz3(); gte_stotz(&p); @@ -221,9 +203,25 @@ static INLINE void drawface_quad_strip(const ps1bsp_face_t *face, SVECTOR *vecs) } } +static INLINE short world_pointPlaneDist(const VECTOR *point, const ps1bsp_plane_t *plane) +{ + // TODO: can be optimized for axis-aligned planes, no need for a dot product there + return m_pointPlaneDist2(*point, plane->normal, plane->dist); +} + static void world_drawface(const world_t *world, const ps1bsp_face_t *face) { - const CVECTOR *col = &colors[(u_long)face % numColors]; + // Backface culling using the face's plane and center point + // This eliminates the need for normal clipping per polygon + SVECTOR cam_vec, center = face->centerPoint; + cam_vec.vx = center.vx - cam_pos.vx; + cam_vec.vy = center.vy - cam_pos.vy; + cam_vec.vz = center.vz - cam_pos.vz; + + const ps1bsp_plane_t *plane = &world->planes[face->planeId]; + short dot = m_dot12s(cam_vec, plane->normal); + if ((dot >= 0) ^ face->side) + return; SVECTOR *vecs = (SVECTOR*)(scratchpad + 256); @@ -273,21 +271,8 @@ static void world_drawnode(const world_t *world, short nodeIdx, u_char *pvs) } const ps1bsp_node_t *node = &world->nodes[nodeIdx]; - - // Still not sure why we have faces attached to nodes... Try to remove this and see what happens - // ps1bsp_face_t *face = &world->faces[node->firstFace]; - // for (u_short faceIdx = 0; faceIdx < node->numFaces; ++faceIdx, ++face) - // { - // // Check if we've already drawn this face on the current frame - // if (face->drawFrame == frameNum) - // continue; - - // world_drawface(world, face); - // face->drawFrame = frameNum; - // } - const ps1bsp_plane_t *plane = &world->planes[node->planeId]; - short dist = m_pointPlaneDist2(cam_pos, plane->normal, plane->dist); + short dist = world_pointPlaneDist(&cam_pos, plane); // Draw child nodes in front-to-back order; adding faces to the OT will reverse the drawing order if (dist > 0) @@ -356,9 +341,7 @@ static u_short world_leafAtPoint(const world_t *world, const VECTOR *point) const ps1bsp_node_t *node = &world->nodes[nodeIdx]; const ps1bsp_plane_t *plane = &world->planes[node->planeId]; - // TODO: can be optimized for axis-aligned planes, no need for a dot product there - short dist = m_pointPlaneDist2(*point, plane->normal, plane->dist); - + short dist = world_pointPlaneDist(point, plane); nodeIdx = dist > 0 ? node->front : node->back; // TODO: this can be done branchless with (dist < 0)^1 }