From c80f16ae742bdd8f09af940463a3f2b5d8413ecc Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 3 Oct 2020 23:31:56 -0500 Subject: [PATCH] Started to add particles. --- assets/voxygen/shaders/particle-vert.glsl | 8 ++ common/src/comp/inventory/item/tool.rs | 4 +- voxygen/src/render/pipelines/particle.rs | 1 + voxygen/src/scene/particle.rs | 106 +++++++++++++++------- 4 files changed, 84 insertions(+), 35 deletions(-) diff --git a/assets/voxygen/shaders/particle-vert.glsl b/assets/voxygen/shaders/particle-vert.glsl index 87d09d4a27..04ecb6b32c 100644 --- a/assets/voxygen/shaders/particle-vert.glsl +++ b/assets/voxygen/shaders/particle-vert.glsl @@ -51,6 +51,7 @@ const int BEE = 11; const int GROUND_SHOCKWAVE = 12; const int HEALING_BEAM = 13; const int ENERGY_NATURE = 14; +const int FLAMETHROWER = 15; // meters per second squared (acceleration) const float earth_gravity = 9.807; @@ -286,6 +287,13 @@ void main() { vec4(vec3(0, 1, 0), 1), spin_in_axis(vec3(rand6, rand7, rand8), rand9 * 3) ); + } else if (inst_mode == FLAMETHROWER) { + attr = Attr( + inst_dir * lifetime / inst_lifespan, + vec3(1), + vec4(1, 0.3 + rand5 * 0.4, 0, 0.4), + spin_in_axis(vec3(rand6, rand7, rand8), rand9 * 3) + ); } else { attr = Attr( linear_motion( diff --git a/common/src/comp/inventory/item/tool.rs b/common/src/comp/inventory/item/tool.rs index d476ea556b..156a178e93 100644 --- a/common/src/comp/inventory/item/tool.rs +++ b/common/src/comp/inventory/item/tool.rs @@ -413,12 +413,12 @@ impl Tool { energy_cost: 0, buildup_duration: Duration::from_millis(250), recover_duration: Duration::from_millis(250), - beam_duration: Duration::from_secs(1), + beam_duration: Duration::from_millis(500), base_hps: 0, base_dps: (100.0 * self.base_power()) as u32, tick_rate: 2.0, range: 15.0, - max_angle: 45.0, + max_angle: 22.5, lifesteal_eff: 0.0, energy_regen: 50, energy_drain: 0, diff --git a/voxygen/src/render/pipelines/particle.rs b/voxygen/src/render/pipelines/particle.rs index 929fdbb062..22ccb56491 100644 --- a/voxygen/src/render/pipelines/particle.rs +++ b/voxygen/src/render/pipelines/particle.rs @@ -111,6 +111,7 @@ pub enum ParticleMode { GroundShockwave = 12, HealingBeam = 13, EnergyNature = 14, + FlameThrower = 15, } impl ParticleMode { diff --git a/voxygen/src/scene/particle.rs b/voxygen/src/scene/particle.rs index 55b22e4787..307f638251 100644 --- a/voxygen/src/scene/particle.rs +++ b/voxygen/src/scene/particle.rs @@ -354,16 +354,52 @@ impl ParticleMgr { if let CharacterState::BasicBeam(b) = character_state { let particle_ori = b.particle_ori.unwrap_or(*ori.vec()); if b.stage_section == StageSection::Cast { - for i in 0..self.scheduler.heartbeats(Duration::from_millis(1)) { - self.particles.push(Particle::new_beam( - b.static_data.beam_duration, - time + i as f64 / 1000.0, - ParticleMode::HealingBeam, - pos.0 + particle_ori * 0.5 + Vec3::new(0.0, 0.0, b.offset), - pos.0 - + particle_ori * b.static_data.range - + Vec3::new(0.0, 0.0, b.offset), - )); + if b.static_data.base_hps > 0 { + for i in 0..self.scheduler.heartbeats(Duration::from_millis(1)) { + self.particles.push(Particle::new_beam( + b.static_data.beam_duration, + time + i as f64 / 1000.0, + ParticleMode::HealingBeam, + pos.0 + particle_ori * 0.5 + Vec3::new(0.0, 0.0, b.offset), + pos.0 + + particle_ori * b.static_data.range + + Vec3::new(0.0, 0.0, b.offset), + )); + } + } else { + let mut rng = thread_rng(); + let (phi, theta) = (particle_ori.z.acos(), particle_ori.y.atan2(particle_ori.x)); + for _ in 0..self.scheduler.heartbeats(Duration::from_millis(1)) { + let phi2 = phi + rng.gen_range(-b.static_data.max_angle.to_radians(), b.static_data.max_angle.to_radians()); + let theta2 = theta + rng.gen_range(-b.static_data.max_angle.to_radians(), b.static_data.max_angle.to_radians()); + let random_ori = Vec3::new(phi2.sin()*theta2.cos(), phi2.sin()*theta2.sin(), phi2.cos()).try_normalized().unwrap_or(particle_ori); + self.particles.push(Particle::new_beam( + b.static_data.beam_duration, + time, + ParticleMode::FlameThrower, + pos.0 + random_ori * 0.5 + Vec3::new(0.0, 0.0, b.offset), + pos.0 + + random_ori * b.static_data.range + + Vec3::new(0.0, 0.0, b.offset), + )); + } + /*self.particles.resize_with( + self.particles.len() + 10 * usize::from(self.scheduler.heartbeats(Duration::from_millis(1))), + || { + let phi2 = phi + rng.gen_range(-b.static_data.max_angle.to_radians(), b.static_data.max_angle.to_radians()); + let theta2 = theta + rng.gen_range(-b.static_data.max_angle.to_radians(), b.static_data.max_angle.to_radians()); + let random_ori = Vec3::new(phi2.sin()*theta2.cos(), phi2.sin()*theta2.sin(), phi2.cos()).try_normalized().unwrap_or(particle_ori); + Particle::new_beam( + b.static_data.beam_duration, + time, + ParticleMode::FlameThrower, + pos.0 + random_ori * 0.5 + Vec3::new(0.0, 0.0, b.offset), + pos.0 + + random_ori * b.static_data.range + + Vec3::new(0.0, 0.0, b.offset), + ) + }, + );*/ } } } @@ -514,38 +550,42 @@ impl ParticleMgr { let theta = ori.0.y.atan2(ori.0.x); let dtheta = radians / distance; - // 1 / 3 the size of terrain voxel - let scale = 1.0 / 3.0; + if shockwave.properties.requires_ground { + // 1 / 3 the size of terrain voxel + let scale = 1.0 / 3.0; - let scaled_speed = shockwave.properties.speed * scale; + let scaled_speed = shockwave.properties.speed * scale; - let heartbeats = self - .scheduler - .heartbeats(Duration::from_millis(scaled_speed as u64)); - let new_particle_count = distance / scale * heartbeats as f32; - self.particles.reserve(new_particle_count as usize); + let heartbeats = self + .scheduler + .heartbeats(Duration::from_millis(scaled_speed as u64)); + let new_particle_count = distance / scale * heartbeats as f32; + self.particles.reserve(new_particle_count as usize); - for heartbeat in 0..heartbeats { - let sub_tick_interpolation = scaled_speed * 1000.0 * heartbeat as f32; + for heartbeat in 0..heartbeats { + let sub_tick_interpolation = scaled_speed * 1000.0 * heartbeat as f32; - let distance = - shockwave.properties.speed * (elapsed as f32 - sub_tick_interpolation); + let distance = + shockwave.properties.speed * (elapsed as f32 - sub_tick_interpolation); - for d in 0..((distance / scale) as i32) { - let arc_position = theta - radians / 2.0 + dtheta * d as f32 * scale; + for d in 0..((distance / scale) as i32) { + let arc_position = theta - radians / 2.0 + dtheta * d as f32 * scale; - let position = - pos.0 + distance * Vec3::new(arc_position.cos(), arc_position.sin(), 0.0); + let position = + pos.0 + distance * Vec3::new(arc_position.cos(), arc_position.sin(), 0.0); - let position_snapped = ((position / scale).floor() + 0.5) * scale; + let position_snapped = ((position / scale).floor() + 0.5) * scale; - self.particles.push(Particle::new( - Duration::from_millis(250), - time, - ParticleMode::GroundShockwave, - position_snapped, - )); + self.particles.push(Particle::new( + Duration::from_millis(250), + time, + ParticleMode::GroundShockwave, + position_snapped, + )); + } } + } else { + } } }