From 0ffdf28cc70479d837bdc11c5b8d335ee93342d3 Mon Sep 17 00:00:00 2001 From: erenoku Date: Mon, 6 Feb 2023 19:15:21 +0300 Subject: [PATCH 01/14] rendering cube infastructure --- Cargo.lock | 40 ++++ assets/navigation_cube/bottom.png | Bin 0 -> 6836 bytes assets/navigation_cube/cube.blend | Bin 0 -> 1030548 bytes assets/navigation_cube/cube.mtl | 62 ++++++ assets/navigation_cube/cube.obj | 45 ++++ assets/navigation_cube/front.png | Bin 0 -> 6643 bytes assets/navigation_cube/left.png | Bin 0 -> 3831 bytes assets/navigation_cube/rear.png | Bin 0 -> 5169 bytes assets/navigation_cube/right.png | Bin 0 -> 5727 bytes assets/navigation_cube/top.png | Bin 0 -> 7642 bytes crates/fj-viewer/Cargo.toml | 8 + crates/fj-viewer/src/graphics/mod.rs | 3 + crates/fj-viewer/src/graphics/model.rs | 205 ++++++++++++++++++ .../fj-viewer/src/graphics/navigation_cube.rs | 134 ++++++++++++ .../src/graphics/navigation_cube.wgsl | 33 +++ crates/fj-viewer/src/graphics/renderer.rs | 15 +- crates/fj-viewer/src/graphics/texture.rs | 84 +++++++ 17 files changed, 627 insertions(+), 2 deletions(-) create mode 100644 assets/navigation_cube/bottom.png create mode 100644 assets/navigation_cube/cube.blend create mode 100644 assets/navigation_cube/cube.mtl create mode 100644 assets/navigation_cube/cube.obj create mode 100644 assets/navigation_cube/front.png create mode 100644 assets/navigation_cube/left.png create mode 100644 assets/navigation_cube/rear.png create mode 100644 assets/navigation_cube/right.png create mode 100644 assets/navigation_cube/top.png create mode 100644 crates/fj-viewer/src/graphics/model.rs create mode 100644 crates/fj-viewer/src/graphics/navigation_cube.rs create mode 100644 crates/fj-viewer/src/graphics/navigation_cube.wgsl create mode 100644 crates/fj-viewer/src/graphics/texture.rs diff --git a/Cargo.lock b/Cargo.lock index e58a1eb5a..acf609abe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -51,6 +51,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" dependencies = [ "cfg-if", + "getrandom", "once_cell", "version_check", ] @@ -581,6 +582,12 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + [[package]] name = "concurrent-queue" version = "2.1.0" @@ -1259,6 +1266,7 @@ dependencies = [ name = "fj-viewer" version = "0.36.0" dependencies = [ + "anyhow", "bytemuck", "chrono", "crossbeam-channel", @@ -1267,9 +1275,11 @@ dependencies = [ "fj-interop", "fj-math", "getrandom", + "image", "raw-window-handle 0.5.0", "rfd", "thiserror", + "tobj", "tracing", "wgpu", "wgpu_glyph", @@ -1807,6 +1817,21 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "image" +version = "0.24.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69b7ea949b537b0fd0af141fff8c77690f2ce96f4f41f042ccb6c69c6c965945" +dependencies = [ + "bytemuck", + "byteorder 1.4.3", + "color_quant", + "jpeg-decoder", + "num-rational", + "num-traits", + "png", +] + [[package]] name = "indexmap" version = "1.9.2" @@ -1910,6 +1935,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +[[package]] +name = "jpeg-decoder" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e" + [[package]] name = "js-sys" version = "0.3.61" @@ -3737,6 +3768,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "tobj" +version = "3.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d0bde887a49e2e09f30ba3b454cdba3fbc971703e436c527f9f69a035b45b9b" +dependencies = [ + "ahash 0.8.3", +] + [[package]] name = "tokio" version = "1.25.0" diff --git a/assets/navigation_cube/bottom.png b/assets/navigation_cube/bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..3d561a966865975ce298cc620d8c83cd66a7b560 GIT binary patch literal 6836 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 literal 0 HcmV?d00001 diff --git a/assets/navigation_cube/cube.blend b/assets/navigation_cube/cube.blend new file mode 100644 index 0000000000000000000000000000000000000000..fc06180d06807e5343fb899a645c893ec76ef6d1 GIT binary patch literal 1030548 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 literal 0 HcmV?d00001 diff --git a/assets/navigation_cube/left.png b/assets/navigation_cube/left.png new file mode 100644 index 0000000000000000000000000000000000000000..9686f6b888a5c0251a8539b9117bfb2e37a12778 GIT binary patch literal 3831 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 Lrp4#~^UHq$G-W}G literal 0 HcmV?d00001 diff --git a/assets/navigation_cube/rear.png b/assets/navigation_cube/rear.png new file mode 100644 index 0000000000000000000000000000000000000000..3102564a64ea81cb1559ab9b86f611a45487bf8d GIT binary patch literal 5169 zcmd5=c{tQv-=FTDlE`!uk}Y?)C|e~Fp=^`HqzH-077Ak-#y%~B7EB05xGDQGgzV#P zBxPxkCF^8g#$cE+gIV6A_j<1DzMlWz_j+co-}SrB?|06bbH3m2XF2oqng#5@{v-P# z5Xb@3%SP8BkX?>D*S@{rNtY7(2xvrk8X8_RH8ecx>yNza>E#B2C?-TC=w5EQDAkI% zk^6_}?>bMkTnmJpFIn|j7GJ~e&%Wu=|8cq(nr&*BI60|UD<;LZEzz#kqAdPAx$lwe z(K1zwXR6mHd5H$k4@2X(Y0KkN%hE^tu3W7gHrZuf(`EIC>fQHB&hw(bJ(~Y`DBA6= zL}lVj>!bLVNeohR9WY)>vt> ztn7Ls(eE!#tDoN9hux~z@Y>&)6;pli2S3$)b2T|LM^14}L#qpoaSxWge@@mHo(TJU zMyQ+V`Xz7a%B3^|J!oTAkEYwhar?gl`YELqxbJ*N%^l>C4;~xdDY!UvUvFjEgGwc< z$8jSeX>a{&rZvqjgS_l@HiH>Kcst*}n(~vt6Mo;zb^#EG>am?`S8%R=5O~OkGBr2m zoBM6I@Gj{2+2h0Dkp#-v7G;R^_IC3@K@9!foKSAAN70@rkE1YC^J_K_g~TBc;eDn? zm#l(^sbd(gmyC(OY4AP9Z@hex&fFC1+jMbCa1HR#G#MyJ&VG+Lb4K&k{H*f<<(E&& z929>-UmU)4xBTdfxQ7Bx3waWI#cK*HE^6*Ai+jPM9I?UPx;FoSt4dRh}{@4L3S<&fpN?a_1!V_|*T$nwx0$op9-=&lE=zwJ|l5Cx7lLiVYF2Dtx6<5!P= zzxhXZqQE~IzsCL-PK1wvTnyfY6^BghIp_$%ih~BY|3~9jkAJ`UNB4<6|7iRg`+qW# z(_iu=V>?a>a+_nUyo7fOKTO6866!x zQ$SpLZMJbuz0DbMMXt9uhrd6y+N13QU8kNUx~^zZ?5-{Q!rrS>&xHm=y!yh{NA z0an+qC-%CkDJ#dGJb5z5R#{9#Qxis|QY~FvT&!$t#G6=?&wDsbau$69s>iy6`uX?6 zSnm!qwWgOS&i%nMU8-A6O%2T4+`K2-FeYaZfziFy5JZKg=!dLL>xId*2 z($hUQLH%ZrY!V&w?@*!5;3U-ZNSQ6m<1`)x!8?OLIL`HIe|dsmA<){|8lTeN*LO(8 zu~BQ`x#|u5{b;7e*&7paIf_N4rE#BQB}5P~L}SN=P`by<^z`insza@Bc8KxtP_bMb zVXGgX=WW*#1BK@1<~niNoBa3yN@-2B4I)B=I+Bo@n%dt+O*B*GSF$NvdhdSegZ0gu z(cpt)Z%?*9H;jmA3NgOLk3145qpMxoA*qe>P&{#hUqr#;YH)^K<=v>qe9*kWrlBo! zZsBqBv_m{Xb+tw@WqE#n-^|Pme;XonL4JMz1QoAZ`}0wi+ImtJ+f`9T#av6~c`NZd zTt8zVFcUoAZ% zGd*EO?9d^s-_&P$DMXcrWkGQs(3dY67?aXaUugd=@YID2CJ*!K|C?g}oX{adSC}X^^`I* zR(wNtw%pQ>iWX3Te9v9l;^n1f^&=bk3dJ{;$41EGco`kV#$SUmiV)@kM2wdHW3djWZ&+Ij|g zG9(0VYmnA~)7`MG1w;Ze2XGturK`)F<>SX(9^2XdIY6Uc^c3FAa;tq55N5f zFaE5}PWQc|AG}9CsIVu+o4;&@l7pw>%0WT1W(sfQA8+Csi#r?=Q?`BK+o<-x3-TQJ z@#AocvYl`w{jF@E4gs~$yVHMlh!pvOj5LG6U>^7G?FWI~2k0WZq(pf%e7!5eAF-1_ z786a5K-aFdD}^<7X*O?mVO;<;9k^>$_t_U-$6vk$4&1BhD4JKdL-$43NA4bqL=qvHiXI z_U+qJ(FY_`)~NWp*|bwmM66F%4Pd(Ri0zGc4VkZPSg|!YDV-qYzP`S9^vQj4SlzG< zY+72{F5cu}zsChrI&pQPrKQ}d zh1i{K*b*h~co?im%p~@3!s=M(PK>%oN5cnn#dN9d$*Ra^PEacDoKF*D;QK8LA0MCK z`Ro|sc>V3A${nt`7S3JIf;MlDtq8{>LCJdkD4!@9SvFIx`_t)g??PWCpSY-KREJtK zyDF8Du@bH@@q-v8u-#9S+)HT`cDx?6-leH9X4za&Pyi?Sr}MW&A26%c_pFyX@Bin^ zUIPv@(He`KPo|8*@b3T9=BO4if(;J-! zea~rE!lTZ2GY1J9)i08g0)`QW(SoL1&p#$B+1zCqWq?rlN2}J)=d2bZI4389LFwC8 zI2&sLeYUIYGB!4zc*rO7<;(k#;bCGDT<>*1wXmpY5#5G79J_uccp1iCWCjfR;yl1cW2G zL*3m6+uPf>`rV&$%)Pz6*=-a6=3GvrlelBBQ}2!4j5ah5?5_7Qa9ZVeyV9^zlIOe* zzliy>GX?aJ<8s)W>+1euQ2-iP7qb-Q1=^p9JN==+F~tB#%1iOS!Xt%?ii=5GH~|8) zX(dYW*>!?Ba6YLbcH_P+2PEo{sffss+NpS*dg+m74CY6LOH4@As*n*-WA_~d5@~e- zbJ2hlGLuKf0s8H@|v$wO8&=($T3|S}6=`rhKN1K6|z9V(j2U50{ewC>I z-e{<-j0}h@Ha{z5b0)O~Bw(l*jorO4^~hFvptwad2!+A|G_ht}F-tFmfJ<^9BHmkD zSz!SjUju=ejcDiD*7o9{<# z^`@Q))rW!Frynwj2>g{PzGPSZTbW;l7B$C%U4o|*V8ZddC3k%RK$Dk8g6IsL4DG%CMAi?cD_zp zy)#l_tGpw8-uaR%9nH=~Wo1IGt*vs{?&7h(@7=%OGKJHZX};h$`Ke@-tW;L}$AV`! zZ!NVMcnjol;BDlkbiRMpasKo~)!mYX0Dkj8u?^m$qoLn*+yCyGxC!t8G>%LD)z`wR zP4wQE$OZrr7E|5*n_x&th+W9H7(of)opfNQpt|&H9$sE&foHsWKAh!CtN?cQXKX5_ z-`XY$I4bNESl0v;!)lSh&wY9-!ryi#P;d~iP`TI8`*NT{2ZKU;E zeycw}VqIc{q_1pG4Gav3rKllfQdAv|@M`Yko6hBq1O){}1Ly{A*7UrExidm!&-=Uf z(k3S-SI5Iv4s3`y({+Aa%G}37n4Lp0A~) zrF(#Wgx>ZsH8rI#H>{YbsHmJEljGy#3xMcp`%hoCvbUGqarw7Cc-hr-kZb*1u5^?X z6b(sd5%z8s&Z0Ag-SauAZG+>3!Frz{z?Z0Fs8i0qKs(^!=2aFPVMXm9m z0sZgYP$PUZHx$KY(dMVWCb^?z2k?ljUTpyZfwyG#tY%N9ZdeX5P0bwwc}-2aTR$H| zb24<$dGtR>p9g`5>!EIdsGBet3`_8PJ0~KP1n`bMX&U!)fVvrh7x@ey^@Q2k*#ZJV zZsmP>88?1NPgK@ks>!PWLQHZ+ppeEHx!1WgdiK znX%R0(eW10Ngcvy1Jk^J|9;`f&Q%$QK>}ZGxEw$-m5{JT;&295du1d zv-lU0w;5xOHrHo~>+D=3sxND%lrE?@VD-2K?5g>!mTq1QTKaS&#MbUkO?+Z7WxpBr zx&kGbMG9QUea~Cqr};&JaK|oHbW>t;KHtTC_F+tAPU&yi%(1Cnas*g8A4i9WKqLRg z*RV7VEE6oO`vpDU1lh`oimti;$~O$aMh6xy%0_PEm)P9}GB=^Me5=0uF|&^*_$* ze^=O@SAF7_LZ=4_Dndd+^LuMQJc(Zzn!MN2=NA@K4GfY^TfEg36wEQ3ipwKK30{<0 zv(~n@?w%eP27~!LGh>FDTEu0iwEG{aIye+HHa1pP$)VZ%rs|w*zeL>$c{wmJpawoX zWS8)|jzXc9C#pU+wzNcshK8ci=&*u<0a9+k{6(CSWtf)Kpa?)`?KFX1%quE0-_#^~Uk!S#$&pm6?b+Oz$r< zx}>G0adR8I9q;x38Fz9-9oU%bLUJ;*vp=@(i4pN?_uE^I!$}{lZgwCLh&&LxcEWnR zjguj*HQ-%SFX%9sDk{G9-T3)NRase!*b{5WZPfskk&&tMKk`PN93s2MKNc6O-n?<6 za3BR*lEh~SZ+q$L>gq^cpIKSJW)$bJQK6<1Li(%8Ibex?EZ*x3ze;*MMp|iQU zx$-6YZt?r~vPnrvMa9LuwxSvO+S+mby}eqrw6u;t>RlZFd3{0C|E$uoYXm2AR;r_` zo788c)8K|TkPp44&z&PAEL>*(rMg-Oxj4v<{Q1v?o7b=Zxm!<9ORN1*<8Li-aq)g< z(Q)*T)Rzyyf8@n*NEL@La=Pwf{t5~jsj}|T0~zIoLMyzdz&Ux(q(tvWL`S<+&Nyt$ z`RjlL(lIhNI2LSDsfL1rg1nC(t0yHV^VUq3g1qP{DTPRQucoGpI3=%B1CQ1kRt7Vl zdz++moF1w*wX~20{%UDyQPt3>{~`3br$>fajY-?m(sJeaV7oXcCr4>mI0MToD5(85 zBm|BLC^v1=DX|sc=hp+*+$!j>>7MW1xxsBz8Du zS;)%1mheBU#SV*QU{@xptos3u5i^5XQYPeOdwYAbYr~sMSEfkAa+a1Kwsv<%|E>U! zejKjB5#HC=r|C~Y;r$CDA|st@CF_G5nvqA8hgJSZdraoXd{3TeAwt!Zl?ylHzUC-K zdRg>_USqEw@HK7o)kn3n2$(*>WQ|u?RO}Ibjf_%9zgHUg`W_NFAKyL^6n*y0i27>W z{1(5_dvW|*dKS1;rm+2>RU$|u+!%>G=c=hnOmK(twlcQcWLgCk^+vPBvYa-Mi1?z^+3d)5Kc zVBG9gRO>o3_3fZ-XGpCYu{h`$n5M6%XER)D;kPC-W060lHePNf(gSFrEK37mC@gGe z?T2Ce@s^syQ0{49>};clH7x@}k_Yiicvvq;%w1>et8OBaQc}@U$Xpd>T1Li{3zukK zNk0I)Tc2%nTEaX&G3d}QF$lqur<)K$ufDyvA5_|3$Z)e+_?k9U>!8~rX$T1A9g;j2 zUQt2OJl(p`SkCy65#Ud0sT<@Jq~nK0n{T<$a&I64;pLPMkK?Y*aaMxjukb8~YcSQw=j z)f2-W5;8tIs*flIcl9=5X>%C2X^)M0aB_Uiw!S<15yl8AJg&3zMQ3E-BzejC+k3gK zLvn>v4Aity3y|xtC$9>6!VnSLTU$2$iH~p!h6?wDgoestp_;zb8Pt7A$z#Auo}SL> zS+n(3wPtG~_;g8&`}gk?C=|E-*n}uw#2qQ$T1oWA>y6F{E(dm%SWX#psvzLsike;L zk-|82yoI^B06mL9A|N&?;af~hzq_?=DrJ@rj1=i|p8Xi({ITS6*QCM31<&s!gb!up z?DwOz*^k@SDOQ-b&7Yne1+yTDSTXzvdu(hhDjj(MSkdO>a2I#nk&%(nEq2>)X}YPV z6x6PQ0;u4jpVXRInbQf&6dVqx`QpWktI(B@yx0I06%~yt4r60uA^*c2#~yBO?p#1$ zyVa)In62=zu)igJba;7rSyuzb3N$&FM@v$=1S|lCY&U*>0t@IGg02$?1cgVW4KmZs zo4fnXSI=(VzHQ_-Kq3-(5*}*aiVF;^VZ1&|GdSe7Z{feIA9~U>&BFpUPrOWjOYga; z^_O3lhw{|g1n?g}ns?H7(lb?ItU7oCB{BCTB;W|=iAu}eb`01Sb6kjjkTl!fablTu z@}L=pT-LzmdoVmaY}*%qKb@`EpP9q}dCYuli3;XYWmq*86=p-Bc#>|X_hJbQq zYdLPJ)*c!fng?k~Cswp>(P;|FqS-_HY~pPPk{x0KH@jJWyMF!WH}ap$J@=F>Os{ga z7S;j5m~2Ltut}mTr#3;s^afp~UkwnvV{&pr#Wxf88mV_>(c0FkkHTYO#*XHbJ3JS6T z6+$2qiC$#5fq{YBw(CrD9S|s0AD^ZhH*P3{N>or%QhoU{N*~|hyX$xd&^X%H7v9Pj zD#Er&AaJ$fL;?c?m&eL7p1RFW6JTy}f$KgunVETJXJ@YkGSHZGnV6fG`z_L#JawHm zGBq{*+}(ZdHF8mu*`aoSzev7X6 zsj;vJ5}5>ygj&J_^;|%K)mGhf9tgy+q-xf4RJpE2{-8SXR$K}Q+>p2datL6 zxn-@x@Bod^NX>Q5lRC#ICrHkZNEn?TH03dD88V05i=J$(`uexHE)4@~?m?=^st*h zfBxBoBq!^Z0g=wU_w=bARdDc7*ctr%O1h{E@Ad+AxYftj+q?d2woJz$&cALHh%~YX z2!2xwR2EH+1zto!QPClWGF7J*aJ&gCfES=S9b=nO7E%H^hJX8%eZ4brjE(Mh}H@#k3WoRX3fet4}iRggSZmeAj? znuU42F~;fU<~F1Ibpe-cv8Fi8uAeRKZ!?^)o=yZt7Vq#+9QBfmoXLF&PHUr6zL)f$vQ&Pqy z1jZc4%QFF~DAN3TTWf6}{O9};r32N>QamgDCr<1)zjZ&6Je0KPq9e0;7inR^F=nPC z5Wlbts?m%ZUh5$GsDj5@zKg?NpR;a zI?X;{)46jFNMv#ehcxC@Z>uK)kp!H_`fz->f4n3bg-)=tvTrx7( z6`B+qt68_b3PeuAb6&Y@d|BnuqeqUQ>eI<6!e`o+)k_yHTqv%s9ocY6$;@=|!1M9* zmnMvVYV)IdrF4S^>m~~ea}=DrRr3$fRp{ow{5~_Mpx`pwYOHTyz$%2RvB$yx#-|Ee z>seXl2xVXmG^vE{$o})rtl8Y$9JC^RuF&bx5<{m!zt3SzyrQD@U!b!?LpsR4RpXl+ z9OdF`VPRK+lPZH#E?ESg)O9b~tWDL0wE9R|38js+`fT$LqJSws?`+B|E+zEk+TpTX zJdEp|C#@#PuQx=W*wq-H`)`@kefelsk$%G9-jdVa>LjnYxG`9J36QOfWXq$yH3RH0 z9&fQW-K3lO9Hn7vYb(V}IA6#1f_j}jjsqaVZnwDS zKn^~FJh@C=0fJLH>uUWaO1meP({OTfQp8smvo-wbuPclr00jE(?v;R x{P#J=|Eci5O}GAYi1S~DUjMto|1=$QemKl*&R1<#0%JyqilT->`HMe;{sp_DvUUIf literal 0 HcmV?d00001 diff --git a/assets/navigation_cube/top.png b/assets/navigation_cube/top.png new file mode 100644 index 0000000000000000000000000000000000000000..072e81e75fbff6f0c0ef6caaf764e25e5db3eeb4 GIT binary patch literal 7642 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 abr3}-l5$evm#mGS&CHA~jfziSiuoTGF}KeE literal 0 HcmV?d00001 diff --git a/crates/fj-viewer/Cargo.toml b/crates/fj-viewer/Cargo.toml index 050359d9b..b404109ea 100644 --- a/crates/fj-viewer/Cargo.toml +++ b/crates/fj-viewer/Cargo.toml @@ -11,6 +11,7 @@ keywords.workspace = true categories.workspace = true [dependencies] +anyhow = "1.0.68" bytemuck = "1.13.0" chrono = "0.4.23" crossbeam-channel = "0.5.6" @@ -18,11 +19,18 @@ egui = "0.20.1" egui-wgpu = "0.20.0" fj-interop.workspace = true fj-math.workspace = true +tobj = "3.2.4" + raw-window-handle = "0.5.0" thiserror = "1.0.35" tracing = "0.1.37" wgpu_glyph = "0.18.0" +[dependencies.image] +version = "0.24" +default-features = false +features = ["png", "jpeg"] + [dependencies.rfd] version = "0.11.1" default_features = false diff --git a/crates/fj-viewer/src/graphics/mod.rs b/crates/fj-viewer/src/graphics/mod.rs index 6f21b91a0..33e4cb56c 100644 --- a/crates/fj-viewer/src/graphics/mod.rs +++ b/crates/fj-viewer/src/graphics/mod.rs @@ -3,9 +3,12 @@ mod draw_config; mod drawables; mod geometries; +mod model; +mod navigation_cube; mod pipelines; mod renderer; mod shaders; +mod texture; mod transform; mod uniforms; mod vertices; diff --git a/crates/fj-viewer/src/graphics/model.rs b/crates/fj-viewer/src/graphics/model.rs new file mode 100644 index 000000000..9c8e65a2a --- /dev/null +++ b/crates/fj-viewer/src/graphics/model.rs @@ -0,0 +1,205 @@ +use std::ops::Range; + +use wgpu::util::DeviceExt; + +use super::texture; + +#[repr(C)] +#[derive(Copy, Clone, Debug, bytemuck::Pod, bytemuck::Zeroable)] +pub struct ModelVertex { + pub position: [f32; 3], + pub tex_coords: [f32; 2], +} + +impl ModelVertex { + pub fn desc<'a>() -> wgpu::VertexBufferLayout<'a> { + use std::mem; + wgpu::VertexBufferLayout { + array_stride: mem::size_of::() as wgpu::BufferAddress, + step_mode: wgpu::VertexStepMode::Vertex, + attributes: &[ + wgpu::VertexAttribute { + offset: 0, + shader_location: 0, + format: wgpu::VertexFormat::Float32x3, + }, + wgpu::VertexAttribute { + offset: mem::size_of::<[f32; 3]>() as wgpu::BufferAddress, + shader_location: 1, + format: wgpu::VertexFormat::Float32x2, + }, + ], + } + } +} + +#[derive(Debug)] +pub struct Model { + pub meshes: Vec, + pub materials: Vec, +} + +#[derive(Debug)] +pub struct Material { + pub name: String, + pub diffuse_texture: super::texture::Texture, + pub bind_group: wgpu::BindGroup, +} + +#[derive(Debug)] +pub struct Mesh { + pub name: String, + pub vertex_buffer: wgpu::Buffer, + pub index_buffer: wgpu::Buffer, + pub num_elements: u32, + pub material: usize, +} + +pub fn load_model( + file_name: &str, + device: &wgpu::Device, + queue: &wgpu::Queue, + layout: &wgpu::BindGroupLayout, +) -> anyhow::Result { + let (models, obj_materials) = tobj::load_obj( + std::path::Path::new("assets/navigation_cube").join(file_name), + &tobj::LoadOptions { + triangulate: true, + single_index: true, + ..Default::default() + }, + )?; + + let mut materials = Vec::new(); + for m in obj_materials? { + let texture_data = std::fs::read( + std::path::Path::new("assets/navigation_cube") + .join(m.diffuse_texture), + )?; + let diffuse_texture = texture::Texture::from_bytes( + device, + queue, + &texture_data, + file_name, + )?; + + let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { + layout, + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: wgpu::BindingResource::TextureView( + &diffuse_texture.view, + ), + }, + wgpu::BindGroupEntry { + binding: 1, + resource: wgpu::BindingResource::Sampler( + &diffuse_texture.sampler, + ), + }, + ], + label: None, + }); + + materials.push(Material { + name: m.name, + diffuse_texture, + bind_group, + }) + } + + let meshes = models + .into_iter() + .map(|m| { + let vertices = (0..m.mesh.positions.len() / 3) + .map(|i| ModelVertex { + position: [ + m.mesh.positions[i * 3], + m.mesh.positions[i * 3 + 1], + m.mesh.positions[i * 3 + 2], + ], + tex_coords: [ + m.mesh.texcoords[i * 2], + m.mesh.texcoords[i * 2 + 1], + ], + }) + .collect::>(); + + let vertex_buffer = + device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some(&format!("{:?} Vertex Buffer", file_name)), + contents: bytemuck::cast_slice(&vertices), + usage: wgpu::BufferUsages::VERTEX, + }); + let index_buffer = + device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some(&format!("{:?} Index Buffer", file_name)), + contents: bytemuck::cast_slice(&m.mesh.indices), + usage: wgpu::BufferUsages::INDEX, + }); + + Mesh { + name: file_name.to_string(), + vertex_buffer, + index_buffer, + num_elements: m.mesh.indices.len() as u32, + material: m.mesh.material_id.unwrap_or(0), + } + }) + .collect::>(); + + Ok(Model { meshes, materials }) +} + +pub trait DrawModel<'a> { + fn draw_mesh(&mut self, mesh: &'a Mesh, material: &'a Material); + fn draw_mesh_instanced( + &mut self, + mesh: &'a Mesh, + material: &'a Material, + instances: Range, + ); + + fn draw_model(&mut self, model: &'a Model); + fn draw_model_instanced(&mut self, model: &'a Model, instances: Range); +} + +impl<'a, 'b> DrawModel<'b> for wgpu::RenderPass<'a> +where + 'b: 'a, +{ + fn draw_mesh(&mut self, mesh: &'b Mesh, material: &'b Material) { + self.draw_mesh_instanced(mesh, material, 0..1); + } + + fn draw_mesh_instanced( + &mut self, + mesh: &'b Mesh, + material: &'b Material, + instances: Range, + ) { + self.set_vertex_buffer(0, mesh.vertex_buffer.slice(..)); + self.set_index_buffer( + mesh.index_buffer.slice(..), + wgpu::IndexFormat::Uint32, + ); + self.set_bind_group(0, &material.bind_group, &[]); + self.draw_indexed(0..mesh.num_elements, 0, instances); + } + + fn draw_model(&mut self, model: &'b Model) { + self.draw_model_instanced(model, 0..1); + } + + fn draw_model_instanced( + &mut self, + model: &'b Model, + instances: Range, + ) { + for mesh in &model.meshes { + let material = &model.materials[mesh.material]; + self.draw_mesh_instanced(mesh, material, instances.clone()); + } + } +} diff --git a/crates/fj-viewer/src/graphics/navigation_cube.rs b/crates/fj-viewer/src/graphics/navigation_cube.rs new file mode 100644 index 000000000..cee7cb470 --- /dev/null +++ b/crates/fj-viewer/src/graphics/navigation_cube.rs @@ -0,0 +1,134 @@ +use super::{ + model::{self, load_model, DrawModel, Model}, + texture, +}; + +#[derive(Debug)] +pub struct NavigationCubeRenderer { + cube_model: Model, + render_pipeline: wgpu::RenderPipeline, +} + +impl NavigationCubeRenderer { + pub fn new( + device: &wgpu::Device, + queue: &wgpu::Queue, + config: &wgpu::SurfaceConfiguration, + ) -> Self { + let texture_bind_group_layout = + device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + entries: &[ + wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Texture { + multisampled: false, + view_dimension: wgpu::TextureViewDimension::D2, + sample_type: wgpu::TextureSampleType::Float { + filterable: true, + }, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 1, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Sampler( + wgpu::SamplerBindingType::Filtering, + ), + count: None, + }, + ], + label: Some("texture_bind_group_layout"), + }); + + let shader = + device.create_shader_module(wgpu::ShaderModuleDescriptor { + label: Some("Shadow Display Shader"), + source: wgpu::ShaderSource::Wgsl( + include_str!("navigation_cube.wgsl").into(), + ), + }); + + let render_pipeline_layout = + device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label: Some("Render Pipeline Layout"), + bind_group_layouts: &[&texture_bind_group_layout], + push_constant_ranges: &[], + }); + + let render_pipeline = + device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label: Some("Navigation Cube Renderer"), + layout: Some(&render_pipeline_layout), + vertex: wgpu::VertexState { + module: &&shader, + entry_point: "vertex", + buffers: &[model::ModelVertex::desc()], + }, + fragment: Some(wgpu::FragmentState { + module: &shader, + entry_point: "fragment", + targets: &[Some(wgpu::ColorTargetState { + format: config.format, + blend: Some(wgpu::BlendState { + color: wgpu::BlendComponent::REPLACE, + alpha: wgpu::BlendComponent::REPLACE, + }), + write_mask: wgpu::ColorWrites::ALL, + })], + }), + primitive: wgpu::PrimitiveState { + topology: wgpu::PrimitiveTopology::TriangleList, + strip_index_format: None, + front_face: wgpu::FrontFace::Ccw, + cull_mode: Some(wgpu::Face::Back), + // Setting this to anything other than Fill requires Features::POLYGON_MODE_LINE + // or Features::POLYGON_MODE_POINT + polygon_mode: wgpu::PolygonMode::Fill, + // Requires Features::DEPTH_CLIP_CONTROL + unclipped_depth: false, + // Requires Features::CONSERVATIVE_RASTERIZATION + conservative: false, + }, + depth_stencil: None, + multisample: wgpu::MultisampleState { + count: 1, + mask: !0, + alpha_to_coverage_enabled: false, + }, + multiview: None, + }); + + let cube_model = + load_model("cube.obj", &device, &queue, &texture_bind_group_layout) + .unwrap(); + + Self { + cube_model, + render_pipeline, + } + } + + pub fn draw( + &self, + view: &wgpu::TextureView, + encoder: &mut wgpu::CommandEncoder, + ) { + let mut render_pass = + encoder.begin_render_pass(&wgpu::RenderPassDescriptor { + label: Some("Depth Visual Render Pass"), + color_attachments: &[Some(wgpu::RenderPassColorAttachment { + view: &view, + resolve_target: None, + ops: wgpu::Operations { + load: wgpu::LoadOp::Load, + store: true, + }, + })], + depth_stencil_attachment: None, + }); + render_pass.set_pipeline(&self.render_pipeline); + render_pass.draw_model(&self.cube_model); + } +} diff --git a/crates/fj-viewer/src/graphics/navigation_cube.wgsl b/crates/fj-viewer/src/graphics/navigation_cube.wgsl new file mode 100644 index 000000000..e0d578b98 --- /dev/null +++ b/crates/fj-viewer/src/graphics/navigation_cube.wgsl @@ -0,0 +1,33 @@ +// Vertex shader + +struct VertexInput { + @location(0) position: vec3, + @location(1) tex_coords: vec2, +} + +struct VertexOutput { + @builtin(position) clip_position: vec4, + @location(0) tex_coords: vec2, +} + +@vertex +fn vertex( + model: VertexInput, +) -> VertexOutput { + var out: VertexOutput; + out.tex_coords = model.tex_coords; + out.clip_position = vec4(model.position, 1.0); + return out; +} + +// Fragment shader + +@group(0) @binding(0) +var t_diffuse: texture_2d; +@group(0)@binding(1) +var s_diffuse: sampler; + +@fragment +fn fragment(in: VertexOutput) -> @location(0) vec4 { + return textureSample(t_diffuse, s_diffuse, in.tex_coords); +} diff --git a/crates/fj-viewer/src/graphics/renderer.rs b/crates/fj-viewer/src/graphics/renderer.rs index b5a3d2348..0ea65d2f9 100644 --- a/crates/fj-viewer/src/graphics/renderer.rs +++ b/crates/fj-viewer/src/graphics/renderer.rs @@ -13,8 +13,9 @@ use crate::{ use super::{ draw_config::DrawConfig, drawables::Drawables, geometries::Geometries, - pipelines::Pipelines, transform::Transform, uniforms::Uniforms, - vertices::Vertices, DEPTH_FORMAT, SAMPLE_COUNT, + navigation_cube::NavigationCubeRenderer, pipelines::Pipelines, + transform::Transform, uniforms::Uniforms, vertices::Vertices, DEPTH_FORMAT, + SAMPLE_COUNT, }; /// Graphics rendering state and target abstraction @@ -34,6 +35,8 @@ pub struct Renderer { geometries: Geometries, pipelines: Pipelines, + + navigation_cube_renderer: NavigationCubeRenderer, } impl Renderer { @@ -183,6 +186,9 @@ impl Renderer { let pipelines = Pipelines::new(&device, &bind_group_layout, color_format); + let navigation_cube_renderer = + NavigationCubeRenderer::new(&device, &queue, &surface_config); + Ok(Self { surface, features, @@ -198,6 +204,8 @@ impl Renderer { geometries, pipelines, + + navigation_cube_renderer, }) } @@ -331,6 +339,9 @@ impl Renderer { gui.draw(&mut render_pass, &clipped_primitives, &screen_descriptor); } + self.navigation_cube_renderer + .draw(&color_view, &mut encoder); + let command_buffer = encoder.finish(); self.queue.submit(Some(command_buffer)); diff --git a/crates/fj-viewer/src/graphics/texture.rs b/crates/fj-viewer/src/graphics/texture.rs new file mode 100644 index 000000000..f66f623b1 --- /dev/null +++ b/crates/fj-viewer/src/graphics/texture.rs @@ -0,0 +1,84 @@ +use anyhow::*; +use image::GenericImageView; +use std::num::NonZeroU32; + +#[derive(Debug)] +pub struct Texture { + pub texture: wgpu::Texture, + pub view: wgpu::TextureView, + pub sampler: wgpu::Sampler, +} + +impl Texture { + pub const DEPTH_FORMAT: wgpu::TextureFormat = + wgpu::TextureFormat::Depth32Float; + + pub fn from_bytes( + device: &wgpu::Device, + queue: &wgpu::Queue, + bytes: &[u8], + label: &str, + ) -> Result { + let img = image::load_from_memory(bytes)?; + Self::from_image(device, queue, &img, Some(label)) + } + + pub fn from_image( + device: &wgpu::Device, + queue: &wgpu::Queue, + img: &image::DynamicImage, + label: Option<&str>, + ) -> Result { + let dimensions = img.dimensions(); + let rgba = img.to_rgba8(); + + let size = wgpu::Extent3d { + width: dimensions.0, + height: dimensions.1, + depth_or_array_layers: 1, + }; + let texture = device.create_texture(&wgpu::TextureDescriptor { + label, + size, + mip_level_count: 1, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format: wgpu::TextureFormat::Rgba8UnormSrgb, + usage: wgpu::TextureUsages::TEXTURE_BINDING + | wgpu::TextureUsages::COPY_DST, + }); + + queue.write_texture( + wgpu::ImageCopyTexture { + aspect: wgpu::TextureAspect::All, + texture: &texture, + mip_level: 0, + origin: wgpu::Origin3d::ZERO, + }, + &rgba, + wgpu::ImageDataLayout { + offset: 0, + bytes_per_row: NonZeroU32::new(4 * dimensions.0), + rows_per_image: NonZeroU32::new(dimensions.1), + }, + size, + ); + + let view = texture.create_view(&wgpu::TextureViewDescriptor::default()); + let sampler = device.create_sampler(&wgpu::SamplerDescriptor { + address_mode_u: wgpu::AddressMode::ClampToEdge, + address_mode_v: wgpu::AddressMode::ClampToEdge, + address_mode_w: wgpu::AddressMode::ClampToEdge, + mag_filter: wgpu::FilterMode::Linear, + min_filter: wgpu::FilterMode::Nearest, + mipmap_filter: wgpu::FilterMode::Nearest, + ..Default::default() + }); + + Ok(Self { + texture, + view, + sampler, + }) + } +} From cce6511313a9c76ba7ff2f7c58ab9569a6189727 Mon Sep 17 00:00:00 2001 From: erenoku Date: Mon, 6 Feb 2023 21:41:34 +0300 Subject: [PATCH 02/14] cube can rotate --- Cargo.lock | 20 ++++++ crates/fj-viewer/Cargo.toml | 1 + .../fj-viewer/src/graphics/navigation_cube.rs | 66 ++++++++++++++++++- .../src/graphics/navigation_cube.wgsl | 5 +- crates/fj-viewer/src/graphics/renderer.rs | 7 +- 5 files changed, 94 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index acf609abe..4ba0f8663 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -89,6 +89,15 @@ dependencies = [ "num-traits", ] +[[package]] +name = "approx" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2a05fd1bd10b2527e20a2cd32d8873d115b8b39fe219ee25f42a8aca6ba278" +dependencies = [ + "num-traits", +] + [[package]] name = "approx" version = "0.5.1" @@ -454,6 +463,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" +[[package]] +name = "cgmath" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a98d30140e3296250832bbaaff83b27dcd6fa3cc70fb6f1f3e5c9c0023b5317" +dependencies = [ + "approx 0.4.0", + "num-traits", +] + [[package]] name = "chrono" version = "0.4.23" @@ -1268,6 +1287,7 @@ version = "0.36.0" dependencies = [ "anyhow", "bytemuck", + "cgmath", "chrono", "crossbeam-channel", "egui", diff --git a/crates/fj-viewer/Cargo.toml b/crates/fj-viewer/Cargo.toml index b404109ea..6f69f79bb 100644 --- a/crates/fj-viewer/Cargo.toml +++ b/crates/fj-viewer/Cargo.toml @@ -14,6 +14,7 @@ categories.workspace = true anyhow = "1.0.68" bytemuck = "1.13.0" chrono = "0.4.23" +cgmath = "0.18" crossbeam-channel = "0.5.6" egui = "0.20.1" egui-wgpu = "0.20.0" diff --git a/crates/fj-viewer/src/graphics/navigation_cube.rs b/crates/fj-viewer/src/graphics/navigation_cube.rs index cee7cb470..682e5be22 100644 --- a/crates/fj-viewer/src/graphics/navigation_cube.rs +++ b/crates/fj-viewer/src/graphics/navigation_cube.rs @@ -1,3 +1,6 @@ +use cgmath::{Quaternion, Rotation3, Vector3}; +use wgpu::util::DeviceExt; + use super::{ model::{self, load_model, DrawModel, Model}, texture, @@ -7,6 +10,9 @@ use super::{ pub struct NavigationCubeRenderer { cube_model: Model, render_pipeline: wgpu::RenderPipeline, + rotation: f32, + model_matrix_bind_group: wgpu::BindGroup, + model_matrix_buffer: wgpu::Buffer, } impl NavigationCubeRenderer { @@ -42,6 +48,40 @@ impl NavigationCubeRenderer { label: Some("texture_bind_group_layout"), }); + let rotation = 0.0; + let model_matrix = Self::get_model_matrix(rotation); + + let model_matrix_buffer = + device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("Model Matrix Buffer"), + contents: bytemuck::cast_slice(&[model_matrix]), + usage: wgpu::BufferUsages::UNIFORM + | wgpu::BufferUsages::COPY_DST, + }); + let model_matrix_bind_group_layout = + device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + entries: &[wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStages::VERTEX, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Uniform, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + }], + label: Some("model_matrix_group_layout"), + }); + let model_matrix_bind_group = + device.create_bind_group(&wgpu::BindGroupDescriptor { + layout: &model_matrix_bind_group_layout, + entries: &[wgpu::BindGroupEntry { + binding: 0, + resource: model_matrix_buffer.as_entire_binding(), + }], + label: Some("model_matrix_bind_group"), + }); + let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor { label: Some("Shadow Display Shader"), @@ -53,7 +93,10 @@ impl NavigationCubeRenderer { let render_pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { label: Some("Render Pipeline Layout"), - bind_group_layouts: &[&texture_bind_group_layout], + bind_group_layouts: &[ + &texture_bind_group_layout, + &model_matrix_bind_group_layout, + ], push_constant_ranges: &[], }); @@ -107,14 +150,26 @@ impl NavigationCubeRenderer { Self { cube_model, render_pipeline, + rotation, + model_matrix_bind_group, + model_matrix_buffer, } } pub fn draw( - &self, + &mut self, view: &wgpu::TextureView, encoder: &mut wgpu::CommandEncoder, + queue: &wgpu::Queue, ) { + self.rotation += 0.5; + let model_matrix = Self::get_model_matrix(self.rotation); + queue.write_buffer( + &self.model_matrix_buffer, + 0, + bytemuck::cast_slice(&[model_matrix]), + ); + let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { label: Some("Depth Visual Render Pass"), @@ -129,6 +184,13 @@ impl NavigationCubeRenderer { depth_stencil_attachment: None, }); render_pass.set_pipeline(&self.render_pipeline); + render_pass.set_bind_group(1, &self.model_matrix_bind_group, &[]); render_pass.draw_model(&self.cube_model); } + + fn get_model_matrix(rotation: f32) -> [[f32; 4]; 4] { + // TODO: scale and translate + let rotation = Quaternion::from_angle_z(cgmath::Deg(rotation)); + cgmath::Matrix4::from(rotation).into() + } } diff --git a/crates/fj-viewer/src/graphics/navigation_cube.wgsl b/crates/fj-viewer/src/graphics/navigation_cube.wgsl index e0d578b98..ed1892e8c 100644 --- a/crates/fj-viewer/src/graphics/navigation_cube.wgsl +++ b/crates/fj-viewer/src/graphics/navigation_cube.wgsl @@ -1,5 +1,8 @@ // Vertex shader +@group(1) @binding(0) +var model_matrix: mat4x4; + struct VertexInput { @location(0) position: vec3, @location(1) tex_coords: vec2, @@ -16,7 +19,7 @@ fn vertex( ) -> VertexOutput { var out: VertexOutput; out.tex_coords = model.tex_coords; - out.clip_position = vec4(model.position, 1.0); + out.clip_position = model_matrix * vec4(model.position, 1.0); return out; } diff --git a/crates/fj-viewer/src/graphics/renderer.rs b/crates/fj-viewer/src/graphics/renderer.rs index 0ea65d2f9..1e7869875 100644 --- a/crates/fj-viewer/src/graphics/renderer.rs +++ b/crates/fj-viewer/src/graphics/renderer.rs @@ -339,8 +339,11 @@ impl Renderer { gui.draw(&mut render_pass, &clipped_primitives, &screen_descriptor); } - self.navigation_cube_renderer - .draw(&color_view, &mut encoder); + self.navigation_cube_renderer.draw( + &color_view, + &mut encoder, + &self.queue, + ); let command_buffer = encoder.finish(); self.queue.submit(Some(command_buffer)); From b09f840a3adf5ede8ae9ebfa7417603b313f3d0e Mon Sep 17 00:00:00 2001 From: erenoku Date: Tue, 7 Feb 2023 14:41:11 +0300 Subject: [PATCH 03/14] add translation add scale for the navigation cube --- crates/fj-viewer/src/graphics/navigation_cube.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/fj-viewer/src/graphics/navigation_cube.rs b/crates/fj-viewer/src/graphics/navigation_cube.rs index 682e5be22..ba0d9fe6b 100644 --- a/crates/fj-viewer/src/graphics/navigation_cube.rs +++ b/crates/fj-viewer/src/graphics/navigation_cube.rs @@ -191,6 +191,9 @@ impl NavigationCubeRenderer { fn get_model_matrix(rotation: f32) -> [[f32; 4]; 4] { // TODO: scale and translate let rotation = Quaternion::from_angle_z(cgmath::Deg(rotation)); - cgmath::Matrix4::from(rotation).into() + let scale = cgmath::Matrix4::from_scale(0.2); + let translation = + cgmath::Matrix4::from_translation((0.8, 0.8, 0.0).into()); + (translation * cgmath::Matrix4::from(rotation) * scale).into() } } From d0fedbd884a35fb648a48aebe039ff2e89d352c7 Mon Sep 17 00:00:00 2001 From: erenoku Date: Tue, 7 Feb 2023 17:53:42 +0300 Subject: [PATCH 04/14] fix mirrored texture --- assets/navigation_cube/cube.obj | 18 ++++++++++++------ crates/fj-viewer/src/graphics/model.rs | 2 +- .../fj-viewer/src/graphics/navigation_cube.rs | 3 ++- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/assets/navigation_cube/cube.obj b/assets/navigation_cube/cube.obj index 9770c345d..bf3c86e71 100644 --- a/assets/navigation_cube/cube.obj +++ b/assets/navigation_cube/cube.obj @@ -10,6 +10,12 @@ v 1.000000 1.000000 -1.000000 v 1.000000 -1.000000 -1.000000 v -1.000000 1.000000 -1.000000 v -1.000000 -1.000000 -1.000000 +vn -0.0000 1.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn 1.0000 -0.0000 -0.0000 vt 0.999900 0.000100 vt 0.999900 0.999900 vt 0.000100 0.999900 @@ -32,14 +38,14 @@ vt 0.999900 0.000100 vt 0.000100 0.000100 s 0 usemtl top -f 1/1 5/14 7/17 3/7 +f 1/1/1 5/14/1 7/17/1 3/7/1 usemtl left -f 4/10 3/8 7/17 8/20 +f 4/10/2 3/8/2 7/17/2 8/20/2 usemtl front -f 2/5 1/2 3/9 4/12 +f 2/5/5 1/2/5 3/9/5 4/12/5 usemtl right -f 6/16 5/14 1/3 2/6 +f 6/16/6 5/14/6 1/3/6 2/6/6 usemtl rear -f 8/19 7/18 5/13 6/15 +f 8/19/3 7/18/3 5/13/3 6/15/3 usemtl bottom -f 6/16 2/4 4/11 8/20 +f 6/16/4 2/4/4 4/11/4 8/20/4 diff --git a/crates/fj-viewer/src/graphics/model.rs b/crates/fj-viewer/src/graphics/model.rs index 9c8e65a2a..f6937c081 100644 --- a/crates/fj-viewer/src/graphics/model.rs +++ b/crates/fj-viewer/src/graphics/model.rs @@ -121,7 +121,7 @@ pub fn load_model( ], tex_coords: [ m.mesh.texcoords[i * 2], - m.mesh.texcoords[i * 2 + 1], + 1.0 - m.mesh.texcoords[i * 2 + 1], ], }) .collect::>(); diff --git a/crates/fj-viewer/src/graphics/navigation_cube.rs b/crates/fj-viewer/src/graphics/navigation_cube.rs index ba0d9fe6b..7bc8be75d 100644 --- a/crates/fj-viewer/src/graphics/navigation_cube.rs +++ b/crates/fj-viewer/src/graphics/navigation_cube.rs @@ -190,7 +190,8 @@ impl NavigationCubeRenderer { fn get_model_matrix(rotation: f32) -> [[f32; 4]; 4] { // TODO: scale and translate - let rotation = Quaternion::from_angle_z(cgmath::Deg(rotation)); + let rotation = Quaternion::from_angle_y(cgmath::Deg(rotation)); + let scale = cgmath::Matrix4::from_scale(0.2); let translation = cgmath::Matrix4::from_translation((0.8, 0.8, 0.0).into()); From 033570050bae870ffab15a21aaa5f85774140969 Mon Sep 17 00:00:00 2001 From: erenoku Date: Tue, 7 Feb 2023 18:21:33 +0300 Subject: [PATCH 05/14] fix aspect ratio of navigation cube changing when the window is resized --- crates/fj-viewer/src/graphics/navigation_cube.rs | 16 +++++++++++----- crates/fj-viewer/src/graphics/renderer.rs | 9 +++++++-- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/crates/fj-viewer/src/graphics/navigation_cube.rs b/crates/fj-viewer/src/graphics/navigation_cube.rs index 7bc8be75d..beb7cd5af 100644 --- a/crates/fj-viewer/src/graphics/navigation_cube.rs +++ b/crates/fj-viewer/src/graphics/navigation_cube.rs @@ -20,6 +20,7 @@ impl NavigationCubeRenderer { device: &wgpu::Device, queue: &wgpu::Queue, config: &wgpu::SurfaceConfiguration, + aspect_ratio: f64, ) -> Self { let texture_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { @@ -49,7 +50,7 @@ impl NavigationCubeRenderer { }); let rotation = 0.0; - let model_matrix = Self::get_model_matrix(rotation); + let model_matrix = Self::get_model_matrix(rotation, &aspect_ratio); let model_matrix_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { @@ -161,9 +162,10 @@ impl NavigationCubeRenderer { view: &wgpu::TextureView, encoder: &mut wgpu::CommandEncoder, queue: &wgpu::Queue, + aspect_ratio: &f64, ) { self.rotation += 0.5; - let model_matrix = Self::get_model_matrix(self.rotation); + let model_matrix = Self::get_model_matrix(self.rotation, aspect_ratio); queue.write_buffer( &self.model_matrix_buffer, 0, @@ -188,11 +190,15 @@ impl NavigationCubeRenderer { render_pass.draw_model(&self.cube_model); } - fn get_model_matrix(rotation: f32) -> [[f32; 4]; 4] { - // TODO: scale and translate + fn get_model_matrix(rotation: f32, aspect_ratio: &f64) -> [[f32; 4]; 4] { let rotation = Quaternion::from_angle_y(cgmath::Deg(rotation)); - let scale = cgmath::Matrix4::from_scale(0.2); + let scale = cgmath::Matrix4::from_nonuniform_scale( + 0.2, + (0.2 * aspect_ratio) as f32, + 0.2, + ); + let translation = cgmath::Matrix4::from_translation((0.8, 0.8, 0.0).into()); (translation * cgmath::Matrix4::from(rotation) * scale).into() diff --git a/crates/fj-viewer/src/graphics/renderer.rs b/crates/fj-viewer/src/graphics/renderer.rs index 1e7869875..4e484bc6a 100644 --- a/crates/fj-viewer/src/graphics/renderer.rs +++ b/crates/fj-viewer/src/graphics/renderer.rs @@ -186,8 +186,12 @@ impl Renderer { let pipelines = Pipelines::new(&device, &bind_group_layout, color_format); - let navigation_cube_renderer = - NavigationCubeRenderer::new(&device, &queue, &surface_config); + let navigation_cube_renderer = NavigationCubeRenderer::new( + &device, + &queue, + &surface_config, + 800.0 / 600.0, + ); Ok(Self { surface, @@ -343,6 +347,7 @@ impl Renderer { &color_view, &mut encoder, &self.queue, + &aspect_ratio, ); let command_buffer = encoder.finish(); From 9151e808f15d3dff497fbb8deb84ecdf0c8c3c27 Mon Sep 17 00:00:00 2001 From: erenoku Date: Tue, 7 Feb 2023 21:36:19 +0300 Subject: [PATCH 06/14] fix issues and add borders to the edges of the cube --- assets/navigation_cube/bottom.png | Bin 6836 -> 15788 bytes assets/navigation_cube/front.png | Bin 6643 -> 14906 bytes assets/navigation_cube/left.png | Bin 3831 -> 11044 bytes assets/navigation_cube/rear.png | Bin 5169 -> 12911 bytes assets/navigation_cube/right.png | Bin 5727 -> 13654 bytes assets/navigation_cube/top.png | Bin 7642 -> 11956 bytes .../fj-viewer/src/graphics/navigation_cube.rs | 24 +++++++++++------- 7 files changed, 15 insertions(+), 9 deletions(-) diff --git a/assets/navigation_cube/bottom.png b/assets/navigation_cube/bottom.png index 3d561a966865975ce298cc620d8c83cd66a7b560..3f59c243b79c5e85bf947ea52620b67a8b519ee9 100644 GIT binary patch literal 15788 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 diff --git a/assets/navigation_cube/front.png b/assets/navigation_cube/front.png index 86e29d8f8f42bf2c070e6d3f16a8d06e6118ae6d..a02280b06fe3211c067b12d250a546a13bf97df9 100644 GIT binary patch literal 14906 zcmeHt1yJ1E(kBrh1PCF5JAvTN0D}f61a}WGgTo**xFsP3*8l+m1h?Ss!4uqlaCdjv zKe_kacVF#SyY;Gew{~k^2vtm~vQP;vi?hZuzC_0MmAvz<8-jpd`kE(a z#C6Oxm<72NMUQ*4eYfY9+E&pHuYxPQ8WPrveih8VUxGcj)+Ri>c|5_lK4Zk&k2*)b zc8N`y^g~D4A48L&_am7G_m`RWWt||Qvoq2PCj4<(g=-eeo%W>l<*TTR#j8xL=@RvW zgIA~Qd7uVzVfUHzijUJm4|YcPW(=xAP8e@?J^l0D$sZngRG%aw$TRm+THi43FAT*q zt~_5s1kazTFIV(gs#-67ynfg)4C2qqHb+kwabfO>yx2;K&#&4V;d{ix#(utpDYf%y zZ?0BLCgK#glpy80dJ7YkT`XO>EjyXuvW9tESG{M+H`kGfpET38-6*8s@~Gep`SfH& z-@a$$MAI;4^mY5g4e16l-r%6htNYvuC=FNFm#Hq;5Viz14HB#J_!@DAZ5_Lhk*h!a z{TH@eHI_?IDCY+-jCCpQfoj5Z+fwE|>_SA;pA4}fKdtf;+R~r-hYJmOzxcF0JK>&L z>5!vvU5}mPYi2e=@~|oyDx)6ce@7czQ-a9W2vsH1;g9Ab8HtsccqL#>$K4S&JlL1To!O3s#k|gGf zN|K};6Nj8{h}@U8OcFRI?E{sy?b4$(v=F~6;*}>2+Y=n8TQ{qr6(`>X&9B;b$RXW= zS_dyxT#a0MiFTs*%Y9UMW#TwFmQ$(cK7J2pf2iYNk{j4>xy)tSMO{th67(kS>l&9a zgpFlo&~c~AjlBd=#|+i$VKm|yn2y@qtEec%cv^5g z7E)n?kr7iDpl}E=9oc5nbOBtO^~l9s6Mi~qUOL%?rvuoFE}8O%a+yg zW5%lp!WUk~8&NjVI}X~e3#JmE2nU~~zZ(6@V@#&Pl|_)+4)Fx7urISqwEGY>?-@I! zT#t_#T_eAE1@>TvxCnxIc$be>r)Iy5raF8u)(`z36H8VP?Y08Ge5Lsj&}KE8)0=n9 z;gl#NvZdO*s^ZG#vO{JlilTh)jfH~iyVjhQYMp5Q=u$N{x9{IJPsz>h57npk>!I+> z;O*{dQ6!P%js4X1r34wA?PR8&ZGI3I^sIcmd?*K37%7~Q_edvGC9yq-zxVQPyO$V> zknIi2E}1vZ<>+hIOW|o1shjyr7+JT0$6ovnEK%VgcEKyc^=QgnV*SXhp6ZC4<&Y

nhFnB^SCx*gN8M%jpYrV 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 delta 3720 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 Xh_>_-$od8Ze9oHLoGv!~?T`Ne&6(PF diff --git a/assets/navigation_cube/left.png b/assets/navigation_cube/left.png index 9686f6b888a5c0251a8539b9117bfb2e37a12778..b970d348f1d6c730fdc908ef38abec7551312bf6 100644 GIT binary patch literal 11044 zcmeHscQl;c_pd}kf&>vEQG<{u!{{@J8l8yV8DlU}1~Zr;NF)&@2qHQWEqaUIQj~}? zdT$|m?={?qyd~dte{0?Qu62KR{r-4aGoG{eKA&^WXYaGmJ`aBlb%jeLH%JHw2relp z%4rf1oH0H5Tp$7@tz2$52na5t-L>^GnlLwJM`x53(hk9l!8szB5m=-Z0ReWfItJ-F z488pP7)@P$E^NGvK6qyHvisi8Cz=DnFJ{=L9K=8wf*K#I$Iml2WFH@T#Coq$!9nb+ zp%0bcBx=ZR1;tzBC3@YBzcjOPSm&}*ZWa<7NtKY3AF&{}wPWs{;OXX_w<9||x!))i z!qC?rn8#sQ8M0#*vg09THcE~$VqSJHjNiGmBQ=2v{JiBkd@a>*oj14DNfI*r;@g7R zt3@qU5b@oorI7S*UTeaZt8ou!8EZ^wO&-_KV;^}N&lfcDI$7*pU5ku(=gqQYwwOcuecNHpJ7pS(wUk-KxL`%6So zql?J{akpDuMQXn9c@}3;Q>Fb@#P}FjzAorN53XzsR5lkg~7JP7cK9M z`ID4+;!UxO`wJy_O@#7I@dp1S=A-&+Zj46wNnbA48)6KR?v3WbMo0U7hs)1B7L1+S z-q2*{H`}JbpS!f@(Se>4mZCH!&+M)p94X+aXm(VnU z@E!!r6CITBxQ~z3)ZeM-zplo&ow0oK)_2a-XN7OvVv~y1lS1j$m&Ngc;qa02ZUt`! zd7WFd{;IuXB04uLpHuiJ(vyI@-_=pTRl$u{Z0(f7+NxeVYvLRXoWFw8<2n|N(OjA` z{&psL{yk2xD*p7i(2ywV4!EVZbDCCzIUo1Tq$}_6 zNXvDNL&{NA&Dc<4r#h6p@#-OHyA2inrqVc zBWu%i>T9$rQ(qrMFF%iRa?E4YgWXv82%jk;c4b{QF%Q9yS`t!uc-S>2Mb~du>1~HX z2AYbEtVRhdrpG_TPZTPndOkVk%$D%UOM0{xV>auXggxqT@;4t$J*gejFEq}vEqGqs ziSH3!tPbLo8-60Xr|=YnW^5QvyZxRvdB|oo7EOnaeTS3@f*q7Yq$Pz*qE>?TF2|G7 zZ-_%_M5l2WkYmfntnql%Oh@@gFg_Xm1fHNUbGA`Dr0sk#j`1%;F3f(}B1u$SrUrG; zK)X(&;T&#R5Pq*19@=5OWYIY)p>gr1;wA7MiFv|n$q6&d6~hH7IWGs`{<@7!-4`-E zA0*on3_l_p{~{p;rO#9f1R@~vFWqyr#w$>JPm`*i`;?5DyRY5bO&Ee|W9MX8RZ8LjmuKZyDi`mgrdzKHWk zCTmM+6i-tbR*Ai3|Dbo5Ur{V2LP?C~UCBo1B1L2$cNwRr%d)hygSc&rx<{N4uqm#e z2{$6iiH5F+DQ3hAJQv>8ylbTAM$1ND8(viO;sI6hT3nJ~C0%N5O;(43^_E-jl5Y}a z{+*VX{d_6o#X*iD8ed2PczMqhO;)W=L|ffg_SH_u5g(k8M&3YP;j;fgWNnPFxczqf zjSF^Dg10ZYzenb@DyX8%May$41`cdMKT3#oD{LAJi;KF5+k)>Z+f%Y_4_~?Bf1Pdf zqYb!BXJIjy^93Yyr|6k@VY0-X+iY$MS6tdUhmASj7~9^V9%y^$Um$+zqW9ewqk3CO zD>B~H&Pqv7U+(DZ&K9QLZyhlG);ZxVV@%H~wD^Jlnc>+(n_6i5CQHueg?01*D1vxj zzL-A{>Hog{g*AveVSLUjCfE79Wk_I10b&f59<%#QN~))BADv zWwqLKrVVH3y$z@_q*^ROz1tp5P;REMfBgz~hQWpM$!EQLwh_BIH{N?u-ZolEr_OOE z5_P{Yjq=^)kiep1a1!HhR<4=|wf9|i|15QUqchkOr;%o4-Pv93vr@fuCAu_v{{iX9 zk^+C-WB9I%ABSRoo~}RZThk-eYb#X6iOZ=QK8gq{kk1*O?^&ISuV^JGrS*xG$%lv@ zQlb3}#jL(55r5bC5taE&{yTlHYX=SO`5~#t!dXw4Iq2{oiPd$^+&}Nt&`Zov9Q3;E z*|Z&qX3BM2F`vV5y+M2Kq9>gd=~5Ni@YOXPqBLvnge2K{l?%ESLVg>Z*4Kn?Zcj*o zY|~!gWnQYOW`r-l?+VgmsoCyF=TbxD;#1Di^>XtJ2)%b*qnV8{a&1cq^B;Y_Y)ya5 zpjKE-&DMeHNQl++jl0+!>6W&hN~(vsd>XOU{lLdmcY5KO!n?(YDaWj^hm@bLrstD~ z%Z#SF>aY3fba6Wgff4V_43f#jVzS@Ow|6;s7JqHSJwej5wNM7sxId=-PA33Y4uNOA zDa}=awmjEOavUo072#wO;Ay1_+mb*E-c7D+nUH8-XKV(EU!Z3rt}k^ut8#17Sn9{q zl%?oCs^?ua;pGd>RCV=sA={Og^3R9PACTOj#Ch=&BDy4>*2h^PBPSv_@F3*;iY=$_?N+u9^QR~b12nul@ z?325)7GX7h9Om}z1GmyO?_}ykUnMp`H0Cq-2NK1U&nsE>UUdleqk!DTu4XFv(Ox}s zyAGCC|~I-4gOSeu^mhI!HU(O{xccll~DFV{yS&OnI1>F+GCDzw>oXWfe^L)chN3t z8cUVb{AmvbXk9#ijz52EP$rm{J)!L-l*_H>u*hnY{b{s?{?cvk2sQtL_h|`{H0s3t z(4Ef@WfJf`G9({DC_eg-tdS5<^T9L1bP>WO!X0^6%VXpyUU|?^CrV=cY`+PM8N9Ckp&@0rknnt(>irsgQqNVb z$VYrP>bFGH;`R=Nr}ZNEyvG_2Gp|gK!V;1WROLF(mtw0kD?DgF_A#=DDMztpEbPB; z)&_M;Y!bwd$lO@^`!2r$TDK}4TtCBrv9hSd} zx<%;8Ngo^V?h5#|1M>W0QHyJu*-ph36&cyIISunGF-?Rin;9lgUbH*Lz_~wgkW@|& zUUzZc+7RXie+eXOJiKYkeos~Jx{ZaRK%kRue|Jr2<8%U91btGW37s03Rb+lSm1fFU z)2QST>2nrRGB2yIX}&MH{oEAMOR8uB4M#kbx!TpH>Jn{P7L%o$@p|p{=XNCpuWv2q zDp-}zW^x7CUqU3640QXos8TMdF>~MXE+M0kg@iN&j>?&wBOl~Y4YAO;-x9$Rdi_Ga zG^69Ktj>2T&mt~f|Kw{?$Sx!mr9HJKnTn~<>O*<=~sQ2smVxt|c9?6#t0_f$8TjSbEFXW*_XK2;(tS#Iv5}~&% zW%=tV87|xV`!WU*No28#JWlKrGCh}y{=5?S0l!z zb0$}}Mz`D&Y#(fY+CkS|++rM898}n$Bx3l{bIe;Mg2!$R5&pcqL_XG9^g*&p7~gp$ z{&VH<Ivt#WPN@mwKZ(+AHKT#pG#`dP@ty`YU{9r5y5}yr0`8g_h&G;!f$4!{vKI{``}PY^V^W={uk1l=OdLOrSqm86MriZ|F0`a>UdQ5 ztcp?aodFvihRyTuc2%>Ki!xA?>52Z|-?O<$BsJsWU-43^+rM;=Gz9 z^Pbw!g|B>5)~54SN|`80?s;O#Ygv~;Z57Zm5}$EmzpTLUcY&{WYg5`;8lFyiRaNek zc@SSHzS5Ol@<6J~ULe9RFnTe7*8TZo3U|IB(`bW+Y_?n9#cGx*#}`aqTJI$upfMSc zz%yq;vA);S)T-3Q%aL?(JN~TMx3lVI>R8!LUhRf11T>=JNI|6H0v2gn=sHS^g7(kK zq($#CDDP7!=%}SXx;a_!4HsCXo0;Dru}As^;)(NL5F`%$c=p;&>1RG9!Wuq7v^mf_ z*EByc?W~cPdHEZYlna0S3J&2H{F=*jNbcokJJr}&mEuTmpnX?G>JI#d=fC;O)w_ zS>r8t+r`PvGm2VzO?2bq6tp0X?HGKen4!nPj%so(lg*BEGRrfCN5E?WcO>vSKwnK2 z3P;(4V3sHg1PE*I2)r&JAP|?tI>O+#2n@3Y!W!uy!Lm|W%fgJblwi>lQsYx|lttJe z72TZ?TJGxFaCcic#F9nwE{Ql63INz6FfeAUy`2LZij`nF#f1XTCt_X}=2H`ltptm{ zng+8h${E2d2oePG@!Z2AUHMt=k}!)qTUtRi<>dc>09q0(HW-W}l$Y1d%?;!x075xi z^MWA|2rnN$FF!vIV8MgNIbdK|9tSk*3B)f9IRqN+jC8~xQ4Y)}m@o^J3r2#41<*79 zIX`Liq z;+`wQ0mJ$`geCm1{*ErrcBjj+g!3Zo5cYs68WjA}q+mk3jIjMd4PW7BJ!8AnrROfvAMp{XVM`C`$l} z9|7aDfFLY*goOnyc?7{iqC60=D40hG3>@g zjR4ZeAMyI99Qj|wf(TrI4@?O&d{b4uD@=598K6E^^i@$m8U{LPr?AB^$-v0~nntnufP z#d-fXQp8UUeoHezzh5#SeF52!_pfyL2Wh|z{yTsEaK?Y<5X{W~4)Txq{gH0?u z{3GLkqw8O~{t*NJ$oSvr`hP|j$=??$gac3pxdGQDah{q`;HpJrp`sv1aD4LnwmLl= zkX&?BG(Zy&fLKpHXRxV~u7Hpjqoj6^c;+lICD8@M3|T%Px{kT0kC8>$pVZ|9r`00D zlGzQ3v0*-`7WJN7rXe68+fkB}*2WGljo91hJZJj2Hm0K`&7*3}D`?1m4&n38LVti% z!Ecwn{{2-M{S>+Adz?0Rh=k7HEc7E&c{!?Bef#TYKBfRhGf}#`=~2n8+vC%W!>%i? zN4!V3qbs}AN=IxH$&FvdIj_q5X}TR|*8E{??y10J~G;zZ<_SzMntU{AT`)=C{WGP@w;bt2yW|9rL2g z(4O~|T&~(^GmZCH8Lh77-`TqRhSzL#YS^|nyQw@nD>D-sUtCcE<=9!1WU4(}4-D7G zZs4;GiddAwY*45WUtizbTwH-YS$b}^3@cR|>hz+H%tuEDD>e=e!K&<3)@^ZfJ>|eR z4!N9`mL}?Th^^Wg_4rvMX=`g+X7T(dh7_@mCBO3B{dzO%D4%#uGkyXev0 zRHQ*-*YZeZ3xaDH8pfc} zrKP1Dq}RA-BUW9fch@GH;vi^Hj`w1JfrKHxDVzhPk1fi`$x#!wAH>vGgwR7e=Vl@! zB22b%sOl}<&i?-X9DCFI*yE+cy^W@ZAUa;7#+gL#Wy_`d)ry|>Mqje)S2kww_=-pK z-5Frm=V!x}975(&SE;GD2DTeQn3!TkP{9T8MtM0o91aJp#UU>}KcA1$YxlcpyvvWT zp#^pWg}dWV$w3ELBO{~q#Iep!=Q;dBZ%$yOnHR+O5?wE<(Y4Nxvf$C)dVdveBQ-=w zNC;vuGFe^zl1>D)P^iF&V(joC}-r$keAG`$lO6Z&P2Nvk9)t#jK$D11fs+qcZt zGc`*kL;H_nkE;xq=0sBEgKqS26kVnlng?DSV(1K}p%s z-#;ryJsP{>Dl7cu1v!48oS2+(cxH%R!X3kHP?*xp^)+j**%Jy(6+0OuQbD#-pVf5a z)pyUDT{VhgvLPrCAXDtY^POquW}Z?@lQ*Qti;GRe)yV0V=sxPvCxpb?b5%vw_+Y>0 zm8l~wG#U*sUC-b)92!n@{=WE{T%4F&n?Glj$bkCF1fxUl=vdJ1v1iMX<4X08X1>cWj zG4MT$JS;)awCR^SBiir=Mn-gb)!Q+I@*#Vnu>E`N;r=BhCGWGc0ws?R1#0%^v-E4d zJk{G`*pxn$l*qfdxV(PzMqWutX>qJ}Oj-^*X9n!s2gb&6Zs?hbJcEhp8C}B1t6?D} zb^}+G!i+aqAT*cl(Keu@&Z)#cXDXP&WAOVtEpSI2MPzU}AZ;}a!_ z)Eq|RB?@3)h={M~RsC@Do53eC(TO;;>>0cuXJX{i%WY{Ii}qcWDb3@aX^W4gDGH{C ztaqY*od13+kNVoR20u#Hb&KAEmD;g0ve+hXSzj{$^h7TxuN8yP!`FnqtIp^sQ6~%2 z76@imgE)|JEtkl-E$o&Gz-TC|!t@C5_d06c$E#<{YU05J5dcsM+-#T6#Eap1d=fD_EvC#_)3-Hz$p|v03_vJYwoGBQ?`N*g~tC9d?0O_HoN2VC8t!drcnl2R*OeW`cM-qyBxfY+yb?S^uC zmpcFVsj&)o8fhSh<~bYyi7uGN6nm59-B9WEikQkQuKWcZGc%?v-JAeFKfuY2BW`0O zIkjUzmQ0>`-3&4=Yfna8Sn<~N^z`gSSmP6xikFVo8kq{PYZHEc4r5k+el`yu&ToWE z03mb|aKq&SEG*YR#{D@%WR#RA=T`^%8$w4%#~`w&yIZvBS){j^%e;0k!eeK7DZ=~c zHij(KiTdc_8bR048PsO8WKWhiipj{Dl@0Tl1eCWqwq%LB77?d|IA zebW*v!n@Ey#i6cxgN_c>KRh)x)wF?^^d1ln2nYyMW$((_qK7!AG<#M9(ZLq4KGS3S zzOb;cc}819!%;TmyhLBU)0NShuqMke;M6Q_4rgZx%g{<^uXI~c=j7xJ0}k|*;$k5r z3blfXXJBAZVh>j`G%^a`-`_tuC?St_9Seb#TYmAq)C3&9dHTnL#kQ3aJHY9g3*E`o z$qEB<0|yTe&xoNL;4Y0nT@`T|OD7tZX+EjT)&CLQM<} z4#s5b7ffX0=YH;t;rC;tu_$*Sbbx;m$vUr&fBMm*XI4Fbv5O{TrS|wJ6P?~Qmy(vo zz6W?RJXIxfx^7q@gt0n}Yh!+X-V&%}PR`U^+(;k|uln}NSRzmjOc_5Dh*s6q(~CUZ zU&w0`z>A|>@yPlBY9%BR>3npEqr5hH>}yi#IwhA4^}x8q!teIU`CeFi4HlLt0b}(sbo9I zPE$&pIIn@SW?u-s`#U=eg&8p5Jrdzu!G?ysb4%L{Lf) z0)dEFT9{sjKz1Ou-`)IRrb8Jk1&ml96BAoY6BGG>Ahf5?4HN`&;(p|PLyPz4q?=sr z^Az@r8^oPKzTD$(?9gXdU>hU&)XBU5-Bge0Q%jQv6B8$@C8Rg56zW%>q0fCex%(G6 z`C>KeyK0vwcn{7e91u-hXEDbnnKJTy7cQ0$oA0<()#0F^=2@ofKC^%4FEj7<-9dRC zEPwDYW`4C67F~kX$fDwzo!xoUD*Qi~P8{@1)nVzgrk?u+j2%z>J*V)e?7f84VB-l` zv9c^NP_0^Jp*`-gb%!`CuIapxvTFO?=jLaPr5&|17h`{GK1ow0UCnQl;!LRv)0U}< z#l6z!b_!jI`9WOp$AIcQMbmfJ;C(Ti%JQ-0`iyOisbwXy(t;di%!nL>Em&y$81Nnqy301Fok1fq6i``v-dgNA}hfndu^W&*UG zeBuV`ie8?YVCrD7*_B`uw4Wc!KNw;XgmMc;A?2|?!QS#P%S*P-xAsUvAi^X|Q)36* zFoWXi?YzQ!%OdwV*b40>$C|grJh^D=Ago*$5EG}XWS%G1sG!)Ya@p8Q`)0^1 z?!iYw?79TsZ`dz$8iy9}clFXLq5e$5`qI$Y=Y-GdvzU!qy`Z~K*o2S!|jNX1S2qFB>!oA^Z35O;M@vrRJilvEdh(`H`v;o9V48Lb9@Rr~#)ogkI)9-P+n}?N#*ZRcmYH z2CZ2Xy7A?x#Mr2o7b(L+$t*lPypK$VxwyC#!s{wwbll`U-H9*nZnM_si7u=($tgHrzQR?v8siRD*_^96Q?)zhS-sV1WijikWT5_TsG|RCZztZnaA=Ueh zR3b|1ii%XVwYBrWsU4i09##5{un8;B> zDbpb3f|XToqKrXLU%tHooHN_|!T{dcl60KMs)>z_olUYavOI2+brHnPuc^^PX+Bo- zT3hb5sf(}%sAkz=uPZB`0|3FR3*)abG?Fzfj`a}F)pRxL|6f!hwV--f!nM`IgrzZ>%-f5@ZdBXK5+P z$(z(AL^z|OudAyo*KaF*VT;m~AlWwY_ckNl36q*vG6h4qU79zsH(vhMAg%g@u9C$dV(=X?WX)%03F5{J27A3knKOtdL!a6NbG^P-soR9n|7R4Aj@x zU#ShAb!ARs_m4rD+18o*+F6n8p#z#o3#SMV)srXh0(?Rx3y5t0H*3>sDO4KGi!rK8 z3AQJqmpYvb8aAKyrD}L^Q3LO83pCr?7=|>3@pjLHdgVuEhoWY>o^B(Fi}UvO4#*Ll zU%}QrRXzesY#*-qb&t&O{D`zc=na)?m4ze9pOj}iBlZ19t8vt1=US0@Ip-w4&Ef>o z#kA8($1bLdNvb1)wLD6x6zzn#E*Yl}5 zepiXEv78U>kF`9$4wfQtjcxd$!BUSSc@OQih#QM-aJ6(z)CH$bgsrXEu3ftjIDc)( zZgohbkbFHDYrashpYKgfOcZ99=j13XE-nK0jT)QaTKtHc>}%HTL;buN>6ny^p0P1m zMMXtD4LT?snNu+-quA;8$E(b``LZa|!^@Ed}6WodEI9Td_1>})xZ8VywI!|KUI1NYwNm-ZYj z#uEZbATpEjS|a1IvaT+qY$)`&r;OpvWh(KLP@|Q#@`)31 zfHTw&g&@CGe0LTetltqiBmsDfvu@Y-Y(F3%JWl1F3R|4YNW}mJ*(1>~0T)4LqS_u& zKV;;>2&5WlW4!WTI%Zx9kTLg`2a4T2JrC?L_|@@WSqtw)*WXDrS}}(j!m$@K&S-!= z9%*Tj`}>;!Ehf5Qa`%9|3W$#@Vz&i5Ffb5Q&hZ!1TN_KAlR$Yi{Dx0&uX2h*Mdgg7 zIinaGQu}pB$NlQ{3+LMbCjUBy4sf8(g#-r+&#*xXJ%HYnMs0GdSsxFTaOwQqtT_R> zi0w4620aK(PmG;;J$`6(=P<4B8hH})6N2k-Ea_m^iTTkQtvxdOeUl@?d}|`PKo_&Z znKf~7sYa1E32!PZDztrxKeC&AUltX0SRSk2fMe$sy#4)|y?#LXIjnZAPE*t6RUH#7 z28-RrM)w1VY1+OD3hvC&n!t5N6=#NiNJ{GFN=DgGo>j`t3gPk1&Q}Em^q`@&CEEIp zI=~Jq6?pAwg`DQ9g9-{#hYqc8BGJCS34jhKl$7G*;(+>aW^_zUKLDPGgE%fI6e^_+ z#K=T8wtdbtimYuzt+N^QB>dL){grxm=bVXH4KOt=8SAjMv+FJpTXq5$bYrMY5fQo4 z-zJx?;bBgAzX^M7fB}chh!EKX?E|i65c)MWNo7Ql>xjW%00yVKacXh`qO$d#BLzi8 zm*yKdW6(-FXJ>Nm%65y{B_t87w=~s~WN%{fUOT-GB-9WD!Vj4P)oDd)8eZ+}&V|)c z$X1V3ECDI>R;2W?%C^-O;)JbaGU{qeDPSr+H^W4>$Ld&=Qi0{?5{&fpqws8 zMn?YZ<73HSFfxnFb90Y?F4qUjYi@3?rv^joxqk%KlVup*^ZZhJ&njz@SGu)ACv$L2 z8H3R4flO`RfoGs?KbxMOmMy9SJrZ6Wa2VW^e&kYzZhm!jb?*wudN~Y3CX-*};&TaKZX5nfN{6_ z-;6&z8il^C{KfrGb^h-DO{%{e-`xLZ{2v1SD-Q9`YeB~IcDNnJow}8GnE^h3AeLs< Lrp4#~^UHq$G-W}G diff --git a/assets/navigation_cube/rear.png b/assets/navigation_cube/rear.png index 3102564a64ea81cb1559ab9b86f611a45487bf8d..9fb336eb299f1ac348d966ba5fc52b7ce517190f 100644 GIT binary patch literal 12911 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 OrzEc?mvir__kRGF$Sgkq literal 5169 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 diff --git a/assets/navigation_cube/top.png b/assets/navigation_cube/top.png index 072e81e75fbff6f0c0ef6caaf764e25e5db3eeb4..e3021c8212c7921f16635cc04b47dd213bf81639 100644 GIT binary patch literal 11956 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 abr3}-l5$evm#mGS&CHA~jfziSiuoTGF}KeE diff --git a/crates/fj-viewer/src/graphics/navigation_cube.rs b/crates/fj-viewer/src/graphics/navigation_cube.rs index beb7cd5af..f58c72648 100644 --- a/crates/fj-viewer/src/graphics/navigation_cube.rs +++ b/crates/fj-viewer/src/graphics/navigation_cube.rs @@ -1,4 +1,4 @@ -use cgmath::{Quaternion, Rotation3, Vector3}; +use cgmath::{Quaternion, Rotation3, SquareMatrix, Vector3}; use wgpu::util::DeviceExt; use super::{ @@ -191,16 +191,22 @@ impl NavigationCubeRenderer { } fn get_model_matrix(rotation: f32, aspect_ratio: &f64) -> [[f32; 4]; 4] { - let rotation = Quaternion::from_angle_y(cgmath::Deg(rotation)); + let rotation = Quaternion::from_angle_y(cgmath::Deg(rotation)) + * Quaternion::from_angle_x(cgmath::Deg(rotation)); - let scale = cgmath::Matrix4::from_nonuniform_scale( - 0.2, - (0.2 * aspect_ratio) as f32, - 0.2, - ); + let scale = + cgmath::Matrix4::from_nonuniform_scale(0.2, (0.2) as f32, 0.2); + + let mut ortho = cgmath::Matrix4::identity(); + ortho.x.x = 2.0 / (2.0 * *aspect_ratio as f32); + ortho.x.w = 0.0; + ortho.y.y = 1.0; + ortho.y.w = 0.0; + ortho.z.z = 0.5; + ortho.z.w = 0.0; let translation = - cgmath::Matrix4::from_translation((0.8, 0.8, 0.0).into()); - (translation * cgmath::Matrix4::from(rotation) * scale).into() + cgmath::Matrix4::from_translation((0.8, 0.7, 0.5).into()); + (translation * ortho * (cgmath::Matrix4::from(rotation) * scale)).into() } } From ad3b426acc6641c1386d0c5381b7d8fb0026dede Mon Sep 17 00:00:00 2001 From: erenoku Date: Wed, 8 Feb 2023 21:25:37 +0300 Subject: [PATCH 07/14] add navigation cube --- Cargo.lock | 1 + crates/fj-math/src/transform.rs | 12 ++++ crates/fj-viewer/Cargo.toml | 1 + .../fj-viewer/src/graphics/navigation_cube.rs | 57 +++++++++++-------- crates/fj-viewer/src/graphics/renderer.rs | 3 +- 5 files changed, 50 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4ba0f8663..83f103472 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1296,6 +1296,7 @@ dependencies = [ "fj-math", "getrandom", "image", + "nalgebra", "raw-window-handle 0.5.0", "rfd", "thiserror", diff --git a/crates/fj-math/src/transform.rs b/crates/fj-math/src/transform.rs index 3fcb4d8fb..a710b80fb 100644 --- a/crates/fj-math/src/transform.rs +++ b/crates/fj-math/src/transform.rs @@ -40,6 +40,13 @@ impl Transform { )) } + /// Construct a scaling + pub fn scale(scaling_factor: f64) -> Self { + Self(nalgebra::Transform::from_matrix_unchecked( + nalgebra::OMatrix::new_scaling(scaling_factor), + )) + } + /// Transform the given point pub fn transform_point(&self, point: &Point<3>) -> Point<3> { Point::from(self.0.transform_point(&point.to_na())) @@ -119,6 +126,11 @@ impl Transform { array.map(Scalar::from) } + /// Return the inner nalgebra transform + pub fn get_inner(&self) -> nalgebra::Transform { + self.0 + } + /// Transform the given axis-aligned bounding box pub fn transform_aabb(&self, aabb: &Aabb<3>) -> Aabb<3> { Aabb { diff --git a/crates/fj-viewer/Cargo.toml b/crates/fj-viewer/Cargo.toml index 6f69f79bb..f66b1f06e 100644 --- a/crates/fj-viewer/Cargo.toml +++ b/crates/fj-viewer/Cargo.toml @@ -20,6 +20,7 @@ egui = "0.20.1" egui-wgpu = "0.20.0" fj-interop.workspace = true fj-math.workspace = true +nalgebra = "0.32.1" tobj = "3.2.4" raw-window-handle = "0.5.0" diff --git a/crates/fj-viewer/src/graphics/navigation_cube.rs b/crates/fj-viewer/src/graphics/navigation_cube.rs index f58c72648..eef20c989 100644 --- a/crates/fj-viewer/src/graphics/navigation_cube.rs +++ b/crates/fj-viewer/src/graphics/navigation_cube.rs @@ -1,4 +1,6 @@ -use cgmath::{Quaternion, Rotation3, SquareMatrix, Vector3}; +use bytemuck::bytes_of; +use fj_math::Transform; +use nalgebra::{self, Matrix4, Translation}; use wgpu::util::DeviceExt; use super::{ @@ -10,11 +12,13 @@ use super::{ pub struct NavigationCubeRenderer { cube_model: Model, render_pipeline: wgpu::RenderPipeline, - rotation: f32, model_matrix_bind_group: wgpu::BindGroup, model_matrix_buffer: wgpu::Buffer, } +const SCALE_FACTOR: f64 = 0.15; +const CUBE_TRANSLATION: [f64; 3] = [0.8, 0.7, 0.4]; + impl NavigationCubeRenderer { pub fn new( device: &wgpu::Device, @@ -49,8 +53,8 @@ impl NavigationCubeRenderer { label: Some("texture_bind_group_layout"), }); - let rotation = 0.0; - let model_matrix = Self::get_model_matrix(rotation, &aspect_ratio); + let model_matrix = + Self::get_model_matrix(Transform::identity(), aspect_ratio); let model_matrix_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { @@ -151,7 +155,6 @@ impl NavigationCubeRenderer { Self { cube_model, render_pipeline, - rotation, model_matrix_bind_group, model_matrix_buffer, } @@ -162,10 +165,10 @@ impl NavigationCubeRenderer { view: &wgpu::TextureView, encoder: &mut wgpu::CommandEncoder, queue: &wgpu::Queue, - aspect_ratio: &f64, + aspect_ratio: f64, + rotation: Transform, ) { - self.rotation += 0.5; - let model_matrix = Self::get_model_matrix(self.rotation, aspect_ratio); + let model_matrix = Self::get_model_matrix(rotation, aspect_ratio); queue.write_buffer( &self.model_matrix_buffer, 0, @@ -190,23 +193,31 @@ impl NavigationCubeRenderer { render_pass.draw_model(&self.cube_model); } - fn get_model_matrix(rotation: f32, aspect_ratio: &f64) -> [[f32; 4]; 4] { - let rotation = Quaternion::from_angle_y(cgmath::Deg(rotation)) - * Quaternion::from_angle_x(cgmath::Deg(rotation)); + fn get_model_matrix(rotation: Transform, aspect_ratio: f64) -> [f32; 16] { + let scale = Transform::scale(SCALE_FACTOR); - let scale = - cgmath::Matrix4::from_nonuniform_scale(0.2, (0.2) as f32, 0.2); + let mut model_matrix = Transform::identity(); + model_matrix = model_matrix * rotation; + model_matrix = model_matrix * scale; - let mut ortho = cgmath::Matrix4::identity(); - ortho.x.x = 2.0 / (2.0 * *aspect_ratio as f32); - ortho.x.w = 0.0; - ortho.y.y = 1.0; - ortho.y.w = 0.0; - ortho.z.z = 0.5; - ortho.z.w = 0.0; + let ortho = nalgebra::Orthographic3::new( + -aspect_ratio, + aspect_ratio, + -1.0, + 1.0, + 2.0, + -2.0, + ); - let translation = - cgmath::Matrix4::from_translation((0.8, 0.7, 0.5).into()); - (translation * ortho * (cgmath::Matrix4::from(rotation) * scale)).into() + let translation = Transform::translation(CUBE_TRANSLATION).get_inner(); + + let mut mat = [0.; 16]; + mat.copy_from_slice( + (translation.matrix() + * ortho.to_projective().matrix() + * model_matrix.get_inner().matrix()) + .as_slice(), + ); + mat.map(|x| x as f32) } } diff --git a/crates/fj-viewer/src/graphics/renderer.rs b/crates/fj-viewer/src/graphics/renderer.rs index 4e484bc6a..04c9f8678 100644 --- a/crates/fj-viewer/src/graphics/renderer.rs +++ b/crates/fj-viewer/src/graphics/renderer.rs @@ -347,7 +347,8 @@ impl Renderer { &color_view, &mut encoder, &self.queue, - &aspect_ratio, + aspect_ratio, + camera.rotation, ); let command_buffer = encoder.finish(); From 095f12d6d5389d3e037a54bf1889baa561d9836c Mon Sep 17 00:00:00 2001 From: erenoku Date: Wed, 8 Feb 2023 23:28:32 +0300 Subject: [PATCH 08/14] minor change in documentation --- crates/fj-math/src/transform.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/fj-math/src/transform.rs b/crates/fj-math/src/transform.rs index a710b80fb..61a32621a 100644 --- a/crates/fj-math/src/transform.rs +++ b/crates/fj-math/src/transform.rs @@ -126,7 +126,7 @@ impl Transform { array.map(Scalar::from) } - /// Return the inner nalgebra transform + /// Return a copy of the inner nalgebra transform pub fn get_inner(&self) -> nalgebra::Transform { self.0 } From e4e8e15746797947ee1f841ec254a5f56b5973e8 Mon Sep 17 00:00:00 2001 From: erenoku Date: Thu, 9 Feb 2023 19:12:38 +0300 Subject: [PATCH 09/14] cleanup --- Cargo.lock | 20 ------------------- crates/fj-viewer/Cargo.toml | 2 -- .../fj-viewer/src/graphics/navigation_cube.rs | 13 ++++-------- crates/fj-viewer/src/graphics/texture.rs | 3 --- 4 files changed, 4 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 83f103472..65c18102d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -89,15 +89,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "approx" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f2a05fd1bd10b2527e20a2cd32d8873d115b8b39fe219ee25f42a8aca6ba278" -dependencies = [ - "num-traits", -] - [[package]] name = "approx" version = "0.5.1" @@ -463,16 +454,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" -[[package]] -name = "cgmath" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a98d30140e3296250832bbaaff83b27dcd6fa3cc70fb6f1f3e5c9c0023b5317" -dependencies = [ - "approx 0.4.0", - "num-traits", -] - [[package]] name = "chrono" version = "0.4.23" @@ -1287,7 +1268,6 @@ version = "0.36.0" dependencies = [ "anyhow", "bytemuck", - "cgmath", "chrono", "crossbeam-channel", "egui", diff --git a/crates/fj-viewer/Cargo.toml b/crates/fj-viewer/Cargo.toml index f66b1f06e..46204c23e 100644 --- a/crates/fj-viewer/Cargo.toml +++ b/crates/fj-viewer/Cargo.toml @@ -14,7 +14,6 @@ categories.workspace = true anyhow = "1.0.68" bytemuck = "1.13.0" chrono = "0.4.23" -cgmath = "0.18" crossbeam-channel = "0.5.6" egui = "0.20.1" egui-wgpu = "0.20.0" @@ -22,7 +21,6 @@ fj-interop.workspace = true fj-math.workspace = true nalgebra = "0.32.1" tobj = "3.2.4" - raw-window-handle = "0.5.0" thiserror = "1.0.35" tracing = "0.1.37" diff --git a/crates/fj-viewer/src/graphics/navigation_cube.rs b/crates/fj-viewer/src/graphics/navigation_cube.rs index eef20c989..5967db937 100644 --- a/crates/fj-viewer/src/graphics/navigation_cube.rs +++ b/crates/fj-viewer/src/graphics/navigation_cube.rs @@ -1,12 +1,7 @@ -use bytemuck::bytes_of; use fj_math::Transform; -use nalgebra::{self, Matrix4, Translation}; use wgpu::util::DeviceExt; -use super::{ - model::{self, load_model, DrawModel, Model}, - texture, -}; +use super::model::{self, load_model, DrawModel, Model}; #[derive(Debug)] pub struct NavigationCubeRenderer { @@ -110,7 +105,7 @@ impl NavigationCubeRenderer { label: Some("Navigation Cube Renderer"), layout: Some(&render_pipeline_layout), vertex: wgpu::VertexState { - module: &&shader, + module: &shader, entry_point: "vertex", buffers: &[model::ModelVertex::desc()], }, @@ -149,7 +144,7 @@ impl NavigationCubeRenderer { }); let cube_model = - load_model("cube.obj", &device, &queue, &texture_bind_group_layout) + load_model("cube.obj", device, queue, &texture_bind_group_layout) .unwrap(); Self { @@ -179,7 +174,7 @@ impl NavigationCubeRenderer { encoder.begin_render_pass(&wgpu::RenderPassDescriptor { label: Some("Depth Visual Render Pass"), color_attachments: &[Some(wgpu::RenderPassColorAttachment { - view: &view, + view, resolve_target: None, ops: wgpu::Operations { load: wgpu::LoadOp::Load, diff --git a/crates/fj-viewer/src/graphics/texture.rs b/crates/fj-viewer/src/graphics/texture.rs index f66f623b1..5604667d3 100644 --- a/crates/fj-viewer/src/graphics/texture.rs +++ b/crates/fj-viewer/src/graphics/texture.rs @@ -10,9 +10,6 @@ pub struct Texture { } impl Texture { - pub const DEPTH_FORMAT: wgpu::TextureFormat = - wgpu::TextureFormat::Depth32Float; - pub fn from_bytes( device: &wgpu::Device, queue: &wgpu::Queue, From 3f86c02e7c21bbb25acabb48e6110d7ab1766839 Mon Sep 17 00:00:00 2001 From: erenoku Date: Thu, 9 Feb 2023 19:47:39 +0300 Subject: [PATCH 10/14] Fix new clippy lint --- crates/fj-viewer/src/graphics/model.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/fj-viewer/src/graphics/model.rs b/crates/fj-viewer/src/graphics/model.rs index f6937c081..b6f92ad4e 100644 --- a/crates/fj-viewer/src/graphics/model.rs +++ b/crates/fj-viewer/src/graphics/model.rs @@ -128,13 +128,13 @@ pub fn load_model( let vertex_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some(&format!("{:?} Vertex Buffer", file_name)), + label: Some(&format!("{file_name:?} Vertex Buffer")), contents: bytemuck::cast_slice(&vertices), usage: wgpu::BufferUsages::VERTEX, }); let index_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some(&format!("{:?} Index Buffer", file_name)), + label: Some(&format!("{file_name:?} Index Buffer")), contents: bytemuck::cast_slice(&m.mesh.indices), usage: wgpu::BufferUsages::INDEX, }); From dc8476b71e18ca10bc0e407daaa585089e27ba78 Mon Sep 17 00:00:00 2001 From: erenoku Date: Sat, 11 Feb 2023 21:27:25 +0300 Subject: [PATCH 11/14] convert to using thiserror instead of anyhow --- Cargo.lock | 1 - crates/fj-viewer/Cargo.toml | 1 - crates/fj-viewer/src/graphics/model.rs | 19 ++++++++++++++++--- crates/fj-viewer/src/graphics/texture.rs | 19 ++++++++++++------- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 65c18102d..d26f6862b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1266,7 +1266,6 @@ dependencies = [ name = "fj-viewer" version = "0.36.0" dependencies = [ - "anyhow", "bytemuck", "chrono", "crossbeam-channel", diff --git a/crates/fj-viewer/Cargo.toml b/crates/fj-viewer/Cargo.toml index 46204c23e..f2545e14b 100644 --- a/crates/fj-viewer/Cargo.toml +++ b/crates/fj-viewer/Cargo.toml @@ -11,7 +11,6 @@ keywords.workspace = true categories.workspace = true [dependencies] -anyhow = "1.0.68" bytemuck = "1.13.0" chrono = "0.4.23" crossbeam-channel = "0.5.6" diff --git a/crates/fj-viewer/src/graphics/model.rs b/crates/fj-viewer/src/graphics/model.rs index b6f92ad4e..37ff0938d 100644 --- a/crates/fj-viewer/src/graphics/model.rs +++ b/crates/fj-viewer/src/graphics/model.rs @@ -1,8 +1,9 @@ -use std::ops::Range; +use std::{io, ops::Range}; +use tobj::LoadError; use wgpu::util::DeviceExt; -use super::texture; +use super::texture::{self, LoadTextureError}; #[repr(C)] #[derive(Copy, Clone, Debug, bytemuck::Pod, bytemuck::Zeroable)] @@ -55,12 +56,24 @@ pub struct Mesh { pub material: usize, } +#[derive(Debug, thiserror::Error)] +pub enum LoadModelError { + #[error("Object loading error")] + ObjLoad(#[from] LoadError), + + #[error("Load texture error")] + Texture(#[from] LoadTextureError), + + #[error("Load reading object file error")] + ReadFile(#[from] io::Error), +} + pub fn load_model( file_name: &str, device: &wgpu::Device, queue: &wgpu::Queue, layout: &wgpu::BindGroupLayout, -) -> anyhow::Result { +) -> Result { let (models, obj_materials) = tobj::load_obj( std::path::Path::new("assets/navigation_cube").join(file_name), &tobj::LoadOptions { diff --git a/crates/fj-viewer/src/graphics/texture.rs b/crates/fj-viewer/src/graphics/texture.rs index 5604667d3..956f97d1d 100644 --- a/crates/fj-viewer/src/graphics/texture.rs +++ b/crates/fj-viewer/src/graphics/texture.rs @@ -1,5 +1,4 @@ -use anyhow::*; -use image::GenericImageView; +use image::{GenericImageView, ImageError}; use std::num::NonZeroU32; #[derive(Debug)] @@ -9,15 +8,21 @@ pub struct Texture { pub sampler: wgpu::Sampler, } +#[derive(Debug, thiserror::Error)] +pub enum LoadTextureError { + #[error("Image processing error")] + ImageError(#[from] ImageError), +} + impl Texture { pub fn from_bytes( device: &wgpu::Device, queue: &wgpu::Queue, bytes: &[u8], label: &str, - ) -> Result { + ) -> Result { let img = image::load_from_memory(bytes)?; - Self::from_image(device, queue, &img, Some(label)) + Ok(Self::from_image(device, queue, &img, Some(label))) } pub fn from_image( @@ -25,7 +30,7 @@ impl Texture { queue: &wgpu::Queue, img: &image::DynamicImage, label: Option<&str>, - ) -> Result { + ) -> Self { let dimensions = img.dimensions(); let rgba = img.to_rgba8(); @@ -72,10 +77,10 @@ impl Texture { ..Default::default() }); - Ok(Self { + Self { texture, view, sampler, - }) + } } } From cec4a37cfa214aef42fa08a25a3380b15d31d131 Mon Sep 17 00:00:00 2001 From: erenoku Date: Sun, 12 Feb 2023 00:24:43 +0300 Subject: [PATCH 12/14] embed assets into the binary --- crates/fj-viewer/src/assets.rs | 59 ++++++++++++++++++++++++++ crates/fj-viewer/src/graphics/model.rs | 30 ++++++++----- crates/fj-viewer/src/lib.rs | 1 + 3 files changed, 79 insertions(+), 11 deletions(-) create mode 100644 crates/fj-viewer/src/assets.rs diff --git a/crates/fj-viewer/src/assets.rs b/crates/fj-viewer/src/assets.rs new file mode 100644 index 000000000..9e98d806c --- /dev/null +++ b/crates/fj-viewer/src/assets.rs @@ -0,0 +1,59 @@ +pub struct Assets<'a> { + pub cube_obj: &'a [u8], + pub cube_mtl: &'a [u8], + pub front_texture: &'a [u8], + pub right_texture: &'a [u8], + pub rear_texture: &'a [u8], + pub left_texture: &'a [u8], + pub top_texture: &'a [u8], + pub bottom_texture: &'a [u8], +} + +impl<'a> Assets<'a> { + pub fn get_instance() -> Self { + let cube_obj: &[u8] = + include_bytes!("../../../assets/navigation_cube/cube.obj"); + let cube_mtl: &[u8] = + include_bytes!("../../../assets/navigation_cube/cube.mtl"); + let front_texture: &[u8] = + include_bytes!("../../../assets/navigation_cube/front.png"); + let right_texture: &[u8] = + include_bytes!("../../../assets/navigation_cube/right.png"); + let rear_texture: &[u8] = + include_bytes!("../../../assets/navigation_cube/rear.png"); + let left_texture: &[u8] = + include_bytes!("../../../assets/navigation_cube/left.png"); + let top_texture: &[u8] = + include_bytes!("../../../assets/navigation_cube/top.png"); + let bottom_texture: &[u8] = + include_bytes!("../../../assets/navigation_cube/bottom.png"); + + Self { + cube_obj, + cube_mtl, + front_texture, + right_texture, + rear_texture, + left_texture, + top_texture, + bottom_texture, + } + } + + pub fn get_asset(&self, file_name: &str) -> &[u8] { + match file_name { + "cube.obj" => self.cube_obj, + "cube.mtl" => self.cube_mtl, + "front.png" => self.front_texture, + "right.png" => self.right_texture, + "rear.png" => self.rear_texture, + "left.png" => self.left_texture, + "top.png" => self.top_texture, + "bottom.png" => self.bottom_texture, + _ => unreachable!( + "An unknown asset: {} is trying to be loaded", + file_name + ), + } + } +} diff --git a/crates/fj-viewer/src/graphics/model.rs b/crates/fj-viewer/src/graphics/model.rs index 37ff0938d..c5f07edbe 100644 --- a/crates/fj-viewer/src/graphics/model.rs +++ b/crates/fj-viewer/src/graphics/model.rs @@ -1,9 +1,10 @@ -use std::{io, ops::Range}; +use std::ops::Range; use tobj::LoadError; use wgpu::util::DeviceExt; use super::texture::{self, LoadTextureError}; +use crate::assets::Assets; #[repr(C)] #[derive(Copy, Clone, Debug, bytemuck::Pod, bytemuck::Zeroable)] @@ -63,9 +64,6 @@ pub enum LoadModelError { #[error("Load texture error")] Texture(#[from] LoadTextureError), - - #[error("Load reading object file error")] - ReadFile(#[from] io::Error), } pub fn load_model( @@ -74,25 +72,35 @@ pub fn load_model( queue: &wgpu::Queue, layout: &wgpu::BindGroupLayout, ) -> Result { - let (models, obj_materials) = tobj::load_obj( - std::path::Path::new("assets/navigation_cube").join(file_name), + let assets = Assets::get_instance(); + + let (models, obj_materials) = tobj::load_obj_buf( + &mut assets.get_asset(file_name), &tobj::LoadOptions { triangulate: true, single_index: true, ..Default::default() }, + |p| { + tobj::load_mtl_buf( + &mut assets.get_asset( + p.file_name() + .unwrap() + .to_str() + .expect("OsStr could not be converted to a str"), + ), + ) + }, )?; let mut materials = Vec::new(); for m in obj_materials? { - let texture_data = std::fs::read( - std::path::Path::new("assets/navigation_cube") - .join(m.diffuse_texture), - )?; + let texture_data: &[u8] = assets.get_asset(m.diffuse_texture.as_str()); + let diffuse_texture = texture::Texture::from_bytes( device, queue, - &texture_data, + texture_data, file_name, )?; diff --git a/crates/fj-viewer/src/lib.rs b/crates/fj-viewer/src/lib.rs index bab957c54..7e290eb93 100644 --- a/crates/fj-viewer/src/lib.rs +++ b/crates/fj-viewer/src/lib.rs @@ -14,6 +14,7 @@ #![warn(missing_docs)] +mod assets; mod camera; mod graphics; mod gui; From de6bd375e39dd2b6b709d6471ac9723c55eeb999 Mon Sep 17 00:00:00 2001 From: erenoku Date: Sun, 12 Feb 2023 20:27:37 +0300 Subject: [PATCH 13/14] Use a perspective camera to render the navigation cube --- .../fj-viewer/src/graphics/navigation_cube.rs | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/crates/fj-viewer/src/graphics/navigation_cube.rs b/crates/fj-viewer/src/graphics/navigation_cube.rs index 5967db937..4c2e49beb 100644 --- a/crates/fj-viewer/src/graphics/navigation_cube.rs +++ b/crates/fj-viewer/src/graphics/navigation_cube.rs @@ -11,8 +11,8 @@ pub struct NavigationCubeRenderer { model_matrix_buffer: wgpu::Buffer, } -const SCALE_FACTOR: f64 = 0.15; -const CUBE_TRANSLATION: [f64; 3] = [0.8, 0.7, 0.4]; +const SCALE_FACTOR: f64 = 0.13; +const CUBE_TRANSLATION: [f64; 3] = [0.8, 0.7, 0.0]; impl NavigationCubeRenderer { pub fn new( @@ -190,29 +190,31 @@ impl NavigationCubeRenderer { fn get_model_matrix(rotation: Transform, aspect_ratio: f64) -> [f32; 16] { let scale = Transform::scale(SCALE_FACTOR); + let world_translation = Transform::translation([0.0, 0.0, -1.0]); let mut model_matrix = Transform::identity(); + model_matrix = model_matrix * world_translation; model_matrix = model_matrix * rotation; model_matrix = model_matrix * scale; - let ortho = nalgebra::Orthographic3::new( - -aspect_ratio, - aspect_ratio, - -1.0, - 1.0, - 2.0, - -2.0, + let perspective = + nalgebra::Perspective3::new(aspect_ratio, 30.0, 0.1, 2.0); + + let view_matrix = nalgebra::Matrix4::look_at_lh( + &nalgebra::Point3::new(0.0, 0.0, 0.0), + &nalgebra::Point3::new(0.0, 0.0, 1.0), + &nalgebra::Vector3::new(0.0, -1.0, 0.0), ); - let translation = Transform::translation(CUBE_TRANSLATION).get_inner(); + let screen_translation = Transform::translation(CUBE_TRANSLATION); + + let matrix = screen_translation.get_inner().matrix() + * *perspective.to_projective().matrix() + * view_matrix + * model_matrix.get_inner().matrix(); let mut mat = [0.; 16]; - mat.copy_from_slice( - (translation.matrix() - * ortho.to_projective().matrix() - * model_matrix.get_inner().matrix()) - .as_slice(), - ); + mat.copy_from_slice(matrix.as_slice()); mat.map(|x| x as f32) } } From 533f6c243d777c1767404dc6dd4ffc503f02de92 Mon Sep 17 00:00:00 2001 From: erenoku Date: Sun, 12 Feb 2023 22:59:25 +0300 Subject: [PATCH 14/14] Rename model_matrix to mvp_matrix --- .../fj-viewer/src/graphics/navigation_cube.rs | 40 +++++++++---------- .../src/graphics/navigation_cube.wgsl | 4 +- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/crates/fj-viewer/src/graphics/navigation_cube.rs b/crates/fj-viewer/src/graphics/navigation_cube.rs index 4c2e49beb..e5855cb3d 100644 --- a/crates/fj-viewer/src/graphics/navigation_cube.rs +++ b/crates/fj-viewer/src/graphics/navigation_cube.rs @@ -7,8 +7,8 @@ use super::model::{self, load_model, DrawModel, Model}; pub struct NavigationCubeRenderer { cube_model: Model, render_pipeline: wgpu::RenderPipeline, - model_matrix_bind_group: wgpu::BindGroup, - model_matrix_buffer: wgpu::Buffer, + mvp_matrix_bind_group: wgpu::BindGroup, + mvp_matrix_buffer: wgpu::Buffer, } const SCALE_FACTOR: f64 = 0.13; @@ -48,17 +48,17 @@ impl NavigationCubeRenderer { label: Some("texture_bind_group_layout"), }); - let model_matrix = - Self::get_model_matrix(Transform::identity(), aspect_ratio); + let mvp_matrix = + Self::get_mvp_matrix(Transform::identity(), aspect_ratio); - let model_matrix_buffer = + let mvp_matrix_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { label: Some("Model Matrix Buffer"), - contents: bytemuck::cast_slice(&[model_matrix]), + contents: bytemuck::cast_slice(&[mvp_matrix]), usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, }); - let model_matrix_bind_group_layout = + let mvp_matrix_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { entries: &[wgpu::BindGroupLayoutEntry { binding: 0, @@ -70,16 +70,16 @@ impl NavigationCubeRenderer { }, count: None, }], - label: Some("model_matrix_group_layout"), + label: Some("mvp_matrix_group_layout"), }); - let model_matrix_bind_group = + let mvp_matrix_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { - layout: &model_matrix_bind_group_layout, + layout: &mvp_matrix_bind_group_layout, entries: &[wgpu::BindGroupEntry { binding: 0, - resource: model_matrix_buffer.as_entire_binding(), + resource: mvp_matrix_buffer.as_entire_binding(), }], - label: Some("model_matrix_bind_group"), + label: Some("mvp_matrix_bind_group"), }); let shader = @@ -95,7 +95,7 @@ impl NavigationCubeRenderer { label: Some("Render Pipeline Layout"), bind_group_layouts: &[ &texture_bind_group_layout, - &model_matrix_bind_group_layout, + &mvp_matrix_bind_group_layout, ], push_constant_ranges: &[], }); @@ -150,8 +150,8 @@ impl NavigationCubeRenderer { Self { cube_model, render_pipeline, - model_matrix_bind_group, - model_matrix_buffer, + mvp_matrix_bind_group, + mvp_matrix_buffer, } } @@ -163,11 +163,11 @@ impl NavigationCubeRenderer { aspect_ratio: f64, rotation: Transform, ) { - let model_matrix = Self::get_model_matrix(rotation, aspect_ratio); + let mvp_matrix = Self::get_mvp_matrix(rotation, aspect_ratio); queue.write_buffer( - &self.model_matrix_buffer, + &self.mvp_matrix_buffer, 0, - bytemuck::cast_slice(&[model_matrix]), + bytemuck::cast_slice(&[mvp_matrix]), ); let mut render_pass = @@ -184,11 +184,11 @@ impl NavigationCubeRenderer { depth_stencil_attachment: None, }); render_pass.set_pipeline(&self.render_pipeline); - render_pass.set_bind_group(1, &self.model_matrix_bind_group, &[]); + render_pass.set_bind_group(1, &self.mvp_matrix_bind_group, &[]); render_pass.draw_model(&self.cube_model); } - fn get_model_matrix(rotation: Transform, aspect_ratio: f64) -> [f32; 16] { + fn get_mvp_matrix(rotation: Transform, aspect_ratio: f64) -> [f32; 16] { let scale = Transform::scale(SCALE_FACTOR); let world_translation = Transform::translation([0.0, 0.0, -1.0]); diff --git a/crates/fj-viewer/src/graphics/navigation_cube.wgsl b/crates/fj-viewer/src/graphics/navigation_cube.wgsl index ed1892e8c..487a40575 100644 --- a/crates/fj-viewer/src/graphics/navigation_cube.wgsl +++ b/crates/fj-viewer/src/graphics/navigation_cube.wgsl @@ -1,7 +1,7 @@ // Vertex shader @group(1) @binding(0) -var model_matrix: mat4x4; +var mvp_matrix: mat4x4; struct VertexInput { @location(0) position: vec3, @@ -19,7 +19,7 @@ fn vertex( ) -> VertexOutput { var out: VertexOutput; out.tex_coords = model.tex_coords; - out.clip_position = model_matrix * vec4(model.position, 1.0); + out.clip_position = mvp_matrix * vec4(model.position, 1.0); return out; }