Trails are now hackily created.

This commit is contained in:
Sam 2022-01-25 20:37:56 -05:00
parent 05f53a5316
commit 33419c7b4c
24 changed files with 149 additions and 10 deletions

View File

@ -113,6 +113,7 @@ impl Skeleton for ArthropodSkeleton {
orientation: mount_orientation,
scale: Vec3::one(),
},
trail_points: None,
}
}
}

View File

@ -137,6 +137,7 @@ impl Skeleton for BipedLargeSkeleton {
.into(),
..Default::default()
},
trail_points: None,
}
}
}

View File

@ -83,6 +83,7 @@ impl Skeleton for BipedSmallSkeleton {
.into(),
..Default::default()
},
trail_points: None,
}
}
}

View File

@ -106,6 +106,7 @@ impl Skeleton for BirdLargeSkeleton {
.into(),
..Default::default()
},
trail_points: None,
}
}
}

View File

@ -60,6 +60,7 @@ impl Skeleton for BirdMediumSkeleton {
.into(),
..Default::default()
},
trail_points: None,
}
}
}

View File

@ -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(),
)),
}
}
}

View File

@ -81,6 +81,7 @@ impl Skeleton for DragonSkeleton {
.into(),
..Default::default()
},
trail_points: None,
}
}
}

View File

@ -60,6 +60,7 @@ impl Skeleton for FishMediumSkeleton {
.into(),
..Default::default()
},
trail_points: None,
}
}
}

View File

@ -51,6 +51,7 @@ impl Skeleton for FishSmallSkeleton {
.into(),
..Default::default()
},
trail_points: None,
}
}
}

View File

@ -37,6 +37,7 @@ impl Skeleton for FixtureSkeleton {
Offsets {
lantern: None,
mount_bone: Transform::default(),
trail_points: None,
}
}
}

View File

@ -83,6 +83,7 @@ impl Skeleton for GolemSkeleton {
.into(),
..Default::default()
},
trail_points: None,
}
}
}

View File

@ -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 {

View File

@ -49,6 +49,7 @@ impl Skeleton for ObjectSkeleton {
.into(),
..Default::default()
},
trail_points: None,
}
}
}

View File

@ -97,6 +97,7 @@ impl Skeleton for QuadrupedLowSkeleton {
orientation: mount_orientation,
scale: Vec3::one(),
},
trail_points: None,
}
}
}

View File

@ -109,6 +109,7 @@ impl Skeleton for QuadrupedMediumSkeleton {
orientation: mount_orientation,
scale: Vec3::one(),
},
trail_points: None,
}
}
}

View File

@ -74,6 +74,7 @@ impl Skeleton for QuadrupedSmallSkeleton {
orientation: mount_orientation,
scale: Vec3::one(),
},
trail_points: None,
}
}
}

View File

@ -53,6 +53,7 @@ impl Skeleton for ShipSkeleton {
),
..Default::default()
},
trail_points: None,
}
}
}

View File

@ -84,6 +84,7 @@ impl Skeleton for TheropodSkeleton {
.into(),
..Default::default()
},
trail_points: None,
}
}
}

View File

@ -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"]

View File

@ -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);

View File

@ -49,6 +49,7 @@ impl anim::Skeleton for VolumeKey {
anim::Offsets {
lantern: None,
mount_bone: anim::vek::Transform::default(),
trail_points: None,
}
}

View File

@ -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,

View File

@ -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);
}
}

View File

@ -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,
// }
// }
// }