From 86449c950b43ac8e1a6e17727329fcdcc19a5a9b Mon Sep 17 00:00:00 2001 From: RynKitty Date: Wed, 31 Jul 2024 13:23:57 +0100 Subject: [PATCH 1/3] ryn changes --- assets/images/forest.png | Bin 889 -> 743 bytes assets/images/map.png | Bin 51847 -> 44957 bytes assets/light_frag.glsl | 40 ++++++++++++++++ assets/light_shader.wgsl | 39 ++++++++++++++++ assets/light_vert.glsl | 18 ++++++++ src/game/enemy.rs | 5 +- src/game/lighting.rs | 53 ++++++++++++++++++++++ src/game/mod.rs | 2 + src/game/spawn/map.rs | 3 +- src/game/spawn/mod.rs | 2 + src/game/spawn/player.rs | 30 ++++++++++-- src/game/spell_system/helpers.rs | 12 ++++- src/game/spell_system/spells/modifiers.rs | 5 +- src/game/spell_system/spells/targeters.rs | 23 +++++----- src/screen/loading.rs | 1 + 15 files changed, 212 insertions(+), 21 deletions(-) create mode 100644 assets/light_frag.glsl create mode 100644 assets/light_shader.wgsl create mode 100644 assets/light_vert.glsl create mode 100644 src/game/lighting.rs diff --git a/assets/images/forest.png b/assets/images/forest.png index fec14c4490f5e19a47dc058b07694a41b22ce1b4..13e15f6f3df3d5c8457a5dcfb6df7e907ab14c1f 100644 GIT binary patch delta 707 zcmV;!0zCcs2ImEkFnzaTh;K?LmHT%Fo= zI7nk~qtZ>_8o`k|b$)>R1dI+fhyR2PDpc4Q3`g)4x>?Vzc2{2y3}Qd#y`7nzS-0+o z4`vE77deV@Ibt8OGAX%eA#_gtBn_J0FFd%FoM8{lZVzg_19 z6aore6%pG_h%|{V0xGjBLg)b7O;{*|=6TN5$^jsYqnZO;fI3d39BC4vbw7MKH%TO& zi2h)W#bgWsczXL1b2$PUVjn=YM-Ce)r{>X%mnB}sHl@CoSZ^MB8fw~hTL8K!5Xi#t6JoLZ{NlD zavDo^PrFz;pwsD&q#EB7ZoI^?DVEb1!78&$UZz8}iMZ1pH7=_hFCU*d5mdOiM;*SX zNt{(2j&lU7?Az8owWXMME1+DNtqZMyPIn|K86_eKDSrcgfTH4LY(_kWRYa)XD}rO2 zBoT|rScrIf`_fiT-f*Ot7kI!Z;BcG^_XS6uMA=w>u*PDTi3(ODL7pZNplML11UH6& z$1Y7G@dNZ-jZpQGqV<4ovyIeP%#ekNZjsIlIS-hWmua=Us}fGT*!pT}^Myrj<6%%q zxQDnM@_&vg2U@?w@tNv0CnD(jIe+mG_{+z(m&R_s{lsE2&gX!Qym$AE>-{5u?22*` zud^#G|NM|_@tR=DArS)Ay(+ou`GTDA^6@DZtYG*{nm6@;+>5A4C5<1B^PBOX!nIwuraa_8<}pe@;QuY4N%c19(Da}2_5M*x pUa1f*r^TJ@w2LcuJQX~7{{doWj6Qi%juHR>002ovPDHLkV1kJ-QuY7< delta 854 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

HggiFaO=)-a2*D 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 F{1*o*x`zM& diff --git a/assets/light_frag.glsl b/assets/light_frag.glsl new file mode 100644 index 0000000..024ad38 --- /dev/null +++ b/assets/light_frag.glsl @@ -0,0 +1,40 @@ +#version 450 + +layout(location = 0) in vec2 frag_uv; +layout(location = 1) in vec3 world_position; + +layout(location = 0) out vec4 out_color; + +layout(set = 2, binding = 0) uniform Material { + vec4 material_color; +}; + +layout(set = 2, binding = 1) uniform LightCount { + uint light_count; +}; + +layout(set = 2, binding = 2) buffer Lights { + vec3 lights[]; +}; + +void main() { + bool discard_fragment = false; + + for (uint i = 0u; i < light_count; i++) { + vec2 light_pos = lights[i].xy; + float light_radius = lights[i].z; + float lr_squared = light_radius * light_radius; + vec2 diff = world_position.xy - light_pos; + float distancesquared = dot(diff, diff); + if (distancesquared < lr_squared) { + discard_fragment = true; + break; + } + } + + if (discard_fragment) { + discard; + } + + out_color = material_color; +} diff --git a/assets/light_shader.wgsl b/assets/light_shader.wgsl new file mode 100644 index 0000000..028f031 --- /dev/null +++ b/assets/light_shader.wgsl @@ -0,0 +1,39 @@ +#import bevy_sprite::{ + mesh2d_vertex_output::VertexOutput, +} + +@group(2) @binding(0) var material_color: vec4; +@group(2) @binding(1) var light_count: u32; +@group(2) @binding(2) var lights: array, 64>; + + +@fragment +fn fragment( + in: VertexOutput +) -> @location(0) vec4 { + + var world_pos = in.world_position; + var discard_fragment = false; + + for (var i = 0u; i < light_count; i = i + 1u) { + let light_pos = lights[i].xy; + let light_radius = lights[i].z; + let lr_squared = light_radius * light_radius; + let diff = world_pos.xy - light_pos; + let distancesquared = dot(diff, diff); + if (distancesquared < lr_squared) { + discard_fragment = true; + break; + } + } + + if (discard_fragment) { + discard; + } + + return material_color; +} + + + + diff --git a/assets/light_vert.glsl b/assets/light_vert.glsl new file mode 100644 index 0000000..3f16770 --- /dev/null +++ b/assets/light_vert.glsl @@ -0,0 +1,18 @@ +#version 450 + +layout(location = 0) in vec3 in_position; +layout(location = 1) in vec2 in_uv; + +layout(location = 0) out vec2 frag_uv; +layout(location = 1) out vec3 world_position; + +layout(set = 0, binding = 0) uniform CameraData { + mat4 view_proj; + mat4 model; +}; + +void main() { + frag_uv = in_uv; + world_position = (model * vec4(in_position, 1.0)).xyz; + gl_Position = view_proj * vec4(in_position, 1.0); +} diff --git a/src/game/enemy.rs b/src/game/enemy.rs index 617b2b3..7ae6c45 100644 --- a/src/game/enemy.rs +++ b/src/game/enemy.rs @@ -452,6 +452,9 @@ fn clear_dead_enemies( // let rng = rand::thread_rng(); for (health, pos, xp, enemy) in enemy_query.iter() { + let mut exp_pos = *pos; + exp_pos.translation.z += 30.; + if health.health <= 0.0 { commands.entity(enemy).despawn_recursive(); commands.spawn(( @@ -460,7 +463,7 @@ fn clear_dead_enemies( ItemDrop, SpriteBundle { texture: images[&ImageAsset::Exp].clone_weak(), - transform: *pos, + transform: exp_pos, ..default() }, ExpireTimer { diff --git a/src/game/lighting.rs b/src/game/lighting.rs new file mode 100644 index 0000000..3ceb5ae --- /dev/null +++ b/src/game/lighting.rs @@ -0,0 +1,53 @@ +use bevy::app::Update; +use bevy::asset::{Asset, Assets}; +use bevy::color::LinearRgba; +use bevy::math::Vec3; +use bevy::prelude::{Component, GlobalTransform, Query, ResMut, TypePath}; +use bevy::render::render_resource::{AsBindGroup, ShaderRef}; +use bevy::sprite::{Material2d, Material2dPlugin}; + +pub(super) fn plugin(app: &mut bevy::app::App) { + app.add_plugins(Material2dPlugin::::default()); + app.add_systems(Update, update_light_material); +} + +#[derive(Component)] +pub struct GameLight { + pub radius: f32, + #[allow(dead_code)] + pub priority: u32, +} + +#[derive(AsBindGroup, TypePath, Debug, Clone, Asset)] +pub struct LightMaterial { + #[uniform(0)] + pub color: LinearRgba, + #[uniform(1)] + pub light_count: u32, + #[uniform(2)] + pub lights: [Vec3; 64], +} + +impl Material2d for LightMaterial { + fn fragment_shader() -> ShaderRef { + "light_shader.wgsl".into() + } +} + +fn update_light_material( + mut materials: ResMut>, + light_sources: Query<(&GameLight, &GlobalTransform)>, +) { + let mut lights = [Vec3::ZERO; 64]; + let mut light_count = 0; + + for (light, transform) in light_sources.iter() { + lights[light_count] = transform.translation().truncate().extend(light.radius); + light_count += 1; + } + + for (_, material) in materials.iter_mut() { + material.light_count = light_count as u32; + material.lights.copy_from_slice(&lights); + } +} diff --git a/src/game/mod.rs b/src/game/mod.rs index ad95609..f564d0f 100644 --- a/src/game/mod.rs +++ b/src/game/mod.rs @@ -12,6 +12,7 @@ pub mod enemy; pub mod enemy_casting; pub mod input; pub mod levelling; +pub mod lighting; pub mod physics; pub mod player_mods; pub mod projectiles; @@ -32,6 +33,7 @@ pub(super) fn plugin(app: &mut App) { projectiles::plugin, physics::plugin, player_mods::plugin, + lighting::plugin, )); app.register_type::(); diff --git a/src/game/spawn/map.rs b/src/game/spawn/map.rs index 80721e9..d135ce9 100644 --- a/src/game/spawn/map.rs +++ b/src/game/spawn/map.rs @@ -3,13 +3,12 @@ use bevy::{prelude::*, utils::HashSet}; use bevy_ecs_tilemap::prelude::*; +use super::{borders::SpawnBorders, player::SpawnPlayer, prompt::SpawnPrompt, wand::SpawnWand}; use crate::{ game::assets::{ImageAsset, ImageAssets}, screen::Screen, }; -use super::{borders::SpawnBorders, player::SpawnPlayer, prompt::SpawnPrompt, wand::SpawnWand}; - pub(super) fn plugin(app: &mut App) { app.observe(spawn_level); app.insert_resource(ChunkManager::default()); diff --git a/src/game/spawn/mod.rs b/src/game/spawn/mod.rs index 273698a..84a5d1a 100644 --- a/src/game/spawn/mod.rs +++ b/src/game/spawn/mod.rs @@ -9,6 +9,7 @@ pub mod map; pub mod player; pub mod prompt; pub mod wand; +// pub mod lighting; pub(super) fn plugin(app: &mut App) { app.add_plugins(( @@ -17,5 +18,6 @@ pub(super) fn plugin(app: &mut App) { wand::plugin, borders::plugin, prompt::plugin, + // lighting::plugin, )); } diff --git a/src/game/spawn/player.rs b/src/game/spawn/player.rs index d5a44d5..e5b4010 100644 --- a/src/game/spawn/player.rs +++ b/src/game/spawn/player.rs @@ -2,9 +2,7 @@ use std::time::Duration; -use avian2d::prelude::*; -use bevy::prelude::*; - +use crate::game::lighting::{GameLight, LightMaterial}; use crate::game::physics::GameLayer; use crate::game::player_mods::damage::player_hit_by_projectile; use crate::game::player_mods::movement::{Movement, PlayerMovement}; @@ -19,6 +17,8 @@ use crate::{ }, screen::Screen, }; +use avian2d::prelude::*; +use bevy::prelude::*; pub(super) fn plugin(app: &mut App) { app.observe(spawn_player); @@ -37,6 +37,8 @@ fn spawn_player( mut commands: Commands, images: Res, mut texture_atlas_layouts: ResMut>, + #[allow(dead_code)] _light_materials: ResMut>, + #[allow(dead_code)] _meshes: ResMut>, ) { // A texture atlas is a way to split one image with a grid into multiple sprites. // By attaching it to a [`SpriteBundle`] and providing an index, we can specify which section of the image we want to see. @@ -87,5 +89,27 @@ fn spawn_player( StateScoped(Screen::Playing), )); + p.insert(GameLight { + radius: 100.0, + priority: 1, + }); + p.observe(player_hit_by_projectile); + + // p.with_children(|parent| { + // parent.spawn(( + // Name::new("Darkness"), + // MaterialMesh2dBundle { + // mesh: meshes.add(Rectangle::new(660.,380.)).into(), + // material: light_materials.add(LightMaterial { + // color: LinearRgba::new(0.0,0.0,0.0,0.9), + // light_count: 2, + // lights: [Vec3::ZERO; 64], + // }), + // transform: Transform::from_translation(Vec3::new(0., 0., 20.)), + // ..Default::default() + // }, + // StateScoped(Screen::Playing), + // )); + // }); } diff --git a/src/game/spell_system/helpers.rs b/src/game/spell_system/helpers.rs index ead44be..0530188 100644 --- a/src/game/spell_system/helpers.rs +++ b/src/game/spell_system/helpers.rs @@ -2,6 +2,7 @@ use std::time::Duration; use crate::game::assets::particles::{ParticleAsset, ParticleAssets}; use crate::game::assets::spell_gfx::{SpellGFXAsset, SpellGFXAssets}; +use crate::game::lighting::GameLight; use crate::game::projectiles::{ProjectileDamage, ProjectileLifetime, ProjectileTeam}; use crate::game::spell_system::casting::SpellCastContext; use crate::screen::Screen; @@ -76,7 +77,7 @@ pub fn spawn_spell_projectile( Sensor, SpatialBundle { transform: Transform::from_translation( - caster_transform.translation + Vec3::new(0.0, 0.0, 0.1), + caster_transform.translation + Vec3::new(0.0, 0.0, 30.), ) .with_rotation(rotation) .with_scale(Vec3::splat(1.0)), @@ -88,7 +89,7 @@ pub fn spawn_spell_projectile( ProjectileDamage { damage: stats.damage, hits_remaining: stats.num_hits, - team, + team: team.clone(), knockback_force: stats.knockback_force, }, ProjectileLifetime { @@ -98,6 +99,13 @@ pub fn spawn_spell_projectile( )) .id(); + if team == ProjectileTeam::Player { + world.entity_mut(spell).insert(GameLight { + radius: 20.0, + priority: 10, + }); + } + match spell_model { SpellModel::None => {} SpellModel::StaticSprite(gfx) => { diff --git a/src/game/spell_system/spells/modifiers.rs b/src/game/spell_system/spells/modifiers.rs index abef5e6..a0bfb64 100644 --- a/src/game/spell_system/spells/modifiers.rs +++ b/src/game/spell_system/spells/modifiers.rs @@ -47,7 +47,7 @@ pub(super) fn get_spells() -> Vec<(SpellComponent, i32)> { }), icon_id: 17, }, - 100, + 50, ), ( SpellComponent { @@ -58,7 +58,7 @@ pub(super) fn get_spells() -> Vec<(SpellComponent, i32)> { }), icon_id: 18, }, - 20, + 100, ), ] } @@ -221,6 +221,7 @@ impl SpellEffect for Duplicate { // get ProjectileDamage component if let Some(mut projectile_damage) = mod_world.get_mut::(e) { projectile_damage.damage *= damage_decrease; + projectile_damage.knockback_force *= damage_decrease; }; }); diff --git a/src/game/spell_system/spells/targeters.rs b/src/game/spell_system/spells/targeters.rs index dc4e8e8..7cc8df2 100644 --- a/src/game/spell_system/spells/targeters.rs +++ b/src/game/spell_system/spells/targeters.rs @@ -37,17 +37,17 @@ pub(super) fn get_spells() -> Vec<(SpellComponent, i32)> { }, 15, ), - ( - SpellComponent { - data: Box::new(HomingData { - homing_range: 50.0, - homing_rate: 0.99, - target: HomingTarget::PlayerOrbit, - }), - icon_id: 38, - }, - 15, - ), + // ( + // SpellComponent { + // data: Box::new(HomingData { + // homing_range: 50.0, + // homing_rate: 0.99, + // target: HomingTarget::PlayerOrbit, + // }), + // icon_id: 38, + // }, + // 15, + // ), ] } @@ -61,6 +61,7 @@ pub(super) fn get_spells() -> Vec<(SpellComponent, i32)> { #[derive(Clone, Debug, Copy)] pub enum HomingTarget { ClosestEnemy, + #[allow(dead_code)] PlayerOrbit, } impl HomingTarget { diff --git a/src/screen/loading.rs b/src/screen/loading.rs index 32c30a0..90f3c3c 100644 --- a/src/screen/loading.rs +++ b/src/screen/loading.rs @@ -36,6 +36,7 @@ fn enter_loading(mut commands: Commands, asset_server: Res) { fn check_all_loaded( image_assets: Res>, audio_assets: Res>, + #[allow(dead_code)] _shader_assets: Res>, images: Res, sfxs: Res, soundtracks: Res, From 1e2b50cf64f8973d439fc20e521346f61468b253 Mon Sep 17 00:00:00 2001 From: RynKitty Date: Wed, 31 Jul 2024 13:24:18 +0100 Subject: [PATCH 2/3] ryn changes --- src/game/spell_system/spells/cores.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/game/spell_system/spells/cores.rs b/src/game/spell_system/spells/cores.rs index 59861a5..96669b4 100644 --- a/src/game/spell_system/spells/cores.rs +++ b/src/game/spell_system/spells/cores.rs @@ -98,7 +98,7 @@ impl SpellEffect for ZapSpell { damage: self.base_damage, num_hits: 1, lifetime: Duration::from_secs_f32(2.0), - knockback_force: 200.0, + knockback_force: 100.0, }, ) else { warn!("Failed to spawn zap spell entity"); @@ -159,7 +159,7 @@ impl SpellEffect for BangSpell { damage: self.base_damage, num_hits: 1000, lifetime: Duration::from_secs_f32(0.05), - knockback_force: 100.0, + knockback_force: 50.0, }, // self.radius, // 0.0, // self.base_damage, @@ -227,7 +227,7 @@ impl SpellEffect for ArcaneArrowSpell { damage: self.base_damage, num_hits: self.num_hits, lifetime: Duration::from_secs_f32(2.0), - knockback_force: 100.0, + knockback_force: 50.0, }, ) else { warn!("Failed to spawn arcane arrow spell entity"); @@ -292,7 +292,7 @@ impl SpellEffect for SplitterBoltsSpell { damage: self.base_damage, num_hits: 1, lifetime: Duration::from_secs_f32(2.0), - knockback_force: 50.0, + knockback_force: 25.0, }, ) else { warn!("Failed to spawn splitter bolts spell entity"); From a6de84cc9befc4e92fda3a6b951e6f020ebc039b Mon Sep 17 00:00:00 2001 From: RynKitty Date: Wed, 31 Jul 2024 13:26:00 +0100 Subject: [PATCH 3/3] ryn changes --- assets/images/forest.png | Bin 743 -> 739 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/images/forest.png b/assets/images/forest.png index 13e15f6f3df3d5c8457a5dcfb6df7e907ab14c1f..8a93bce711d60dddc0c88b91c969ec0b427c756b 100644 GIT binary patch delta 702 zcmV;v0zv)f1>*&fF@K#&L_t(og{@aTYa&4yeq1)N#a-csThQ(-Oc`>Buv~ThbvD7q z>#RcR{DQ0Hs+4x&@*^x4B#q_S*ePsqQ^aCH&@1#E-Z` zg&cB842J*U0Otg zCXymn5(Vo0HGeaws~OAL=paBRLPeEy<>cfl5=k6V8gg^>T75iR-BluwK7SG4hxLwh zZn~OE7j(TwSE}(%iy5n8SnuHR?FGQe|8yyrh=Fq1kcatpjrPT*Bx3A2rwbn8@*f{X z4gizQ0uw9%*t@5;6!UHc6f3h;p%vgYy25-Eh$N&4_jaVbRn{`W^)HF?94e4b+gqkzd~p{?D7UaOCGx&r__zP*SwNgM&1E@=vIqYJq2 zk~k6{lORIbM~e16pxdmH{`mA&1nSsxtPfUOqsv&pq`XM07>Pux7IAn(k-Ci0a7iO}+M&7)>M|f;fYOQ~` zy2IF$J<4l>DR9LO)x0XXAB2LOFyF4Ff;Bj%CBf7KGB2V$l{7xtEHVf9L5K+!Mly9= zjTe_6NH?`X?dN5oayY=jfAqq&rQ5mWz`+L_t(og{4edVn61+otd3kx9*1z zXV>!q0G;j#Hk@{GsdZ(s-Gpd;pS_=}ZX_XT5}|kZT$z~m1Ajn!y9p~B;ApzPUFQT8 z0t#If5!+3OG>I+(Dzhs>=m6VISSW<%dCt|!0U(Q`ngd*bI!>e_8n3gfTI7Fk-^KTG z8cTLhyI4A))9H?+8s8Icyu`67meUx)Dzi&orbD%fxYHdqE~^|bAD=l9RJgcD9loeZ zoK+l-a|EmG+txj`rI>dspj?@)3$1`ocO)tqB_ata1Al&iqT*z1Mm&a9M5x{?f@7N` z5sS%Kh3RWXQo+c5XX;7vFH->=6 zE=?lw1N2>uQ1y|b^?+`(jnr7okcEkEkC6=`f6(Pg+*@TVNgl9 zhqxW`j(;f!TED~bnd&qrBIx=#fAJ9b%g45t#%{j-#9}he=YWm8clV6z{UdOE?jUSHloB`MK5vi8vJ))xW%t!BG!d~My%sdBV|EPnLDwOzNS