From bb7052397c9901bedfc342985e5b5f797d35c0f9 Mon Sep 17 00:00:00 2001 From: Mahdi Khosravi Date: Sat, 28 Oct 2023 15:26:02 +0300 Subject: [PATCH 1/2] refactored utils.h and utils.cpp --- src/raytracer | Bin 144104 -> 144576 bytes src/utils.cpp | 66 +++++++++++++++++++++++++++++++++++++-- src/utils.h | 84 +++++++------------------------------------------- 3 files changed, 74 insertions(+), 76 deletions(-) diff --git a/src/raytracer b/src/raytracer index c9bcb83ee8be694598c030137ed37ffa91dd2b6e..2fca5058efe85c1f0aabf39f07918e635cb7d38f 100755 GIT binary patch delta 35423 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 bf77*Jwulu`YHQa&LiG_jgo%@(YQ6stRK}lS delta 34792 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 sI>_^?PJ3S65t*b0RHJ`cCt2+f #include -const double EPSILON = 1e-6; +const float EPSILON = 1e-6; /* ============================= Vector Operations ============================= */ -template -parser::Vec3f add_vectors(X &v1, Y &v2) -{ - parser::Vec3f result; - result.x = v1.x + v2.x; - result.y = v1.y + v2.y; - result.z = v1.z + v2.z; - return result; -} - -template -parser::Vec3f subtract_vectors(X &v1, Y &v2) -{ - parser::Vec3f result; - result.x = v1.x - v2.x; - result.y = v1.y - v2.y; - result.z = v1.z - v2.z; - return result; -} - -template -parser::Vec3f multiply_scalar_with_vector(float s, Y &v1) -{ - parser::Vec3f result; - result.x = v1.x * s; - result.y = v1.y * s; - result.z = v1.z * s; - return result; -} - -template -parser::Vec3f multiply_vector_with_vector(Y &v1, X &v2) -{ - parser::Vec3f result; - result.x = v1.x * v2.x; - result.y = v1.y * v2.y; - result.z = v1.z * v2.z; - return result; -} - -template -parser::Vec3f divide_vector_by_scalar(float s, Y &v1) -{ - parser::Vec3f result; - result.x = v1.x / s; - result.y = v1.y / s; - result.z = v1.z / s; - return result; -} - -template -parser::Vec3f cross_product(X &v1, Y &v2) -{ - parser::Vec3f result; - result.x = v1.y * v2.z - v1.z * v2.y; - result.y = v1.z * v2.x - v1.x * v2.z; - result.z = v1.x * v2.y - v1.y * v2.x; - return result; -} - -float dot_product(parser::Vec3f &v1, parser::Vec3f &v2); - -template -parser::Vec3f compute_unit_vector(X v) -{ - float magnitude = std::sqrt(v.x * v.x + v.y * v.y + v.z * v.z); - return divide_vector_by_scalar(magnitude, v); -} - -float compute_magnitude(parser::Vec3f v); - -float compute_determinant(parser::Vec3f v1, parser::Vec3f v2, parser::Vec3f v3); +parser::Vec3f add_vectors(const parser::Vec3f &v1, const parser::Vec3f &v2); +parser::Vec3f subtract_vectors(const parser::Vec3f &v1, const parser::Vec3f &v2); +parser::Vec3f multiply_scalar_with_vector(float s, const parser::Vec3f &v1); +parser::Vec3f multiply_vector_with_vector(const parser::Vec3f &v1, const parser::Vec3f &v2); +parser::Vec3f divide_vector_by_scalar(float s, const parser::Vec3f &v1); +parser::Vec3f cross_product(const parser::Vec3f &v1, const parser::Vec3f &v2); +parser::Vec3f compute_unit_vector(const parser::Vec3f &v); +float dot_product(const parser::Vec3f &v1, const parser::Vec3f &v2); +float compute_magnitude(const parser::Vec3f &v); +float compute_determinant(const parser::Vec3f &v1, const parser::Vec3f &v2, const parser::Vec3f &v3); /* ============================= Pixel Processing Functions ============================= */ parser::Vec3i compute_color(parser::Ray camera_ray, parser::Scene &scene); From 9583bacb16b0453c5ae19dc807d1d763d6e26869 Mon Sep 17 00:00:00 2001 From: Mahdi Khosravi Date: Sat, 28 Oct 2023 15:28:42 +0300 Subject: [PATCH 2/2] removed unused add func --- src/raytracer | Bin 144576 -> 144544 bytes src/utils.cpp | 2 -- 2 files changed, 2 deletions(-) diff --git a/src/raytracer b/src/raytracer index 2fca5058efe85c1f0aabf39f07918e635cb7d38f..28a221d63fead493ebc312f507f9fa321bbd37c3 100755 GIT binary patch delta 11083 zcmZvi4_s7L+Q;uR&M4q0OrnC028w^sQ9#N3GwQJ6zZMJ2HZ3gJsI?k5C{#?8Au<1r z3i;>J4PEH9%{JVHO&2UG*sR4CT`BF=8VkzaS9h_+%`NLC&ii}rz0*tc?)`l5d(ZPb z=Q)4wInO!wj*VBsDzAia3uqpN7lj+iqFwtf z|A?OR@VM+^S9Sa9xl1o@v%ge#>dn59uU7QR7)1%Yu8bW)`Md0iGic+k`H4)+cC{tm zL2qtI8dsMzj;eZb+XUJ{f8-}7QWZtlIg;ouqLZAPOs`vP6FEMGKB7eKN})TciZdor zO!$q?ZZ&_)pD$cZS~J58T{35^|3|6IGd}ND3+SB%)82{PxD|#gtGgBY^!AlLSJ*$3iYd0v zK8w~9z0ccb(*Zici5?nj>H9g~?V)wUI@-Dw`jwuLemSLGZXM|f=pzjCFURp!4-KCbJ)=%zYLCe4j3F2uu|h=&_!>{bo9Z#dDdy6l>^@ZD}z&`;C+ zV03>?`y<#G3mtR~(X>B-`@m+N% z-D+%KIOs+T!3Kq%gIq@Aioh-v@z(&vu zo(27hs#smdO*IS}CQl0(1A50Pl?nR6RFpNmH+_IY@e@hAr_2P@{I;b5Q`H)n8@wE#m8wtz7s zP~q(;0A_$5&<`#KoePz!1gq~cQflf*I0o~;>cwa%=)G5|umt$M4;=vQ_oG6v zWf>X-`m-@YqcpA9o`YwL8~e|dsu4Z}$HH9nY&0r-SgBm$BdA#T3#9^}7wiNx9)qJX z=n3cpvmVE@mNa-C^m@^uv9PbeVk64446WSEGSo0IUWx3gLHrF@^*; zb{B*-m@J_CX*2|^0QU*k;?aQ4A~-}O>sW``4Z2Iv1JJn;f~utSZcEu=)k~0quv7Z!+}XAYg%kmoP`bikHzKNrS~5xN-g#6(Yp? zUqM5_ifUw#^brg>SoAxkQg1=Seh&v=phl?{FryZeYziv;14a()dKJr4(nqnHz=~s- z#0b^yI*cUfs>iwqyfR5Mrv2EYz5dK&Dn4|Zz_SG#z(b(x4U_{bzz#6$O^noZbo4DuW-tJ{`@`Q`#dv18=@J37H{#iYPS6j! zz)H{!9tAVNW-tp3fL^c@ECQ{O=l~c4R)8+B8uWk-;9{@^Tn+}nBCw+vH)Xi#0uO=q zCd_)!3ATVPunlyB*TD=h44X$5=mfoBGFSwrgMM%cSOG>m&;W2O*aEu20GJ7OfVp6? z{ZHsIZk(VWbb*y%26zOUpTaIDY48#l z0JVYW$Z4hGz%1|v_5?3zM`-thhw$vH!FsR-Y?+Sr-+`Mp80>$=5QA8n& z8SDbnLDv}!G3W=qVh4R-pcU&HYzCMe<1dDD9;L|g&2yIU#*F-{+;__8J_w=1V&7KpJ=MpdozFOXCt->$}x#wA8xhK$_M+Z$qDF zd;4wMtvh<{M3uNw@t0uLw9S0YOSeY&j^mUlJ=w^UR?w8hJQPRJ*Q^In+}=A1>$rIfX|rY+%C zDYZBxhYM0>h|R<8Qfe`z`5gZQN~MS7D1zh(v6XQOvf2(on#%dOotcUpJqNS}QZj77 z53O!P!UbEHX~U+kU5Blio1UQY1G~QIRtOOKC7n#|qiJDGc{Cs~8gr(nlm#iShfO@? z!RF$bc{D!JhyAH%#Wj$MU_(^UFMTq=wwcS}eP(G$_6|tmqGxsujrPNaf&alpG;Ej* zK^HxCn?NUioJM&o(`W6FDJtFZa#^HUBMRtOU*I9<0%?$^F<(3aQ;*9aR|4| z<#r@qE`gz3^Av?iMNrAd7X)qmt-!;v1wbWFE1;otmhVAo*mZ2^2xNFE>mRkjvZ_Ct zu3@{@PV|)tQeHqasEbblmh7+jG)i#dN*ZcAfhYbZx55$Ut|TYT=aQ9pwV%(eD`^1b z@)s*Ih*#6tJjRjA@c9_doqq=H-V>Je=jl&Bm34=UM(8!Mpl6gO1tF&Tg z;-=L!g8xxSqby%m^J{*@vE(&mwH5SM>OMofe+`YI&0MkuX*!*3Y-AkutmuZ(ZGY&(UgH%SQ&ORPYk#l)i2?kbu@Hf09kuVav(U*<^N8) zu1ih-PD;SAoabwhBE;dZP=~dV2d$?`5uP}uUXb(&z6hJJ z&lS^TOWY`a(?^ro?V~WuZX*#ci|XiLiHjvZtcD`NWbQ;3tc-7csLwh^si&nfT*>(J zV#M-zS_w@aSPdyS*0MU}mH#}Kl+b`!E8f(D(tJn(NXf8mmzg}9J4z5)3dRM~dSsCg z0`;8s44$})w?9L-S_&recN=gpNFO3ybZmf<#mhEexnAa`4RkAI^S3Zs&Q6tlKM7Ao zMJI;J##3GjwTw@eB0?;7^LwQ<#a4h}jp4M7=w^V|32OMbpn(4+n93>7Vh<|t;1tC< z8)z6Ge2n_=if0kU!npidx{VeyZK9FkGVH0C-G?PP9+7CmCYp`ex?&SO2;Zk*v?R~r z)0?n7otrU~r95i0ghjl>ujh+?is1u$DS{v0OlkBiAAyEodP>m1R|Ns?w*`P_fr}Rk zP=Ub9O?{m`=c0#dzm?^fzuFFsv} zuapb7V~|dB{&vV%F53}p6ZpmLG(IA1sZv|zkk`x~ZKol_3hw{^^IaxLIs#82J9eO& z%e-s{{9raCWqF46c-GrFTGQGd;PpGOjYRCEaTcc`aOO@#$Rb#5zYfVp^V1cvhhV?HP`Mz%*rdHvDkw4mm%|d{-O*IE7yzD zHm9sI)CeA3P7@QYEB-G$==*_81=#SlPQT*tZw+i+ysjK0a+s^iv2yGAS~(_I3r~0s zz>f1AzH;y5+UGFca`Ba+R<_p|zPJ-};_uHP#-C@$E^H5%Ic*mWj)=kshsPv*weZh( z(X9C9=em_tZv9A3wr!RT)@OV9F~kxTuH(!a!%e$TE1c{`b$(t5SUhX^j@>kc8+Vg6 z;`$n;9u|+E@#)<(DZa4W^mz5h9wj;~c1d)I-vd`}UbY90Gx&&s@AqK1YIwn3OgJ1Y z_acSqvlruD!B_X9Kqljx{1|A91eJo3wzCr@N>qs@icc~o;$r?6QUm=Zc+o-K8 zO_GV5vJa8qObHL)Pea1vU~Yuj$+i3Nj4t7Jx!jJFASa08Zv|OAY`;GKY5UO(ynzU6 z1e3XAKiP}hb}5Cxsb4ado)o;dh1eFub^|tq#~<=7hs}!5Dm}{?+34Yn58mgyypve#jY!MB}9df37y zX<7knpY*UfVe{bI&j+S$s@4b57)Cogp2u$N#cdwrwcXS`pbxeH=R8ldZ6|OW!!JHh zV!iy&J!zWQ0(%_m^oE=FU2gA%Y(ln*lOyQ zRnV^fyOM`G>pFi+o?djgF6DRhY47mEX=##CtKpnuIKQPHql6!9hjm*>k}Hv=Z;e^( zSX$byT1$Lg=P_#TMMZVTkK-Icm+D$yLukgda5T_M6jyh=0dp0B?Ajaj7J2Gw-=sc7 zXZZMAbT2*3jz;^KSeiYcFoF#6ih9G#muP2`-LQQFd9D{~p8G06J0 zhVvmW*ef!e*Su@UZCLYiy=~evry5@6;mGx!X|Eh&*ne)Awc*?|QARXHGrrkHfD0Zh|)<%pl@}G$}?7^|PgRe<#*`{1+%E5P_tsMUs$hDAVs48zU zN*}fuZaa99$dOp8(irVQk8YQ*5OS^O5|OJQOX=+89^HJu{x8mCTr08-r~h~?-pfBT zoa1PtU-8^7@^r{j+BeaVgCQWB9W9VIK$g0*@ABxSg2Q-_(?o7GODCJ9gTr{;aNci} zQFmFE;k;7!p=pU+C8d7>S?X>(U^thPr(C7nD)LLF?E8&JH~)wJucn=2It4i%Tdb50 zo!obGipXnCIqD6g^igxvsyRpGze1LdWsWnNR%|-I#^oXpM>G@Xp3O#SG)2E=ag)e7 zrkuRmkVlXq@8oMDzhKIlm4>|0P_>gBe;V=)Q!X=|-(<=$yh!9nF}J1eY;$3urTR6A zOGJJEJGRKap+?J}H05WwR^)@G+3@NZvFwBfuRa=bQ3%dR$@2P1eAw@T^z zaT?I)+RcU>oNFaaXCNOjWuLjCt)};LoFekyAj>@WEHO$4=Xqbw5qUa(^Uzx!vIKLv zT;x*7((lY}qvgR+_&PUeoDuZ-xA5P=3*H z9-PQ~c#+7BrW|*{kRLP(<0Ya*5 zaTu-=Sx!q*y5^imSBgyC!mT1t!U;&~&U?g=gFDJRrVnUviWjn!&WkaeKVX*LZ`$J~ z8}_HnDgA-&mA>E{l#cD2Y?Su38P3m{^JgxXi@e5^JzEWVV_(Dj5pIIKK*Q-o>MncP zkc0cnMAP0GvQgX%yG*z2kg)m`$Dc)Q&zr@v-!?`XAuQ=Bx8FHmAYTBLLDzf~b zCUR)J`4!WLkeeXu%Q9rmf5tcp4UYW=vNSC@WE3JfM@rAU#c&>afVq#$A=`W+>r11R znXw4qvC$lPDai$vaImM#nF%26&6 zxgD}T5a&Jm2+1cNxq5RgWQsK~h1(@{zn+TSf?o-xOr<%t!GQU>K05fXL22jV`Aaib zo*BDN8jiKWoGAaEN#xPkfW&#_J%;mW)A=mECbIn4DNWPN=N*(wIsPNawLv-LO!+Y{f=rQI zBAB5gb|FqidPB|0fdH#tk8rK{DmCT2kf;A5w~PD%WW6QJJ$k9&670>6k5R`MPW+gX zVi&lLTxaY?cdi;$Xlpqixng%hmfptQYsiQW`gMe>ME;8@*PDY8lt0%?(>DfgVhSMh z?3reFLfV_dDI%9Z)@NReN3UYFQIl57IU=7m<;E`zIf4xRYc3Z#ZkFLZJ7lw6z)d21 zA&Yb0L8J5wrt>X)P2^Y1(r3mS-3)HFr#Sv1VtIH zkbj{WS8q-e*@YTJjthC_4{^T88zJk?Ln8kRTm{+orj*v#wI$t$v3m#}k zGkpqq4R#KPHbiSQqf?mKm|t^>$fqIe{T>51xPq(qI_HQSeVZYd-R03``I%I%ja)AB zE0CotZP7;QJ!Hrqa+AnirrbHpkn7D=I-0MEJTKiSU3Su=7b`OgYfo}~8|00qTp1ET z>UfdJS0U>yH=E`#OAq7{krS}B%5=y!7sW7Bp2M{wKLS}=e#YF_g8^g3&0$lsZAjTt+Gi+(VtiJUaoaGqUglwN1{dm-nG>^0@i0miUgF`e(`Dv_H_ zSu+oI!Rgb%ts?iEXY@NRN2VfXzY~7mA zXytG&`xyM#+J`#!m delta 11128 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 G