From f18982670030c0ea15aadf0fbc1aa5dd1b14c9da Mon Sep 17 00:00:00 2001 From: extrawurst Date: Sat, 15 Mar 2025 12:32:10 +0100 Subject: [PATCH] cutscene cam movement animation --- assets/maps/map1.map | 11 ++++++++++- src/cutscene.rs | 36 +++++++++++++++++++++++++++++++----- src/gates.rs | 2 +- src/tb_entities.rs | 6 ++++++ trenchbroom/hedz/hedz.fgd | 5 +++++ 5 files changed, 53 insertions(+), 7 deletions(-) diff --git a/assets/maps/map1.map b/assets/maps/map1.map index da8ec73..d3d2a2f 100644 --- a/assets/maps/map1.map +++ b/assets/maps/map1.map @@ -997,9 +997,10 @@ { "classname" "cutscene_camera" "origin" "792 5464 1224" -"name" "fence_02" +"name" "cutscene_02" "angles" "0 90 0" "target" "cam_target_02" +"targetname" "cutscene_02" } // entity 28 { @@ -1037,3 +1038,11 @@ "origin" "1176 6872 -264" "targetname" "cam_target_02" } +// entity 31 +{ +"classname" "cutscene_camera_movement_end" +"origin" "696 6888 1224" +"name" "cutscene_02_end" +"angles" "0 90 0" +"target" "cutscene_02" +} diff --git a/src/cutscene.rs b/src/cutscene.rs index e6889ce..7d26683 100644 --- a/src/cutscene.rs +++ b/src/cutscene.rs @@ -1,6 +1,6 @@ use crate::{ DebugVisuals, - tb_entities::{CameraTarget, CutsceneCamera}, + tb_entities::{CameraTarget, CutsceneCamera, CutsceneCameraMovementEnd}, }; use bevy::prelude::*; use bevy_trenchbroom::class::Target; @@ -14,7 +14,8 @@ enum CutsceneState { None, Playing { timer: Timer, - camera: Transform, + camera_start: Transform, + camera_end: Transform, }, } @@ -29,12 +30,14 @@ fn on_start_cutscene( mut res: ResMut, mut cutscene_state: ResMut, cutscenes: Query<(&Transform, &CutsceneCamera, &Target), Without>, + cutscene_movement: Query<(&Transform, &CutsceneCameraMovementEnd, &Target), Without>, cam_target: Query<(&Transform, &CameraTarget), Without>, ) { let cutscene = trigger.event().0.clone(); res.cam_follow = false; + // asumes `name` and `targetname` are equal let Some((t, _, target)) = cutscenes .iter() .find(|(_, cutscene_camera, _)| cutscene == cutscene_camera.name) @@ -42,6 +45,12 @@ fn on_start_cutscene( return; }; + let move_end = cutscene_movement + .iter() + .find(|(_, _, target)| cutscene == target.target.clone().unwrap_or_default()) + .map(|(t, _, _)| t.clone()) + .unwrap_or_else(|| t.clone()); + let Some((target, _)) = cam_target.iter().find(|(_, camera_target)| { camera_target.targetname == target.target.clone().unwrap_or_default() }) else { @@ -50,7 +59,8 @@ fn on_start_cutscene( *cutscene_state = CutsceneState::Playing { timer: Timer::from_seconds(2.0, TimerMode::Once), - camera: t.looking_at(target.translation, Vec3::Y), + camera_start: t.looking_at(target.translation, Vec3::Y), + camera_end: move_end.looking_at(target.translation, Vec3::Y), }; } @@ -60,11 +70,27 @@ fn update( mut cam: Query<&mut Transform, With>, time: Res