From ced4595f8bf2b7f8fe8e09f1dfbed34b8c5d2524 Mon Sep 17 00:00:00 2001 From: extrawurst Date: Sat, 15 Mar 2025 10:37:34 +0100 Subject: [PATCH] cutscene camera editor defined target --- assets/maps/map1.map | 18 ++++++++++++++++-- src/cutscene.rs | 37 ++++++++++++++++++++++++------------- src/tb_entities.rs | 7 +++++++ trenchbroom/hedz/hedz.fgd | 7 ++++++- 4 files changed, 53 insertions(+), 16 deletions(-) diff --git a/assets/maps/map1.map b/assets/maps/map1.map index bd3875f..da8ec73 100644 --- a/assets/maps/map1.map +++ b/assets/maps/map1.map @@ -983,8 +983,9 @@ { "classname" "cutscene_camera" "origin" "-56 -648 264" -"angles" "0 45 0" +"angles" "0 0 0" "name" "fence_01" +"target" "cam_target_01" } // entity 26 { @@ -995,9 +996,10 @@ // entity 27 { "classname" "cutscene_camera" -"origin" "744 4632 344" +"origin" "792 5464 1224" "name" "fence_02" "angles" "0 90 0" +"target" "cam_target_02" } // entity 28 { @@ -1023,3 +1025,15 @@ ( 928 6656 -272 ) ( 928 6656 -271 ) ( 928 6657 -272 ) origin [ 0 1 0 0 ] [ 0 0 -1 0 ] 180 1 1 } } +// entity 29 +{ +"classname" "camera_target" +"origin" "1143.38 248 -232" +"targetname" "cam_target_01" +} +// entity 30 +{ +"classname" "camera_target" +"origin" "1176 6872 -264" +"targetname" "cam_target_02" +} diff --git a/src/cutscene.rs b/src/cutscene.rs index 18d8707..e6889ce 100644 --- a/src/cutscene.rs +++ b/src/cutscene.rs @@ -1,5 +1,9 @@ -use crate::{DebugVisuals, tb_entities::CutsceneCamera}; +use crate::{ + DebugVisuals, + tb_entities::{CameraTarget, CutsceneCamera}, +}; use bevy::prelude::*; +use bevy_trenchbroom::class::Target; #[derive(Event, Debug)] pub struct StartCutscene(pub String); @@ -10,7 +14,7 @@ enum CutsceneState { None, Playing { timer: Timer, - name: String, + camera: Transform, }, } @@ -24,36 +28,43 @@ fn on_start_cutscene( trigger: Trigger, mut res: ResMut, mut cutscene_state: ResMut, + cutscenes: Query<(&Transform, &CutsceneCamera, &Target), Without>, + cam_target: Query<(&Transform, &CameraTarget), Without>, ) { let cutscene = trigger.event().0.clone(); res.cam_follow = false; + let Some((t, _, target)) = cutscenes + .iter() + .find(|(_, cutscene_camera, _)| cutscene == cutscene_camera.name) + else { + return; + }; + + let Some((target, _)) = cam_target.iter().find(|(_, camera_target)| { + camera_target.targetname == target.target.clone().unwrap_or_default() + }) else { + return; + }; + *cutscene_state = CutsceneState::Playing { timer: Timer::from_seconds(2.0, TimerMode::Once), - name: cutscene, + camera: t.looking_at(target.translation, Vec3::Y), }; } fn update( mut res: ResMut, mut cutscene_state: ResMut, - cutscenes: Query<(&Transform, &CutsceneCamera), Without>, mut cam: Query<&mut Transform, With>, time: Res