From 4b8cc8bb71336ec071f0e86cb30db55adae79b0a Mon Sep 17 00:00:00 2001 From: extrawurst Date: Wed, 30 Apr 2025 00:02:45 +0200 Subject: [PATCH] trails and better missile origin --- assets/models/characters/mig pilot.glb | Bin 490812 -> 490968 bytes src/abilities/missile.rs | 5 +- src/character.rs | 71 ++++++++++++++++++------- src/utils/trail.rs | 22 +++++--- 4 files changed, 68 insertions(+), 30 deletions(-) diff --git a/assets/models/characters/mig pilot.glb b/assets/models/characters/mig pilot.glb index 559934fe6e310839a0a2572b2db71ab18a6ebae0..fb257a4b53bbdac8759437c41b5106e93c8a7207 100644 GIT binary patch delta 4278 zcmeHK-ES1v6=%Kn8pb%-yR*gdVy|~u8xqFrxnFbd_ydE9`p_a_T1%B^4Y;XQXr1+E zAsAfKMpe}+vWb3em&UP46-8>QQj#o^A0TPfw^T}j2c)QSQ~J<{3XC14X`|4Dp4lac zDE$L?u;tnFyXV|(;G%XR31D(sR|*mU4va2<8a> z+Ap`1;l;`dTnpa_alBss?~o|GQelNcvT!kSJrwfr)Aj$sPu5rA*$vAfgGuYXuyXvu zaMfF(5G(lA>qF$%^T=KD>)G`8P)HRrwPErrY>!riLK@lFl}guP(qX1hZeI)65b_=F zI-EJ2J6zx&o3~+8{THT%tAl^0jpDu*K5fhj!#&qGQgT;oPiV)@`bJCFWlSpJaie6v zlb#qG$c+yTOdK7~rQ5&mW{sy^rd(GtWnAuvtn{>!+Ea?TO8LxbRavIE;*1F)IYr_9 zQ}}Y-GfHL|Gt#)8;eyymP0mbfWr&q#t}nE5KHbA9mQcp{xKU**M!}@#8g8^@?ErYD2QbuSleXTr7x1{r!_O)h` z3vpkkDYB77N`1Zrw25))an3xCDPm!Ygt(N3^u{PEgKPSyoRjJAJbC2k(6`10gVJ$B zp`IEXKay^jPC7U66!A*;4h`f6v#!h2PWn@>BCE909(SpJ9u-o`pe&xxDXeCKYVVuR zYl1=zGD(S0u}BKn2t|eR6y@bhWh7k@MGY=q(hV9-aU}PBLH9#cA7tt|Tsz#q&sTkh zFOEE#o2IbFr;|7}l`n+nw6d&gh^3aE@X4ffsRZ{D?He07Iz&l+ww-vE+99}H%>r^P z=s}}ZaQRFy<_g7%kv+O0>Nw*I*HuFIPuaxy!N^oXmd5@_Oi@z{?n}@2jH^v>%l|hZ z*`>#%@R{JAkC*Ga(4A?W3!RO1_)Sq~p|w4ZCBidf%}6!|(!$lT z&Dhj#7jaF}#^jhyuYvue8NAsTBUC$_!iDw#?N2n|2JO5u-i(9E7)c9Tn(ENoQNq=o zaaS*Sw{YiJJ-(lg z7jgI2%@`ru;p2^1Iu^&mR`T6xlcdUZ*J1DR65jZ99MgnX5*D6KBrx4=;{s*Ad^}FN zMl_MV=7fb?nFJ2d4b_}TVfLP`_k@kNGjZ(NoxvT_?b>bO@`*ZhHQPn}adR9agb%e? za9a{sp#6th()imw-MN-H{=D19`R`@WJsHROt`ts_?tGVpWy){3Cyrj?wOn71Tcocc zUhfuljrh{ZINq4dU}hW19`f50NDCj6efcDvbFvxBdr0m{;~S>}Y2h60nI$}O%0ktt z1ZJNo;eFfd@JUf0Ewnv0T)oz!Yc2ZlwkX;jvkD(P@zz?KuDwYg;x}orP2&T9Tx-*{ zHhtLJG&|K&i%n-Zo|*YQ`excNG24zeW;UW{R^U&w8o!-w!0t1K2E@rT6`>BA{um8} z4h>R{aJb_;#?g*f91(@X=;NQ!tmx2pHhot!_28&jxb)m;1=90lxR!6i#rY;g&o<#- zB)>{hE~E>;IQydzoczmp^Z6#cmrvmnlKgBM-E&EdpUvQhSCTkME$<7ilo(n@*~r~mmles(Jwrm+sgD^7sRwelr7?7;O~w2j8u zlGDM}T3RW$ zMKB{8jI8X)->nbT220NimU#4bEG&J4w%c80iWNB>xE&2E9^|kCf4LnkS2W8M&l-6@ zSd_9T99(_h`*Gj45Itq|gy|`#r(&^hTjceN`LC2!Mi=*%Ri29EYd(zB-T&FRxc$S( n>2SVgDY8A^v=rI6XqF-u6N|sT6FC#fclK9yE|zboG!y>=FL1Q7 delta 4104 zcmeHKTTfiq74`uJ>_fnYnF)vq%y7&Y6CcCAoPGA*u5oZu_o+^5nI^SeY?G8UX$fGU zsc#rRxT;h+Hs*_p9UE*l>QkB~^;9BKEF1NqQi~K*Rh9D4)JZRCn-G}Z)mFB<&P=6L zYJPwpcsP9DUVHC#*5%W1*4zJXy!NlgsxS9!FN`U(K`0(Ip@949G1KyT>tes1#3{!&Xz%nbiPo^NyAvczBEvzz9lPwGb6KX59 zA`)0jCN1b17o3M8;DJ&-zBlqzZ+~CGZNSMC1fj8^Qj!I9zGzZn+$c@16_5NDjbWg* zwgCY-86EB&80r5wLMEg&oH5BP)6xn>*I1x5*IIJUjbMVp-b_ZpjFy@XhC<0eO3^ds zAM>7i=Gp!)4fjRq3UWVy@0EOrGi8Vm6b`(lrO+*N9vGF#Zw_QjafP#eo}?0`N9Sy z10_Pb7j;W3OV!m@2}xaKf=rT1PI0k7)2Wo@L7}|Q^^H8^Z3(Ebz0Xnay+^+GBvv;J zFh+9WoK6bzt4-){=IzYz&}xd$8tS7q|KmX65BI0XnNc?2nt~A2a8gh7TB<^{(n_h2 zL_#J(Tf$IIh7plkenL_zBneo{NU)TFq?VA@>4u_YSs;ZD{LP|Wk`O6jOA_VQIs&^= zofvA(;__geuo72})#3W?BA+{uKz?^(vMY;+hT=Hc(u^*XAapU;lEB&S*Kl)>i}~gT zoNi1IZ^o;KB6Lx`H-THkuQa;Ye<%gNDNfwO&fy4M+-gi>ocNs0VxIQqtc&#H^^@s1 z4i2Z$G!n;wEm?Fu5uuCgkJn))oxt7UCM*yRbyuRgy8*v?qR59Hs6%Ha;%N*LE{tSx z;tO#?dex`u@lK}5_hph;+Z;zeN$4g6HC^UJ7@p3PXE6>|akId1;J&J%Q!t zTX1<_lF-H7ZFRW2zQ~W$nWn?Z$-^#QTc1LIOCqAz_toRfVWMfA>7vqW7lXSSP?b#* zZ$`(F2wmLJ33O~v;>H)Vcs-jSqy(~5vx3dVqem#P9ty07`1S^L9!=u)BNW(v3alrM zH#a1Ze%M8RdkXI!jkq^SxkRP|4=2&nN~J&6f=3@o61rIX={n4}7WwIogtWhIjKbKM zLiNESf9qg91~x`KjTep+?x4_UZ=%h^y0!>iEVQl0$>UY%7)zknYr(O$q!Zv=o1(ub zccgN^ZtJUBQRj*}?>TkmPVV^aiZZdH%zI9mh2PCLdVjQ{&J}guqyN?48rx8V-<|Ei zhO;-YcS0gLVe#XM6i!bV8a94^<{`XCOynBQ#hk4)OmO;`^+R9zfiGz|@vU!sT^Kn6 zpOZzuCE7c<1GaqChozVct5p033!#CJ`5SR%yq%eZMRj#a?zhU>pC@M(g+n@o?6H_H8EOQgLBK<%A{ll=?@;n?d94M8PNHN zl}SbOTNKe4`I9u36c$~7jTR;-T<{lbQMud!!k7sJS$8dO!oXq;t!Q{ET=;&pN3IGt za<}t;2}?7X%s2C`4m~CGl+sg1Pi!{dT7LD1vrF%nzn_|AzbU^~I`wWzMg8nzNyXvv W*(<*+pD3StyQgC7?3FbYX7oR@FO^0B diff --git a/src/abilities/missile.rs b/src/abilities/missile.rs index 7cf4e93..c61b206 100644 --- a/src/abilities/missile.rs +++ b/src/abilities/missile.rs @@ -137,10 +137,11 @@ fn on_trigger_missile( ), ( Trail::new( - t.translation, + 12, LinearRgba::rgb(1., 0.0, 0.), LinearRgba::rgb(0.9, 0.9, 0.) - ), + ) + .with_pos(t.translation), Gizmo { handle: gizmo_assets.add(GizmoAsset::default()), line_config: GizmoLineConfig { diff --git a/src/character.rs b/src/character.rs index d67f888..61ad642 100644 --- a/src/character.rs +++ b/src/character.rs @@ -1,5 +1,9 @@ -use crate::{GameState, heads_database::HeadsDatabase, loading_assets::GameAssets}; -use bevy::{ecs::system::SystemParam, platform::collections::HashMap, prelude::*}; +use crate::{ + GameState, heads_database::HeadsDatabase, loading_assets::GameAssets, utils::trail::Trail, +}; +use bevy::{ + ecs::system::SystemParam, platform::collections::HashMap, prelude::*, scene::SceneInstanceReady, +}; use std::time::Duration; #[derive(Component, Debug)] @@ -34,12 +38,12 @@ pub struct CharacterAnimations { pub fn plugin(app: &mut App) { app.add_systems( Update, - (spawn, setup_once_loaded, setup_projectile_origin).run_if(in_state(GameState::Playing)), + (spawn, setup_once_loaded).run_if(in_state(GameState::Playing)), ); #[cfg(feature = "dbg")] app.add_systems( Update, - debug_show_projectile_origin.run_if(in_state(GameState::Playing)), + debug_show_projectile_origin_and_trial.run_if(in_state(GameState::Playing)), ); } @@ -63,29 +67,56 @@ fn spawn( }); let asset = gltf_assets.get(handle).unwrap(); - commands.entity(entity).insert(( - Transform::from_translation(Vec3::new(0., -1.45, 0.)).with_scale(Vec3::splat(1.2)), - SceneRoot(asset.scenes[0].clone()), - )); + commands + .entity(entity) + .insert(( + Transform::from_translation(Vec3::new(0., -1.45, 0.)).with_scale(Vec3::splat(1.2)), + SceneRoot(asset.scenes[0].clone()), + )) + .observe(find_marker_bones); } } -fn setup_projectile_origin( +fn find_marker_bones( + trigger: Trigger, mut commands: Commands, - query: Query>, descendants: Query<&Children>, name: Query<&Name>, + mut gizmo_assets: ResMut>, ) { - for character in query.iter() { - for child in descendants.iter_descendants(character) { - let Ok(name) = name.get(child) else { - continue; - }; - if name.as_str() == "ProjectileOrigin" { - commands.entity(child).insert(ProjectileOrigin); - } + let entity = trigger.target(); + + let mut origin_found = false; + for child in descendants.iter_descendants(entity) { + let Ok(name) = name.get(child) else { + continue; + }; + + if name.as_str() == "ProjectileOrigin" { + commands.entity(child).insert(ProjectileOrigin); + origin_found = true; + } else if name.as_str().starts_with("Trail") { + commands.entity(child).insert(( + Trail::new( + 20, + LinearRgba::new(1., 1.0, 1., 0.5), + LinearRgba::new(1., 1., 1., 0.5), + ), + Gizmo { + handle: gizmo_assets.add(GizmoAsset::default()), + line_config: GizmoLineConfig { + width: 20., + ..default() + }, + ..default() + }, + )); } } + + if !origin_found { + error!("ProjectileOrigin not found"); + } } fn setup_once_loaded( @@ -142,9 +173,9 @@ fn setup_once_loaded( } #[cfg(feature = "dbg")] -fn debug_show_projectile_origin( +fn debug_show_projectile_origin_and_trial( mut gizmos: Gizmos, - query: Query<&GlobalTransform, With>, + query: Query<&GlobalTransform, Or<(With, With)>>, ) { for projectile_origin in query.iter() { gizmos.sphere( diff --git a/src/utils/trail.rs b/src/utils/trail.rs index 8602b4d..3cc7db2 100644 --- a/src/utils/trail.rs +++ b/src/utils/trail.rs @@ -10,16 +10,20 @@ pub struct Trail { } impl Trail { - pub fn new(pos: Vec3, col_start: LinearRgba, col_end: LinearRgba) -> Self { - let mut v = Vec::with_capacity(12); - v.push(pos); + pub fn new(points: usize, col_start: LinearRgba, col_end: LinearRgba) -> Self { Self { - points: v, + points: Vec::with_capacity(points), col_start, col_end, } } + pub fn with_pos(self, pos: Vec3) -> Self { + let mut trail = self; + trail.add(pos); + trail + } + pub fn add(&mut self, pos: Vec3) { if self.points.len() >= self.points.capacity() { self.points.pop(); @@ -36,19 +40,21 @@ pub fn plugin(app: &mut App) { } fn update_trail( - mut query: Query<(&mut Trail, &Gizmo, &GlobalTransform, &ChildOf)>, + mut query: Query<(Entity, &mut Trail, &Gizmo, &GlobalTransform)>, global_transform: Query<&GlobalTransform>, mut gizmo_assets: ResMut>, -) -> Result<(), BevyError> { - for (mut trail, gizmo, pos, parent) in query.iter_mut() { +) -> Result { + for (e, mut trail, gizmo, pos) in query.iter_mut() { trail.add(pos.translation()); - let parent_transform = global_transform.get(parent.parent())?; + let parent_transform = global_transform.get(e)?; let Some(gizmo) = gizmo_assets.get_mut(gizmo.handle.id()) else { continue; }; + gizmo.clear(); + let lerp_denom = trail.points.len() as f32; for (i, window) in trail.points.windows(2).enumerate() { let [a, b] = window else {