mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Trails are now hackily created.
This commit is contained in:
parent
05f53a5316
commit
33419c7b4c
@ -113,6 +113,7 @@ impl Skeleton for ArthropodSkeleton {
|
|||||||
orientation: mount_orientation,
|
orientation: mount_orientation,
|
||||||
scale: Vec3::one(),
|
scale: Vec3::one(),
|
||||||
},
|
},
|
||||||
|
trail_points: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -137,6 +137,7 @@ impl Skeleton for BipedLargeSkeleton {
|
|||||||
.into(),
|
.into(),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
|
trail_points: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -83,6 +83,7 @@ impl Skeleton for BipedSmallSkeleton {
|
|||||||
.into(),
|
.into(),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
|
trail_points: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -106,6 +106,7 @@ impl Skeleton for BirdLargeSkeleton {
|
|||||||
.into(),
|
.into(),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
|
trail_points: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -60,6 +60,7 @@ impl Skeleton for BirdMediumSkeleton {
|
|||||||
.into(),
|
.into(),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
|
trail_points: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -125,6 +125,7 @@ impl Skeleton for CharacterSkeleton {
|
|||||||
} else {
|
} else {
|
||||||
shorts_mat
|
shorts_mat
|
||||||
} * Mat4::<f32>::from(self.lantern);
|
} * Mat4::<f32>::from(self.lantern);
|
||||||
|
let main_mat = control_l_mat * Mat4::<f32>::from(self.main);
|
||||||
|
|
||||||
*(<&mut [_; Self::BONE_COUNT]>::try_from(&mut buf[0..Self::BONE_COUNT]).unwrap()) = [
|
*(<&mut [_; Self::BONE_COUNT]>::try_from(&mut buf[0..Self::BONE_COUNT]).unwrap()) = [
|
||||||
make_bone(head_mat),
|
make_bone(head_mat),
|
||||||
@ -139,7 +140,7 @@ impl Skeleton for CharacterSkeleton {
|
|||||||
make_bone(chest_mat * Mat4::<f32>::from(self.shoulder_l)),
|
make_bone(chest_mat * Mat4::<f32>::from(self.shoulder_l)),
|
||||||
make_bone(chest_mat * Mat4::<f32>::from(self.shoulder_r)),
|
make_bone(chest_mat * Mat4::<f32>::from(self.shoulder_r)),
|
||||||
make_bone(chest_mat * Mat4::<f32>::from(self.glider)),
|
make_bone(chest_mat * Mat4::<f32>::from(self.glider)),
|
||||||
make_bone(control_l_mat * Mat4::<f32>::from(self.main)),
|
make_bone(main_mat),
|
||||||
make_bone(control_r_mat * Mat4::<f32>::from(self.second)),
|
make_bone(control_r_mat * Mat4::<f32>::from(self.second)),
|
||||||
make_bone(lantern_mat),
|
make_bone(lantern_mat),
|
||||||
// FIXME: Should this be control_l_mat?
|
// FIXME: Should this be control_l_mat?
|
||||||
@ -155,6 +156,10 @@ impl Skeleton for CharacterSkeleton {
|
|||||||
.into(),
|
.into(),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
|
trail_points: Some((
|
||||||
|
(main_mat * Vec4::new(0.0, 0.5, -6.0, 1.0)).xyz(),
|
||||||
|
(main_mat * Vec4::new(0.0, 0.5, -6.0, 1.0)).xyz(),
|
||||||
|
)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -81,6 +81,7 @@ impl Skeleton for DragonSkeleton {
|
|||||||
.into(),
|
.into(),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
|
trail_points: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -60,6 +60,7 @@ impl Skeleton for FishMediumSkeleton {
|
|||||||
.into(),
|
.into(),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
|
trail_points: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,6 +51,7 @@ impl Skeleton for FishSmallSkeleton {
|
|||||||
.into(),
|
.into(),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
|
trail_points: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,7 @@ impl Skeleton for FixtureSkeleton {
|
|||||||
Offsets {
|
Offsets {
|
||||||
lantern: None,
|
lantern: None,
|
||||||
mount_bone: Transform::default(),
|
mount_bone: Transform::default(),
|
||||||
|
trail_points: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -83,6 +83,7 @@ impl Skeleton for GolemSkeleton {
|
|||||||
.into(),
|
.into(),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
|
trail_points: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -103,6 +103,7 @@ pub fn init() { lazy_static::initialize(&LIB); }
|
|||||||
pub struct Offsets {
|
pub struct Offsets {
|
||||||
pub lantern: Option<Vec3<f32>>,
|
pub lantern: Option<Vec3<f32>>,
|
||||||
pub mount_bone: Transform<f32, f32, f32>,
|
pub mount_bone: Transform<f32, f32, f32>,
|
||||||
|
pub trail_points: Option<(Vec3<f32>, Vec3<f32>)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait Skeleton: Send + Sync + 'static {
|
pub trait Skeleton: Send + Sync + 'static {
|
||||||
|
@ -49,6 +49,7 @@ impl Skeleton for ObjectSkeleton {
|
|||||||
.into(),
|
.into(),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
|
trail_points: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -97,6 +97,7 @@ impl Skeleton for QuadrupedLowSkeleton {
|
|||||||
orientation: mount_orientation,
|
orientation: mount_orientation,
|
||||||
scale: Vec3::one(),
|
scale: Vec3::one(),
|
||||||
},
|
},
|
||||||
|
trail_points: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -109,6 +109,7 @@ impl Skeleton for QuadrupedMediumSkeleton {
|
|||||||
orientation: mount_orientation,
|
orientation: mount_orientation,
|
||||||
scale: Vec3::one(),
|
scale: Vec3::one(),
|
||||||
},
|
},
|
||||||
|
trail_points: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -74,6 +74,7 @@ impl Skeleton for QuadrupedSmallSkeleton {
|
|||||||
orientation: mount_orientation,
|
orientation: mount_orientation,
|
||||||
scale: Vec3::one(),
|
scale: Vec3::one(),
|
||||||
},
|
},
|
||||||
|
trail_points: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -53,6 +53,7 @@ impl Skeleton for ShipSkeleton {
|
|||||||
),
|
),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
|
trail_points: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -84,6 +84,7 @@ impl Skeleton for TheropodSkeleton {
|
|||||||
.into(),
|
.into(),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
|
trail_points: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,8 @@
|
|||||||
drain_filter,
|
drain_filter,
|
||||||
once_cell,
|
once_cell,
|
||||||
trait_alias,
|
trait_alias,
|
||||||
option_get_or_insert_default
|
option_get_or_insert_default,
|
||||||
|
map_try_insert
|
||||||
)]
|
)]
|
||||||
#![recursion_limit = "2048"]
|
#![recursion_limit = "2048"]
|
||||||
|
|
||||||
|
@ -9,15 +9,15 @@ pub use volume::VolumeKey;
|
|||||||
use crate::{
|
use crate::{
|
||||||
ecs::comp::Interpolated,
|
ecs::comp::Interpolated,
|
||||||
render::{
|
render::{
|
||||||
pipelines::{self, ColLights},
|
pipelines::{self, trail, ColLights},
|
||||||
ColLightInfo, FigureBoneData, FigureDrawer, FigureLocals, FigureModel, FigureShadowDrawer,
|
ColLightInfo, FigureBoneData, FigureDrawer, FigureLocals, FigureModel, FigureShadowDrawer,
|
||||||
Mesh, RenderError, Renderer, SubModel, TerrainVertex,
|
Mesh, Quad, RenderError, Renderer, SubModel, TerrainVertex,
|
||||||
},
|
},
|
||||||
scene::{
|
scene::{
|
||||||
camera::{Camera, CameraMode, Dependents},
|
camera::{Camera, CameraMode, Dependents},
|
||||||
math,
|
math,
|
||||||
terrain::Terrain,
|
terrain::Terrain,
|
||||||
SceneData,
|
SceneData, TrailMgr,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
use anim::{
|
use anim::{
|
||||||
@ -571,6 +571,7 @@ impl FigureMgr {
|
|||||||
pub fn maintain(
|
pub fn maintain(
|
||||||
&mut self,
|
&mut self,
|
||||||
renderer: &mut Renderer,
|
renderer: &mut Renderer,
|
||||||
|
trail_mgr: &TrailMgr,
|
||||||
scene_data: &SceneData,
|
scene_data: &SceneData,
|
||||||
// Visible chunk data.
|
// Visible chunk data.
|
||||||
visible_psr_bounds: math::Aabr<f32>,
|
visible_psr_bounds: math::Aabr<f32>,
|
||||||
@ -855,6 +856,7 @@ impl FigureMgr {
|
|||||||
let body = *body;
|
let body = *body;
|
||||||
|
|
||||||
let common_params = FigureUpdateCommonParameters {
|
let common_params = FigureUpdateCommonParameters {
|
||||||
|
entity: Some(entity),
|
||||||
pos: pos.0,
|
pos: pos.0,
|
||||||
ori,
|
ori,
|
||||||
scale,
|
scale,
|
||||||
@ -1759,6 +1761,7 @@ impl FigureMgr {
|
|||||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||||
state.update(
|
state.update(
|
||||||
renderer,
|
renderer,
|
||||||
|
Some(trail_mgr),
|
||||||
&mut update_buf,
|
&mut update_buf,
|
||||||
&common_params,
|
&common_params,
|
||||||
state_animation_rate,
|
state_animation_rate,
|
||||||
@ -1958,6 +1961,7 @@ impl FigureMgr {
|
|||||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||||
state.update(
|
state.update(
|
||||||
renderer,
|
renderer,
|
||||||
|
Some(trail_mgr),
|
||||||
&mut update_buf,
|
&mut update_buf,
|
||||||
&common_params,
|
&common_params,
|
||||||
state_animation_rate,
|
state_animation_rate,
|
||||||
@ -2274,6 +2278,7 @@ impl FigureMgr {
|
|||||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||||
state.update(
|
state.update(
|
||||||
renderer,
|
renderer,
|
||||||
|
Some(trail_mgr),
|
||||||
&mut update_buf,
|
&mut update_buf,
|
||||||
&common_params,
|
&common_params,
|
||||||
state_animation_rate,
|
state_animation_rate,
|
||||||
@ -2631,6 +2636,7 @@ impl FigureMgr {
|
|||||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||||
state.update(
|
state.update(
|
||||||
renderer,
|
renderer,
|
||||||
|
Some(trail_mgr),
|
||||||
&mut update_buf,
|
&mut update_buf,
|
||||||
&common_params,
|
&common_params,
|
||||||
state_animation_rate,
|
state_animation_rate,
|
||||||
@ -2734,6 +2740,7 @@ impl FigureMgr {
|
|||||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||||
state.update(
|
state.update(
|
||||||
renderer,
|
renderer,
|
||||||
|
Some(trail_mgr),
|
||||||
&mut update_buf,
|
&mut update_buf,
|
||||||
&common_params,
|
&common_params,
|
||||||
state_animation_rate,
|
state_animation_rate,
|
||||||
@ -2816,6 +2823,7 @@ impl FigureMgr {
|
|||||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_base, dt_lerp);
|
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_base, dt_lerp);
|
||||||
state.update(
|
state.update(
|
||||||
renderer,
|
renderer,
|
||||||
|
Some(trail_mgr),
|
||||||
&mut update_buf,
|
&mut update_buf,
|
||||||
&common_params,
|
&common_params,
|
||||||
state_animation_rate,
|
state_animation_rate,
|
||||||
@ -3342,6 +3350,7 @@ impl FigureMgr {
|
|||||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||||
state.update(
|
state.update(
|
||||||
renderer,
|
renderer,
|
||||||
|
Some(trail_mgr),
|
||||||
&mut update_buf,
|
&mut update_buf,
|
||||||
&common_params,
|
&common_params,
|
||||||
state_animation_rate,
|
state_animation_rate,
|
||||||
@ -3428,6 +3437,7 @@ impl FigureMgr {
|
|||||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_base, dt_lerp);
|
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_base, dt_lerp);
|
||||||
state.update(
|
state.update(
|
||||||
renderer,
|
renderer,
|
||||||
|
Some(trail_mgr),
|
||||||
&mut update_buf,
|
&mut update_buf,
|
||||||
&common_params,
|
&common_params,
|
||||||
state_animation_rate,
|
state_animation_rate,
|
||||||
@ -3606,6 +3616,7 @@ impl FigureMgr {
|
|||||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||||
state.update(
|
state.update(
|
||||||
renderer,
|
renderer,
|
||||||
|
Some(trail_mgr),
|
||||||
&mut update_buf,
|
&mut update_buf,
|
||||||
&common_params,
|
&common_params,
|
||||||
state_animation_rate,
|
state_animation_rate,
|
||||||
@ -3897,6 +3908,7 @@ impl FigureMgr {
|
|||||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||||
state.update(
|
state.update(
|
||||||
renderer,
|
renderer,
|
||||||
|
Some(trail_mgr),
|
||||||
&mut update_buf,
|
&mut update_buf,
|
||||||
&common_params,
|
&common_params,
|
||||||
state_animation_rate,
|
state_animation_rate,
|
||||||
@ -4219,6 +4231,7 @@ impl FigureMgr {
|
|||||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||||
state.update(
|
state.update(
|
||||||
renderer,
|
renderer,
|
||||||
|
Some(trail_mgr),
|
||||||
&mut update_buf,
|
&mut update_buf,
|
||||||
&common_params,
|
&common_params,
|
||||||
state_animation_rate,
|
state_animation_rate,
|
||||||
@ -4301,6 +4314,7 @@ impl FigureMgr {
|
|||||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_base, dt_lerp);
|
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_base, dt_lerp);
|
||||||
state.update(
|
state.update(
|
||||||
renderer,
|
renderer,
|
||||||
|
Some(trail_mgr),
|
||||||
&mut update_buf,
|
&mut update_buf,
|
||||||
&common_params,
|
&common_params,
|
||||||
state_animation_rate,
|
state_animation_rate,
|
||||||
@ -4922,6 +4936,7 @@ impl FigureMgr {
|
|||||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||||
state.update(
|
state.update(
|
||||||
renderer,
|
renderer,
|
||||||
|
Some(trail_mgr),
|
||||||
&mut update_buf,
|
&mut update_buf,
|
||||||
&common_params,
|
&common_params,
|
||||||
state_animation_rate,
|
state_animation_rate,
|
||||||
@ -5162,6 +5177,7 @@ impl FigureMgr {
|
|||||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||||
state.update(
|
state.update(
|
||||||
renderer,
|
renderer,
|
||||||
|
Some(trail_mgr),
|
||||||
&mut update_buf,
|
&mut update_buf,
|
||||||
&common_params,
|
&common_params,
|
||||||
state_animation_rate,
|
state_animation_rate,
|
||||||
@ -5289,6 +5305,7 @@ impl FigureMgr {
|
|||||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||||
state.update(
|
state.update(
|
||||||
renderer,
|
renderer,
|
||||||
|
Some(trail_mgr),
|
||||||
&mut update_buf,
|
&mut update_buf,
|
||||||
&common_params,
|
&common_params,
|
||||||
state_animation_rate,
|
state_animation_rate,
|
||||||
@ -5385,6 +5402,7 @@ impl FigureMgr {
|
|||||||
|
|
||||||
state.update(
|
state.update(
|
||||||
renderer,
|
renderer,
|
||||||
|
Some(trail_mgr),
|
||||||
&mut update_buf,
|
&mut update_buf,
|
||||||
&common_params,
|
&common_params,
|
||||||
state_animation_rate,
|
state_animation_rate,
|
||||||
@ -5478,6 +5496,7 @@ impl FigureMgr {
|
|||||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||||
state.update(
|
state.update(
|
||||||
renderer,
|
renderer,
|
||||||
|
Some(trail_mgr),
|
||||||
&mut update_buf,
|
&mut update_buf,
|
||||||
&common_params,
|
&common_params,
|
||||||
state_animation_rate,
|
state_animation_rate,
|
||||||
@ -6170,6 +6189,7 @@ impl FigureColLights {
|
|||||||
|
|
||||||
pub struct FigureStateMeta {
|
pub struct FigureStateMeta {
|
||||||
lantern_offset: Option<anim::vek::Vec3<f32>>,
|
lantern_offset: Option<anim::vek::Vec3<f32>>,
|
||||||
|
trail_points: Option<(anim::vek::Vec3<f32>, anim::vek::Vec3<f32>)>,
|
||||||
// Animation to be applied to rider of this entity
|
// Animation to be applied to rider of this entity
|
||||||
mount_transform: anim::vek::Transform<f32, f32, f32>,
|
mount_transform: anim::vek::Transform<f32, f32, f32>,
|
||||||
// Contains the position of this figure or if it is a rider it will contain the mount's
|
// Contains the position of this figure or if it is a rider it will contain the mount's
|
||||||
@ -6218,6 +6238,7 @@ impl<S> DerefMut for FigureState<S> {
|
|||||||
/// Parameters that don't depend on the body variant or animation results and
|
/// Parameters that don't depend on the body variant or animation results and
|
||||||
/// are also not mutable
|
/// are also not mutable
|
||||||
pub struct FigureUpdateCommonParameters<'a> {
|
pub struct FigureUpdateCommonParameters<'a> {
|
||||||
|
pub entity: Option<EcsEntity>,
|
||||||
pub pos: anim::vek::Vec3<f32>,
|
pub pos: anim::vek::Vec3<f32>,
|
||||||
pub ori: anim::vek::Quaternion<f32>,
|
pub ori: anim::vek::Quaternion<f32>,
|
||||||
pub scale: f32,
|
pub scale: f32,
|
||||||
@ -6245,6 +6266,7 @@ impl<S: Skeleton> FigureState<S> {
|
|||||||
Self {
|
Self {
|
||||||
meta: FigureStateMeta {
|
meta: FigureStateMeta {
|
||||||
lantern_offset: offsets.lantern,
|
lantern_offset: offsets.lantern,
|
||||||
|
trail_points: offsets.trail_points,
|
||||||
mount_transform: offsets.mount_bone,
|
mount_transform: offsets.mount_bone,
|
||||||
mount_world_pos: anim::vek::Vec3::zero(),
|
mount_world_pos: anim::vek::Vec3::zero(),
|
||||||
state_time: 0.0,
|
state_time: 0.0,
|
||||||
@ -6266,8 +6288,10 @@ impl<S: Skeleton> FigureState<S> {
|
|||||||
pub fn update<const N: usize>(
|
pub fn update<const N: usize>(
|
||||||
&mut self,
|
&mut self,
|
||||||
renderer: &mut Renderer,
|
renderer: &mut Renderer,
|
||||||
|
trail_mgr: Option<&TrailMgr>,
|
||||||
buf: &mut [anim::FigureBoneData; anim::MAX_BONE_COUNT],
|
buf: &mut [anim::FigureBoneData; anim::MAX_BONE_COUNT],
|
||||||
FigureUpdateCommonParameters {
|
FigureUpdateCommonParameters {
|
||||||
|
entity,
|
||||||
pos,
|
pos,
|
||||||
ori,
|
ori,
|
||||||
scale,
|
scale,
|
||||||
@ -6410,6 +6434,26 @@ impl<S: Skeleton> FigureState<S> {
|
|||||||
|
|
||||||
renderer.update_consts(&mut self.meta.bound.1, &new_bone_consts[0..S::BONE_COUNT]);
|
renderer.update_consts(&mut self.meta.bound.1, &new_bone_consts[0..S::BONE_COUNT]);
|
||||||
self.lantern_offset = offsets.lantern;
|
self.lantern_offset = offsets.lantern;
|
||||||
|
// Handle weapon trails
|
||||||
|
if let Some(trail_mgr) = trail_mgr {
|
||||||
|
if let Some(dynamic_model) = entity
|
||||||
|
.as_ref()
|
||||||
|
.and_then(|e| trail_mgr.dynamic_models.get(e))
|
||||||
|
{
|
||||||
|
if let (Some((p1, p2)), Some((p3, p4))) = (self.trail_points, offsets.trail_points)
|
||||||
|
{
|
||||||
|
let vertex = |p: anim::vek::Vec3<f32>| trail::Vertex {
|
||||||
|
pos: p.into_array(),
|
||||||
|
};
|
||||||
|
let mut quad_mesh = Mesh::new();
|
||||||
|
// TODO: Figure out how to get
|
||||||
|
quad_mesh.push_quad(Quad::new(vertex(p1), vertex(p2), vertex(p3), vertex(p4)));
|
||||||
|
renderer.update_model(dynamic_model, &quad_mesh, trail_mgr.offset * 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.trail_points = offsets.trail_points;
|
||||||
|
|
||||||
// TODO: compute the mount bone only when it is needed
|
// TODO: compute the mount bone only when it is needed
|
||||||
self.mount_transform = offsets.mount_bone;
|
self.mount_transform = offsets.mount_bone;
|
||||||
self.mount_world_pos = mount_transform_pos.map_or(*pos, |(_, pos)| pos);
|
self.mount_world_pos = mount_transform_pos.map_or(*pos, |(_, pos)| pos);
|
||||||
|
@ -49,6 +49,7 @@ impl anim::Skeleton for VolumeKey {
|
|||||||
anim::Offsets {
|
anim::Offsets {
|
||||||
lantern: None,
|
lantern: None,
|
||||||
mount_bone: anim::vek::Transform::default(),
|
mount_bone: anim::vek::Transform::default(),
|
||||||
|
trail_points: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -698,6 +698,7 @@ impl Scene {
|
|||||||
// Maintain the figures.
|
// Maintain the figures.
|
||||||
let _figure_bounds = self.figure_mgr.maintain(
|
let _figure_bounds = self.figure_mgr.maintain(
|
||||||
renderer,
|
renderer,
|
||||||
|
&self.trail_mgr,
|
||||||
scene_data,
|
scene_data,
|
||||||
visible_psr_bounds,
|
visible_psr_bounds,
|
||||||
&self.camera,
|
&self.camera,
|
||||||
|
@ -148,6 +148,7 @@ impl Scene {
|
|||||||
.create_figure(renderer, greedy.finalize(), (opaque_mesh, bounds), [range]);
|
.create_figure(renderer, greedy.finalize(), (opaque_mesh, bounds), [range]);
|
||||||
let mut buf = [Default::default(); anim::MAX_BONE_COUNT];
|
let mut buf = [Default::default(); anim::MAX_BONE_COUNT];
|
||||||
let common_params = FigureUpdateCommonParameters {
|
let common_params = FigureUpdateCommonParameters {
|
||||||
|
entity: None,
|
||||||
pos: anim::vek::Vec3::zero(),
|
pos: anim::vek::Vec3::zero(),
|
||||||
ori: anim::vek::Quaternion::rotation_from_to_3d(
|
ori: anim::vek::Quaternion::rotation_from_to_3d(
|
||||||
anim::vek::Vec3::unit_y(),
|
anim::vek::Vec3::unit_y(),
|
||||||
@ -165,7 +166,15 @@ impl Scene {
|
|||||||
terrain: None,
|
terrain: None,
|
||||||
ground_vel: Vec3::zero(),
|
ground_vel: Vec3::zero(),
|
||||||
};
|
};
|
||||||
state.update(renderer, &mut buf, &common_params, 1.0, Some(&model), ());
|
state.update(
|
||||||
|
renderer,
|
||||||
|
None,
|
||||||
|
&mut buf,
|
||||||
|
&common_params,
|
||||||
|
1.0,
|
||||||
|
Some(&model),
|
||||||
|
(),
|
||||||
|
);
|
||||||
(model, state)
|
(model, state)
|
||||||
}),
|
}),
|
||||||
col_lights,
|
col_lights,
|
||||||
@ -330,6 +339,7 @@ impl Scene {
|
|||||||
.0;
|
.0;
|
||||||
let mut buf = [Default::default(); anim::MAX_BONE_COUNT];
|
let mut buf = [Default::default(); anim::MAX_BONE_COUNT];
|
||||||
let common_params = FigureUpdateCommonParameters {
|
let common_params = FigureUpdateCommonParameters {
|
||||||
|
entity: None,
|
||||||
pos: anim::vek::Vec3::zero(),
|
pos: anim::vek::Vec3::zero(),
|
||||||
ori: anim::vek::Quaternion::rotation_from_to_3d(
|
ori: anim::vek::Quaternion::rotation_from_to_3d(
|
||||||
anim::vek::Vec3::unit_y(),
|
anim::vek::Vec3::unit_y(),
|
||||||
@ -348,7 +358,7 @@ impl Scene {
|
|||||||
ground_vel: Vec3::zero(),
|
ground_vel: Vec3::zero(),
|
||||||
};
|
};
|
||||||
|
|
||||||
figure_state.update(renderer, &mut buf, &common_params, 1.0, model, body);
|
figure_state.update(renderer, None, &mut buf, &common_params, 1.0, model, body);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,23 +1,64 @@
|
|||||||
use super::SceneData;
|
use super::SceneData;
|
||||||
use crate::render::{DynamicModel, Renderer, TrailDrawer, TrailVertex};
|
use crate::render::{DynamicModel, Renderer, TrailDrawer, TrailVertex};
|
||||||
use common::uid::Uid;
|
use common::comp::CharacterState;
|
||||||
use common_base::span;
|
use common_base::span;
|
||||||
|
use specs::{Entity as EcsEntity, Join, WorldExt};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
// use vek::*;
|
||||||
|
|
||||||
pub struct TrailMgr {
|
pub struct TrailMgr {
|
||||||
|
/// Keep track of lifetimes
|
||||||
|
// trails: Vec<Trail>,
|
||||||
|
|
||||||
/// GPU vertex buffers
|
/// GPU vertex buffers
|
||||||
dynamic_models: HashMap<Uid, DynamicModel<TrailVertex>>,
|
pub dynamic_models: HashMap<EcsEntity, DynamicModel<TrailVertex>>,
|
||||||
|
|
||||||
|
/// Offset
|
||||||
|
pub offset: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const TRAIL_DYNAMIC_MODEL_SIZE: usize = 60;
|
||||||
|
|
||||||
impl TrailMgr {
|
impl TrailMgr {
|
||||||
pub fn new(_renderer: &mut Renderer) -> Self {
|
pub fn new(_renderer: &mut Renderer) -> Self {
|
||||||
Self {
|
Self {
|
||||||
|
// trails: Vec::new(),
|
||||||
dynamic_models: HashMap::new(),
|
dynamic_models: HashMap::new(),
|
||||||
|
offset: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn maintain(&mut self, _renderer: &mut Renderer, _scene_data: &SceneData) {
|
pub fn maintain(&mut self, renderer: &mut Renderer, scene_data: &SceneData) {
|
||||||
span!(_guard, "maintain", "TrailMgr::maintain");
|
span!(_guard, "maintain", "TrailMgr::maintain");
|
||||||
|
|
||||||
|
if scene_data.particles_enabled {
|
||||||
|
// remove dead Trails
|
||||||
|
// self.trails
|
||||||
|
// .retain(|t| t.alive_until > scene_data.state.get_time());
|
||||||
|
|
||||||
|
// Update offset
|
||||||
|
self.offset = (self.offset + 1) % TRAIL_DYNAMIC_MODEL_SIZE;
|
||||||
|
|
||||||
|
// Update dynamic models
|
||||||
|
let ecs = scene_data.state.ecs();
|
||||||
|
for (entity, _char_state) in
|
||||||
|
(&ecs.entities(), &ecs.read_storage::<CharacterState>()).join()
|
||||||
|
{
|
||||||
|
let _ = self.dynamic_models.try_insert(
|
||||||
|
entity,
|
||||||
|
renderer.create_dynamic_model(TRAIL_DYNAMIC_MODEL_SIZE * 4),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear dynamic models for entities that no longer exist (is this even
|
||||||
|
// necessary? not sure if this growing too big is a concern)
|
||||||
|
self.dynamic_models
|
||||||
|
.retain(|entity, _| ecs.entities().is_alive(*entity))
|
||||||
|
} else {
|
||||||
|
// if !self.trails.is_empty() {
|
||||||
|
// self.trails.clear();
|
||||||
|
// }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn render<'a>(&'a self, drawer: &mut TrailDrawer<'_, 'a>, scene_data: &SceneData) {
|
pub fn render<'a>(&'a self, drawer: &mut TrailDrawer<'_, 'a>, scene_data: &SceneData) {
|
||||||
@ -29,3 +70,22 @@ impl TrailMgr {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// struct Trail {
|
||||||
|
// entity: EcsEntity,
|
||||||
|
// pos1: Vec3<f32>,
|
||||||
|
// pos2: Vec3<f32>,
|
||||||
|
// alive_until: f64,
|
||||||
|
// }
|
||||||
|
|
||||||
|
// impl Trail {
|
||||||
|
// pub fn new(entity: EcsEntity, pos1: Vec3<f32>, pos2: Vec3<f32>, time:
|
||||||
|
// f64) -> Self { const LIFETIME: f64 = 1.0;
|
||||||
|
// Self {
|
||||||
|
// entity,
|
||||||
|
// pos1,
|
||||||
|
// pos2,
|
||||||
|
// alive_until: time + LIFETIME,
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
Loading…
Reference in New Issue
Block a user