From 402e477f76c01bdae3058bd3eb54213e9b7ee952 Mon Sep 17 00:00:00 2001 From: blockmaster2000 Date: Sat, 5 Nov 2016 20:30:39 +0100 Subject: [PATCH] Add node animation --- data/textures/lava_flowing.png | Bin 0 -> 3993 bytes data/textures/lava_source.png | Bin 0 -> 3685 bytes data/textures/water_flowing.png | Bin 0 -> 2636 bytes data/textures/water_source.png | Bin 0 -> 2032 bytes src/client.cpp | 7 +- src/client.h | 6 ++ src/content_mapblock.cpp | 159 ++++++++++++++++---------------- src/content_mapnode.cpp | 18 ++-- src/map.cpp | 8 ++ src/mapblock_mesh.cpp | 60 +++++++++++- src/mapblock_mesh.h | 41 +++++--- src/mapnode.cpp | 25 ++++- src/mapnode.h | 3 + src/tile.cpp | 50 +++++++++- src/tile.h | 24 ++++- 15 files changed, 286 insertions(+), 115 deletions(-) create mode 100644 data/textures/lava_flowing.png create mode 100644 data/textures/lava_source.png create mode 100644 data/textures/water_flowing.png create mode 100644 data/textures/water_source.png diff --git a/data/textures/lava_flowing.png b/data/textures/lava_flowing.png new file mode 100644 index 0000000000000000000000000000000000000000..432cc25f789f380a51e51b865e5d7eb69ed9e297 GIT binary patch literal 3993 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 literal 0 HcmV?d00001 diff --git a/data/textures/lava_source.png b/data/textures/lava_source.png new file mode 100644 index 0000000000000000000000000000000000000000..305a23373eeac29d1cea6f36ca69865a64e0fe39 GIT binary patch literal 3685 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 Xx7XEHoB6;mA>@WJ+^EdJ_22&iRs=Gk literal 0 HcmV?d00001 diff --git a/data/textures/water_flowing.png b/data/textures/water_flowing.png new file mode 100644 index 0000000000000000000000000000000000000000..6f44c5c570a98ef272724ef438e768d2fea8ce7f GIT binary patch literal 2636 zcmd5;XH=8f7X2t1S^z~-kSZe&kP<~jB#NjM$Dye-K}n?OjG;+@1Q|>W5D}TIa5P?p@`7lTC2mnx2``?lRa`R!5L)qK5PPPD0Nr~Nd z%aH7K{T;730YJ=Q03eV6K(s5tSpbMc0Kgmy08Y~Y02-R^*KRNA*Lvxq?KRv;<}ZGs zWzNuq!JJZ~0|$QivaP4WZ|qW3His`s0KiP9_pl z*2(&Pll9YjV;kXa4x$9;eK-$#NSqJq;A(U{J0?sgi;7&LOvzJUzvLX9P<*zE$YkV( zrwA0EeQjoOcosI*x``6DISA{^+7Ed~UQd-Q?KAf2te(TR(iN&6`DK89S0%4gK=nlV z&L|(qSw2w)gZu&F5L6WT;{@7JT6lxz9!2^sV^2pKiP&l%aUN|!OM%FMRIk3DGt%!W zxo+oQ-rUn^iAViq&1Q3q`511x7fAI%UqArF>O0|?-N2;r4<}ap(_SS!Cb3J?M3y#d z9<1qNsk}Rnbu>O87DiuWjbXTTRHo4hwt1|IUm!r$rp#j_67CXubo{&2Wj!7UY45?k z!HrZBV$8RD?@E%OW73|0k+VAIk@B%At|afs0JR)du*bS>?b!FDb7;Imm9dvQo!{%t zU{I}ZdR*T*bZa4=hZr#HHBR}HSL##4fLR!AMnU``>N%+Gr#7^ZiU75fUi2l*=_6PM zG8{fxd?l(o#8A3)5SS+Fw?AhjFHt~oe1lB)b!J5}Ww(|{et9{{)Pdi@Lg*?rbL$$X ziR+Jl=^Xc7*|xzkZrcbZ>^u1_Z0fUJ7u-a16*YTbEI*Bm-AyI)l37SD(_cFlHWd1? zcTOiLq#E&wNSat}HoCToz+&5EQbuSX&YgxXl8=R%i(A~J$!b2C`-nA7?2evpVKYn} zW3_#AH<66;ll5?w{8jkT3Pg+Dul=kq{CMAM$&?_a-XOFn!1qt3+u~QGZtX)Di#-XWNIHyMS1Nu(8pYW={}I(l~eV!@@*Oe>RLDy zWuWqKi{SX)B*oiNXNJe5+T8DF`oZpkRMoNv<#a3BhvuybiOH|yWRos*yP)Xs>ixPs z9?FoVN#-NOD4+qk7pm|-1|VRMdbiq|-90_-vRvoC7- z1b>RYF?@uZ>R&iB6`i^7mH&61hFuq~N3{{?l}BfY8$%r#Elh*7Wu#2z1Mt z)PzxBiYXFLObM73Xm!0mZ6No!Ty)?uP3Uo&359MYG};x`^qssfv0IqgD|h6!Kj_EV z#@qT*z3A}&D=>1}AKi09^vR5TU#g5wVV%$C_T*iQld_tsqGrFihn9D+cJefi&1#%KIPR3qsM zJh*sjvh<(3?=tk9%Nf#Xa>BO^?VXj$w~TuEKPvs-AW-6i<>k-+M!o+3E$vtW9K+<_ Vev;ZmOMZU9B|GPf73Wb8{{{?l^F9Co literal 0 HcmV?d00001 diff --git a/data/textures/water_source.png b/data/textures/water_source.png new file mode 100644 index 0000000000000000000000000000000000000000..85fcf301db1f9d77d4ba56605647ef47e22b953a GIT binary patch literal 2032 zcmZuyeLPh88b96|L}$BLv$AJW=5lXplqB{bR3`7^YDvtPl=iCb=%ZP4l$f0rDn<0h zVr--$!Z!9YM%LS^m`UDln6V6s=7sSx-tY0U-Ot|7{&7CfInVF=e4p?0ea`3eOY-q@ z)zvoA1^__!2=SmV8b1R76+lxJeY3Wtet`z92;#9w0NALv@~8kAKVZ?M`e`RmCjcnD zacQ2EhJJ4iCHi^-Kr|iz;#dGMyNt#U06@0{fYA^Du)7BUhO}FhhQk1W2|IGo$&c}_ zD5Li3fQNoOzvp^)qNXz;NH=k>dXQ$dTr12(GugatvW`FS{b1=6FAp|VIh&M~H`=-A zdvs>UYmV8{#d&4)@&frnSH;beSt;C;y|l1sBg(RA!jXd{v~r2oHL0B_Yotoi(_|>S zFKfLft$bh1rM?LkIo3>B6iwSK6^WGX9ZQXv*?F{x8+*B27sc2vJyYSPbuBL}HpOyp zw2UXv#1xClvAGC}gqAr7ZfS0P%_%q(6)d5};FRRW7c;09j+?C4IJQ5wg}et?$eH@B z72|04RH-i`>9p@&(st+w%_o;xMZ-B7y2iNXn*JWF8Yh{AN)oW;B9s^>)#)p%dLPe4 zA{Ushar}OT@?*tK!t<2SF4v?PRH^Q^oR*8-Vbgk$+lG_>3D!S>Z<~u4+5SShCp~*p zxg=?kR5O3}=to259P~a%q5BXF6)XAr*7D@k40q#JDcht+L#X066$jj0WhY?YRpN zzCJm^q#C$*!x8O!MYf<(jv1tkKk3pm!Ja}LxtqSCgJ26*K5bDu{`i^p(621QX0n{E zlF`U|6a`Jz?nHcU-uDwTS=-~X83JMlEMLTf3ney-)}R{=r4~$?Kzk#{t{B2fRxMwlO$nc4mdB0q>fYCA^z!1+V}`)S zdr(pDvKv%#b2~g(7>Wu~1~cSZcM0QJ_d#bq%ONYHwVpMc+zcxX@(}iLu6OcYFpsX^ zR{86UL7=NW!{??o*gp1X9~kZ%DP+if_-ZZmc0I76l1LEme}7p?t{FrVa4m zl!J+62ed;aEPa&NFc28(colP^Z`cVp7@gDCUpv#H0nUX@Zx5DbX3l@apy*uTY4nF^ zJ_G&4zbyBWWm=mcos+O!dP4NWs26d5c-UdS)}@+OJm!T5t?%>r|C0N(r?xq4d3-}m zH=~p=bLDov1G%!F27=pD$%_6h`K7S30N+7P9eqOo@=n#?^Xz;{QEfJQ+K~gysPI0f zpZ~eeEC_zqz$2dRq+WzF=toQHqB~TJuycbHg`lXg6P6!46@X#9cT~OVOY--m2bkky z-jL+%>FYyGl^~onhBJ|$gz2On6*9qyG>nj)ta}34*vi|&&&|QDSDUV(?^!ygkL6P#l%N%y_zN-H z1kp0(r*PH(55^&nB8-2NC+sZN54ZsYT^Y)`+B^kz2_oRpvik2A>mKkXU(J8`W$om! z1jpTU&ClO+Me%A+-!DIJw#xg&V@lZlgeN8sScCCv(seqHXRd*F=kg}ypc>r%sdjxj z?r^UBcd3^3bqA{Hi3!Z;!i#^ZT)HwbJ;0Q2S?}_8O~U_765~kUpMNs_Pxw}MweB{$n@~QX1J);R z%ci)IRUa2;tT>HrV097xD5~y}!d?3NHtQ8nS650JneDZ@ZqN5uSkA&C!R*(R*lGt+ zAOl_h6$X~hd%og}%Sg3r7VY+FEM3@RU)QY=21c!Rf0#8hZPX+{Xfx;}I^%*#)IsVy tgr;%s9U^=9X@b&`YI{k>n&acKKtfxRmDS*A0eU+FM-F)%EOrk0?!Qdb(+B_n literal 0 HcmV?d00001 diff --git a/src/client.cpp b/src/client.cpp index 2e46565..ec538d7 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -235,7 +235,8 @@ Client::Client( m_time_of_day_update_timer(0), m_sleeping(false), m_waking(false), - m_sleep_state(0.0) + m_sleep_state(0.0), + m_animation_time(0.0) { m_mesh_update_thread.m_env = &m_env; m_packetcounter_timer = 0.0; @@ -314,6 +315,10 @@ void Client::step(float dtime) m_ignore_damage_timer = 0.0; } + m_animation_time += dtime; + if (m_animation_time > 60.0) + m_animation_time -= 60.0; + if (m_sleeping) { m_sleep_state += dtime; if (m_sleep_state > 1.0) diff --git a/src/client.h b/src/client.h index 5633eee..3ff5e02 100644 --- a/src/client.h +++ b/src/client.h @@ -341,6 +341,11 @@ public: u8 getSleepAlpha() {return m_sleep_state*255;} + float Client::getAnimationTime() + { + return m_animation_time; + } + private: // Virtual methods from con::PeerHandler @@ -416,6 +421,7 @@ private: bool m_sleeping; bool m_waking; float m_sleep_state; + float m_animation_time; }; #endif // !SERVER diff --git a/src/content_mapblock.cpp b/src/content_mapblock.cpp index 9db22c1..76a7c64 100644 --- a/src/content_mapblock.cpp +++ b/src/content_mapblock.cpp @@ -807,7 +807,7 @@ static void meshgen_cuboid( for (s32 j=0; j<4; j++) { vertices[i][j].Pos += pos; } - data->append(tiles[tileindex].getMaterial(), vertices[i], 4, indices, 6, colours); + data->append(tiles[tileindex], vertices[i], 4, indices, 6, colours); } } @@ -895,7 +895,7 @@ static void meshgen_rooftri(MeshMakeData *data, MapNode &n, v3s16 p, v3f corners tri_v[0].Pos += pos; tri_v[1].Pos += pos; tri_v[2].Pos += pos; - data->append(tile.getMaterial(),tri_v, 3, indices, 3, colours); + data->append(tile, tri_v, 3, indices, 3, colours); } { video::S3DVertex tri_v[3] = { @@ -913,7 +913,7 @@ static void meshgen_rooftri(MeshMakeData *data, MapNode &n, v3s16 p, v3f corners tri_v[0].Pos += pos; tri_v[1].Pos += pos; tri_v[2].Pos += pos; - data->append(tile.getMaterial(),tri_v, 3, indices, 3, colours); + data->append(tile, tri_v, 3, indices, 3, colours); } } @@ -949,7 +949,7 @@ void meshgen_cubelike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel vertices[i].Pos += pos; } - data->append(tile.getMaterial(), vertices, 4, indices, 6, colours); + data->append(tile, vertices, 4, indices, 6, colours); } if (meshgen_hardface(data,p,n,v3s16(1,0,0))) { TileSpec tile = getNodeTile(n,p,v3s16(1,0,0),selected,NULL); @@ -972,7 +972,7 @@ void meshgen_cubelike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel vertices[i].Pos += pos; } - data->append(tile.getMaterial(), vertices, 4, indices, 6, colours); + data->append(tile, vertices, 4, indices, 6, colours); } if (meshgen_hardface(data,p,n,v3s16(0,-1,0))) { TileSpec tile = getNodeTile(n,p,v3s16(0,-1,0),selected,NULL); @@ -995,7 +995,7 @@ void meshgen_cubelike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel vertices[i].Pos += pos; } - data->append(tile.getMaterial(), vertices, 4, indices, 6, colours); + data->append(tile, vertices, 4, indices, 6, colours); } if (meshgen_hardface(data,p,n,v3s16(0,1,0))) { TileSpec tile = getNodeTile(n,p,v3s16(0,1,0),selected,NULL); @@ -1018,7 +1018,7 @@ void meshgen_cubelike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel vertices[i].Pos += pos; } - data->append(tile.getMaterial(), vertices, 4, indices, 6, colours); + data->append(tile, vertices, 4, indices, 6, colours); } if (meshgen_hardface(data,p,n,v3s16(0,0,-1))) { TileSpec tile = getNodeTile(n,p,v3s16(0,0,-1),selected,NULL); @@ -1041,7 +1041,7 @@ void meshgen_cubelike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel vertices[i].Pos += pos; } - data->append(tile.getMaterial(), vertices, 4, indices, 6, colours); + data->append(tile, vertices, 4, indices, 6, colours); } if (meshgen_hardface(data,p,n,v3s16(0,0,1))) { TileSpec tile = getNodeTile(n,p,v3s16(0,0,1),selected,NULL); @@ -1064,7 +1064,7 @@ void meshgen_cubelike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel vertices[i].Pos += pos; } - data->append(tile.getMaterial(), vertices, 4, indices, 6, colours); + data->append(tile, vertices, 4, indices, 6, colours); } } @@ -1432,7 +1432,7 @@ void meshgen_dirtlike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel v[i].Pos += pos; } - data->append(toptile.getMaterial(), v, 4, indices, 6, colours); + data->append(toptile, v, 4, indices, 6, colours); if (!o_faces[2] || !o_faces[3] || !o_faces[4] || !o_faces[5]) { if (o_faces[2]) { @@ -1459,7 +1459,7 @@ void meshgen_dirtlike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel v2[i].TCoords += toptile.texture.pos; } - data->append(toptile.getMaterial(), v2, 4, indices, 6, colours); + data->append(toptile, v2, 4, indices, 6, colours); } if (o_faces[3]) { video::S3DVertex v2[4] = { @@ -1487,7 +1487,7 @@ void meshgen_dirtlike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel v2[i].TCoords += toptile.texture.pos; } - data->append(toptile.getMaterial(), v2, 4, indices, 6, colours); + data->append(toptile, v2, 4, indices, 6, colours); } if (o_faces[4]) { video::S3DVertex v2[4] = { @@ -1515,7 +1515,7 @@ void meshgen_dirtlike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel v2[i].TCoords += toptile.texture.pos; } - data->append(toptile.getMaterial(), v2, 4, indices, 6, colours); + data->append(toptile, v2, 4, indices, 6, colours); } if (o_faces[5]) { video::S3DVertex v2[4] = { @@ -1543,7 +1543,7 @@ void meshgen_dirtlike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel v2[i].TCoords += toptile.texture.pos; } - data->append(toptile.getMaterial(), v2, 4, indices, 6, colours); + data->append(toptile, v2, 4, indices, 6, colours); } } } @@ -1567,7 +1567,7 @@ void meshgen_dirtlike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel v[i].Pos += pos; } - data->append(basetile.getMaterial(), v, 4, indices, 6, colours); + data->append(basetile, v, 4, indices, 6, colours); } video::S3DVertex vertices[4] = { @@ -1654,7 +1654,7 @@ void meshgen_dirtlike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel v[i].Pos += pos; } - data->append(upstile.getMaterial(), v, 4, indices, 6, colours); + data->append(upstile, v, 4, indices, 6, colours); } if (!faces[face]) continue; @@ -1683,7 +1683,7 @@ void meshgen_dirtlike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel v[i].Pos += pos; } - data->append(basetile.getMaterial(), v, 4, indices, 6, colours); + data->append(basetile, v, 4, indices, 6, colours); if (!o_faces[face]) continue; @@ -1711,7 +1711,7 @@ void meshgen_dirtlike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel v[i].Pos += pos; } - data->append(sidetile.getMaterial(), v, 4, indices, 6, colours); + data->append(sidetile, v, 4, indices, 6, colours); } } @@ -2193,13 +2193,13 @@ void meshgen_plantlike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se vertices[i].Pos.X += 0.005; } - data->append(tile.getMaterial(), vertices, 4, indices, 6, colours); + data->append(tile, vertices, 4, indices, 6, colours); for (u16 i=0; i<4; i++) { vertices[i].Pos.X -= 0.01; } - data->append(tile.getMaterial(), vertices, 4, indices, 6, colours); + data->append(tile, vertices, 4, indices, 6, colours); } }else{ for (u32 j=0; j<2; j++) { @@ -2232,7 +2232,7 @@ void meshgen_plantlike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se vertices[i].Pos += pos; } - data->append(tile.getMaterial(), vertices, 4, indices, 6, colours); + data->append(tile, vertices, 4, indices, 6, colours); } } @@ -2259,7 +2259,7 @@ void meshgen_plantlike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se vertices[i].Pos += pos; } - data->append(tile.getMaterial(), vertices, 4, indices, 6, colours); + data->append(tile, vertices, 4, indices, 6, colours); } } @@ -2406,7 +2406,7 @@ void meshgen_plantlike_fern(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNod v[i].Pos += pos; } - data->append(tile.getMaterial(), v, 4, indices, 6, colours); + data->append(tile, v, 4, indices, 6, colours); if (!selected.is_coloured && !selected.has_crack) continue; @@ -2415,7 +2415,7 @@ void meshgen_plantlike_fern(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNod v[i].Pos.X -= 0.01; } - data->append(tile.getMaterial(), v, 4, indices, 6, colours); + data->append(tile, v, 4, indices, 6, colours); } u32 max = (data->mesh_detail == 3 ? 8 : 4); for (u32 j=0; jappend(tile.getMaterial(), v, 8, indices, 12, colours); + data->append(tile, v, 8, indices, 12, colours); if (!selected.is_coloured && !selected.has_crack) continue; @@ -2450,7 +2450,7 @@ void meshgen_plantlike_fern(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNod v[i].Pos.Y -= 0.01; } - data->append(tile.getMaterial(), v, 8, indices, 12, colours); + data->append(tile, v, 8, indices, 12, colours); } if (selected.is_coloured || selected.has_crack) @@ -2476,7 +2476,7 @@ void meshgen_plantlike_fern(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNod vertices[i].Pos += pos; } - data->append(tile.getMaterial(), vertices, 4, indices, 6, colours); + data->append(tile, vertices, 4, indices, 6, colours); } } @@ -2700,7 +2700,7 @@ void meshgen_liquid(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &selec vertices[j].Pos += pos; } - data->append(tiles[i].getMaterial(), vertices, 4, indices, 6, colours); + data->append(tiles[i], vertices, 4, indices, 6, colours); } /* @@ -2735,7 +2735,7 @@ void meshgen_liquid(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &selec vertices[j].Pos += pos; } - data->append(tiles[0].getMaterial(), vertices, 4, indices, 6, colours); + data->append(tiles[0], vertices, 4, indices, 6, colours); } } @@ -2912,7 +2912,7 @@ void meshgen_liquid_source(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode for(u16 i=0; i<4; i++) { vertices[i].Pos += pos; } - data->append(tiles[j].getMaterial(), vertices, 4, indices, 6, colours); + data->append(tiles[j], vertices, 4, indices, 6, colours); } } @@ -3035,7 +3035,7 @@ void meshgen_glasslike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se vertices[i].Pos += pos; } - data->append(tiles[j].getMaterial(), vertices, 4, indices, 6, colours); + data->append(tiles[j], vertices, 4, indices, 6, colours); } if (data->mesh_detail > 2 && data->light_detail > 2 && content_features(n.getContent()).light_source > 0) { @@ -3072,7 +3072,7 @@ void meshgen_glasslike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se std::vector colours; meshgen_custom_lights(colours,255,255,255,255,4); - data->append(tile.getMaterial(), vertices, 4, indices, 6, colours); + data->append(tile, vertices, 4, indices, 6, colours); } } } @@ -3210,7 +3210,7 @@ void meshgen_torchlike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se vertices[j][i].Pos += pos; } - data->append(tile.getMaterial(), vertices[j], 4, indices, 6, colours); + data->append(tile, vertices[j], 4, indices, 6, colours); } if (data->mesh_detail > 2 && data->light_detail > 2) { @@ -3246,7 +3246,7 @@ void meshgen_torchlike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se std::vector colours; meshgen_custom_lights(colours,255,255,255,255,4); - data->append(tile.getMaterial(), vertices, 4, indices, 6, colours); + data->append(tile, vertices, 4, indices, 6, colours); } } } @@ -3477,7 +3477,7 @@ void meshgen_firelike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel vertices[i].Pos += pos; } - data->append(tile.getMaterial(), vertices, 4, indices, 6, colours); + data->append(tile, vertices, 4, indices, 6, colours); } } @@ -4653,7 +4653,7 @@ void meshgen_leaflike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel } } - data->append(tile.getMaterial(), vertices, 4, indices, 6, colours); + data->append(tile, vertices, 4, indices, 6, colours); } }else{ TileSpec tile = getNodeTile(n,p,v3s16(1,0,0),selected,NULL); @@ -4685,7 +4685,7 @@ void meshgen_leaflike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel vertices[i].Pos += pos; } - data->append(tile.getMaterial(), vertices, 4, indices, 6, colours); + data->append(tile, vertices, 4, indices, 6, colours); } } @@ -4869,7 +4869,7 @@ void meshgen_wirelike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel u16 indices[] = {0,1,2,2,3,0}; std::vector colours; meshgen_custom_lights(colours,cols[0],cols[1],cols[2],cols[3],4); - data->append(tiles[0].getMaterial(), vertices, 4, indices, 6, colours); + data->append(tiles[0], vertices, 4, indices, 6, colours); } { video::S3DVertex vertices[4] = { @@ -4884,7 +4884,7 @@ void meshgen_wirelike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel u16 indices[] = {0,1,2,2,3,0}; std::vector colours; meshgen_custom_lights(colours,cols[0],cols[1],cols[2],cols[3],4); - data->append(tiles[0].getMaterial(), vertices, 4, indices, 6, colours); + data->append(tiles[0], vertices, 4, indices, 6, colours); } }else{ if (x_plus) { @@ -4900,7 +4900,7 @@ void meshgen_wirelike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel u16 indices[] = {0,1,2,2,3,0}; std::vector colours; meshgen_custom_lights(colours,cols[0],cols[1],cols[2],cols[3],4); - data->append(tiles[0].getMaterial(), vertices, 4, indices, 6, colours); + data->append(tiles[0], vertices, 4, indices, 6, colours); } if (x_minus) { video::S3DVertex vertices[4] = { @@ -4915,7 +4915,7 @@ void meshgen_wirelike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel u16 indices[] = {0,1,2,2,3,0}; std::vector colours; meshgen_custom_lights(colours,cols[0],cols[1],cols[2],cols[3],4); - data->append(tiles[0].getMaterial(), vertices, 4, indices, 6, colours); + data->append(tiles[0], vertices, 4, indices, 6, colours); } if (z_plus) { video::S3DVertex vertices[4] = { @@ -4930,7 +4930,7 @@ void meshgen_wirelike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel u16 indices[] = {0,1,2,2,3,0}; std::vector colours; meshgen_custom_lights(colours,cols[0],cols[1],cols[2],cols[3],4); - data->append(tiles[0].getMaterial(), vertices, 4, indices, 6, colours); + data->append(tiles[0], vertices, 4, indices, 6, colours); } if (z_minus) { video::S3DVertex vertices[4] = { @@ -4945,7 +4945,7 @@ void meshgen_wirelike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel u16 indices[] = {0,1,2,2,3,0}; std::vector colours; meshgen_custom_lights(colours,cols[0],cols[1],cols[2],cols[3],4); - data->append(tiles[0].getMaterial(), vertices, 4, indices, 6, colours); + data->append(tiles[0], vertices, 4, indices, 6, colours); } if (x_plus_y) { video::S3DVertex vertices[4] = { @@ -4960,7 +4960,7 @@ void meshgen_wirelike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel u16 indices[] = {0,1,2,2,3,0}; std::vector colours; meshgen_custom_lights(colours,cols[0],cols[1],cols[2],cols[3],4); - data->append(tiles[0].getMaterial(), vertices, 4, indices, 6, colours); + data->append(tiles[0], vertices, 4, indices, 6, colours); } if (x_minus_y) { video::S3DVertex vertices[4] = { @@ -4975,7 +4975,7 @@ void meshgen_wirelike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel u16 indices[] = {0,1,2,2,3,0}; std::vector colours; meshgen_custom_lights(colours,cols[0],cols[1],cols[2],cols[3],4); - data->append(tiles[0].getMaterial(), vertices, 4, indices, 6, colours); + data->append(tiles[0], vertices, 4, indices, 6, colours); } if (z_plus_y) { video::S3DVertex vertices[4] = { @@ -4990,7 +4990,7 @@ void meshgen_wirelike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel u16 indices[] = {0,1,2,2,3,0}; std::vector colours; meshgen_custom_lights(colours,cols[0],cols[1],cols[2],cols[3],4); - data->append(tiles[0].getMaterial(), vertices, 4, indices, 6, colours); + data->append(tiles[0], vertices, 4, indices, 6, colours); } if (z_minus_y) { video::S3DVertex vertices[4] = { @@ -5005,7 +5005,7 @@ void meshgen_wirelike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel u16 indices[] = {0,1,2,2,3,0}; std::vector colours; meshgen_custom_lights(colours,cols[0],cols[1],cols[2],cols[3],4); - data->append(tiles[0].getMaterial(), vertices, 4, indices, 6, colours); + data->append(tiles[0], vertices, 4, indices, 6, colours); } } return; @@ -5319,7 +5319,7 @@ void meshgen_stairlike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se vertices[i][j].Pos += pos; } - data->append(tiles[i].getMaterial(), vertices[i], vcounts[i], indices[i], icounts[i], colours); + data->append(tiles[i], vertices[i], vcounts[i], indices[i], icounts[i], colours); } }else{ for (int i=0; i<6; i++) { @@ -5343,7 +5343,7 @@ void meshgen_stairlike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se vertices[i][j].Pos += pos; } - data->append(tiles[i].getMaterial(), vertices[i], vcounts[i], indices[i], icounts[i], colours); + data->append(tiles[i], vertices[i], vcounts[i], indices[i], icounts[i], colours); } } }else if (rot) { @@ -5368,7 +5368,7 @@ void meshgen_stairlike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se vertices[i][j].Pos += pos; } - data->append(tiles[i].getMaterial(), vertices[i], vcounts[i], indices[i], icounts[i], colours); + data->append(tiles[i], vertices[i], vcounts[i], indices[i], icounts[i], colours); } }else{ for (int i=0; i<6; i++) { @@ -5389,7 +5389,7 @@ void meshgen_stairlike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se vertices[i][j].Pos += pos; } - data->append(tiles[i].getMaterial(), vertices[i], vcounts[i], indices[i], icounts[i], colours); + data->append(tiles[i], vertices[i], vcounts[i], indices[i], icounts[i], colours); } } } @@ -5485,7 +5485,7 @@ void meshgen_slablike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel vertices[i][j].Pos += pos; } - data->append(tiles[i].getMaterial(), vertices[i], 4, indices, 6, colours); + data->append(tiles[i], vertices[i], 4, indices, 6, colours); } }else{ for (u16 i=0; i<6; i++) { @@ -5509,7 +5509,7 @@ void meshgen_slablike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel vertices[i][j].Pos += pos; } - data->append(tiles[i].getMaterial(), vertices[i], 4, indices, 6, colours); + data->append(tiles[i], vertices[i], 4, indices, 6, colours); } } } @@ -5673,7 +5673,7 @@ void meshgen_trunklike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se v[k].Pos += pos; } - data->append(tile.getMaterial(), v, 10, indices, 24, colours); + data->append(tile, v, 10, indices, 24, colours); } if (!y_plus_any) { for (u16 j=0; j<4; j++) { @@ -5695,7 +5695,7 @@ void meshgen_trunklike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se v[k].Pos += pos; } - data->append(endtile.getMaterial(), v, 6, end_indices, 12, colours); + data->append(endtile, v, 6, end_indices, 12, colours); } } if (!y_minus_any) { @@ -5719,7 +5719,7 @@ void meshgen_trunklike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se v[k].Pos += pos; } - data->append(endtile.getMaterial(), v, 6, end_indices, 12, colours); + data->append(endtile, v, 6, end_indices, 12, colours); } }else if (mud_under) { for (u16 j=0; j<4; j++) { @@ -5741,7 +5741,7 @@ void meshgen_trunklike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se v[k].Pos += pos; } - data->append(tile.getMaterial(), v, 6, base_indices, 12, colours); + data->append(tile, v, 6, base_indices, 12, colours); } } if (x_plus) { @@ -5777,7 +5777,7 @@ void meshgen_trunklike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se v[k].Pos += pos; } - data->append(tile.getMaterial(), v, 10, indices, 24, colours); + data->append(tile, v, 10, indices, 24, colours); } } if (x_minus) { @@ -5812,7 +5812,7 @@ void meshgen_trunklike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se v[k].Pos += pos; } - data->append(tile.getMaterial(), v, 10, indices, 24, colours); + data->append(tile, v, 10, indices, 24, colours); } } if (z_plus) { @@ -5847,7 +5847,7 @@ void meshgen_trunklike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se v[k].Pos += pos; } - data->append(tile.getMaterial(), v, 10, indices, 24, colours); + data->append(tile, v, 10, indices, 24, colours); } } if (z_minus) { @@ -5883,7 +5883,7 @@ void meshgen_trunklike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se v[k].Pos += pos; } - data->append(tile.getMaterial(), v, 10, indices, 24, colours); + data->append(tile, v, 10, indices, 24, colours); } } }else{ /* horizontal trunk */ @@ -5919,7 +5919,7 @@ void meshgen_trunklike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se v[k].Pos += pos; } - data->append(tile.getMaterial(), v, 10, indices, 24, colours); + data->append(tile, v, 10, indices, 24, colours); } if (!x_plus_any) { for (u16 j=0; j<4; j++) { @@ -5942,7 +5942,7 @@ void meshgen_trunklike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se v[k].Pos += pos; } - data->append(endtile.getMaterial(), v, 6, end_indices, 12, colours); + data->append(endtile, v, 6, end_indices, 12, colours); } } if (!x_minus_any) { @@ -5966,7 +5966,7 @@ void meshgen_trunklike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se v[k].Pos += pos; } - data->append(endtile.getMaterial(), v, 6, end_indices, 12, colours); + data->append(endtile, v, 6, end_indices, 12, colours); } } if (z_plus) { @@ -6001,7 +6001,7 @@ void meshgen_trunklike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se v[k].Pos += pos; } - data->append(tile.getMaterial(), v, 10, indices, 24, colours); + data->append(tile, v, 10, indices, 24, colours); } } if (z_minus) { @@ -6037,7 +6037,7 @@ void meshgen_trunklike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se v[k].Pos += pos; } - data->append(tile.getMaterial(), v, 10, indices, 24, colours); + data->append(tile, v, 10, indices, 24, colours); } } }else{ // centred along Z @@ -6072,7 +6072,7 @@ void meshgen_trunklike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se v[k].Pos += pos; } - data->append(tile.getMaterial(), v, 10, indices, 24, colours); + data->append(tile, v, 10, indices, 24, colours); } if (!z_plus_any) { for (u16 j=0; j<4; j++) { @@ -6095,7 +6095,7 @@ void meshgen_trunklike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se v[k].Pos += pos; } - data->append(endtile.getMaterial(), v, 6, end_indices, 12, colours); + data->append(endtile, v, 6, end_indices, 12, colours); } } if (!z_minus_any) { @@ -6119,7 +6119,7 @@ void meshgen_trunklike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se v[k].Pos += pos; } - data->append(endtile.getMaterial(), v, 6, end_indices, 12, colours); + data->append(endtile, v, 6, end_indices, 12, colours); } } if (x_plus) { @@ -6155,7 +6155,7 @@ void meshgen_trunklike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se v[k].Pos += pos; } - data->append(tile.getMaterial(), v, 10, indices, 24, colours); + data->append(tile, v, 10, indices, 24, colours); } } if (x_minus) { @@ -6190,7 +6190,7 @@ void meshgen_trunklike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &se v[k].Pos += pos; } - data->append(tile.getMaterial(), v, 10, indices, 24, colours); + data->append(tile, v, 10, indices, 24, colours); } } } @@ -6269,7 +6269,7 @@ void meshgen_flaglike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel v[i].Pos += pos; } - data->append(flag.getMaterial(), v, 4, indices, 6, colours); + data->append(flag, v, 4, indices, 6, colours); } }else{ for (u16 i=0; i<4; i++) { @@ -6289,7 +6289,7 @@ void meshgen_flaglike(MeshMakeData *data, v3s16 p, MapNode &n, SelectedNode &sel vertices[i].Pos += pos; } - data->append(flag.getMaterial(), vertices, 4, indices, 6, colours); + data->append(flag, vertices, 4, indices, 6, colours); } delete meta; } @@ -6343,7 +6343,7 @@ void meshgen_farnode(MeshMakeData *data, v3s16 p, MapNode &n) vertices[i].Pos += pos; } - data->appendFar(tile.getMaterial(), vertices, 4, indices, 6); + data->appendFar(tile, vertices, 4, indices, 6); } if (meshgen_farface(data,p,n,v3s16(1,0,0))) { TileSpec tile = getNodeTile(n,p,v3s16(1,0,0),selected,NULL); @@ -6360,7 +6360,7 @@ void meshgen_farnode(MeshMakeData *data, v3s16 p, MapNode &n) vertices[i].Pos += pos; } - data->appendFar(tile.getMaterial(), vertices, 4, indices, 6); + data->appendFar(tile, vertices, 4, indices, 6); } if (meshgen_farface(data,p,n,v3s16(0,-1,0))) { TileSpec tile = getNodeTile(n,p,v3s16(0,-1,0),selected,NULL); @@ -6378,7 +6378,7 @@ void meshgen_farnode(MeshMakeData *data, v3s16 p, MapNode &n) vertices[i].Pos += pos; } - data->appendFar(tile.getMaterial(), vertices, 4, indices, 6); + data->appendFar(tile, vertices, 4, indices, 6); } if (meshgen_farface(data,p,n,v3s16(0,1,0))) { TileSpec tile = getNodeTile(n,p,v3s16(0,1,0),selected,NULL); @@ -6395,7 +6395,7 @@ void meshgen_farnode(MeshMakeData *data, v3s16 p, MapNode &n) vertices[i].Pos += pos; } - data->appendFar(tile.getMaterial(), vertices, 4, indices, 6); + data->appendFar(tile, vertices, 4, indices, 6); } if (meshgen_farface(data,p,n,v3s16(0,0,-1))) { TileSpec tile = getNodeTile(n,p,v3s16(0,0,-1),selected,NULL); @@ -6412,7 +6412,7 @@ void meshgen_farnode(MeshMakeData *data, v3s16 p, MapNode &n) vertices[i].Pos += pos; } - data->appendFar(tile.getMaterial(), vertices, 4, indices, 6); + data->appendFar(tile, vertices, 4, indices, 6); } if (meshgen_farface(data,p,n,v3s16(0,0,1))) { TileSpec tile = getNodeTile(n,p,v3s16(0,0,1),selected,NULL); @@ -6429,9 +6429,8 @@ void meshgen_farnode(MeshMakeData *data, v3s16 p, MapNode &n) vertices[i].Pos += pos; } - data->appendFar(tile.getMaterial(), vertices, 4, indices, 6); + data->appendFar(tile, vertices, 4, indices, 6); } } #endif - diff --git a/src/content_mapnode.cpp b/src/content_mapnode.cpp index f332a19..a5dae1c 100644 --- a/src/content_mapnode.cpp +++ b/src/content_mapnode.cpp @@ -2142,7 +2142,9 @@ void content_mapnode_init(bool repeat) i = CONTENT_WATER; f = &content_features(i); f->description = wgettext("Water"); - f->setAllTextures("water.png"); + f->animation_length = 0.8; + f->setAllTextureFlags(MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES); + f->setAllTextures("water_flowing.png"); f->setInventoryTextureCube("water.png", "water.png", "water.png"); f->param_type = CPT_LIGHT; f->param2_type = CPT_LIQUID; @@ -2160,7 +2162,6 @@ void content_mapnode_init(bool repeat) #ifndef SERVER if(!opaque_water) f->vertex_alpha = WATER_ALPHA; - f->setAllTextureFlags(0); f->setAllTextureTypes(MATERIAL_ALPHA_VERTEX); f->post_effect_color = video::SColor(64, 100, 100, 200); #endif @@ -2170,7 +2171,9 @@ void content_mapnode_init(bool repeat) i = CONTENT_WATERSOURCE; f = &content_features(i); f->description = wgettext("Water"); - f->setAllTextures("water.png"); + f->animation_length = 2.0; + f->setAllTextureFlags(MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES); + f->setAllTextures("water_source.png"); f->setInventoryTextureCube("water.png", "water.png", "water.png"); f->param_type = CPT_LIGHT; f->param2_type = CPT_LIQUID; @@ -2187,7 +2190,6 @@ void content_mapnode_init(bool repeat) #ifndef SERVER if(!opaque_water) f->vertex_alpha = WATER_ALPHA; - f->setAllTextureFlags(0); f->setAllTextureTypes(MATERIAL_ALPHA_VERTEX); f->post_effect_color = video::SColor(64, 100, 100, 200); #endif @@ -2199,7 +2201,9 @@ void content_mapnode_init(bool repeat) i = CONTENT_LAVA; f = &content_features(i); f->description = wgettext("Lava"); - f->setAllTextures("lava.png"); + f->animation_length = 3.0; + f->setAllTextureFlags(MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES); + f->setAllTextures("lava_flowing.png"); f->setInventoryTextureCube("lava.png", "lava.png", "lava.png"); f->param_type = CPT_LIGHT; f->param2_type = CPT_LIQUID; @@ -2225,7 +2229,9 @@ void content_mapnode_init(bool repeat) i = CONTENT_LAVASOURCE; f = &content_features(i); f->description = wgettext("Lava"); - f->setAllTextures("lava.png"); + f->animation_length = 3.0; + f->setAllTextureFlags(MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES); + f->setAllTextures("lava_source.png"); f->setInventoryTextureCube("lava.png", "lava.png", "lava.png"); f->param_type = CPT_LIGHT; f->param2_type = CPT_LIQUID; diff --git a/src/map.cpp b/src/map.cpp index 2279340..3a452ec 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -3090,6 +3090,8 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass) // Blocks from which stuff was actually drawn u32 blocks_without_stuff = 0; + float anim_time = m_client->getAnimationTime(); + /* Collect a set of blocks for drawing */ @@ -3272,6 +3274,12 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass) ) continue; + // Animate textures in block mesh + if (block->mesh->isAnimated()) { + //JMutexAutoLock lock(block->mesh_mutex); //needed? + block->mesh->animate(anim_time); + } + // Add to set drawset[block->getPos()] = block; diff --git a/src/mapblock_mesh.cpp b/src/mapblock_mesh.cpp index 4394907..5abd9c0 100644 --- a/src/mapblock_mesh.cpp +++ b/src/mapblock_mesh.cpp @@ -466,6 +466,49 @@ MapBlockMesh::~MapBlockMesh() m_mesh = NULL; m_farmesh->drop(); m_farmesh = NULL; + if (!m_animation_data.empty()) + m_animation_data.clear(); +} + +void MapBlockMesh::animate(float time) +{ + if (!m_mesh) + return; + + for (std::map::iterator it = m_animation_data.begin(); + it != m_animation_data.end(); ++it) { + + AnimationData temp_data = it->second; + const TileSpec &tile = temp_data.tile; + // Figure out current frame + int frame = (int)(time * 1000 / tile.animation_frame_length_ms) % tile.animation_frame_count; + + // If frame doesn't change, skip + if (frame == temp_data.frame) + continue; + + temp_data.frame = frame; + + m_animation_data[it->first] = temp_data; + + // Make sure we don't cause an overflow. Can get removed if future is no problems occuring + if (it->first >= m_mesh->getMeshBufferCount()) { + errorstream << ": animate() Tying to index non existent Buffer." << std::endl; + return; + } + + scene::IMeshBuffer *buf = m_mesh->getMeshBuffer(it->first); + + // Create new texture name from original + if (g_texturesource && buf != 0) { + std::ostringstream os(std::ios::binary); + os << g_texturesource->getTextureName(tile.texture.id); + os << "^[verticalframe:" << (int)tile.animation_frame_count << ":" << frame; + // Set the texture + AtlasPointer ap = g_texturesource->getTexture(os.str()); + buf->getMaterial().setTexture(0, ap.atlas); + } + } } void MapBlockMesh::generate(MeshMakeData *data, v3s16 camera_offset, JMutex *mutex) @@ -479,6 +522,8 @@ void MapBlockMesh::generate(MeshMakeData *data, v3s16 camera_offset, JMutex *mut data->light_detail = g_settings->getU16("light_detail"); m_pos = data->m_blockpos; SelectedNode selected; + if (!m_animation_data.empty()) + m_animation_data.clear(); for(s16 z=0; zm_meshdata.size(); i++) { MeshData &d = data->m_meshdata[i]; + + // - Texture animation + if (d.tile.material_flags & MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES) { + // Add to MapBlockMesh in order to animate these tiles + AnimationData anim_data; + anim_data.tile = d.tile; + anim_data.frame = 0; + m_animation_data[i] = anim_data; + } + // Create meshbuffer // This is a "Standard MeshBuffer", // it's a typedeffed CMeshBuffer scene::SMeshBuffer *buf = new scene::SMeshBuffer(); // Set material - buf->Material = d.material; + buf->Material = d.tile.getMaterial(); // Add to mesh mesh->addMeshBuffer(buf); // Mesh grabbed it @@ -646,7 +701,7 @@ void MapBlockMesh::generate(MeshMakeData *data, v3s16 camera_offset, JMutex *mut // it's a typedeffed CMeshBuffer scene::SMeshBuffer *buf = new scene::SMeshBuffer(); // Set material - buf->Material = d.material; + buf->Material = d.tile.getMaterial(); // Add to mesh fmesh->addMeshBuffer(buf); // Mesh grabbed it @@ -670,6 +725,7 @@ void MapBlockMesh::generate(MeshMakeData *data, v3s16 camera_offset, JMutex *mut m_meshdata.swap(data->m_meshdata); m_fardata.swap(data->m_fardata); refresh(data->m_daynight_ratio); + animate(0.0);// get first frame of animation m_mesh->recalculateBoundingBox(); if (mutex != NULL) diff --git a/src/mapblock_mesh.h b/src/mapblock_mesh.h index ccbe79d..f0a19d3 100644 --- a/src/mapblock_mesh.h +++ b/src/mapblock_mesh.h @@ -50,12 +50,12 @@ struct MeshData { bool single; v3s16 pos; - video::SMaterial material; + TileSpec tile; std::vector indices; std::vector vertices; std::vector colours; std::vector siblings; - MeshData* parent; + MeshData *parent; }; struct MapBlockSound @@ -98,12 +98,12 @@ struct MeshMakeData */ void fill(u32 daynight_ratio, MapBlock *block); - void startSingle(v3s16 pos, video::SMaterial material) + void startSingle(v3s16 pos, TileSpec tile) { MeshData dd; dd.single = true; dd.pos = pos; - dd.material = material; + dd.tile = tile; dd.parent = NULL; m_meshdata.push_back(dd); m_single = &m_meshdata[m_meshdata.size()-1]; @@ -113,7 +113,7 @@ struct MeshMakeData m_single = NULL; } void append( - video::SMaterial material, + TileSpec tile, const video::S3DVertex* const vertices, u32 v_count, const u16* const indices, @@ -125,9 +125,9 @@ struct MeshMakeData if (m_single) { if (m_single->parent) m_single = m_single->parent; - if (m_single->material != material) { + if (m_single->tile != tile) { for (u16 i=0; isiblings.size(); i++) { - if (m_single->siblings[i]->material == material) { + if (m_single->siblings[i]->tile == tile) { d = m_single->siblings[i]; break; } @@ -136,7 +136,7 @@ struct MeshMakeData MeshData dd; dd.single = true; dd.pos = m_single->pos; - dd.material = material; + dd.tile = tile; dd.parent = m_single; m_meshdata.push_back(dd); d = &m_meshdata[m_meshdata.size()-1]; @@ -148,7 +148,7 @@ struct MeshMakeData }else{ for (u32 i=0; i 65535) continue; @@ -160,7 +160,7 @@ struct MeshMakeData if (d == NULL) { MeshData dd; dd.single = false; - dd.material = material; + dd.tile = tile; m_meshdata.push_back(dd); d = &m_meshdata[m_meshdata.size()-1]; } @@ -180,7 +180,7 @@ struct MeshMakeData } } void appendFar( - video::SMaterial material, + TileSpec tile, const video::S3DVertex* const vertices, u32 v_count, const u16* const indices, @@ -190,7 +190,7 @@ struct MeshMakeData MeshData *d = NULL; for (u32 i=0; i 65535) continue; @@ -202,7 +202,7 @@ struct MeshMakeData if (d == NULL) { MeshData dd; dd.single = false; - dd.material = material; + dd.tile = tile; m_fardata.push_back(dd); d = &m_fardata[m_fardata.size()-1]; } @@ -218,6 +218,12 @@ struct MeshMakeData } }; +struct AnimationData +{ + TileSpec tile; + int frame; +}; + class MapBlockMesh { public: @@ -236,6 +242,12 @@ public: void generate(MeshMakeData *data, v3s16 camera_offset, JMutex *mutex); void refresh(u32 daynight_ratio); + void animate(float time); + + bool isAnimated() + { + return !m_animation_data.empty(); + } void updateCameraOffset(v3s16 camera_offset); @@ -247,7 +259,8 @@ private: v3s16 m_camera_offset; std::vector m_meshdata; std::vector m_fardata; + + std::map m_animation_data; }; #endif - diff --git a/src/mapnode.cpp b/src/mapnode.cpp index 642b58a..72fae43 100644 --- a/src/mapnode.cpp +++ b/src/mapnode.cpp @@ -102,9 +102,28 @@ void ContentFeatures::setTexture(u16 i, std::string name, u8 alpha) { used_texturenames[name] = true; - if(g_texturesource) - { + if (g_texturesource) { tiles[i].texture = g_texturesource->getTexture(name); + + // we have an animated texture! + if (tiles[i].material_flags & MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES) { + // Get raw texture size to determine frame count by aspect ratio + video::ITexture *t = g_texturesource->getTextureRaw(name); + if (t != NULL) { + v2u32 size = t->getOriginalSize(); + int frame_count = size.Y / size.X; + int frame_length_ms = 1000.0 * animation_length / frame_count; + tiles[i].animation_frame_count = frame_count; + tiles[i].animation_frame_length_ms = frame_length_ms; + + // If there are no frames for an animation, switch + // animation off (so that having specified an animation + // for something but not using it in the texture pack + // gives no overhead) + if (frame_count == 1) + tiles[i].material_flags &= ~MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES; + } + } } if(alpha != 255) @@ -721,5 +740,3 @@ u8 face_light(MapNode n, MapNode n2, v3s16 face_dir) return (ln<<4)|ld; } - - diff --git a/src/mapnode.h b/src/mapnode.h index 1378546..20d171d 100644 --- a/src/mapnode.h +++ b/src/mapnode.h @@ -300,6 +300,8 @@ struct ContentFeatures TileSpec tiles[6]; TileSpec meta_tiles[6]; + float animation_length; + video::ITexture *inventory_texture; std::string inventory_texture_name; @@ -528,6 +530,7 @@ struct ContentFeatures param_type = CPT_NONE; param2_type = CPT_NONE; draw_type = CDT_AIRLIKE; + animation_length = 1.0; is_ground_content = false; light_propagates = false; sunlight_propagates = false; diff --git a/src/tile.cpp b/src/tile.cpp index 58c12b9..1312ee7 100644 --- a/src/tile.cpp +++ b/src/tile.cpp @@ -647,7 +647,7 @@ void TextureSource::buildMainAtlas() src_x = pos_in_atlas.X; } s32 y = y0 + pos_in_atlas.Y; - s32 src_y = MYMAX(pos_in_atlas.Y, MYMIN(pos_in_atlas.Y + (s32)dim.Height - 1, y)); + s32 src_y = MYMAX((int)pos_in_atlas.Y, MYMIN((int)pos_in_atlas.Y + (int)dim.Height - 1, y)); s32 dst_y = y; video::SColor c = atlas_img->getPixel(src_x, src_y); atlas_img->setPixel(dst_x,dst_y,c); @@ -1255,8 +1255,7 @@ bool generate_image(std::string part_of_name, video::IImage *& baseimg, video::IImage *image = driver->createImageFromFile(path.c_str()); - if(image == NULL) - { + if (image == NULL) { infostream<<"generate_image(): Loading path \"" <drop(); } + /* + [verticalframe:N:I + Crops a frame of a vertical animation. + N = frame count, I = frame index + */ + else if(part_of_name.substr(0,15) == "[verticalframe:") + { + Strfnd sf(part_of_name); + sf.next(":"); + u32 frame_count = stoi(sf.next(":")); + u32 frame_index = stoi(sf.next(":")); + + if(baseimg == NULL){ + errorstream<<"generate_image(): baseimg!=NULL " + <<"for part_of_name=\""<getDimension(); + frame_size.Y /= frame_count; + + video::IImage *img = driver->createImage(video::ECF_A8R8G8B8, + frame_size); + if (!img) { + errorstream <<"generate_image(): Could not create image " + << "for part_of_name=\"" << part_of_name + << "\", cancelling." << std::endl; + return false; + } + + // Fill target image with transparency + img->fill(video::SColor(0,0,0,0)); + + core::dimension2d dim = frame_size; + core::position2d pos_dst(0, 0); + core::position2d pos_src(0, frame_index * frame_size.Y); + baseimg->copyToWithAlpha(img, pos_dst, + core::rect(pos_src, dim), + video::SColor(255,255,255,255), + NULL); + // Replace baseimg + baseimg->drop(); + baseimg = img; + } /* [text:x,y,X,Y,string writes string to texture diff --git a/src/tile.h b/src/tile.h index 1c97d43..064609d 100644 --- a/src/tile.h +++ b/src/tile.h @@ -271,6 +271,7 @@ enum MaterialType{ // Material flags #define MATERIAL_FLAG_BACKFACE_CULLING 0x01 +#define MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES 0x02 /* This fully defines the looks of a tile. @@ -287,8 +288,12 @@ struct TileSpec material_flags( //0 // <- DEBUG, Use the one below MATERIAL_FLAG_BACKFACE_CULLING - ) + ), + animation_frame_count(0), + animation_frame_length_ms(0) { + video::SMaterial m; + m_material = m; } bool operator==(TileSpec &other) @@ -301,6 +306,11 @@ struct TileSpec ); } + bool operator!=(TileSpec &other) + { + return !(*this == other); + } + // Sets everything else except the texture in the material void applyMaterialOptions(video::SMaterial &material) const { @@ -327,10 +337,9 @@ struct TileSpec video::SMaterial getMaterial() { - video::SMaterial m; - applyMaterialOptions(m); - m.setTexture(0,texture.atlas); - return m; + applyMaterialOptions(m_material); + m_material.setTexture(0, texture.atlas); + return m_material; } AtlasPointer texture; @@ -340,6 +349,11 @@ struct TileSpec u8 material_type; // Material flags u8 material_flags; + + u8 animation_frame_count; + u16 animation_frame_length_ms; + + video::SMaterial m_material; }; #endif