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,
|
||||
scale: Vec3::one(),
|
||||
},
|
||||
trail_points: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -137,6 +137,7 @@ impl Skeleton for BipedLargeSkeleton {
|
||||
.into(),
|
||||
..Default::default()
|
||||
},
|
||||
trail_points: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -83,6 +83,7 @@ impl Skeleton for BipedSmallSkeleton {
|
||||
.into(),
|
||||
..Default::default()
|
||||
},
|
||||
trail_points: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -106,6 +106,7 @@ impl Skeleton for BirdLargeSkeleton {
|
||||
.into(),
|
||||
..Default::default()
|
||||
},
|
||||
trail_points: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -60,6 +60,7 @@ impl Skeleton for BirdMediumSkeleton {
|
||||
.into(),
|
||||
..Default::default()
|
||||
},
|
||||
trail_points: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -125,6 +125,7 @@ impl Skeleton for CharacterSkeleton {
|
||||
} else {
|
||||
shorts_mat
|
||||
} * 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()) = [
|
||||
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_r)),
|
||||
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(lantern_mat),
|
||||
// FIXME: Should this be control_l_mat?
|
||||
@ -155,6 +156,10 @@ impl Skeleton for CharacterSkeleton {
|
||||
.into(),
|
||||
..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(),
|
||||
..Default::default()
|
||||
},
|
||||
trail_points: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -60,6 +60,7 @@ impl Skeleton for FishMediumSkeleton {
|
||||
.into(),
|
||||
..Default::default()
|
||||
},
|
||||
trail_points: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -51,6 +51,7 @@ impl Skeleton for FishSmallSkeleton {
|
||||
.into(),
|
||||
..Default::default()
|
||||
},
|
||||
trail_points: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -37,6 +37,7 @@ impl Skeleton for FixtureSkeleton {
|
||||
Offsets {
|
||||
lantern: None,
|
||||
mount_bone: Transform::default(),
|
||||
trail_points: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -83,6 +83,7 @@ impl Skeleton for GolemSkeleton {
|
||||
.into(),
|
||||
..Default::default()
|
||||
},
|
||||
trail_points: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -103,6 +103,7 @@ pub fn init() { lazy_static::initialize(&LIB); }
|
||||
pub struct Offsets {
|
||||
pub lantern: Option<Vec3<f32>>,
|
||||
pub mount_bone: Transform<f32, f32, f32>,
|
||||
pub trail_points: Option<(Vec3<f32>, Vec3<f32>)>,
|
||||
}
|
||||
|
||||
pub trait Skeleton: Send + Sync + 'static {
|
||||
|
@ -49,6 +49,7 @@ impl Skeleton for ObjectSkeleton {
|
||||
.into(),
|
||||
..Default::default()
|
||||
},
|
||||
trail_points: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -97,6 +97,7 @@ impl Skeleton for QuadrupedLowSkeleton {
|
||||
orientation: mount_orientation,
|
||||
scale: Vec3::one(),
|
||||
},
|
||||
trail_points: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -109,6 +109,7 @@ impl Skeleton for QuadrupedMediumSkeleton {
|
||||
orientation: mount_orientation,
|
||||
scale: Vec3::one(),
|
||||
},
|
||||
trail_points: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -74,6 +74,7 @@ impl Skeleton for QuadrupedSmallSkeleton {
|
||||
orientation: mount_orientation,
|
||||
scale: Vec3::one(),
|
||||
},
|
||||
trail_points: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -53,6 +53,7 @@ impl Skeleton for ShipSkeleton {
|
||||
),
|
||||
..Default::default()
|
||||
},
|
||||
trail_points: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -84,6 +84,7 @@ impl Skeleton for TheropodSkeleton {
|
||||
.into(),
|
||||
..Default::default()
|
||||
},
|
||||
trail_points: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -9,7 +9,8 @@
|
||||
drain_filter,
|
||||
once_cell,
|
||||
trait_alias,
|
||||
option_get_or_insert_default
|
||||
option_get_or_insert_default,
|
||||
map_try_insert
|
||||
)]
|
||||
#![recursion_limit = "2048"]
|
||||
|
||||
|
@ -9,15 +9,15 @@ pub use volume::VolumeKey;
|
||||
use crate::{
|
||||
ecs::comp::Interpolated,
|
||||
render::{
|
||||
pipelines::{self, ColLights},
|
||||
pipelines::{self, trail, ColLights},
|
||||
ColLightInfo, FigureBoneData, FigureDrawer, FigureLocals, FigureModel, FigureShadowDrawer,
|
||||
Mesh, RenderError, Renderer, SubModel, TerrainVertex,
|
||||
Mesh, Quad, RenderError, Renderer, SubModel, TerrainVertex,
|
||||
},
|
||||
scene::{
|
||||
camera::{Camera, CameraMode, Dependents},
|
||||
math,
|
||||
terrain::Terrain,
|
||||
SceneData,
|
||||
SceneData, TrailMgr,
|
||||
},
|
||||
};
|
||||
use anim::{
|
||||
@ -571,6 +571,7 @@ impl FigureMgr {
|
||||
pub fn maintain(
|
||||
&mut self,
|
||||
renderer: &mut Renderer,
|
||||
trail_mgr: &TrailMgr,
|
||||
scene_data: &SceneData,
|
||||
// Visible chunk data.
|
||||
visible_psr_bounds: math::Aabr<f32>,
|
||||
@ -855,6 +856,7 @@ impl FigureMgr {
|
||||
let body = *body;
|
||||
|
||||
let common_params = FigureUpdateCommonParameters {
|
||||
entity: Some(entity),
|
||||
pos: pos.0,
|
||||
ori,
|
||||
scale,
|
||||
@ -1759,6 +1761,7 @@ impl FigureMgr {
|
||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||
state.update(
|
||||
renderer,
|
||||
Some(trail_mgr),
|
||||
&mut update_buf,
|
||||
&common_params,
|
||||
state_animation_rate,
|
||||
@ -1958,6 +1961,7 @@ impl FigureMgr {
|
||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||
state.update(
|
||||
renderer,
|
||||
Some(trail_mgr),
|
||||
&mut update_buf,
|
||||
&common_params,
|
||||
state_animation_rate,
|
||||
@ -2274,6 +2278,7 @@ impl FigureMgr {
|
||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||
state.update(
|
||||
renderer,
|
||||
Some(trail_mgr),
|
||||
&mut update_buf,
|
||||
&common_params,
|
||||
state_animation_rate,
|
||||
@ -2631,6 +2636,7 @@ impl FigureMgr {
|
||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||
state.update(
|
||||
renderer,
|
||||
Some(trail_mgr),
|
||||
&mut update_buf,
|
||||
&common_params,
|
||||
state_animation_rate,
|
||||
@ -2734,6 +2740,7 @@ impl FigureMgr {
|
||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||
state.update(
|
||||
renderer,
|
||||
Some(trail_mgr),
|
||||
&mut update_buf,
|
||||
&common_params,
|
||||
state_animation_rate,
|
||||
@ -2816,6 +2823,7 @@ impl FigureMgr {
|
||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_base, dt_lerp);
|
||||
state.update(
|
||||
renderer,
|
||||
Some(trail_mgr),
|
||||
&mut update_buf,
|
||||
&common_params,
|
||||
state_animation_rate,
|
||||
@ -3342,6 +3350,7 @@ impl FigureMgr {
|
||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||
state.update(
|
||||
renderer,
|
||||
Some(trail_mgr),
|
||||
&mut update_buf,
|
||||
&common_params,
|
||||
state_animation_rate,
|
||||
@ -3428,6 +3437,7 @@ impl FigureMgr {
|
||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_base, dt_lerp);
|
||||
state.update(
|
||||
renderer,
|
||||
Some(trail_mgr),
|
||||
&mut update_buf,
|
||||
&common_params,
|
||||
state_animation_rate,
|
||||
@ -3606,6 +3616,7 @@ impl FigureMgr {
|
||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||
state.update(
|
||||
renderer,
|
||||
Some(trail_mgr),
|
||||
&mut update_buf,
|
||||
&common_params,
|
||||
state_animation_rate,
|
||||
@ -3897,6 +3908,7 @@ impl FigureMgr {
|
||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||
state.update(
|
||||
renderer,
|
||||
Some(trail_mgr),
|
||||
&mut update_buf,
|
||||
&common_params,
|
||||
state_animation_rate,
|
||||
@ -4219,6 +4231,7 @@ impl FigureMgr {
|
||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||
state.update(
|
||||
renderer,
|
||||
Some(trail_mgr),
|
||||
&mut update_buf,
|
||||
&common_params,
|
||||
state_animation_rate,
|
||||
@ -4301,6 +4314,7 @@ impl FigureMgr {
|
||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_base, dt_lerp);
|
||||
state.update(
|
||||
renderer,
|
||||
Some(trail_mgr),
|
||||
&mut update_buf,
|
||||
&common_params,
|
||||
state_animation_rate,
|
||||
@ -4922,6 +4936,7 @@ impl FigureMgr {
|
||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||
state.update(
|
||||
renderer,
|
||||
Some(trail_mgr),
|
||||
&mut update_buf,
|
||||
&common_params,
|
||||
state_animation_rate,
|
||||
@ -5162,6 +5177,7 @@ impl FigureMgr {
|
||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||
state.update(
|
||||
renderer,
|
||||
Some(trail_mgr),
|
||||
&mut update_buf,
|
||||
&common_params,
|
||||
state_animation_rate,
|
||||
@ -5289,6 +5305,7 @@ impl FigureMgr {
|
||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||
state.update(
|
||||
renderer,
|
||||
Some(trail_mgr),
|
||||
&mut update_buf,
|
||||
&common_params,
|
||||
state_animation_rate,
|
||||
@ -5385,6 +5402,7 @@ impl FigureMgr {
|
||||
|
||||
state.update(
|
||||
renderer,
|
||||
Some(trail_mgr),
|
||||
&mut update_buf,
|
||||
&common_params,
|
||||
state_animation_rate,
|
||||
@ -5478,6 +5496,7 @@ impl FigureMgr {
|
||||
state.skeleton = anim::vek::Lerp::lerp(&state.skeleton, &target_bones, dt_lerp);
|
||||
state.update(
|
||||
renderer,
|
||||
Some(trail_mgr),
|
||||
&mut update_buf,
|
||||
&common_params,
|
||||
state_animation_rate,
|
||||
@ -6170,6 +6189,7 @@ impl FigureColLights {
|
||||
|
||||
pub struct FigureStateMeta {
|
||||
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
|
||||
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
|
||||
@ -6218,6 +6238,7 @@ impl<S> DerefMut for FigureState<S> {
|
||||
/// Parameters that don't depend on the body variant or animation results and
|
||||
/// are also not mutable
|
||||
pub struct FigureUpdateCommonParameters<'a> {
|
||||
pub entity: Option<EcsEntity>,
|
||||
pub pos: anim::vek::Vec3<f32>,
|
||||
pub ori: anim::vek::Quaternion<f32>,
|
||||
pub scale: f32,
|
||||
@ -6245,6 +6266,7 @@ impl<S: Skeleton> FigureState<S> {
|
||||
Self {
|
||||
meta: FigureStateMeta {
|
||||
lantern_offset: offsets.lantern,
|
||||
trail_points: offsets.trail_points,
|
||||
mount_transform: offsets.mount_bone,
|
||||
mount_world_pos: anim::vek::Vec3::zero(),
|
||||
state_time: 0.0,
|
||||
@ -6266,8 +6288,10 @@ impl<S: Skeleton> FigureState<S> {
|
||||
pub fn update<const N: usize>(
|
||||
&mut self,
|
||||
renderer: &mut Renderer,
|
||||
trail_mgr: Option<&TrailMgr>,
|
||||
buf: &mut [anim::FigureBoneData; anim::MAX_BONE_COUNT],
|
||||
FigureUpdateCommonParameters {
|
||||
entity,
|
||||
pos,
|
||||
ori,
|
||||
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]);
|
||||
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
|
||||
self.mount_transform = offsets.mount_bone;
|
||||
self.mount_world_pos = mount_transform_pos.map_or(*pos, |(_, pos)| pos);
|
||||
|
@ -49,6 +49,7 @@ impl anim::Skeleton for VolumeKey {
|
||||
anim::Offsets {
|
||||
lantern: None,
|
||||
mount_bone: anim::vek::Transform::default(),
|
||||
trail_points: None,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -698,6 +698,7 @@ impl Scene {
|
||||
// Maintain the figures.
|
||||
let _figure_bounds = self.figure_mgr.maintain(
|
||||
renderer,
|
||||
&self.trail_mgr,
|
||||
scene_data,
|
||||
visible_psr_bounds,
|
||||
&self.camera,
|
||||
|
@ -148,6 +148,7 @@ impl Scene {
|
||||
.create_figure(renderer, greedy.finalize(), (opaque_mesh, bounds), [range]);
|
||||
let mut buf = [Default::default(); anim::MAX_BONE_COUNT];
|
||||
let common_params = FigureUpdateCommonParameters {
|
||||
entity: None,
|
||||
pos: anim::vek::Vec3::zero(),
|
||||
ori: anim::vek::Quaternion::rotation_from_to_3d(
|
||||
anim::vek::Vec3::unit_y(),
|
||||
@ -165,7 +166,15 @@ impl Scene {
|
||||
terrain: None,
|
||||
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)
|
||||
}),
|
||||
col_lights,
|
||||
@ -330,6 +339,7 @@ impl Scene {
|
||||
.0;
|
||||
let mut buf = [Default::default(); anim::MAX_BONE_COUNT];
|
||||
let common_params = FigureUpdateCommonParameters {
|
||||
entity: None,
|
||||
pos: anim::vek::Vec3::zero(),
|
||||
ori: anim::vek::Quaternion::rotation_from_to_3d(
|
||||
anim::vek::Vec3::unit_y(),
|
||||
@ -348,7 +358,7 @@ impl Scene {
|
||||
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 crate::render::{DynamicModel, Renderer, TrailDrawer, TrailVertex};
|
||||
use common::uid::Uid;
|
||||
use common::comp::CharacterState;
|
||||
use common_base::span;
|
||||
use specs::{Entity as EcsEntity, Join, WorldExt};
|
||||
use std::collections::HashMap;
|
||||
// use vek::*;
|
||||
|
||||
pub struct TrailMgr {
|
||||
/// Keep track of lifetimes
|
||||
// trails: Vec<Trail>,
|
||||
|
||||
/// 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 {
|
||||
pub fn new(_renderer: &mut Renderer) -> Self {
|
||||
Self {
|
||||
// trails: Vec::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");
|
||||
|
||||
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) {
|
||||
@ -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