From 4f7b499217ea5ebffdf0903ef15dddbfa3014dd3 Mon Sep 17 00:00:00 2001 From: jsrobson10 Date: Fri, 26 Jun 2020 15:11:40 +1000 Subject: [PATCH] Added temperature to the player and added moisture --- .../display/DisplayLighting.java | 45 ++- .../display/DisplayRenderUI.java | 25 +- .../entity/player/EntityPlayer.java | 21 ++ src/projectzombie/init/Models.java | 2 + .../world/layer/layergen/LayerGen.java | 1 + .../layer/layergen/LayerGenBossArena.java | 5 + .../world/layer/layergen/LayerGenCaves.java | 53 +++- .../world/layer/layergen/LayerGenEarth.java | 11 +- .../layer/layergen/LayerGenLavaCaves.java | 5 + src/resources/shader/environmentRenderer.fsh | 22 +- src/resources/texture/gui/temperature.png | Bin 0 -> 5596 bytes src/resources/texture/gui/water.png | Bin 0 -> 655 bytes src/resources/texture/list.txt | 296 +++++++++--------- 13 files changed, 314 insertions(+), 172 deletions(-) create mode 100644 src/resources/texture/gui/temperature.png create mode 100644 src/resources/texture/gui/water.png diff --git a/src/projectzombie/display/DisplayLighting.java b/src/projectzombie/display/DisplayLighting.java index bd8a585..2ade1ec 100755 --- a/src/projectzombie/display/DisplayLighting.java +++ b/src/projectzombie/display/DisplayLighting.java @@ -28,13 +28,14 @@ public class DisplayLighting int x, y; private int getID(int x, int y) { - return (x + y * w) * 3 + 1; + return (x + y * w) * 4 + 1; } } private static int lighting_last_x = 0; private static int lighting_last_y = 0; private static boolean lighting_dirty = false; + private static boolean lighting_new = false; public static int lightmap; private static Lighting lighting; @@ -49,6 +50,7 @@ public class DisplayLighting private synchronized static void setLighting(Lighting lighting) { DisplayLighting.lighting = lighting; + lighting_new = true; } public DisplayLighting() { @@ -255,6 +257,23 @@ public class DisplayLighting } } + if(lighting_new) + { + for(int i=0;i public abstract void generateChunk(Chunk chunk, Layer layer, Random rand, Vec2i pos); public abstract double getTemperatureStatic(Layer layer, Vec2d pos); public abstract double getTemperatureDynamic(Layer layer, Vec2d pos); + public abstract double getHumidity(Layer layer, Vec2d pos); public abstract void spawnEntities(Layer layer, Random rand); public abstract TileState getTileDestroyed(); public abstract ColorRange getLightLevel(); diff --git a/src/projectzombie/world/layer/layergen/LayerGenBossArena.java b/src/projectzombie/world/layer/layergen/LayerGenBossArena.java index 9bd11fa..3f41126 100755 --- a/src/projectzombie/world/layer/layergen/LayerGenBossArena.java +++ b/src/projectzombie/world/layer/layergen/LayerGenBossArena.java @@ -124,5 +124,10 @@ public class LayerGenBossArena extends LayerGen implements LayerGenRememberPlaye public double getTemperatureDynamic(Layer layer, Vec2d pos) { return 0.8; } + + @Override + public double getHumidity(Layer layer, Vec2d pos) { + return 0; + } } diff --git a/src/projectzombie/world/layer/layergen/LayerGenCaves.java b/src/projectzombie/world/layer/layergen/LayerGenCaves.java index ac7cb9d..40f8600 100755 --- a/src/projectzombie/world/layer/layergen/LayerGenCaves.java +++ b/src/projectzombie/world/layer/layergen/LayerGenCaves.java @@ -20,6 +20,39 @@ import projectzombie.world.layer.Layer; public class LayerGenCaves extends LayerGen { + @Override + public double getTemperatureStatic(Layer layer, Vec2d pos) + { + // Get the noise generator + OpenSimplexNoise terrain_noise = layer.noise_gens[0]; + return MathHelpers.map(terrain_noise.eval(pos.x/64.0, pos.y/64.0), -1, 1, 0, 0.6); + } + + @Override + public double getTemperatureDynamic(Layer layer, Vec2d pos) { + return getTemperatureStatic(layer, pos); + } + + @Override + public double getHumidity(Layer layer, Vec2d pos) + { + // Get the noise generator + OpenSimplexNoise terrain_noise = layer.noise_gens[1]; + return MathHelpers.map(terrain_noise.eval(pos.x/64.0, pos.y/64.0), -1, 1, 0.3, 0.8); + } + + @Override + public void init(Layer layer) { + super.init(layer); + + Random rand = new Random(layer.seed); + + layer.noise_gens = new OpenSimplexNoise[] { + new OpenSimplexNoise(rand.nextLong()), + new OpenSimplexNoise(rand.nextLong()) + }; + } + @Override public void generateChunk(Chunk chunk, Layer layer, Random rand, Vec2i c_pos) { @@ -79,6 +112,18 @@ public class LayerGenCaves extends LayerGen if(chunk.getBackTile(chest_pos).tile == getTileDestroyed().tile) { chunk.setFrontTile(new TileState(Tiles.CHEST, 1), chest_pos); } + + // Spawn entities + Entity zombie = new EntityZombie(new Vec2d( + chunk.c_pos.x * 16 + RandomHelpers.randrange(rand, 0, 16), + chunk.c_pos.y * 16 + RandomHelpers.randrange(rand, 0, 16))); + + if( + chunk.getBackTile(new Vec2i((int)zombie.pos.x, + (int)zombie.pos.y)).tile == getTileDestroyed().tile + ) { + chunk.spawnEntity(zombie); + } } @Override @@ -119,14 +164,6 @@ public class LayerGenCaves extends LayerGen return new ColorRange(new Vec3d(0, 0, 0), new Vec3d(0, 0, 0)); } - @Override - public double getTemperatureStatic(Layer layer, Vec2d pos) { - return 0.5; - } - @Override - public double getTemperatureDynamic(Layer layer, Vec2d pos) { - return 0.5; - } } diff --git a/src/projectzombie/world/layer/layergen/LayerGenEarth.java b/src/projectzombie/world/layer/layergen/LayerGenEarth.java index e78e88f..3812d26 100755 --- a/src/projectzombie/world/layer/layergen/LayerGenEarth.java +++ b/src/projectzombie/world/layer/layergen/LayerGenEarth.java @@ -38,14 +38,23 @@ public class LayerGenEarth extends LayerGen return MathHelpers.map(terrain_noise.eval(pos.x/64.0, pos.y/64.0), -1, 1, light, 0.5 + light); } + @Override + public double getHumidity(Layer layer, Vec2d pos) + { + // Get the noise generator + OpenSimplexNoise terrain_noise = layer.noise_gens[1]; + return MathHelpers.map(terrain_noise.eval(pos.x/64.0, pos.y/64.0), -1, 1, 0, 1); + } + @Override public void init(Layer layer) { super.init(layer); - Random rand = new Random(layer.lseed); + Random rand = new Random(layer.seed); layer.noise_gens = new OpenSimplexNoise[] { new OpenSimplexNoise(rand.nextLong()), + new OpenSimplexNoise(rand.nextLong()) }; } diff --git a/src/projectzombie/world/layer/layergen/LayerGenLavaCaves.java b/src/projectzombie/world/layer/layergen/LayerGenLavaCaves.java index 248594b..48c09ab 100755 --- a/src/projectzombie/world/layer/layergen/LayerGenLavaCaves.java +++ b/src/projectzombie/world/layer/layergen/LayerGenLavaCaves.java @@ -170,5 +170,10 @@ public class LayerGenLavaCaves extends LayerGen public double getTemperatureDynamic(Layer layer, Vec2d pos) { return 0.7; } + + @Override + public double getHumidity(Layer layer, Vec2d pos) { + return 0; + } } diff --git a/src/resources/shader/environmentRenderer.fsh b/src/resources/shader/environmentRenderer.fsh index 739f50a..6e03785 100644 --- a/src/resources/shader/environmentRenderer.fsh +++ b/src/resources/shader/environmentRenderer.fsh @@ -20,8 +20,10 @@ uniform vec2 lightmap_size; uniform vec2 tex_cut; uniform vec4 color; -vec3 color_grass_min = vec3(0.05, 0.8, 0); -vec3 color_grass_max = vec3(1, 0.6, 0); +vec3 color_grass_hot_wet = vec3(0.05, 0.8, 0); +vec3 color_grass_hot_dry = vec3(1, 0.6, 0); +vec3 color_grass_cold_wet = vec3(0.075, 0.533, 0.047); +vec3 color_grass_cold_dry = vec3(0.812, 0.761, 0); float map(float x, float in_min, float in_max, float out_min, float out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; @@ -45,6 +47,14 @@ float smoothStep(float a) { return a * a * (3 - 2 * a); } +float interpolate2(float x, float y, float v00, float v01, float v10, float v11) { + return (v00 * x + v10 * (1 - x)) * y + (v01 * x + v11 * (1 - x)) * (1 - y); +} + +vec3 interpolate2RGB(float x, float y, vec3 v00, vec3 v01, vec3 v10, vec3 v11) { + return (v00 * x + v10 * (1 - x)) * y + (v01 * x + v11 * (1 - x)) * (1 - y); +} + void main() { vec4 light = texture(lightmap, vec2( @@ -54,10 +64,12 @@ void main() vec3 light_day = mapVec(scaleLight(light.r), 0, 1, lighting_day_low, lighting_day_high); vec3 light_src = vec3(1, 1, 1) * (scaleLight(light.g) - abs(pLightMapPos.y) * 0.1); - vec4 color_white = vec4(1, 1, 1, 1); - vec4 color_grass = vec4(mapVec(smoothStep(light.b), 0, 1, color_grass_min, color_grass_max), 1); + vec4 color_grass = vec4(interpolate2RGB( + smoothStep(light.b), smoothStep(light.a), + color_grass_cold_dry, color_grass_hot_dry, + color_grass_cold_wet, color_grass_hot_wet), 1); - FragColor = texture(atlas, pTexture) * (mod(int(pFlags / 4), 2) == 1 ? color_grass : color_white) * + FragColor = texture(atlas, pTexture) * (mod(int(pFlags / 4), 2) == 1 ? color_grass : vec4(1,1,1,1)) * color * vec4(biggest(light_day, light_src), 1); discard(FragColor.a == 0 || (pPos.x > tex_cut.y && tex_cut.x > 0.5)); diff --git a/src/resources/texture/gui/temperature.png b/src/resources/texture/gui/temperature.png new file mode 100644 index 0000000000000000000000000000000000000000..1005b71be88f8ab4f75fb0cba1044d16ea0f25bc GIT binary patch literal 5596 zcmeAS@N?(olHy`uVBq!ia0y~yVBi2@4mJh`h9ms@x)~UlH&%s2lmsP~D-;yvr)B1( zDwI?fq$;FVWTr7NRNPt{9=+|c2G5`CT2-9W95|*m8_v0GJ>zNl!|SDwY-%POZggc4 zbDi4I@~XaG`tLziX7^87hD!w4V(fmZNKUoT37<9J=Eu*SG11cZe`V%7+&Fk}*VENc zx7N4C*T>y>+_Sx|E4%xM=>@Y-QWw5XWS#nwL#QtD&ztKGEA^&MSR}i!Z_|xO{J~NA z>BTQ>J^uT-x0`P;(X6tZ`057lXJb8%J4NYt82t+w|4J;qJ~Ls??Ppw0dCRuneAxCP z`qOo(yPNl4e|KW~o?mxmrzZyM+T+lcHxQWtYy3{l?hS zX1bW|){U3%7d+-Tb@xw{gW;X7U1wDn9#Q0HedOaT={Dt1C+jMcr1Qe*c`@nHI~W#C z*J9HSQtZYqc_y*%^5+BKi}+y6MOa&nxT**7CW?wIP4 z6@Mm2=UuzGaQ-2^)lDatnKEb`y1`}OQGMPyVYy6&fnYLQzaUepg81{)7N#{?!VX>K z5xOZtOZ$7vd!FxGB(!ArMsr7wqo<5ACdafz+|&MayvBtuwe(e}>55Dh-&xJvb{QN8 zo$f!`WchiS*cqLuO){}x0+Tz$l6?%-J^88^ESsQnbV|@UCrReiBd1=>e<+z+vRJ;9 zXK`<#PqLoJ{72o>0@fUvIU4hOb>1)oXh7&V=l0Ra}4PzSDcx#ADvOPFg=*;r+c{!+pZLHMg0sE~`5? zHF9IBXqg{-`_<`ZwW}}Hbu3`YUX`8u-DB5ho2_4#FtW^T>RaD*al6Mn#a&HL9v=AK zcqO&-N5kR!k+-yhO8MF%x>G%>U+>%=^QpgGZ2EfJsCV{WcAJ%#a;q#Y|2*C1V)mE! zI_-O$7RlbWJ}7_C!e#0D1et&f;RbwxFV%D8?)&Q9cVGMc)BFSTFFiClRU2Z}yw~L< zr*W;vNln$4RzE&#Sw;PtFzNH6y$t_?)?Lc>S{MC`>lh(4Ruo+}vv@D;exq%T(0t+k86}R7+}CN#?Jv~Zq4VKP$4tMog6E_%+^pjOj&C*vi~y*%w5v)rs ziDiDH_THEJ*Be&)Us~;}TgCDvhgtl(ukTG}z4C^A>dt1V;arzQK2<*W+p|xT`^!D1 z*wu0Qy|r`f7&2dJRWi%SFdb$+75BNaJUu)A|GdmE-spanW~5}trC?K(l4cd;;s!OMC?(BSDWjyMz)D}g zyu4hm+*mKaC|%#s($Z4jz)0W7NVg~@O}Dr*uOzWTH?LS3WCX+vm(=3qqRfJl%=|nB zkeP`|`K2YcN=jS`3JOreL5bb9q6BUMhz~ZtxFkj2v!Eo|q$0P#wW37d$iTot*T6{E z$Wk9!e?@MAuPm&XYryIqu;Ji0+w{ za)4DzesX4t6_{z7oS0^6mSm)BZeeDiYm#PQplg|GVySCvXp)*{k!F%=o|uSalxJRX zNn&1dD#)mc+ycGK%oMAnv?O!OGz$Y=b3+RYU6aH#b6tyM6H8r7OUoqFRD2C}6D|13Yb&jPwi;A^|yxC29FZxwc9^nR%rZ2#Ju)+|=NbL{Oj^npzqg8k?9{ zni`lJ8(LZ*6osW06=&w>fy^{C&@+U{q$FFpKEjtgSAxT7FanK zr6!i-7lq{K=h!NN+@xTnXJ`P<3ko)%RP9<(V&#*coCwMdV8y8^cHoQv&TdYL>H1)< zjXplb7$ya0%;ifnim6YcfW&0QTCuOB3m*6)Cn_{?0L8XIQLp5CWAuJR;f6#EHwoj1qv{! zD(FqXi>u;-;-;8g1Ysdu6{1-oD!M<`fE8= literal 0 HcmV?d00001 diff --git a/src/resources/texture/gui/water.png b/src/resources/texture/gui/water.png new file mode 100644 index 0000000000000000000000000000000000000000..1a359bfe8073106c81806eb0d8309c12a68210da GIT binary patch literal 655 zcmeAS@N?(olHy`uVBq!ia0y~yVBi2@4mJh`h9ms@x)~T4TQi-V13aCb6$*;-(=u~X z85lGs)=sqbIP4&EG(LE%k|?|N3X7B#eqt`JC6~2C7CNmEjVd+Rxn=8xC5oPfg(5NB ze04fuvN3Z?OAAC<4)P1AyQ{m3YksWvT++%@^*UQR4W>eVw-4{zAPSIv>t-%=9}e=-zSEiCbIujG0ewMU%y& zA@h}1C9{kS(_z+Aai1&8)3fvc&&&Msoq4xW(Gl_KTB!^S3~Wi>?k)^c46Y242Q@Em zXJBC9EbxddW?Tjz|igK;us=vxwLOD zZ?l1b+kM4V**2VV58V>{uHRwmV4cwCspFleF{eu-aLV<%{Xt%dkzz_sk1g05W_q5R z`Fht3`HOcwH5nhgV|X%WrgGCYDb1x9tJxhw-Lrj_nm7~gm;Wzopr E0ChnDMF0Q* literal 0 HcmV?d00001 diff --git a/src/resources/texture/list.txt b/src/resources/texture/list.txt index 7ce9d58..342fc21 100644 --- a/src/resources/texture/list.txt +++ b/src/resources/texture/list.txt @@ -1,157 +1,159 @@ -./text/char_question.png -./text/char_l_a.png -./text/char_u_j.png -./text/char_l_u.png -./text/char_u_s.png -./text/char_l_s.png -./text/char_plus.png -./text/char_l_e.png -./text/char_7.png -./text/char_minus.png -./text/char_u_r.png -./text/char_u_l.png -./text/char_obracket.png -./text/char_u_m.png -./text/char_l_t.png -./text/char_percent.png -./text/char_l_y.png -./text/char_0.png -./text/char_4.png -./text/char_l_r.png -./text/char_l_m.png -./text/char_cbracket.png -./text/char_u_g.png -./text/char_u_q.png -./text/char_u_i.png -./text/char_l_w.png -./text/char_l_v.png -./text/char_fslash.png -./text/char_u_p.png -./text/char_gthan.png -./text/char_8.png -./text/char_unknown.png -./text/char_u_n.png -./text/char_l_i.png -./text/char_u_y.png -./text/char_l_p.png -./text/char_lthan.png -./text/char_l_g.png -./text/char_bslash.png -./text/char_1.png -./text/char_u_z.png -./text/char_l_f.png -./text/char_u_w.png -./text/char_9.png -./text/char_l_x.png -./text/char_l_o.png -./text/char_equals.png -./text/char_l_d.png -./text/char_dollar.png -./text/char_hashtag.png -./text/char_l_q.png -./text/char_u_o.png -./text/char_6.png -./text/char_u_d.png -./text/char_u_e.png -./text/char_exclamation.png -./text/char_vertical.png -./text/char_u_k.png -./text/char_u_c.png -./text/char_l_n.png -./text/char_u_b.png -./text/char_u_f.png -./text/char_l_h.png -./text/char_l_k.png -./text/char_u_t.png -./text/char_3.png -./text/char_u_v.png -./text/char_u_h.png -./text/char_u_a.png -./text/char_l_b.png -./text/char_underscore.png -./text/char_u_x.png -./text/char_comma.png -./text/char_l_l.png -./text/char_5.png -./text/char_colon.png -./text/char_l_z.png -./text/char_space.png -./text/char_2.png -./text/char_l_j.png -./text/char_fullstop.png -./text/char_l_c.png -./text/char_u_u.png +./tile/rock.png +./tile/ladder.png +./tile/water.png +./tile/ladder_up.png +./tile/cactus4.png +./tile/cactus2.png +./tile/dirt.png +./tile/wall.png +./tile/tree_base.png +./tile/cactus1.png +./tile/tunnel_down.png +./tile/stone.png +./tile/snow.png +./tile/boss_portal.png +./tile/sand.png +./tile/lantern.png +./tile/chest.png +./tile/cactus3.png +./tile/lava.png +./tile/tree_leaves.png +./tile/lava_flow.png +./tile/snow_pile.png +./tile/grass.png +./tile/rock_sandstone.png ./list.txt -./player/player_white_front_moving.png -./player/player_white_back_moving.png -./player/player_black_back_moving.png -./player/player_black_back_still.png +./item/rock.png +./item/ammo_box.png +./item/shield_upgrade.png +./item/grappling_hook.png +./item/health_potion.png +./item/gun_upgrade.png ./player/player_white_back_still.png ./player/player_white_front_still.png ./player/player_black_front_moving.png ./player/player_black_front_still.png -./particle/smoke_trail.png -./particle/water.png -./particle/smoke_0.png -./particle/smoke_1.png -./particle/blood.png -./particle/lava.png -./particle/bullet.png -./particle/smoke_2.png -./particle/smoke_4.png -./particle/smoke_3.png -./particle/smoke_5.png -./gui/health_empty.png -./gui/button_hover.png -./gui/button_normal.png -./gui/hotbar.png -./gui/health_full.png -./gui/hotbar_selected.png -./gui/shield.png +./player/player_black_back_moving.png +./player/player_black_back_still.png +./player/player_white_back_moving.png +./player/player_white_front_moving.png +./gui/water.png ./gui/gun.png -./tile/cactus4.png -./tile/dirt.png -./tile/lantern.png -./tile/wall.png -./tile/cactus2.png -./tile/rock.png -./tile/water.png -./tile/stone.png -./tile/tree_leaves.png -./tile/ladder_up.png -./tile/lava_flow.png -./tile/grass.png -./tile/chest.png -./tile/lava.png -./tile/snow.png -./tile/rock_sandstone.png -./tile/cactus1.png -./tile/tunnel_down.png -./tile/snow_pile.png -./tile/boss_portal.png -./tile/ladder.png -./tile/sand.png -./tile/tree_base.png -./tile/cactus3.png -./entity/flare.png -./entity/grappling_hook.png -./entity/zombie_back_moving.png -./entity/tnt.png +./gui/health_empty.png +./gui/hotbar_selected.png +./gui/health_full.png +./gui/temperature.png +./gui/hotbar.png +./gui/button_normal.png +./gui/shield.png +./gui/button_hover.png +./text/char_bslash.png +./text/char_dollar.png +./text/char_l_w.png +./text/char_u_d.png +./text/char_u_t.png +./text/char_space.png +./text/char_l_x.png +./text/char_l_k.png +./text/char_6.png +./text/char_unknown.png +./text/char_comma.png +./text/char_obracket.png +./text/char_u_w.png +./text/char_7.png +./text/char_l_f.png +./text/char_vertical.png +./text/char_plus.png +./text/char_u_a.png +./text/char_9.png +./text/char_u_k.png +./text/char_u_n.png +./text/char_percent.png +./text/char_u_m.png +./text/char_exclamation.png +./text/char_1.png +./text/char_l_q.png +./text/char_l_z.png +./text/char_l_h.png +./text/char_u_c.png +./text/char_l_g.png +./text/char_l_s.png +./text/char_fullstop.png +./text/char_u_j.png +./text/char_l_m.png +./text/char_l_t.png +./text/char_u_v.png +./text/char_colon.png +./text/char_l_i.png +./text/char_l_y.png +./text/char_u_l.png +./text/char_u_e.png +./text/char_5.png +./text/char_2.png +./text/char_3.png +./text/char_l_p.png +./text/char_fslash.png +./text/char_l_u.png +./text/char_u_f.png +./text/char_u_u.png +./text/char_l_e.png +./text/char_l_l.png +./text/char_u_g.png +./text/char_u_q.png +./text/char_u_b.png +./text/char_l_o.png +./text/char_minus.png +./text/char_l_v.png +./text/char_lthan.png +./text/char_u_s.png +./text/char_equals.png +./text/char_8.png +./text/char_underscore.png +./text/char_u_x.png +./text/char_0.png +./text/char_l_d.png +./text/char_l_c.png +./text/char_l_j.png +./text/char_u_z.png +./text/char_u_h.png +./text/char_hashtag.png +./text/char_gthan.png +./text/char_cbracket.png +./text/char_u_i.png +./text/char_question.png +./text/char_u_o.png +./text/char_u_y.png +./text/char_l_r.png +./text/char_l_b.png +./text/char_l_a.png +./text/char_l_n.png +./text/char_u_p.png +./text/char_u_r.png +./text/char_4.png ./entity/armored_zombie_back_moving.png -./entity/armored_zombie_front_moving.png -./entity/dummy.png -./entity/armored_zombie_front_still.png -./entity/armored_zombie_back_still.png -./entity/zombie_front_moving.png -./entity/boss1/boss_walking_firing.png +./entity/zombie_front_still.png +./entity/tnt.png +./entity/flare.png +./entity/boss1/boss_walking.png ./entity/boss1/boss_firing.png ./entity/boss1/boss_still.png -./entity/boss1/boss_walking.png +./entity/boss1/boss_walking_firing.png +./entity/armored_zombie_back_still.png +./entity/armored_zombie_front_moving.png +./entity/grappling_hook.png ./entity/zombie_back_still.png -./entity/zombie_front_still.png -./item/grappling_hook.png -./item/gun_upgrade.png -./item/shield_upgrade.png -./item/rock.png -./item/ammo_box.png -./item/health_potion.png +./entity/dummy.png +./entity/zombie_back_moving.png +./entity/armored_zombie_front_still.png +./entity/zombie_front_moving.png +./particle/smoke_1.png +./particle/water.png +./particle/blood.png +./particle/smoke_3.png +./particle/smoke_4.png +./particle/smoke_2.png +./particle/smoke_0.png +./particle/bullet.png +./particle/lava.png +./particle/smoke_trail.png +./particle/smoke_5.png