mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Initial particle work
This commit is contained in:
parent
5eea73f793
commit
bf7e84c6ae
@ -73,6 +73,7 @@ const int ICE_SPIKES = 31;
|
|||||||
const int DRIP = 32;
|
const int DRIP = 32;
|
||||||
const int TORNADO = 33;
|
const int TORNADO = 33;
|
||||||
const int DEATH = 34;
|
const int DEATH = 34;
|
||||||
|
const int ENERGY_BUFFING = 35;
|
||||||
|
|
||||||
// meters per second squared (acceleration)
|
// meters per second squared (acceleration)
|
||||||
const float earth_gravity = 9.807;
|
const float earth_gravity = 9.807;
|
||||||
@ -568,6 +569,16 @@ void main() {
|
|||||||
spin_in_axis(vec3(rand6, rand7, rand8), percent() * 10 + 3 * rand9)
|
spin_in_axis(vec3(rand6, rand7, rand8), percent() * 10 + 3 * rand9)
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
case ENERGY_BUFFING:
|
||||||
|
f_reflect = 0.0;
|
||||||
|
spiral_radius = start_end(1 - pow(abs(rand5), 5), 1) * length(inst_dir);
|
||||||
|
attr = Attr(
|
||||||
|
spiral_motion(vec3(0, 0, rand3 + 1), spiral_radius, lifetime, abs(rand0), rand1 * 2 * PI) + vec3(0, 0, rand2),
|
||||||
|
vec3(6 * abs(rand4) * (1 - slow_start(2)) * pow(spiral_radius / length(inst_dir), 0.5)),
|
||||||
|
vec4(vec3(1.4), 1),
|
||||||
|
spin_in_axis(vec3(rand6, rand7, rand8), rand9 * 3)
|
||||||
|
);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
attr = Attr(
|
attr = Attr(
|
||||||
linear_motion(
|
linear_motion(
|
||||||
|
@ -777,6 +777,14 @@ impl Body {
|
|||||||
Body::Arthropod(_) => true,
|
Body::Arthropod(_) => true,
|
||||||
_ => false,
|
_ => false,
|
||||||
},
|
},
|
||||||
|
BuffKind::Regeneration | BuffKind::ProtectingWard | BuffKind::Hastened => matches!(
|
||||||
|
self,
|
||||||
|
Body::Object(
|
||||||
|
object::Body::GnarlingTotemRed
|
||||||
|
| object::Body::GnarlingTotemGreen
|
||||||
|
| object::Body::GnarlingTotemWhite
|
||||||
|
)
|
||||||
|
),
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -85,6 +85,7 @@ pub enum ParticleMode {
|
|||||||
Drip = 32,
|
Drip = 32,
|
||||||
Tornado = 33,
|
Tornado = 33,
|
||||||
Death = 34,
|
Death = 34,
|
||||||
|
EnergyBuffing = 35,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ParticleMode {
|
impl ParticleMode {
|
||||||
|
@ -910,6 +910,7 @@ impl ParticleMgr {
|
|||||||
let ecs = state.ecs();
|
let ecs = state.ecs();
|
||||||
let time = state.get_time();
|
let time = state.get_time();
|
||||||
let mut rng = thread_rng();
|
let mut rng = thread_rng();
|
||||||
|
let dt = scene_data.state.get_delta_time();
|
||||||
|
|
||||||
for (pos, auras) in (
|
for (pos, auras) in (
|
||||||
&ecs.read_storage::<Pos>(),
|
&ecs.read_storage::<Pos>(),
|
||||||
@ -945,6 +946,16 @@ impl ParticleMgr {
|
|||||||
kind: buff::BuffKind::Regeneration,
|
kind: buff::BuffKind::Regeneration,
|
||||||
..
|
..
|
||||||
} => {
|
} => {
|
||||||
|
if auras.auras.iter().any(|(_, aura)| {
|
||||||
|
matches!(aura.aura_kind, aura::AuraKind::Buff {
|
||||||
|
kind: buff::BuffKind::ProtectingWard,
|
||||||
|
..
|
||||||
|
})
|
||||||
|
}) {
|
||||||
|
// If same entity has both protecting ward and regeneration auras, skip
|
||||||
|
// particles for regeneration
|
||||||
|
continue;
|
||||||
|
}
|
||||||
let heartbeats = self.scheduler.heartbeats(Duration::from_millis(5));
|
let heartbeats = self.scheduler.heartbeats(Duration::from_millis(5));
|
||||||
self.particles.resize_with(
|
self.particles.resize_with(
|
||||||
self.particles.len()
|
self.particles.len()
|
||||||
@ -963,6 +974,56 @@ impl ParticleMgr {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
aura::AuraKind::Buff {
|
||||||
|
kind: buff::BuffKind::Burning,
|
||||||
|
..
|
||||||
|
} => {
|
||||||
|
let num_particles = aura.radius.powi(2) * dt / inline_tweak::tweak!(20.0);
|
||||||
|
self.particles.resize_with(
|
||||||
|
self.particles.len() + num_particles as usize,
|
||||||
|
|| {
|
||||||
|
let rand_pos = {
|
||||||
|
let mut x = (rng.gen::<f32>() - 0.5) * 2.0;
|
||||||
|
let mut y = (rng.gen::<f32>() - 0.5) * 2.0;
|
||||||
|
while (x.powi(2) + y.powi(2)) > 1.0 {
|
||||||
|
x = (rng.gen::<f32>() - 0.5) * 2.0;
|
||||||
|
y = (rng.gen::<f32>() - 0.5) * 2.0;
|
||||||
|
}
|
||||||
|
Vec2::new(x, y) * aura.radius + pos.0.xy()
|
||||||
|
};
|
||||||
|
let max_dur = Duration::from_secs(1);
|
||||||
|
Particle::new_directed(
|
||||||
|
aura.duration.map_or(max_dur, |dur| dur.min(max_dur)),
|
||||||
|
time,
|
||||||
|
ParticleMode::FlameThrower,
|
||||||
|
rand_pos.with_z(pos.0.z),
|
||||||
|
rand_pos.with_z(pos.0.z + 1.0),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
aura::AuraKind::Buff {
|
||||||
|
kind: buff::BuffKind::Hastened,
|
||||||
|
..
|
||||||
|
} => {
|
||||||
|
let heartbeats = self.scheduler.heartbeats(Duration::from_millis(5));
|
||||||
|
self.particles.resize_with(
|
||||||
|
self.particles.len()
|
||||||
|
+ aura.radius.powi(2) as usize * usize::from(heartbeats) / 300,
|
||||||
|
|| {
|
||||||
|
let rand_dist = aura.radius * (1.0 - rng.gen::<f32>().powi(100));
|
||||||
|
let init_pos = Vec3::new(rand_dist, 0_f32, 0_f32);
|
||||||
|
let max_dur = Duration::from_secs(1);
|
||||||
|
Particle::new_directed(
|
||||||
|
aura.duration.map_or(max_dur, |dur| dur.min(max_dur)),
|
||||||
|
time,
|
||||||
|
ParticleMode::EnergyBuffing,
|
||||||
|
pos.0,
|
||||||
|
pos.0 + init_pos,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
_ => {},
|
_ => {},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -385,7 +385,10 @@ impl GnarlingFortification {
|
|||||||
supplement.add_entity(random_gnarling(wpos, dynamic_rng));
|
supplement.add_entity(random_gnarling(wpos, dynamic_rng));
|
||||||
},
|
},
|
||||||
GnarlingStructure::ChieftainHut => {
|
GnarlingStructure::ChieftainHut => {
|
||||||
supplement.add_entity(gnarling_chieftain(wpos, dynamic_rng));
|
supplement.add_entity(gnarling_chieftain(
|
||||||
|
wpos.xy().with_z(wpos.z + 8),
|
||||||
|
dynamic_rng,
|
||||||
|
));
|
||||||
let left_inner_guard_pos = wpos + ori.dir() * 8 + ori.cw().dir() * 2;
|
let left_inner_guard_pos = wpos + ori.dir() * 8 + ori.cw().dir() * 2;
|
||||||
supplement.add_entity(wood_golem(left_inner_guard_pos, dynamic_rng));
|
supplement.add_entity(wood_golem(left_inner_guard_pos, dynamic_rng));
|
||||||
let right_inner_guard_pos = wpos + ori.dir() * 8 + ori.ccw().dir() * 2;
|
let right_inner_guard_pos = wpos + ori.dir() * 8 + ori.ccw().dir() * 2;
|
||||||
|
Loading…
Reference in New Issue
Block a user