From 1aad8e5f9e8f5bf8bfb8e75b1d9483342ab8b0fa Mon Sep 17 00:00:00 2001 From: milang Date: Sun, 1 Sep 2019 12:28:31 +0200 Subject: [PATCH] correct perspective deformation (this is quite slow, and I will turn `double` to `int` as soon as possible) --- libfxengine.a | Bin 9664 -> 9696 bytes src/render/triangle.c | 41 ++++++++++++++++++++++++----------------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/libfxengine.a b/libfxengine.a index 001a3dc5e82a91092b563351994f8bfb3339eaf9..850b3a591f6d034d72025ff2ccdb76830c3152fe 100644 GIT binary patch delta 1483 zcmZ9Le@q)?7{{Nt*FxdS3U@$DX+3%{SO!UErx zO&JNP2GAm5G15LFjiN%QSL_qb0k#*#J@(~I=|m<#Jf1g;m&!`^GgG>T?85F?SL|f0 zy0|konX(Kn`Yih5<$YOdQHh!{>6DV);;b*jMe3bT!e)2Z)t^deJg zQK=D`)X$dbz*MHy;%m9Zs1`5e7N^u^TtvfPFI3gwEc5I7X72EERqKOF{~)?o#r=ps zHs>E;k;(3?FwW~OyxifTYtk0<()TqM4{cEs8rvofp)-~w(zRHUTOT;D7VHoxKkOh%4YS7s9P8m4-p;#LB%e_rr;mgR}T8OGP*k zk(O@viM);X(&ffLRO;v0Mk}X^t3Ti9qUMjOH@$Q>>x;^)|KECAqPV1aAztGQ!I99I zMAg$WJKY>D!;%iw$Hf5d>BW-@%y_-GFq{i{c!=3S*5J_yU~A=;0YT#gN)lw2+g zu^ze=-*g8k;fjqvOmi85Xpnm8A1OaX7Lpya2W9pMdC_#mGR!!AYyNdNZBy-9PnS!S zZ&M~o__u^j;<+Q{tM_41Z^?Fj9EhbK3VkJ|P`=v1#9gGGj7y4=IUFUpl zJS-dUi;>V*cLMb81h_$7@pwD*9C<8A@|!cbNrJan;>6z0uBY$9lXdFiA+ugGAxKR! zazFV!mh!X%DS>Ev{?BMiAEYWySt@jLe>G`*e&+&$r@pE<(y!ad~y)i<#nPP z_-bA#Jf@sWe*zN;`j-Sflc4`f(0?cB)&Fax0YJ3?>T?VM03JP)aKN6RU&Q0qYxq3x zPCfOCc=olPGbg1WzRtIY;XQ!Vop+*r06K+B0MZmL1=yo-Ie=baCs{$^7oK7lK)O<| z0m#^4>P-NZ!hPFw!`pjOZ|^oVLjcUqAtim4wWGXxikfrcv0NDy(1~4f6C4f=k zs{kg2Zvf;fJWc_a@i$ahrJ2C4EMApTg2xMr&-NSAuAD+uk`}k^ VEzP(pJaEp~a9T7S3ta0XkXY zN2X_i3om8`d5u>~B*qJ4jLsNuTwikPqhTSjV&$seNBzp>vp?mEH0`W*IPc9{&Y5c8l7;O z|8gXJXSt!7sN=$Z)aEo#m2#Cy+t5VRFl>l&jjfzvzSd9QhGgxK!BcVtoT{XWkSal~ z5+(}y-KcGt8K?5w?xgO?_DRl=tmvSjJgK`4XHUGk)!}+&YhIfLe+hk&`ZlwQDYX&5 zWv#%Mtu?N2hcqj8MrO|U4n$uYqCen!z|wm`dwTdy%A&1vn<-0KOQQ}fjb&>5v(-g) z;eV~J@~)~Y)a;Kd?Psvl_O3p{p3b%pK4^v?J7dw=Lr!Sx2wt2Zr7Z9(E0~f*$0}QzczI@>u=ue9q4(|Fr1QBp(-a!X-H{r88OeEX;*ab;X>3ODF25IDWj#T<$;{RWlRYb} zM&`fY89|vd>b)R6%7pKWOk^uS3y4LTklbU9vAK9kKml507G95`{>?bkN%I@5F4LW# z+vT~)$U8)bS9Am<>xhgnmmU&RF$sm}IK!{9M~Ecb|9Bmi&hfjfCP1?_OM~mcBG$<7 z1?c{LwzlVEwk$~VhEX)egg3IV$cO02X1Y&6vOU6E{6;KAjI6QR5Y1W_UW_6Bp=_)F zk+>E^aq^FlVy!(htX9@p=p04T;wd7worO+1vJ<{9y9*I_a+I-De2w3(E~z$!=>DCB zwiwFz-Mf5AUa(Y1$&z{V+vN2-x0+;L@~%T66Onm=ygdAH3`HLC8$@Aqss8Dih~}S- zNo#(Z$BweTT%v`<HMHLZ!KfFCDMb+#pc} OaJ`08X^psBWBds1->x < 0 && face->s2->x < 0 && face->s3->x < 0) + if (face->s1->x < 0 && face->s2->x < 0 && face->s3->x < 0) return; - if (face->s1->x >= render_width && face->s2->x >= render_width && face->s3->x >= render_width) + if (face->s1->x >= render_width && face->s2->x >= render_width && face->s3->x >= render_width) return; - if (face->s1->y < 0 && face->s2->y < 0 && face->s3->y < 0) + if (face->s1->y < 0 && face->s2->y < 0 && face->s3->y < 0) return; - if (face->s1->y >= render_height && face->s2->y >= render_height && face->s3->y >= render_height) + if (face->s1->y >= render_height && face->s2->y >= render_height && face->s3->y >= render_height) return; - if (face->s1->z <= 0 && face->s2->z <= 0 && face->s3->z <= 0) + if (face->s1->z <= 0 && face->s2->z <= 0 && face->s3->z <= 0) return; line cotes[3]; @@ -184,7 +184,7 @@ void render_display_triangle(const render_triangle * face) } for (int32_t t=0;t<3;t++) { - if (line_get_x(y,&cotes[t],&tx2)&&tx1!=tx2) + if (line_get_x(y,&cotes[t],&tx2) && tx1!=tx2) break; } @@ -197,19 +197,26 @@ void render_display_triangle(const render_triangle * face) // calcul de vx, vy vx=(xcalc*fact_1-ycalc*fact_2); // 0 s1->z + (vx * zAB + vy * zAC) / 32768; - vx /= 32768; - vy /= 32768; + z=face->s1->z + (vx * zAB + vy * zAC) / 32768.0; + vx /= 32768.0; + vy /= 32768.0; + double vx2= ( vx/face->s2->z ) / ((1-vx)/face->s1->z + vx/face->s2->z); + double vy2= ( vy/face->s3->z ) / ((1-vy)/face->s1->z + vy/face->s3->z); + /* Perspective correction vx /= (double) face->s2->z / ((1 - vx) / face->s1->z + vx / (double) face->s2->z); vy /= (double) face->s3->z / ((1 - vy) / face->s1->z + vy / (double) face->s3->z); - + */ // Affichage du point - const uint8_t color = bitmap_get_pixel_r(face->texture, 8*vx, 8*vy); + const uint8_t color = bitmap_get_pixel_r(face->texture, face->texture->size_px_x * vx2, + face->texture->size_px_y * vy2); - if (color) + if (color >> 1) + { + //dpixel(x,y, C_BLACK); if (render_zbuffer_set_px(x,y,z)) dpixel(x, y, 3 * (color % 2)); // 3* means cast to black and white, and vx,and vy casted between 0 and 7 + } } } }