forked from VoxeLibre/VoxeLibre
Merge pull request 'Implement new fire particles' (#1305) from iliekprogrammar/MineClone2:fire_particle into master
Reviewed-on: MineClone2/MineClone2#1305
This commit is contained in:
commit
502666932f
|
@ -28,7 +28,72 @@ local alldirs=
|
||||||
{ x = 0, y = 0, z = 1}
|
{ x = 0, y = 0, z = 1}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-- 3 exptime variants because the animation is not tied to particle expiration time.
|
||||||
|
-- 3 colorized variants to imitate minecraft's
|
||||||
|
local smoke_pdef_base = {
|
||||||
|
amount = 0.001,
|
||||||
|
time = 0,
|
||||||
|
-- minpos = vector.add(pos, { x = -0.45, y = -0.45, z = -0.45 }),
|
||||||
|
-- maxpos = vector.add(pos, { x = 0.45, y = 0.45, z = 0.45 }),
|
||||||
|
minvel = { x = -0.1, y = 0.3, z = -0.1 },
|
||||||
|
maxvel = { x = 0.1, y = 1.6, z = 0.1 },
|
||||||
|
-- minexptime = 3 exptime variants,
|
||||||
|
-- maxexptime = 3 exptime variants
|
||||||
|
minsize = 4.0,
|
||||||
|
maxsize = 4.5,
|
||||||
|
-- texture = "mcl_particles_smoke_anim.png^[colorize:#000000:(3 colourize variants)",
|
||||||
|
animation = {
|
||||||
|
type = "vertical_frames",
|
||||||
|
aspect_w = 8,
|
||||||
|
aspect_h = 8,
|
||||||
|
-- length = 3 exptime variants
|
||||||
|
},
|
||||||
|
collisiondetection = true,
|
||||||
|
}
|
||||||
|
local smoke_pdef_cached = {}
|
||||||
local spawn_smoke = function(pos)
|
local spawn_smoke = function(pos)
|
||||||
|
local min = math.min
|
||||||
|
local new_minpos = vector.add(pos, { x = -0.45, y = -0.45, z = -0.45 })
|
||||||
|
local new_maxpos = vector.add(pos, { x = 0.45, y = 0.45, z = 0.45 })
|
||||||
|
|
||||||
|
-- populate the cache
|
||||||
|
if not next(smoke_pdef_cached) then
|
||||||
|
-- the last frame plays for 1/8 * N seconds, so we can take advantage of it
|
||||||
|
-- to have varying exptime for each variant.
|
||||||
|
local exptimes = { 0.75, 1.5, 4.0 }
|
||||||
|
local colorizes = { "199", "209", "243" } -- round(78%, 82%, 90% of 256) - 1
|
||||||
|
|
||||||
|
local id = 1
|
||||||
|
for _,exptime in ipairs(exptimes) do
|
||||||
|
for _,colorize in ipairs(colorizes) do
|
||||||
|
smoke_pdef_base.minpos = new_minpos
|
||||||
|
smoke_pdef_base.maxpos = new_maxpos
|
||||||
|
smoke_pdef_base.maxexptime = exptime
|
||||||
|
smoke_pdef_base.animation.length = exptime + 0.1
|
||||||
|
-- minexptime must be set such that the last frame is actully rendered,
|
||||||
|
-- even if its very short. Larger exptime -> larger range
|
||||||
|
smoke_pdef_base.minexptime = min(exptime, (7.0/8.0 * (exptime + 0.1) + 0.1))
|
||||||
|
smoke_pdef_base.texture = "mcl_particles_smoke_anim.png^[colorize:#000000:" ..colorize
|
||||||
|
|
||||||
|
smoke_pdef_cached[id] = table.copy(smoke_pdef_base)
|
||||||
|
|
||||||
|
mcl_particles.add_node_particlespawner(pos, smoke_pdef_cached[id], "high")
|
||||||
|
|
||||||
|
id = id + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- cache already populated
|
||||||
|
else
|
||||||
|
for i, smoke_pdef in ipairs(smoke_pdef_cached) do
|
||||||
|
smoke_pdef.minpos = new_minpos
|
||||||
|
smoke_pdef.maxpos = new_maxpos
|
||||||
|
mcl_particles.add_node_particlespawner(pos, smoke_pdef, "high")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[ Old smoke pdef
|
||||||
|
local spawn_smoke = function(pos)
|
||||||
mcl_particles.add_node_particlespawner(pos, {
|
mcl_particles.add_node_particlespawner(pos, {
|
||||||
amount = 0.1,
|
amount = 0.1,
|
||||||
time = 0,
|
time = 0,
|
||||||
|
@ -48,6 +113,8 @@ local spawn_smoke = function(pos)
|
||||||
length = 2.1,
|
length = 2.1,
|
||||||
},
|
},
|
||||||
}, "high")
|
}, "high")
|
||||||
|
-- ]]
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
Loading…
Reference in New Issue