From fb8d220ccac288451927e901c35aa967ee4f4855 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 22 Nov 2023 01:53:48 +0300 Subject: [PATCH] Blocks atlas is auto-assembling now --- res/textures/block.png | Bin 17272 -> 0 bytes res/textures/blocks/air.png | Bin 0 -> 5891 bytes res/textures/blocks/bedrock.png | Bin 0 -> 7010 bytes res/textures/blocks/brick.png | Bin 0 -> 6770 bytes res/textures/blocks/dirt.png | Bin 0 -> 7176 bytes res/textures/blocks/flower.png | Bin 0 -> 6439 bytes res/textures/blocks/glass.png | Bin 0 -> 6104 bytes res/textures/blocks/grass.png | Bin 0 -> 6400 bytes res/textures/blocks/grass_side.png | Bin 0 -> 7420 bytes res/textures/blocks/grass_top.png | Bin 0 -> 7360 bytes res/textures/blocks/lamp.png | Bin 0 -> 6068 bytes res/textures/blocks/leaves.png | Bin 0 -> 7624 bytes res/textures/blocks/metal.png | Bin 0 -> 6655 bytes res/textures/blocks/planks.png | Bin 0 -> 7312 bytes res/textures/blocks/rust.png | Bin 0 -> 7167 bytes res/textures/blocks/sand.png | Bin 0 -> 7165 bytes res/textures/blocks/stone.png | Bin 0 -> 6845 bytes res/textures/blocks/water.png | Bin 0 -> 5795 bytes res/textures/blocks/wood.png | Bin 0 -> 7490 bytes res/textures/blocks/wood_top.png | Bin 0 -> 7685 bytes res/textures/slot.png | Bin 262913 -> 0 bytes src/assets/Assets.cpp | 16 +++ src/assets/Assets.h | 5 + src/assets/AssetsLoader.cpp | 29 +++--- src/constants.h | 2 - src/definitions.cpp | 42 ++++---- src/frontend/gui/controls.cpp | 3 +- src/frontend/hud.cpp | 23 +++-- src/frontend/world_render.cpp | 26 ++++- src/graphics/Atlas.cpp | 86 ++++++++++++++++ src/graphics/Atlas.h | 44 ++++++++ src/graphics/Batch2D.cpp | 32 +++--- src/graphics/Batch2D.h | 5 +- src/graphics/BlocksRenderer.cpp | 7 +- src/graphics/ImageData.cpp | 157 ++++++++++++++++++++++++++++- src/graphics/ImageData.h | 5 + src/maths/LMPacker.cpp | 149 +++++++++++++++++++++++++++ src/maths/LMPacker.h | 52 ++++++++++ src/voxel_engine.cpp | 4 + src/voxels/Block.cpp | 2 +- src/voxels/Block.h | 8 +- 41 files changed, 622 insertions(+), 75 deletions(-) delete mode 100644 res/textures/block.png create mode 100644 res/textures/blocks/air.png create mode 100644 res/textures/blocks/bedrock.png create mode 100644 res/textures/blocks/brick.png create mode 100644 res/textures/blocks/dirt.png create mode 100644 res/textures/blocks/flower.png create mode 100644 res/textures/blocks/glass.png create mode 100644 res/textures/blocks/grass.png create mode 100644 res/textures/blocks/grass_side.png create mode 100644 res/textures/blocks/grass_top.png create mode 100644 res/textures/blocks/lamp.png create mode 100644 res/textures/blocks/leaves.png create mode 100644 res/textures/blocks/metal.png create mode 100644 res/textures/blocks/planks.png create mode 100644 res/textures/blocks/rust.png create mode 100644 res/textures/blocks/sand.png create mode 100644 res/textures/blocks/stone.png create mode 100644 res/textures/blocks/water.png create mode 100644 res/textures/blocks/wood.png create mode 100644 res/textures/blocks/wood_top.png delete mode 100644 res/textures/slot.png create mode 100644 src/graphics/Atlas.cpp create mode 100644 src/graphics/Atlas.h create mode 100644 src/maths/LMPacker.cpp create mode 100644 src/maths/LMPacker.h diff --git a/res/textures/block.png b/res/textures/block.png deleted file mode 100644 index 2879bd8fc1951eb164d8ff9b9ade1dcee2554c00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17272 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 bfotx9)v%#HW7n@=hAGOaKFF7O;{U$@c_V7^ diff --git a/res/textures/blocks/air.png b/res/textures/blocks/air.png new file mode 100644 index 0000000000000000000000000000000000000000..8b3742501c91e1d06c83b2832fdfe2db47d97556 GIT binary patch literal 5891 zcmeHLdsq}@7vGJ90Qu6iQqo*UBvEH~Zo4}(4=d^}!ivjvLr6?#XJ%n#Z|)ATV5VqZ zAPesnqNSCZd_gK|mZXLV<~^~zpceWFL`bEUpvL#^0t(O9KR%X!x%xv0zkS@tGv44ll*s>KZRk8?>%pqdutN=IJj{_$gn@UMW3ss!#d)>H1|;lf7n~NtkC@uu7dJPJ zj3qYJ+|E4NZ&h(sOY_Z%qrRmy)8-YG{_)v5vV8OQ@$LMzhSZq#&BF$ljM%H0bBPs( zq#sKPe`nx^|Vdpq=CS=wZu6T3c-SQX`8YKlrLGdhpf4ph&)8yLL$ zg#YZe0|Rc1Kz#NYdQFA!vrEy##{w(HzEw4_rtGP^BT9d`x>Z8%ITs4`%DwoX7pK(C z!E&W1^K*ThXQrHOYZMLrrpDJ`$DsLv>2*gBXqF7j6+~N?N&|T>akQ4!Ow=Eneg)fn z=#@k1TY_@mpB{mE<$atSV9rn6pN}%_Ny0B13W>^<@zJY8SLt_LdoSVmx!)({pQ(Y8 zx0{XD%B{r_G3zhZmb>8i{#txh%70xUpClel{%KELQ@(hob$jCryERiTnQwe%-pSl4 zI~#xGSmEyPW~?b0-1`nw!k2nYv5a_!{I0rUVFC7Yc=N%w zsMfiGAJlNm3cZ>)dKaIo=ygI^9*m3n<@c^r^qsCg!o5($uGCsF|6YwTE5>q#N9h=Y zWI)zx;`V`euS)2{_heS?x4gA?Cp(B!vm>uhwzh1!)tbHqHdKWajSI*>{li|rH+S__ zRw^0Q(14fW1us_Y{%n_iP4TIm0mmw^AMCsOzux=u?qO>#M?(9w&z)Htw5&EL?{2VG zZ(FW$tO)vjZBSgf_PN8l<<(%|RB2iQ@D@Cxr`>hSwQ_zZ&_+-i<@l&p`Q~A05p`FJIn3 zetrF?D@{|Eq-KoyvwlFV^98Rrpx;L0lh(TCyK+t|$d-PKlHwBcPUL+QJay^qWli~2 zwjzJ2e<;pvO1N=wsA1d5Lla-xvGLQsF?}QSy3KD4y|V4w?6-F$mTbSKYW4S`X7lei z5fMxGL#rj@-kLXZ;)sd~OA^=h_YXN=koD`Lsrxk21u4T3$LJ5A3fSJ{(?0+5#n)O7 z`^rN4_>z^gg$8>fxA#>iXP2@wQE)`|R!2_Wj;Vg?Gr=qVH;6{oR`+pFZTbvi#Cd7t5Q= z@6FnD?((xAsvUcRcOOX=iTY-mKz~cpO`=(wMapnC121)1?4bXNM4@3WJHw{)g2ce5 znyf0Q<*R*=#Kftf$#NZ{v#a?uQ)G^VPsoYZvpMN3#X(_X{6bwc0I=`^BXL>GRwwOJ zK^|NhT)T&5ki;V*q^qDLU93cHbMO*EN=Okn+-1tdpfP@uPzPtE<24gHA;6sqN)rS- zEt6$sWl6Jesm+lpLn(@qA(#xqU?2fIv#kQ-g00SBZio&H4ew+fCc9v=StV{v#$d}3 zR1gH_C0+hm>^j|jc&oEB3LqXb7h{*9QbcC4$hvDdh44%O(&^COYB=@aF(HfRowf`I z%ZF$3R$*9o2#&q4Z_jX;J#;u$#+!Ky5Oo5pXb+PST3zgY4R;7qO%}UH3k17|q+l{W z2v!f@+%q0J-5mky_i=kjcX9U!11X)3*4Wq#w|iQR3Ub@0IU8%@XwM}nXE+u!%3(Q) zp)g@Y8Q5R|Ns&_wOYj)ZFg(@`N^5lrjFsixPyk$N0yrE+DKRBN0d1B5CxU|) zxDsUurGYbGR5yqihY3_AWA5&i8;S!^7%6Av1kS?@uK;+6TnRG*31Y-prC>#nXDPE2NQaeg-;L| zcQjEYg2*X3Nm2-cDdZi7Ja~z`!wD+Ujfo;syaU&r78;NNfo0rv3IMuT(rO3K2sVe_ zW;3fGH-yBk=_zkXXh%{aO->+@?XLLFnor5NN^;p z1Z4-~B+J1BMo^%L5C%AdC|H){5RxT(I{oMrQG&)EBSlQfkT?Ps8cr}um{4E{%uq@e z<`A$(c%DNUM2|uZ> zC*gXi2t1VVlj{1%!sYkiWeRTv|FE*atCFBwpPvS=S-cHV5gJju`}<+}<`rPX*B+Vd z6p8%%xeu|ZuxJ1n^bxeWaG!er=lhLDzW0j@07Fu(W}Kcp!rndcYkQd2%loVMFODh9 x&C4B+%-BC2nY%1ES8Sti7fj0``Yc)`7NKq4FC|zNPXkSnHauEWGJg8J{{b_GO056@ literal 0 HcmV?d00001 diff --git a/res/textures/blocks/bedrock.png b/res/textures/blocks/bedrock.png new file mode 100644 index 0000000000000000000000000000000000000000..9984e91a616cf2ba900b8bd553483a65c77bf5e1 GIT binary patch literal 7010 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 literal 0 HcmV?d00001 diff --git a/res/textures/blocks/dirt.png b/res/textures/blocks/dirt.png new file mode 100644 index 0000000000000000000000000000000000000000..6239e67cdb3fcf04988b0eb3215a3b2556938123 GIT binary patch literal 7176 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 XZqgz*LS`aXz&KYYcgG_8C9(en7_P_T literal 0 HcmV?d00001 diff --git a/res/textures/blocks/flower.png b/res/textures/blocks/flower.png new file mode 100644 index 0000000000000000000000000000000000000000..38f070eb022b8dd663d3d9b8881534f084049da5 GIT binary patch literal 6439 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 C%3WUo literal 0 HcmV?d00001 diff --git a/res/textures/blocks/glass.png b/res/textures/blocks/glass.png new file mode 100644 index 0000000000000000000000000000000000000000..1389f23182d284f84927a6dc0cecf1c3fbad6438 GIT binary patch literal 6104 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 W=~&?&wfXFxAq@%*EFJe{`hNhbxv!i6 literal 0 HcmV?d00001 diff --git a/res/textures/blocks/grass.png b/res/textures/blocks/grass.png new file mode 100644 index 0000000000000000000000000000000000000000..d43769ca196e37736be9a3d409206a092f7c2ee4 GIT binary patch literal 6400 zcmeHLdpuO>8y~Bvlu!z*nnqgGnK|donVB<_A;vY0gd!1V&YWR3b1^d*wzdnQBHec- zMYW3hbwNcp6}nMWw*4t|(M3sCwTbQWJ3}|0-~Q8Qcl)a|pD{D<`#j(0{eGY4ea`DF z_w)4}HpFTOg+dwT?d9fAewygsgAB;O?K#h35-9c`c4QgZXp^IIHe zdQ7smmS*W!Cs4Z|hHtgLI8{y+A&)fc^KH)Fpa=~U=5EaJzE_(3i!8P&Xxok2^z3!N zc2%5zRy=xtkUnpWT77r&lS@L1{MF_dOa0_2Q>;?#8WO%MHQYI3@Sw6g4`XbpkMs-6 z5njR5sLQeC3A3x8Au%&1ob_DTps)+wUF5$g?Q!g(myN?8i3QIq-@N=|-obtI&o~ri z=JGDNxBJYQyML~UD0#Mil&O=A%4=rkTECHV!g50nR?+R2nL&3S-7WCX_m%y}$b9Pa z#-T=5H3PS0_{N@IZZyF*D%CZo$~Gv+wYKQOlQGWw>#W!fqH9qr&TWXeFd(vI;;Emi z7EH4ir!-(N;f;3_jA>9 zj@g72Y17v3@jY&k;ZV2<`OeokRpJGCUs>;eDJ|XJI|KKK1)n^MM0W-DKnoupW%NH(O1 z{OUM&>ZHG2`aQqZ?@9PWN##~e%c8=~mRA-QH13uM75>_3<*-|HgKoVeB(*8EGe3)! z`BRgRta;dixo4gg2Y4ktfq7=M;y^Q_}`^voKWMewo`%)VvA9RKF% z9f7Z7+^(877kPIYH%sb!a<s`#4O?3Fww9QNS8p)bx5~+{b;t>> zS=_~-t|=vG?uLix*j)b8))BH-u(0vvi2_GqbW_Bp>dMk3UGyD#U0csTopxWkC1D*t z&g9LS?csyU&Kaw{GP7&S!roliRn|2Ax984@nd)@sZ@q2D+3oVL@SJf{Khd8ExpD2n zY3yLDZ`GLen)42+7iVl=zpJXm65ur#5XN(^)Gx>p02^h8EL|Qu_1f4`o$_jb*fXPX%MVLbz(p&ppMK6pCK5R3Py4 z76{&V8?wi2Ubu$uRWa4NDm=jb@(RHuub6XwIUy$IG4&23^IUhChs1(q&y6-A6YS}$ zmd-zQDzmCEX=U+V)E*G$HJ*RE|vPdvHZ(iWB;8SB*bz`{>GN`C>Zb24*!wl+zd zc$JNIj7SZhIeU5S^6eADR=-@+w&JW}vk~3Mktxm(cvd-HbfE6cv~P>I6`0O2^$Zm5 zTrj@nz=edB#k2Po-RE~3>2ntnS#5~t>XWpMRF~wX4%6%^Jkn?9j5M;po*DmpYFN1& zeOah2sG6Mn&9I_2!?#H{n?kzJ4`$e#7#<0?et?f`Z5U|9I@|3OxB1NATZ;_#KHpgG zZzyr{-gmI%oGDm3EHv~mLJTi$)Jxeqv|)YN`56J{9xUl%_T*1CIX1B8+Og(Mf1(R1 zSL$ayH9*k;XNIgl-h8|1c>D3!Kjb&u9G)vsl}$Wc9Z8{>#!1QUA1s{C!xb_*CRT_D zx>lwn?+z4-qqA0t;qwU%RYXKe<$PMl(Q+D9D(2IISVB;!6cABTuS69QkmwtTC(g&Y zVw$tl5JxSK1dtILjH;DI%hfzBpVo`ZBfsm088m9IiDo{Z7A*9m3KS}WiqH`{2)Jvd zaWKtk2-Q&~mhk-DJl;W&zxcE$jYi31FyiCm>G4duLKVq?xLhs+gc&dlkQRVCL9W5H zfLv{(gXqI>BhW0Mr@mjGOeqw8fS0S^sX*$%&|*pkL_(f^;?^6rkBpA3nAS<;P$hA&%M`}v=Rz= zZVEhBw>)n*K1~;&CsyE6F|YS4%EH7rEMWmG6ovpq0%3qiL?(sB#c+gxnHWaEpFnxb z)f!BW6FMjooGvACFjR~{C<_Eo2w?&U7sUXS&Ex=VRD!V)6eA?C_!Ed3Dk)i&SoEi> z(m{zyC>UkoEQCn_7{TTO2*~09m`KC{P%#FA2#gUB+P4}p&ht>HWEh!FsSJxG7)p6$ zZw#H_JQqK2J`JXWA4mM6F^z2Nul7K9d9w-3_SPYZ-#zBB9W-|c^$b<<@ECE5X9rO#VR!B7Qn2KrHVgt7mxBXhklZ5#A%-x{ zKS_}j2tqtEe-QNLvdCn!5P~B{Ns0skAczP8L@1L5khd!)0&!8M80y=hAGX2Y$|5%q z;_?s{4}!lOMXp4G;2bsxh+(qPAuyW_pct7-vVJiT#XvSm`tKL&m*a!6KoJ|mVF1EV zGG!c*2tb(-4!{HxmY`fVlZF3-DTARv80H}y9t-VH(UGA$F}&}lj*S27w|xem95KkA z)Hg;RUC5IV`YP9FDezgw zU#sgMlWWMwhbe@d{0}Rhd{pvw);uctn8iTkDD`|BMxyreDdt39%|rDd+D5F6k+xD$3HKe z)Lpf;X;&v=+_58*vMk8!+KWb!W|i5Sa_o9Qny)0zfV@(|!?U2!(!!SUHtDrBRT=yF zrEcxcMH%O!e=a^SknU*m8|mbBXjsFGi`&@msX61RK@Xh| zEhg^Y@i0xYJd?afE2{-OQp%kzbrGFT{HZruoxZUr^ResQU4(0#vA({3#o0^~!^h!0 z>8AYKx2AjT3xAVrly;%$bORU@TyomX?Axwz?NohA$g>~(a#j|HkXli^-F@Bmx<)Mh EANFxZ#{d8T literal 0 HcmV?d00001 diff --git a/res/textures/blocks/grass_side.png b/res/textures/blocks/grass_side.png new file mode 100644 index 0000000000000000000000000000000000000000..802c1a8799dea75299f6c3f2324e65be9ee5ced8 GIT binary patch literal 7420 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 VHN&|+3@LLI%Wj=*iFH8ie*w$WM6v(? literal 0 HcmV?d00001 diff --git a/res/textures/blocks/grass_top.png b/res/textures/blocks/grass_top.png new file mode 100644 index 0000000000000000000000000000000000000000..f2e7324be5bec46ec854fb66ce4c5b6619f8d7a4 GIT binary patch literal 7360 zcmeHLdpwkR7ayBTNODcBG{$9-XXcsvCHMQttw?f7&&)i-tjmm<5t3DOLvGbptlV;| zmZFO!SrLj_TcU(6tAv({l9b+OsJ1@u`_F#%-TkYX&)j~$bH3+%&pE&IoOzNw+#Hn@ zmMWl7C?%$o-5TU`k>oXB7I|Mj{vJZ1WcO|M@)56rqR;{%pUVq{(c%~ZjE19mTofw0 zr+D4^15ZsBz75i-lh!xn(OoP`qdMBgewkl&Ec{*XIw*KRx#QOro-= z6L$yyw%N_f}55?*C(#Wg>rk^x{Sr8MDS2<2zk>F)!}vufA*)r=s7t z;q(}el)Yt2w^e-ytilFeGP3i3nU=}gdcN<)`r<8-1=rqbx2W9-tPU@@P<0|Bubyo^ z;c$twF?U-+i@7ur{WD)s@KEN#^=(}?{^X_%!K8J&s`NlLtuOsjVNll6_<#weA6FLM z8|-sGjk&w`nO^IZMf~BY{XaN9QhK-e+Un4zdxPT>u-}Bgq zJt{09xS(vLZ^<|36EIR_g(Sk%CI8)voTRKYN<_PRx1x%h<~ax#=+680LGe;Qg}POA ze95xM)?9w%Baf}AI~7i{Tw3!~W$0d>PWa;ep3J?ZTiU{Q<3axyn9II4NfkwVR~fH4 z?Io{jz&wD#n5_HYq^O0YBc2)3?$lhAK;QV~1{> z>2AVl@^W!mW2MX*WJ2$NeK3l&bcw>tD`5b^`eQl)_E9Qdz-f1DUzSH(Cm!H%h8eX>xSC~ zV+W@11M|6c^WI%hH}T6?z3dMb!)BD%e`qdtL{c6;zmQ#Zp6g<|< zoa&*~uiUul_6skgYwJXMFJl*G`BZN#V)}d=;QRI!wy~`;u+aFaAm1RgQYm}*tbT0K zADU*1>VHT$?AcTMAfT@#S$wBzMN4=?nyF^Ra70OucWf8bPtT2=9ME&i^|J=_Ip-$mAr z#jYCjpIAN+s~A*a8FKt?|4r}2o8GRDi_FiSzIXqL67gwJidxw+_i91}enwH1QuRPr zcg&+*2)P!eABB3ZZ{}}{I-{q0^X%4uv*{hSx9plp?%thT`FNI8?*daff}-C`D}h>| z)oqi)$-@D_kwtDY&C5_8gWiSxk!{g-{xtj~)gr z+ok3P=(a=^pE$5rxuw%niMDl!5=eUt$eBKIE0;b}u0z)9^>pgAx_(RB`Z0e8)BQyS zd$L%COi!(~UplzEMf(|LNAVAd%OYgyc;!l8o2%>3&1m^tZ56hgRdSSzymje;mwoEn zdUV|a0R3w3VV3eZYVe?E_c#jrc_(|o)n=EGgoU@B$j<)*yT&r7d*7g;{>o^0q1EW|&)B>#3`yj<(hn<4jXx9P%`upwb< zeQbI2_Fng@zGQiaN9{xBMp6s30~RKgGJbh-Aei>@_}W6txVFNSu*Kc>`PUV?o}zqa z#Cm5g`o)1Mrc!YX*Xs4Ex-kJ#2^3lRWg8~(!x3-h=k(v!j=v(h({(@nWTfAB>x@)S zxhFoD2;v+`Qpvmaqs5V9Np@OF-yd8Tqos1fa!AvlhGZY4=HKp(TJBp}*nH3Qc$Uf3 zgrm0F=2KU`f9cmSZ#-jUT(?j>oflF%cnIGZU+}YS5oVK)&GM5utwW+?^ZDiF7?aY) zdF-2boojjgqnv%4olFRQ?Q4Vn(22Y5y!ic8dWAMWq;~c5#v8UL&RL1bt+y;*l>XlP zSlhjLK|Xzy`H)+7C^Vx#rAI;8Ep2#4d0>(5Gqs`L_MuQx+j+LO9!y)?kC!LpqLdSt zY3|f$rF}Wj)Bd+)+Z9d`tsaMc7imOvny44plxg@zf;AJ0*(7~qY+6D{Lqq!IV~HuJ zDi&5GpkGTp9DZ2z1Y97%5B=O|(o&4`>5&+#T*R%J)C^S7r8kE*zNf zy-&Q?=R0*p9%sBr?tGy3AY1*(9hs%%mMM!(InDC-<7F!*4%Dxa<61CJoH^a90-jUy z_pc_w%IA8ecIGX(vp?X9yJzd*wn^ff64ON&WZraL=+B;}#i4F=u6-d(qe(X_?62#8 z&{y|I-MiS5JNK0HZG|<4)onp2l*%R^GA{VIx-i)MFf7F3vtVp=m;f0kP$)CYXaU3y zfyHPR9K;JZ$Bfn1W6(T~Ic6Q%6?7HY!ofVJ%|h67vzr%ta|oNx!B|=-m_;)XfG}7L zp`*h>!$pi}bIdF*1Nkml#$nL2BH|EpjE}1a+LkYb(IhMh3j+4hyiEj*g#y}4$l)^9 z*g1TFKz^BHg2iG11BZ)>io!+_v3y|=4o|1kaUcOlAOMI2Ac_eWL(xFENKXPWhhYbc z*g~E_%;SfnC72M4A1OA+V32+ENB_bEuCAZp!$lvWfW!kA4GC~~EQkvW!+owH65DS= zKt4G1KQ%;N$kc^f1B>{PLN;u_2@V(QeGb84f6^C33PWeBq0dmg$ZW0kYIlyDduti4AvLENp@!GeC`OM{t5RB>5trJg%K%NSB4#*9Vu~- zX=jd+*k^F~Y#xU(`;|t9IBWu!43KFAJV4^&A%Mj~l0v3KY!XZ$LJ&;&42l^p5<}r^ zSOSHBV|fS;g+if1G$I9{vbk)4#3s-HI*q~s2qXfLOrx_U%b!8G3wcOYLZP2~C4u4~ zPy`y8O(qdx0D>uWfCQ4M0K{TZ0U8GaK@tIi@w7Q_IBbRkUl;}<>Ewk$K`>4b9yDu1 z5^#pK2h$uwz=D6Sc!WY?E}~$Lap8qWM*q3t#S4Qy#gHVLcq#~z>0~-cCy~hnkou>P zH!Kt(l_9~m@B{`(XOKxNKq3PKF}Q!8B8fv|Q>iQtK%}ub z0Es}NBSi#4h%+FC&8Bfc8k_c|(|?~Lp2Q&hixdfx0|$~w0FeYy0TP7(0uY_b1~?#c zMqrqOhp7Kgic~KU&p`5r$Nzg-BvQyEn989c6k!-3kyvG9KyUbQT-nvWYO2MW@o)G}hne^Rc%O@LmLhBxNA|ONwSV$;9xn zo0{SNtKZHEd^TbrJ!x(Y8C{S`2={3e`p~Q-E&3mPd}z1-palf_tC7DH->>2N8m_+- zfxjgDwYt8B>n}y%FA0CGuK!!O6#l%K0*532u%eJ#B}>Mp*QBKTswU--I)KCNDGt{5hp-|uCFzu|pXl(}9nZmmc zD68M@sdWSkRE_;IpL#u=9?+?YJhs=FrzxG$)XCP|Q1^#g{LIVpBK_5vQ+2%PnK9>^ zCOze>!hZxq+41bg^qrBK?cEwvj|%L|_Vk(LzNaT< z`d94W`4}tg#a*z#=1W7b#LIK{%lw$ul#@BwPu!qd$hr8w7ynA}Zeod(wU1d~{Yr{o z+YHw>R&cHyTB3GP)V#D~S7O7=Xsd2V)QYaPIkl~$%{FdZF0}7CxVvM?k@(c7T^#}D zk#I)J!3o^FzG>$@3aj&Z3WLAOaBO}`-Zhr?uppmDO?a*y^SZKSdQVQv)|I|XORc1b z%dL%V;gE!N9Lwi3!h+=(V-CwGln)%VKqfw&_z<6#-C+wLx1zE`gLVs7-0*r@&p3Ae z@u+eO&3@-~(U92=J6PRUJ*h&!v1OvIJM-NY-4|EkLwM(c)S~#T+smk@u{XlWV>qJo zcN2qt=|>lwEob6As7qmte(K6!iUXM{l-gwVZ}vBhi1Pco&zb0@2l}#FT|}7ImpWpc zUAA0|`5vJ6t#=8?TvZqw_^d!M*|CWG>y&l}KYc~1T-&qrRkg%JvR%fNmc0I42WM=s zk_~;>;pEEj=vchlryS9>&Z!Hc_)AUTd>$`N_Il8fQW{fpg(Uqz#$t43L%w~Dz(ewFH&jQjfyOnLthUBwx>UCYF*qoUINNa>=O M_HK3+HX9TE19xB{@&Et; literal 0 HcmV?d00001 diff --git a/res/textures/blocks/lamp.png b/res/textures/blocks/lamp.png new file mode 100644 index 0000000000000000000000000000000000000000..eb53b8ca960c0c9806e71afcb43272840cc2fb61 GIT binary patch literal 6068 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 OJCd(wAg{d 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 QB5jLub6VzDWFM69fA`}Fa{vGU literal 0 HcmV?d00001 diff --git a/res/textures/blocks/rust.png b/res/textures/blocks/rust.png new file mode 100644 index 0000000000000000000000000000000000000000..21a7d4ba38bfb37d4891407eb6a2d0b559a5f083 GIT binary patch literal 7167 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 dtbMiB@r~B33#baW@{ha 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 Xvz8!v!<&xQ8HQtF%g$TAKIZ=bZKKiI literal 0 HcmV?d00001 diff --git a/res/textures/blocks/stone.png b/res/textures/blocks/stone.png new file mode 100644 index 0000000000000000000000000000000000000000..5214e3e1126af2d13681b64a3c3bcb7f7aa9b84d GIT binary patch literal 6845 zcmeHLX;>3i7Y>371Q2EY5G4tMfFzm8J}E&VY+(~w1W{Ti$plhJ0$Cthm$JDc3Puz} z1QFZ{ZY*wSt%3_krCMCDq98&=MMXiR>Nf$k`h5N4)35zy^2}uB-gDk_-gC~Jdo!y; zf_;q*Z45COj4{v8D-``T)gJoe(6e3tTNs1UySX?#N*M~L;1cCBkvIXtDHkOoI7BTL zVKC~OWpn4(Jap239c!MVpVlE@xpzc!(x<+u*W|iX^d}wLxGBSPtWb8~&a1)gCd=;; zymYg<&o6vuzd3+3#}Z#~ZBrl9CgoK3gu@vVI6auv7cX8rxy)x~HUc2gN=FgQ2|Xb;7C7C+;0)|E_DX z>B;e_$yK(OoRb3%UF(bF;FkM#1;5@JYqiU3`z!aL)EkFp7TuozaIgrmy0M5?y?tx+ z{G$%}k!R}@r+7SEWOfe*CqDk_!j#NkBSPZK3kWIo8PgI~%IkpOT<@E?KTO(Digj8w zD|~EKNfskyhs&yxh0~eIhKw7c(mV5H*S9&W8!M~55Pqc2`{}Kaa{r--q`*_B?$%-# z+m+$ErqUxPS+)2L^o&WnrEa8o=nV(Dv>SXqxXgG#1@63kW2sl}w3-uv<_){du1}7e zVK(pNe);LkJ`RrpL>i87~jJ-%TJKUnhvEhyMM(>%-{TKltW-r*mbDfn*Bddo=bHRO`Bx&D=& z+aI_@e#2cy|Mk}H8;-9_hb*HL_H<#%CBJl$PX1w0sVLoeLjvhL~@Yjb+biUWan;-w16N0$*wT6(e?VH+ugtwE$A%$uamkA|wz_ZL zRGpQ#aP#*Cp)67V&F>r9BfSa+kJU)>7TygfuJw5xUsGuzS>Sl3KyMk8eXYo&Z}Zq) zmQDU;<$O<_6@z%I3%k6A9=!?nu@BY+r8MW zdrDzaZ336Iv+E0zo8#UJFWsEuQY_(iruh0g`(|$soe!qfC?hzpzauYK&>SBXjaAof zH2Hd_l7`_|O8K@<6Vt1guRMywKEc zb-uYi<;lvJQ(mOZ1rC7RwRnv2q2BRt)7yWG9=c#ab~YV<>>Jx|fqBo3u{QK`L+;6i z4F-3XkE?v1cPeze$ep*py6XHy;E3^p1+_F}!jW4#E4CZm(8OGr9d^Dub&&e1+|~5N z*jKG5ZWj!*mSTRn8u4r#i>23KsHwYs_qV!7b+5lGztKLSm@7Z(Slbwj!AwjRqpMC- zP#{|%laOGcjE|7il0!eHEHsuN*BJfg($kyx>mL+CqxihvUfIfO`h5D=8eMdHMM zi{(hz;^1(>;&=fhB+PU-bW^iY012XmacW6|RKZqr2qU;`^jbSiCg4Uyl<^!wR8R(GKJu7h;x$*MeI;7pLY=G9fuI7R3@^?
YQVNwMlgE-l2!hA} zg-oFkQ3;}AkyHt*iBg5V7Ge~`3sDH<;zXrbCdFwnVZKbI83lRg&|hjO!qLT>9EvDpD!BmhPDZ3k`;Q@nf)DzM zDtW>P9if1XBp?!0RDoIrKQZac3kvz5p$$Q-SduuRg$DZ*Nu^lyXRto;O*=C}=VM1u z^$)n8NWbSkB8*A}1+l$k0+rT1o)?Fpwa*sH1Y#k3OT}L>fS65@9}{Nn{CO0H9G|1Z0hR zBNVWGWO50Nrc*3|V-a$qGHsEZJ5FUp>Apw7mge1U95vsr;1d639^`8^rVhIwa zgtgHGnE*hC7yuOj0Vb9Dk@j3fu0ShMiwOdxcQe|wuu(E-U}0^Yq5$t%vbk~uR?6hz zGFbwLpmhnS)f_2roZDzp{KN`WVv)Au-_?8=k~DfZ`UoV5N2YMNk+NmOf>9$1I2jR+ z7((?%rv!1ZG!{Xh?{@|Deq8)l$pYvshzf{^2t`Oi^DO{~kdQ$oiU2AFfrTOfK-lnq)yBW!R^BcXKuR5~RN(Z&g&P>CQ&1nJ=*g$+P#I&B6(Wdi_# z{LfRQ30VRrlP@GvSpuQ9C?T|n02p-!U(A;1!_K6U!1Aq%C5AVeCC4-)w- zDxHWfS5z7Zv8Y0Dv=w}K4E|OYp>Pml)97rF^6ycEL?W7i$pDB#3fkys6b6IHg3(l> z^$P+N+NjZ zYnE~R0ADZ6TkW^FZr4V1#30dco&tlxnrROmOhKVFIyhd*3-TV{jkPc%8-6vTZ3zZ5 zCY0yp5zcDl<8j?hZa+8m zXPKt$-TU(8%i>;ktE%4m%+L~_+kGkWW_|pT1*E3_CRR2^AAg|r7u6IfwpGP3S!wE2 zh8tWOTj01;6BR$lzeP0#uUFNI0##e$^;9vPg`NHV8!LO&Zd2p>I8f|^W8-GUUpiK~ zQxoD}qUjhOp4`W&ZCe*==j%f~zgS$N`3YLtYSV4o zeDuuiL#{nFlBc(Ifo%I`C<~0Mn3vb}B)+0Px{(%CB?<8VJ!Q6jswP(zv!}Np)bLub zg|kD0brx6{yemDhtp@cUFj_#ey4U%%SR>!*l2I&~zf*%+HBC#hJ^Gt8t5c0D>>grL z`#6nt1&1${;5?Uf#S@qmK`XKw*zna_7fifJ!y|Hbx$TZ#duk zVu#pf*|KGqqs;_oqZ`}WCPzdZl(dl_nEsUXXhIuc!DW08-VezS^_+brqdISFHFn9PG@%qDT~$o~gg4m43dTNsJ6doUo_DZUrRT!5{{mm^4ITgh literal 0 HcmV?d00001 diff --git a/res/textures/blocks/water.png b/res/textures/blocks/water.png new file mode 100644 index 0000000000000000000000000000000000000000..00dac81b6b872b06452f467be8f24a7e389e25b6 GIT binary patch literal 5795 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 literal 0 HcmV?d00001 diff --git a/res/textures/blocks/wood.png b/res/textures/blocks/wood.png new file mode 100644 index 0000000000000000000000000000000000000000..00757a50c5af43cdf17fdbd08457dd949e1c298b GIT binary patch literal 7490 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 o)}bp#l34}AS3nR}lfdGMe3G5k! zv$eG~_$2>jl+c!!m%F2kHPlYydSZijW9QOyIAduDy8E3s8B8&7cC}l0cILYyeHFwp`E7AXFF*p(3y}Z;0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBnQ3Y<9f@3(pZsw%Dt5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7dXx&q_$0%T=x!N6AV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK;UBwOsp3mD|_9K9jx^T5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7csfn5cDzIE*Th%Ab{-Pv`p0R#vTAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!8B)1txYbKkpKY#1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C7nk0}wFF;oIx=kvHTnP{$K!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfWQX{JUDaipNK4qyxsYrg-j+ufB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C7Y9Wxoxd63r5(EJP1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oOj`KrcWll@ccb0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBm#KY@Aa1<1-? z_x&<9iU0uu1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72+X&@v!{=Xh%Ab{-I?!9 zWk-Mj0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0tA{NFfZo<@1OvioD$!W4b8>2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+K+OaibuK{7?1e*s009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXjA)psv z5~|iDK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pkvlGw@P_@s>UblMBH30$y z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5J*Sh{=@P~L>5Kf?xYj7NC^-iK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB=DE0?q{(CgVN<0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBmFQ$R03nspO30RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N w0t5&U7$)$#7oc_2{|Fc+^tSu0h@G9QzaM$@>EGx78w@DEI-TD;`QxuI0a{C!pa1{> diff --git a/src/assets/Assets.cpp b/src/assets/Assets.cpp index 459ac868..cb6c16aa 100644 --- a/src/assets/Assets.cpp +++ b/src/assets/Assets.cpp @@ -2,6 +2,7 @@ #include "../graphics/Texture.h" #include "../graphics/Shader.h" +#include "../graphics/Atlas.h" #include "../graphics/Font.h" Assets::~Assets() { @@ -16,6 +17,10 @@ Assets::~Assets() { for (auto& iter : fonts){ delete iter.second; } + + for (auto& iter : atlases) { + delete iter.second; + } } Texture* Assets::getTexture(std::string name) const { @@ -52,3 +57,14 @@ Font* Assets::getFont(std::string name) const { void Assets::store(Font* font, std::string name){ fonts[name] = font; } + +Atlas* Assets::getAtlas(std::string name) const { + auto found = atlases.find(name); + if (found == atlases.end()) + return nullptr; + return found->second; +} + +void Assets::store(Atlas* atlas, std::string name){ + atlases[name] = atlas; +} diff --git a/src/assets/Assets.h b/src/assets/Assets.h index e8122ff0..2bccb784 100644 --- a/src/assets/Assets.h +++ b/src/assets/Assets.h @@ -7,11 +7,13 @@ class Texture; class Shader; class Font; +class Atlas; class Assets { std::unordered_map textures; std::unordered_map shaders; std::unordered_map fonts; + std::unordered_map atlases; public: ~Assets(); Texture* getTexture(std::string name) const; @@ -22,6 +24,9 @@ public: Font* getFont(std::string name) const; void store(Font* font, std::string name); + + Atlas* getAtlas(std::string name) const; + void store(Atlas* atlas, std::string name); }; #endif /* ASSETS_ASSETS_H_ */ diff --git a/src/assets/AssetsLoader.cpp b/src/assets/AssetsLoader.cpp index 2e62556e..f8125d2b 100644 --- a/src/assets/AssetsLoader.cpp +++ b/src/assets/AssetsLoader.cpp @@ -2,6 +2,7 @@ #include "Assets.h" #include +#include #include #include "../constants.h" @@ -42,6 +43,7 @@ bool AssetsLoader::loadNext() { #include "../graphics/Shader.h" #include "../graphics/ImageData.h" #include "../graphics/Texture.h" +#include "../graphics/Atlas.h" #include "../graphics/Font.h" bool _load_shader(Assets* assets, const std::string& filename, const std::string& name) { @@ -65,18 +67,19 @@ bool _load_texture(Assets* assets, const std::string& filename, const std::strin } bool _load_atlas(Assets* assets, const std::string& filename, const std::string& name) { - unique_ptr image (png::load_image(filename)); - if (image == nullptr) { - std::cerr << "failed to load image '" << name << "'" << std::endl; - return false; + AtlasBuilder builder; + for (const auto& entry : std::filesystem::directory_iterator(filename)) { + std::filesystem::path file = entry.path(); + if (file.extension() == ".png") { + std::string name = file.stem().string(); + std::unique_ptr image (png::load_image(file.string())); + //image->flipY(); + image->fixAlphaColor(); + builder.add(name, image.release()); + } } - for (int i = 0; i < ATLAS_MARGIN_SIZE; i++) { - ImageData* newimage = add_atlas_margins(image.get(), 16); - image.reset(newimage); - } - - Texture* texture = Texture::from(image.get()); - assets->store(texture, name); + Atlas* atlas = builder.build(2); + assets->store(atlas, name); return true; } @@ -107,9 +110,7 @@ void AssetsLoader::addDefaults(AssetsLoader& loader) { loader.add(ASSET_SHADER, SHADERS_FOLDER"/lines", "lines"); loader.add(ASSET_SHADER, SHADERS_FOLDER"/ui", "ui"); - loader.add(ASSET_ATLAS, TEXTURES_FOLDER"/block.png", "block"); - loader.add(ASSET_TEXTURE, TEXTURES_FOLDER"/block.png", "block_tex"); - loader.add(ASSET_TEXTURE, TEXTURES_FOLDER"/slot.png", "slot"); + loader.add(ASSET_ATLAS, TEXTURES_FOLDER"/blocks", "blocks"); loader.add(ASSET_TEXTURE, TEXTURES_FOLDER"/menubg.png", "menubg"); loader.add(ASSET_FONT, FONTS_FOLDER"/font", "normal"); diff --git a/src/constants.h b/src/constants.h index e2665635..9a471de4 100644 --- a/src/constants.h +++ b/src/constants.h @@ -18,8 +18,6 @@ inline uint vox_index(int x, int y, int z, int w=CHUNK_W, int d=CHUNK_D) { return (y * d + z) * w + x; } -#define ATLAS_MARGIN_SIZE 2 - #define RES_FLODER "res/" #define SHADERS_FOLDER "res/shaders" diff --git a/src/definitions.cpp b/src/definitions.cpp index eb4e68dd..3b810ea8 100644 --- a/src/definitions.cpp +++ b/src/definitions.cpp @@ -9,7 +9,7 @@ // All in-game definitions (blocks, items, etc..) void setup_definitions(ContentBuilder* builder) { // TODO: automatic atlas generation instead of using texture indices - Block* block = new Block("core:air", 0); + Block* block = new Block("core:air", "air"); block->drawGroup = 1; block->lightPassing = true; block->skyLightPassing = true; @@ -18,41 +18,41 @@ void setup_definitions(ContentBuilder* builder) { block->model = BlockModel::none; builder->add(block); - block = new Block("base:dirt", 2); + block = new Block("base:dirt", "dirt"); builder->add(block); - block = new Block("base:grass_block", 4); - block->textureFaces[2] = 2; - block->textureFaces[3] = 1; + block = new Block("base:grass_block", "grass_side"); + block->textureFaces[2] = "dirt"; + block->textureFaces[3] = "grass_top"; builder->add(block); - block = new Block("base:lamp", 3); + block = new Block("base:lamp", "lamp"); block->emission[0] = 15; block->emission[1] = 14; block->emission[2] = 13; builder->add(block); - block = new Block("base:glass",5); + block = new Block("base:glass", "glass"); block->drawGroup = 2; block->lightPassing = true; builder->add(block); - block = new Block("base:planks", 6); + block = new Block("base:planks", "planks"); builder->add(block); - block = new Block("base:wood", 7); - block->textureFaces[2] = 8; - block->textureFaces[3] = 8; + block = new Block("base:wood", "wood"); + block->textureFaces[2] = "wood_top"; + block->textureFaces[3] = "wood_top"; block->rotatable = true; builder->add(block); - block = new Block("base:leaves", 9); + block = new Block("base:leaves", "leaves"); builder->add(block); - block = new Block("base:stone", 10); + block = new Block("base:stone", "stone"); builder->add(block); - block = new Block("base:water", 11); + block = new Block("base:water", "water"); block->drawGroup = 4; block->lightPassing = true; block->skyLightPassing = false; @@ -60,14 +60,14 @@ void setup_definitions(ContentBuilder* builder) { block->selectable = false; builder->add(block); - block = new Block("base:sand", 12); + block = new Block("base:sand", "sand"); builder->add(block); - block = new Block("base:bedrock", 13); + block = new Block("base:bedrock", "bedrock"); block->breakable = false; builder->add(block); - block = new Block("base:grass", 14); + block = new Block("base:grass", "grass"); block->drawGroup = 5; block->lightPassing = true; block->obstacle = false; @@ -75,20 +75,20 @@ void setup_definitions(ContentBuilder* builder) { block->hitboxScale = 0.5f; builder->add(block); - block = new Block("base:flower", 16); + block = new Block("base:flower", "flower"); block->drawGroup = 5; block->lightPassing = true; block->obstacle = false; block->model = BlockModel::xsprite; builder->add(block); - block = new Block("base:brick", 17); + block = new Block("base:brick", "brick"); builder->add(block); - block = new Block("base:metal", 18); + block = new Block("base:metal", "metal"); builder->add(block); - block = new Block("base:rust", 19); + block = new Block("base:rust", "rust"); builder->add(block); } diff --git a/src/frontend/gui/controls.cpp b/src/frontend/gui/controls.cpp index 8b4935cb..c7a2f278 100644 --- a/src/frontend/gui/controls.cpp +++ b/src/frontend/gui/controls.cpp @@ -162,8 +162,7 @@ InputBindBox::InputBindBox(Binding& binding, vec4 padding) : Panel(vec2(100,32), padding, 0, false), binding(binding) { label = new Label(L""); - //label->align(Align::center); - add(shared_ptr(label)); + add(label); } shared_ptr InputBindBox::getAt(vec2 pos, shared_ptr self) { diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index 42d3b145..c65751df 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -15,6 +15,7 @@ #include "../graphics/Shader.h" #include "../graphics/Batch2D.h" #include "../graphics/Font.h" +#include "../graphics/Atlas.h" #include "../graphics/Mesh.h" #include "../window/Camera.h" #include "../window/Window.h" @@ -146,6 +147,7 @@ void HudRenderer::drawContentAccess(const GfxContext& ctx, Player* player) { const Viewport& viewport = ctx.getViewport(); const uint width = viewport.getWidth(); + Atlas* atlas = assets->getAtlas("blocks"); uint count = contentIds->countBlockDefs(); uint icon_size = 48; @@ -171,7 +173,7 @@ void HudRenderer::drawContentAccess(const GfxContext& ctx, Player* player) { batch->rect(inv_x, inv_y, inv_w, inv_h); // blocks & items - batch->texture(assets->getTexture("block_tex")); + batch->texture(atlas->getTexture()); for (uint i = 0; i < count-1; i++) { Block* cblock = contentIds->getBlockDef(i+1); if (cblock == nullptr) @@ -190,9 +192,10 @@ void HudRenderer::drawContentAccess(const GfxContext& ctx, Player* player) { } if (cblock->model == BlockModel::block){ - batch->blockSprite(x, y, icon_size, icon_size, 16, cblock->textureFaces, tint); + batch->blockSprite(x, y, icon_size, icon_size, (const UVRegion*)cblock->uvdata, tint); } else if (cblock->model == BlockModel::xsprite){ - batch->sprite(x, y, icon_size, icon_size, 16, cblock->textureFaces[3], tint); + const UVRegion& region = (reinterpret_cast(cblock->uvdata))[3]; + batch->sprite(x, y, icon_size, icon_size, region, tint); } } } @@ -231,6 +234,8 @@ void HudRenderer::draw(const GfxContext& ctx){ const uint width = viewport.getWidth(); const uint height = viewport.getHeight(); + Atlas* atlas = assets->getAtlas("blocks"); + debugPanel->visible(level->player->debug); uicamera->fov = height; @@ -239,10 +244,9 @@ void HudRenderer::draw(const GfxContext& ctx){ uishader->use(); uishader->uniformMatrix("u_projview", uicamera->getProjection()*uicamera->getView()); - // Chosen block preview - Texture* blocks = assets->getTexture("block_tex"); + batch->begin(); - batch->texture(nullptr); + // Chosen block preview batch->color = vec4(1.0f); if (Events::_cursor_locked && !level->player->debug) { batch->lineWidth(2); @@ -258,14 +262,15 @@ void HudRenderer::draw(const GfxContext& ctx){ batch->rect(width - 68, height - 68, 68, 68); batch->color = vec4(1.0f); - batch->texture(blocks); + batch->texture(atlas->getTexture()); { Block* cblock = contentIds->getBlockDef(player->choosenBlock); assert(cblock != nullptr); if (cblock->model == BlockModel::block){ - batch->blockSprite(width-56, uicamera->fov - 56, 48, 48, 16, cblock->textureFaces, vec4(1.0f)); + batch->blockSprite(width-56, uicamera->fov - 56, 48, 48, (const UVRegion*)cblock->uvdata, vec4(1.0f)); } else if (cblock->model == BlockModel::xsprite){ - batch->sprite(width-56, uicamera->fov - 56, 48, 48, 16, cblock->textureFaces[3], vec4(1.0f)); + const UVRegion& region = (reinterpret_cast(cblock->uvdata))[3]; + batch->sprite(width-56, uicamera->fov - 56, 48, 48, region, vec4(1.0f)); } } diff --git a/src/frontend/world_render.cpp b/src/frontend/world_render.cpp index c06649ec..73862e8f 100644 --- a/src/frontend/world_render.cpp +++ b/src/frontend/world_render.cpp @@ -10,6 +10,7 @@ #include "../window/Window.h" #include "../window/Camera.h" #include "../graphics/Mesh.h" +#include "../graphics/Atlas.h" #include "../graphics/Shader.h" #include "../graphics/Texture.h" #include "../graphics/LineBatch.h" @@ -27,6 +28,7 @@ #include "../engine.h" using glm::vec3; +using std::string; using std::shared_ptr; WorldRenderer::WorldRenderer(Engine* engine, Level* level) @@ -37,6 +39,26 @@ WorldRenderer::WorldRenderer(Engine* engine, Level* level) level->events->listen(EVT_CHUNK_HIDDEN, [this](lvl_event_type type, Chunk* chunk) { renderer->unload(chunk); }); + + // TODO: move to some proper place + // otrefactoryu dnem + Assets* assets = engine->getAssets(); + Atlas* atlas = assets->getAtlas("blocks"); + const Content* content = level->content; + const ContentIndices* contentIds = content->indices; + for (uint i = 0; i < contentIds->countBlockDefs(); i++) { + Block* def = contentIds->getBlockDef(i); + for (uint side = 0; side < 6; side++) { + string tex = def->textureFaces[side]; + if (atlas->has(tex)) { + UVRegion region = atlas->get(tex); + float* data = reinterpret_cast(®ion); + for (uint j = 0; j < 4; j++) { + def->uvdata[side * 4 + j] = data[j]; + } + } + } + } } WorldRenderer::~WorldRenderer() { @@ -99,7 +121,7 @@ void WorldRenderer::draw(const GfxContext& pctx, Camera* camera, bool occlusion) const Content* content = level->content; const ContentIndices* contentIds = content->indices; Assets* assets = engine->getAssets(); - Texture* texture = assets->getTexture("block"); + Atlas* atlas = assets->getAtlas("blocks"); Shader* shader = assets->getShader("main"); Shader* linesShader = assets->getShader("lines"); @@ -139,7 +161,7 @@ void WorldRenderer::draw(const GfxContext& pctx, Camera* camera, bool occlusion) cblock->emission[1] / 15.0f * multiplier, cblock->emission[2] / 15.0f * multiplier); shader->uniform1f("u_torchlightDistance", 6.0f); - texture->bind(); + atlas->getTexture()->bind(); Chunks* chunks = level->chunks; drawChunks(chunks, camera, shader, occlusion); diff --git a/src/graphics/Atlas.cpp b/src/graphics/Atlas.cpp new file mode 100644 index 00000000..7db65bc6 --- /dev/null +++ b/src/graphics/Atlas.cpp @@ -0,0 +1,86 @@ +#include "Atlas.h" + +#include "../maths/LMPacker.h" +#include "Texture.h" +#include "ImageData.h" + +using std::vector; +using std::string; +using std::unique_ptr; +using std::shared_ptr; +using std::unordered_map; + +Atlas::Atlas(ImageData* image, + unordered_map regions) + : texture(Texture::from(image)), + image(image), + regions(regions) { +} + +Atlas::~Atlas() { + delete image; + delete texture; +} + +bool Atlas::has(string name) const { + return regions.find(name) != regions.end(); +} + +const UVRegion& Atlas::get(string name) const { + return regions.at(name); +} + +Texture* Atlas::getTexture() const { + return texture; +} + +ImageData* Atlas::getImage() const { + return image; +} + +void AtlasBuilder::add(string name, ImageData* image) { + entries.push_back(atlasentry{name, shared_ptr(image)}); +} + +Atlas* AtlasBuilder::build(uint extrusion) { + unique_ptr sizes (new uint[entries.size() * 2]); + for (uint i = 0; i < entries.size(); i++) { + auto& entry = entries[i]; + auto image = entry.image; + sizes[i*2] = image->getWidth(); + sizes[i*2+1] = image->getHeight(); + } + LMPacker packer(sizes.get(), entries.size()*2); + sizes.reset(nullptr); + + int width = 32; + int height = 32; + while (!packer.buildCompact(width, height, extrusion)) { + if (width > height) { + height *= 2; + } else { + width *= 2; + } + } + + unordered_map regions; + unique_ptr canvas (new ImageData(ImageFormat::rgba8888, width, height)); + vector rects = packer.getResult(); + for (uint i = 0; i < entries.size(); i++) { + const rectangle& rect = rects[i]; + const atlasentry& entry = entries[i]; + uint x = rect.x; + uint y = rect.y; + uint w = rect.width; + uint h = rect.height; + canvas->blit(entry.image.get(), rect.x, rect.y); + for (uint j = 0; j < extrusion; j++) { + canvas->extrude(x - j, y - j, w + j*2, h + j*2); + } + float unitX = 1.0f / width; + float unitY = 1.0f / height; + regions[entry.name] = UVRegion(unitX * x, unitY * y, + unitX * (x + w), unitY * (y + h)); + } + return new Atlas(canvas.release(), regions); +} \ No newline at end of file diff --git a/src/graphics/Atlas.h b/src/graphics/Atlas.h new file mode 100644 index 00000000..5da3ffa0 --- /dev/null +++ b/src/graphics/Atlas.h @@ -0,0 +1,44 @@ +#ifndef GRAPHICS_ATLAS_H_ +#define GRAPHICS_ATLAS_H_ + +#include +#include +#include +#include +#include "UVRegion.h" +#include "../typedefs.h" + +class ImageData; +class Texture; + +class Atlas { + Texture* texture; + ImageData* image; + std::unordered_map regions; +public: + Atlas(ImageData* image, std::unordered_map regions); + ~Atlas(); + + bool has(std::string name) const; + const UVRegion& get(std::string name) const; + + Texture* getTexture() const; + ImageData* getImage() const; +}; + + +struct atlasentry { + std::string name; + std::shared_ptr image; +}; + +class AtlasBuilder { + std::vector entries; +public: + AtlasBuilder() {} + void add(std::string name, ImageData* image); + + Atlas* build(uint extrusion); +}; + +#endif // GRAPHICS_ATLAS_H_ \ No newline at end of file diff --git a/src/graphics/Batch2D.cpp b/src/graphics/Batch2D.cpp index c27af864..6885e752 100644 --- a/src/graphics/Batch2D.cpp +++ b/src/graphics/Batch2D.cpp @@ -288,6 +288,10 @@ void Batch2D::sprite(Sprite* sprite) { sprite->color); } +void Batch2D::sprite(float x, float y, float w, float h, const UVRegion& region, vec4 tint){ + rect(x, y, w, h, region.u1, region.v1, region.u2-region.u1, region.v2-region.v1, tint.r, tint.g, tint.b, tint.a); +} + void Batch2D::sprite(float x, float y, float w, float h, int atlasRes, int index, vec4 tint){ float scale = 1.0f / (float)atlasRes; float u = (index % atlasRes) * scale; @@ -295,12 +299,16 @@ void Batch2D::sprite(float x, float y, float w, float h, int atlasRes, int index rect(x, y, w, h, u, v, scale, scale, tint.r, tint.g, tint.b, tint.a); } -void Batch2D::blockSprite(float x, float y, float w, float h, int atlasRes, int index[6], vec4 tint){ - float scale = 1.0f / (float)atlasRes; - float uu = (index[3] % atlasRes) * scale; - float vu = 1.0f - ((index[3] / atlasRes) * scale) - scale; - float uf = (index[0] % atlasRes) * scale; - float vf = 1.0f - ((index[0] / atlasRes) * scale) - scale; +void Batch2D::blockSprite(float x, float y, float w, float h, const UVRegion regions[], vec4 tint){ + // TODO: rewrite it + float uu = (regions[3].u1); + float vu = (regions[3].v1); + + float uf = (regions[0].u1); + float vf = (regions[0].v1); + + float scalex = regions[3].u2-regions[3].u1; + float scaley = regions[3].v2-regions[3].v1; if (this->index + 18*VERTEX_SIZE >= capacity) render(); @@ -317,13 +325,13 @@ void Batch2D::blockSprite(float x, float y, float w, float h, int atlasRes, int vec2(ox-sx, y+(h*0.75f))}; vec2 uvpoints[8] = {vec2(uu, vu), - vec2(uu+scale, vu), - vec2(uu+scale, vu+scale), - vec2(uu, vu+scale), + vec2(uu+scalex, vu), + vec2(uu+scalex, vu+scalex), + vec2(uu, vu+scalex), vec2(uf, vf), - vec2(uf+scale, vf), - vec2(uf+scale, vf+scale), - vec2(uf, vf+scale)}; + vec2(uf+scaley, vf), + vec2(uf+scaley, vf+scaley), + vec2(uf, vf+scaley)}; vertex(points[0], uvpoints[3], tint.r, tint.g, tint.b, tint.a); vertex(points[1], uvpoints[0], tint.r, tint.g, tint.b, tint.a); diff --git a/src/graphics/Batch2D.h b/src/graphics/Batch2D.h index 6d66106f..c19becf3 100644 --- a/src/graphics/Batch2D.h +++ b/src/graphics/Batch2D.h @@ -37,9 +37,10 @@ public: void begin(); void texture(Texture* texture); - void sprite(float x, float y, float w, float h, int atlasRes, int index, vec4 tint); + void sprite(float x, float y, float w, float h, const UVRegion& region, vec4 tint); void sprite(Sprite* sprite); - void blockSprite(float x, float y, float w, float h, int atlasRes, int index[6], vec4 tint); + void sprite(float x, float y, float w, float h, int atlasRes, int index, vec4 tint); + void blockSprite(float x, float y, float w, float h, const UVRegion regions[], vec4 tint); void point(float x, float y, float r, float g, float b, float a); void line(float x1, float y1, float x2, float y2, float r, float g, float b, float a); void rect(float x, float y, diff --git a/src/graphics/BlocksRenderer.cpp b/src/graphics/BlocksRenderer.cpp index 6dae363a..5067f23d 100644 --- a/src/graphics/BlocksRenderer.cpp +++ b/src/graphics/BlocksRenderer.cpp @@ -303,12 +303,7 @@ vec4 BlocksRenderer::pickSoftLight(int x, int y, int z, const ivec3& right, cons // Get texture atlas UV region for block face inline UVRegion uvfor(const Block& def, uint face, int atlas_size) { - float uvsize = 1.0f / (float)atlas_size; - float us = 1.0f / (float)atlas_size / (float)atlas_size * ATLAS_MARGIN_SIZE * 0.8f; - const uint id = def.textureFaces[face]; - float u = (id % atlas_size) * uvsize; - float v = 1.0f - (id / atlas_size + 1) * uvsize; - return UVRegion(u + us, v + us, u + uvsize - us, v + uvsize - us); + return *reinterpret_cast(def.uvdata + face * 4); } void BlocksRenderer::render(const voxel* voxels, int atlas_size) { diff --git a/src/graphics/ImageData.cpp b/src/graphics/ImageData.cpp index caf88c26..bc45df56 100644 --- a/src/graphics/ImageData.cpp +++ b/src/graphics/ImageData.cpp @@ -11,6 +11,16 @@ inline int max(int a, int b) { return (a > b) ? a : b; } +ImageData::ImageData(ImageFormat format, uint width, uint height) + : format(format), width(width), height(height) { + switch (format) { + case ImageFormat::rgb888: data = new ubyte[width*height*3]{}; break; + case ImageFormat::rgba8888: data = new ubyte[width*height*4]{}; break; + default: + throw std::runtime_error("format is not supported"); + } +} + ImageData::ImageData(ImageFormat format, uint width, uint height, void* data) : format(format), width(width), height(height), data(data) { } @@ -70,6 +80,150 @@ void ImageData::flipY() { } } +void ImageData::blit(const ImageData* image, int x, int y) { + if (format != image->format) { + throw std::runtime_error("mismatching format"); + } + uint comps; + switch (format) { + case ImageFormat::rgb888: comps = 3; break; + case ImageFormat::rgba8888: comps = 4; break; + default: + throw std::runtime_error("only unsigned byte formats supported"); + } + ubyte* pixels = static_cast(data); + ubyte* source = static_cast(image->getData()); + uint srcwidth = image->getWidth(); + uint srcheight = image->getHeight(); + + for (uint srcy = max(0, -y); (int)srcy < min(srcheight, height-y); srcy++) { + for (uint srcx = max(0, -x); (int)srcx < min(srcwidth, width-x); srcx++) { + uint dstx = srcx + x; + uint dsty = srcy + y; + uint dstidx = (dsty * width + dstx) * comps; + uint srcidx = (srcy * srcwidth + srcx) * comps; + for (uint c = 0; c < comps; c++) { + pixels[dstidx + c] = source[srcidx + c]; + } + } + } +} + +/* Extrude rectangle zone border pixels out by 1 pixel. + Used to remove atlas texture border artifacts */ +void ImageData::extrude(int x, int y, int w, int h) { + uint comps; + switch (format) { + case ImageFormat::rgb888: comps = 3; break; + case ImageFormat::rgba8888: comps = 4; break; + default: + throw std::runtime_error("only unsigned byte formats supported"); + } + ubyte* pixels = static_cast(data); + + int rx = x + w - 1; + int ry = y + h - 1; + + // top-left pixel + if (x > 0 && (uint)x < width && y > 0 && (uint)y < height) { + uint srcidx = (y * width + x) * comps; + uint dstidx = ((y - 1) * width + x - 1) * comps; + for (uint c = 0; c < comps; c++) { + pixels[dstidx + c] = pixels[srcidx + c]; + } + } + + // top-right pixel + if (rx >= 0 && (uint)rx < width-1 && y > 0 && (uint)y < height) { + uint srcidx = (y * width + rx) * comps; + uint dstidx = ((y - 1) * width + rx + 1) * comps; + for (uint c = 0; c < comps; c++) { + pixels[dstidx + c] = pixels[srcidx + c]; + } + } + + // bottom-left pixel + if (x > 0 && (uint)x < width && ry >= 0 && (uint)ry < height-1) { + uint srcidx = (ry * width + x) * comps; + uint dstidx = ((ry + 1) * width + x - 1) * comps; + for (uint c = 0; c < comps; c++) { + pixels[dstidx + c] = pixels[srcidx + c]; + } + } + + // bottom-right pixel + if (rx >= 0 && (uint)rx < width-1 && ry >= 0 && (uint)ry < height-1) { + uint srcidx = (ry * width + rx) * comps; + uint dstidx = ((ry + 1) * width + rx + 1) * comps; + for (uint c = 0; c < comps; c++) { + pixels[dstidx + c] = pixels[srcidx + c]; + } + } + + // left border + if (x > 0 && (uint)x < width) { + for (uint ey = max(y, 0); (int)ey < y + h; ey++) { + uint srcidx = (ey * width + x) * comps; + uint dstidx = (ey * width + x - 1) * comps; + for (uint c = 0; c < comps; c++) { + pixels[dstidx + c] = pixels[srcidx + c]; + } + } + } + + // top border + if (y > 0 && (uint)y < height) { + for (uint ex = max(x, 0); (int)ex < x + w; ex++) { + uint srcidx = (y * width + ex) * comps; + uint dstidx = ((y-1) * width + ex) * comps; + for (uint c = 0; c < comps; c++) { + pixels[dstidx + c] = pixels[srcidx + c]; + } + } + } + + // right border + if (rx >= 0 && (uint)rx < width-1) { + for (uint ey = max(y, 0); (int)ey < y + h; ey++) { + uint srcidx = (ey * width + rx) * comps; + uint dstidx = (ey * width + rx + 1) * comps; + for (uint c = 0; c < comps; c++) { + pixels[dstidx + c] = pixels[srcidx + c]; + } + } + } + + // bottom border + if (ry >= 0 && (uint)ry < height-1) { + for (uint ex = max(x, 0); (int)ex < x + w; ex++) { + uint srcidx = (ry * width + ex) * comps; + uint dstidx = ((ry+1) * width + ex) * comps; + for (uint c = 0; c < comps; c++) { + pixels[dstidx + c] = pixels[srcidx + c]; + } + } + } +} + +void ImageData::fixAlphaColor() { + ubyte* pixels = static_cast(data); + + // Fixing black transparent pixels for Mip-Mapping + for (int ly = 0; ly < height-1; ly++) { + for (int lx = 0; lx < width-1; lx++) { + if (pixels[((ly) * width + lx) * 4 + 3]) { + for (int c = 0; c < 3; c++) { + int val = pixels[((ly) + + lx) * 4 + c]; + if (pixels[((ly) * width + lx + 1) * 4 + 3] == 0) + pixels[((ly) * width + lx + 1) * 4 + c] = val; + if (pixels[((ly + 1) * width + lx) * 4 + 3] == 0) + pixels[((ly + 1) * width + lx) * 4 + c] = val; + } + } + } + } +} + ImageData* add_atlas_margins(ImageData* image, int grid_size) { // RGBA is only supported assert(image->getFormat() == ImageFormat::rgba8888); @@ -95,7 +249,8 @@ ImageData* add_atlas_margins(ImageData* image, int grid_size) { int sy = max(min(ly, imgres-1), 0); int sx = max(min(lx, imgres-1), 0); for (int c = 0; c < 4; c++) - dstdata[((doy+ly) * dstwidth + dox + lx) * 4 + c] = srcdata[((soy+sy) * srcwidth + sox + sx) * 4 + c]; + dstdata[((doy+ly) * dstwidth + dox + lx) * 4 + c] = + srcdata[((soy+sy) * srcwidth + sox + sx) * 4 + c]; } } diff --git a/src/graphics/ImageData.h b/src/graphics/ImageData.h index b236293d..b7f73c01 100644 --- a/src/graphics/ImageData.h +++ b/src/graphics/ImageData.h @@ -14,12 +14,17 @@ class ImageData { uint height; void* data; public: + ImageData(ImageFormat format, uint width, uint height); ImageData(ImageFormat format, uint width, uint height, void* data); ~ImageData(); void flipX(); void flipY(); + void blit(const ImageData* image, int x, int y); + void extrude(int x, int y, int w, int h); + void fixAlphaColor(); + void* getData() const { return data; } diff --git a/src/maths/LMPacker.cpp b/src/maths/LMPacker.cpp new file mode 100644 index 00000000..eebca1e0 --- /dev/null +++ b/src/maths/LMPacker.cpp @@ -0,0 +1,149 @@ +#include "LMPacker.h" + +#include + +inline int getPackerScore(rectangle& rect) { + if (rect.width * rect.height > 100) + return rect.height * rect.height * 1000; + return (rect.width * rect.height * rect.height); +} + +LMPacker::LMPacker(const uint32_t sizes[], size_t length) { + for (unsigned int i = 0; i < length/2; i++) { + rectangle rect(0, 0, (int)sizes[i * 2], (int)sizes[i * 2 + 1]); + rects.push_back(rect); + } + sort(rects.begin(), rects.end(), [](rectangle a, rectangle b) { + return -getPackerScore(a) < -getPackerScore(b); + }); +} + +LMPacker::~LMPacker() { + if (matrix) { + for (unsigned int y = 0; y < (height >> mbit); y++) { + delete[] matrix[y]; + } + delete[] matrix; + } +} + +void LMPacker::cleanup() { + placed.clear(); +} + +bool LMPacker::build(uint32_t width, uint32_t height, + uint16_t extension, uint32_t mbit, uint32_t vstep) { + cleanup(); + this->mbit = mbit; + this->width = width; + this->height = height; + int mpix = 1 << mbit; + + const unsigned int mwidth = width >> mbit; + const unsigned int mheight = height >> mbit; + matrix = new rectangle**[mheight]; + for (unsigned int y = 0; y < mheight; y++) { + matrix[y] = new rectangle*[mwidth]; + for (unsigned int x = 0; x < mwidth; x++) { + matrix[y][x] = nullptr; + } + } + for (unsigned int i = 0; i < rects.size(); i++) { + rectangle& rect = rects[i]; + rect = rectangle(0, 0, rect.width, rect.height); + rect.width += extension * 2; + rect.height += extension * 2; + if (mpix > 1) { + if (rect.width % mpix > 0) { + rect.extX = mpix - (rect.width % mpix); + } + if (rect.height % mpix > 0) { + rect.extY = mpix - (rect.height % mpix); + } + } + rect.width += rect.extX; + rect.height += rect.extY; + } + bool built = true; + for (unsigned int i = 0; i < rects.size(); i++) { + rectangle* rect = &rects[i]; + if (!place(rect, vstep)) { + built = false; + break; + } + } + for (unsigned int i = 0; i < rects.size(); i++) { + rectangle& rect = rects[i]; + rect.x += extension; + rect.y += extension; + rect.width -= extension * 2 + rect.extX; + rect.height -= extension * 2 + rect.extY; + } + return built; +} + +inline rectangle* findCollision(rectangle*** matrix, int x, int y, int w, int h) { + for (int row = y; row < y+h; row++) { + for (int col = x; col < x+w; col++) { + rectangle* rect = matrix[row][col]; + if (rect) { + return rect; + } + } + } + return nullptr; +} + +inline void fill(rectangle*** matrix, rectangle* rect, int x, int y, int w, int h) { + for (int row = y; row < y+h; row++) { + for (int col = x; col < x+w; col++) { + matrix[row][col] = rect; + } + } +} + +bool LMPacker::place(rectangle* rectptr, uint32_t vstep) { + rectangle& rect = *rectptr; + const unsigned int rw = rect.width >> mbit; + const unsigned int rh = rect.height >> mbit; + if (vstep > 1) { + vstep = (vstep > rh ? vstep : rh); + } + const unsigned int mwidth = width >> mbit; + const unsigned int mheight = height >> mbit; + for (unsigned int y = 0; y + rh < mheight; y += vstep) { + rectangle** line = matrix[y]; + bool skiplines = true; + rectangle** lower = matrix[y + rh - 1]; + for (unsigned int x = 0; x + rw < mwidth; x++) { + rectangle* prect = line[x]; + if (prect) { + x = (prect->x >> mbit) + (prect->width >> mbit) - 1; + } else { + if (skiplines) { + unsigned int lfree = 0; + while (lfree + x < mwidth && !lower[x + lfree] && lfree < rw) { + lfree++; + } + if (lfree >= rw) + skiplines = false; + } + prect = findCollision(matrix, x, y, rw, rh); + if (prect) { + x = (prect->x >> mbit) + (prect->width >> mbit) - 1; + continue; + } + fill(matrix, rectptr, x, y, rw, rh); + rectptr->x = x << mbit; + rectptr->y = y << mbit; + placed.push_back(rectptr); + return true; + } + } + if (skiplines) { + y += rh - vstep; + } + } + return false; +} + diff --git a/src/maths/LMPacker.h b/src/maths/LMPacker.h new file mode 100644 index 00000000..c280a85f --- /dev/null +++ b/src/maths/LMPacker.h @@ -0,0 +1,52 @@ +/* + C++ LMPacker port + https://github.com/MihailRis/LMPacker +*/ +#ifndef LMPACKER_H_ +#define LMPACKER_H_ + +#include +#include +#include + +struct rectangle { + int x; + int y; + int width; + int height; + int extX = 0; + int extY = 0; + + rectangle(int x, int y, int width, int height) + : x(x), y(y), width(width), height(height){ + } +}; + +class LMPacker { + std::vector rects; + std::vector placed; + uint32_t width = 0; + uint32_t height = 0; + rectangle*** matrix = nullptr; + uint32_t mbit = 0; + + void cleanup(); + bool place(rectangle* rect, uint32_t vstep); +public: + LMPacker(const uint32_t sizes[], size_t length); + virtual ~LMPacker(); + + bool buildCompact(uint32_t width, uint32_t height, uint16_t extension) { + return build(width, height, extension, 0, 1); + } + bool buildFast(uint32_t width, uint32_t height, uint16_t extension) { + return build(width, height, extension, 1, 2); + } + bool build(uint32_t width, uint32_t height, uint16_t extension, uint32_t mbit, uint32_t vstep); + + std::vector getResult() { + return rects; + } +}; + +#endif /* LMPACKER_H_ */ \ No newline at end of file diff --git a/src/voxel_engine.cpp b/src/voxel_engine.cpp index 509fff61..808e125a 100644 --- a/src/voxel_engine.cpp +++ b/src/voxel_engine.cpp @@ -13,6 +13,10 @@ #include "files/settings_io.h" #include "content/Content.h" +#include "coders/png.h" +#include "graphics/Atlas.h" +#include "graphics/ImageData.h" + int main() { platform::configure_encoding(); ContentBuilder contentBuilder; diff --git a/src/voxels/Block.cpp b/src/voxels/Block.cpp index 880facf3..3836d0f6 100644 --- a/src/voxels/Block.cpp +++ b/src/voxels/Block.cpp @@ -1,6 +1,6 @@ #include "Block.h" -Block::Block(std::string name, int texture) : name(name), +Block::Block(std::string name, std::string texture) : name(name), textureFaces{texture,texture,texture,texture,texture,texture}, emission{0,0,0}{ } diff --git a/src/voxels/Block.h b/src/voxels/Block.h index bd177e74..f579ff1d 100644 --- a/src/voxels/Block.h +++ b/src/voxels/Block.h @@ -18,8 +18,8 @@ class Block { public: std::string const name; unsigned int id; - // 0 1 2 3 4 5 - int textureFaces[6]; // -x,x, -y,y, -z,z + // 0 1 2 3 4 5 + std::string textureFaces[6]; // -x,x, -y,y, -z,z unsigned char emission[3]; unsigned char drawGroup = 0; BlockModel model = BlockModel::block; @@ -31,7 +31,9 @@ public: bool rotatable = false; float hitboxScale = 1; - Block(std::string name, int texture); + float uvdata[4*6]; + + Block(std::string name, std::string texture); }; #endif /* VOXELS_BLOCK_H_ */