2019-08-21 01:19:02 +00:00
|
|
|
use super::load::*;
|
|
|
|
use crate::{
|
2020-04-24 18:52:44 +00:00
|
|
|
mesh::Meshable,
|
2019-08-21 01:19:02 +00:00
|
|
|
render::{FigurePipeline, Mesh, Model, Renderer},
|
2019-08-18 09:01:57 +00:00
|
|
|
scene::camera::CameraMode,
|
2019-08-21 01:19:02 +00:00
|
|
|
};
|
2020-06-18 06:45:49 +00:00
|
|
|
use anim::Skeleton;
|
2019-08-24 23:18:47 +00:00
|
|
|
use common::{
|
|
|
|
assets::watch::ReloadIndicator,
|
2020-03-28 05:51:52 +00:00
|
|
|
comp::{
|
2020-08-04 23:21:42 +00:00
|
|
|
item::{armor::ArmorKind, tool::ToolKind, ItemKind},
|
2020-07-18 00:05:28 +00:00
|
|
|
Body, CharacterState, Loadout,
|
2020-03-28 05:51:52 +00:00
|
|
|
},
|
2020-04-24 18:52:44 +00:00
|
|
|
figure::Segment,
|
2020-04-24 18:37:45 +00:00
|
|
|
vol::BaseVol,
|
2019-08-24 23:18:47 +00:00
|
|
|
};
|
2020-01-26 00:22:48 +00:00
|
|
|
use hashbrown::{hash_map::Entry, HashMap};
|
|
|
|
use std::{
|
|
|
|
convert::TryInto,
|
|
|
|
mem::{discriminant, Discriminant},
|
|
|
|
};
|
2020-04-24 18:52:44 +00:00
|
|
|
use vek::*;
|
2019-08-21 01:19:02 +00:00
|
|
|
|
2020-06-10 19:47:36 +00:00
|
|
|
#[allow(clippy::large_enum_variant)] // TODO: Pending review in #587
|
2019-08-21 01:19:02 +00:00
|
|
|
#[derive(PartialEq, Eq, Hash, Clone)]
|
|
|
|
enum FigureKey {
|
|
|
|
Simple(Body),
|
2020-03-16 21:04:49 +00:00
|
|
|
Complex(Body, CameraMode, CharacterCacheKey),
|
2019-09-07 09:29:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(PartialEq, Eq, Hash, Clone)]
|
2020-03-16 11:32:57 +00:00
|
|
|
struct CharacterCacheKey {
|
2020-03-16 21:04:49 +00:00
|
|
|
state: Option<Discriminant<CharacterState>>, // TODO: Can this be simplified?
|
2020-03-19 19:57:36 +00:00
|
|
|
active_tool: Option<ToolKind>,
|
2020-07-05 15:11:45 +00:00
|
|
|
second_tool: Option<ToolKind>,
|
2020-07-18 00:05:28 +00:00
|
|
|
shoulder: Option<ArmorKind>,
|
|
|
|
chest: Option<ArmorKind>,
|
|
|
|
belt: Option<ArmorKind>,
|
|
|
|
back: Option<ArmorKind>,
|
2020-08-04 23:21:42 +00:00
|
|
|
lantern: Option<String>,
|
2020-07-18 00:05:28 +00:00
|
|
|
hand: Option<ArmorKind>,
|
|
|
|
pants: Option<ArmorKind>,
|
|
|
|
foot: Option<ArmorKind>,
|
2019-09-07 09:29:26 +00:00
|
|
|
}
|
|
|
|
|
2020-03-16 11:32:57 +00:00
|
|
|
impl CharacterCacheKey {
|
2020-03-16 21:04:49 +00:00
|
|
|
fn from(cs: Option<&CharacterState>, loadout: &Loadout) -> Self {
|
2019-09-07 09:29:26 +00:00
|
|
|
Self {
|
2020-03-16 21:04:49 +00:00
|
|
|
state: cs.map(|cs| discriminant(cs)),
|
2020-03-16 11:32:57 +00:00
|
|
|
active_tool: if let Some(ItemKind::Tool(tool)) =
|
|
|
|
loadout.active_item.as_ref().map(|i| &i.item.kind)
|
2020-07-05 15:11:45 +00:00
|
|
|
{
|
2020-08-02 01:21:32 +00:00
|
|
|
Some(tool.kind.clone())
|
2020-07-05 15:11:45 +00:00
|
|
|
} else {
|
|
|
|
None
|
|
|
|
},
|
|
|
|
second_tool: if let Some(ItemKind::Tool(tool)) =
|
|
|
|
loadout.second_item.as_ref().map(|i| &i.item.kind)
|
2020-03-16 11:32:57 +00:00
|
|
|
{
|
2020-08-02 01:21:32 +00:00
|
|
|
Some(tool.kind.clone())
|
2020-03-16 11:32:57 +00:00
|
|
|
} else {
|
|
|
|
None
|
|
|
|
},
|
2020-07-18 00:05:28 +00:00
|
|
|
shoulder: if let Some(ItemKind::Armor(armor)) =
|
|
|
|
loadout.shoulder.as_ref().map(|i| &i.kind)
|
|
|
|
{
|
2020-08-03 03:41:32 +00:00
|
|
|
Some(armor.kind.clone())
|
2020-07-18 00:05:28 +00:00
|
|
|
} else {
|
|
|
|
None
|
|
|
|
},
|
|
|
|
chest: if let Some(ItemKind::Armor(armor)) = loadout.chest.as_ref().map(|i| &i.kind) {
|
2020-08-03 03:41:32 +00:00
|
|
|
Some(armor.kind.clone())
|
2020-07-18 00:05:28 +00:00
|
|
|
} else {
|
|
|
|
None
|
|
|
|
},
|
|
|
|
belt: if let Some(ItemKind::Armor(armor)) = loadout.belt.as_ref().map(|i| &i.kind) {
|
2020-08-03 03:41:32 +00:00
|
|
|
Some(armor.kind.clone())
|
2020-07-18 00:05:28 +00:00
|
|
|
} else {
|
|
|
|
None
|
|
|
|
},
|
|
|
|
back: if let Some(ItemKind::Armor(armor)) = loadout.back.as_ref().map(|i| &i.kind) {
|
2020-08-03 03:41:32 +00:00
|
|
|
Some(armor.kind.clone())
|
2020-07-18 00:05:28 +00:00
|
|
|
} else {
|
|
|
|
None
|
|
|
|
},
|
|
|
|
lantern: if let Some(ItemKind::Lantern(lantern)) =
|
|
|
|
loadout.lantern.as_ref().map(|i| &i.kind)
|
|
|
|
{
|
2020-08-04 23:21:42 +00:00
|
|
|
Some(lantern.kind.clone())
|
2020-07-18 00:05:28 +00:00
|
|
|
} else {
|
|
|
|
None
|
|
|
|
},
|
|
|
|
hand: if let Some(ItemKind::Armor(armor)) = loadout.hand.as_ref().map(|i| &i.kind) {
|
2020-08-03 03:41:32 +00:00
|
|
|
Some(armor.kind.clone())
|
2020-07-18 00:05:28 +00:00
|
|
|
} else {
|
|
|
|
None
|
|
|
|
},
|
|
|
|
pants: if let Some(ItemKind::Armor(armor)) = loadout.pants.as_ref().map(|i| &i.kind) {
|
2020-08-03 03:41:32 +00:00
|
|
|
Some(armor.kind.clone())
|
2020-07-18 00:05:28 +00:00
|
|
|
} else {
|
|
|
|
None
|
|
|
|
},
|
|
|
|
foot: if let Some(ItemKind::Armor(armor)) = loadout.foot.as_ref().map(|i| &i.kind) {
|
2020-08-03 03:41:32 +00:00
|
|
|
Some(armor.kind.clone())
|
2020-07-18 00:05:28 +00:00
|
|
|
} else {
|
|
|
|
None
|
|
|
|
},
|
2019-09-07 09:29:26 +00:00
|
|
|
}
|
|
|
|
}
|
2019-08-21 01:19:02 +00:00
|
|
|
}
|
|
|
|
|
2020-06-10 19:47:36 +00:00
|
|
|
#[allow(clippy::type_complexity)] // TODO: Pending review in #587
|
2020-01-26 00:22:48 +00:00
|
|
|
pub struct FigureModelCache<Skel = anim::character::CharacterSkeleton>
|
|
|
|
where
|
|
|
|
Skel: Skeleton,
|
|
|
|
{
|
2020-04-24 18:37:45 +00:00
|
|
|
models: HashMap<FigureKey, (([Model<FigurePipeline>; 3], Skel::Attr), u64)>,
|
2019-08-24 23:18:47 +00:00
|
|
|
manifest_indicator: ReloadIndicator,
|
2019-08-21 01:19:02 +00:00
|
|
|
}
|
|
|
|
|
2020-01-26 00:22:48 +00:00
|
|
|
impl<Skel: Skeleton> FigureModelCache<Skel> {
|
2020-06-10 19:47:36 +00:00
|
|
|
#[allow(clippy::new_without_default)] // TODO: Pending review in #587
|
2019-08-21 01:19:02 +00:00
|
|
|
pub fn new() -> Self {
|
|
|
|
Self {
|
|
|
|
models: HashMap::new(),
|
2019-08-24 23:18:47 +00:00
|
|
|
manifest_indicator: ReloadIndicator::new(),
|
2019-08-21 01:19:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-24 18:37:45 +00:00
|
|
|
fn bone_meshes(
|
|
|
|
body: Body,
|
|
|
|
loadout: Option<&Loadout>,
|
|
|
|
character_state: Option<&CharacterState>,
|
|
|
|
camera_mode: CameraMode,
|
|
|
|
manifest_indicator: &mut ReloadIndicator,
|
|
|
|
generate_mesh: fn(&Segment, Vec3<f32>) -> Mesh<FigurePipeline>,
|
|
|
|
) -> [Option<Mesh<FigurePipeline>>; 16] {
|
|
|
|
match body {
|
|
|
|
Body::Humanoid(body) => {
|
2020-04-24 18:52:44 +00:00
|
|
|
let humanoid_head_spec = HumHeadSpec::load_watched(manifest_indicator);
|
2020-04-24 18:37:45 +00:00
|
|
|
let humanoid_armor_shoulder_spec =
|
|
|
|
HumArmorShoulderSpec::load_watched(manifest_indicator);
|
2020-04-24 18:52:44 +00:00
|
|
|
let humanoid_armor_chest_spec = HumArmorChestSpec::load_watched(manifest_indicator);
|
|
|
|
let humanoid_armor_hand_spec = HumArmorHandSpec::load_watched(manifest_indicator);
|
|
|
|
let humanoid_armor_belt_spec = HumArmorBeltSpec::load_watched(manifest_indicator);
|
|
|
|
let humanoid_armor_back_spec = HumArmorBackSpec::load_watched(manifest_indicator);
|
2020-04-24 18:37:45 +00:00
|
|
|
let humanoid_armor_lantern_spec =
|
|
|
|
HumArmorLanternSpec::load_watched(manifest_indicator);
|
2020-04-24 18:52:44 +00:00
|
|
|
let humanoid_armor_pants_spec = HumArmorPantsSpec::load_watched(manifest_indicator);
|
|
|
|
let humanoid_armor_foot_spec = HumArmorFootSpec::load_watched(manifest_indicator);
|
|
|
|
let humanoid_main_weapon_spec = HumMainWeaponSpec::load_watched(manifest_indicator);
|
2020-04-24 18:37:45 +00:00
|
|
|
|
|
|
|
// TODO: This is bad code, maybe this method should return Option<_>
|
|
|
|
let default_loadout = Loadout::default();
|
|
|
|
let loadout = loadout.unwrap_or(&default_loadout);
|
|
|
|
|
|
|
|
[
|
|
|
|
match camera_mode {
|
2020-07-09 17:12:11 +00:00
|
|
|
CameraMode::ThirdPerson | CameraMode::Freefly => {
|
2020-05-29 18:23:00 +00:00
|
|
|
Some(humanoid_head_spec.mesh_head(&body, generate_mesh))
|
|
|
|
},
|
2020-04-24 18:37:45 +00:00
|
|
|
CameraMode::FirstPerson => None,
|
|
|
|
},
|
|
|
|
match camera_mode {
|
2020-07-09 17:12:11 +00:00
|
|
|
CameraMode::ThirdPerson | CameraMode::Freefly => Some(
|
|
|
|
humanoid_armor_chest_spec.mesh_chest(&body, loadout, generate_mesh),
|
|
|
|
),
|
2020-04-24 18:37:45 +00:00
|
|
|
CameraMode::FirstPerson => None,
|
|
|
|
},
|
|
|
|
match camera_mode {
|
2020-07-09 17:12:11 +00:00
|
|
|
CameraMode::ThirdPerson | CameraMode::Freefly => {
|
2020-04-24 18:37:45 +00:00
|
|
|
Some(humanoid_armor_belt_spec.mesh_belt(&body, loadout, generate_mesh))
|
|
|
|
},
|
|
|
|
CameraMode::FirstPerson => None,
|
|
|
|
},
|
|
|
|
match camera_mode {
|
2020-07-09 17:12:11 +00:00
|
|
|
CameraMode::ThirdPerson | CameraMode::Freefly => {
|
2020-04-24 18:37:45 +00:00
|
|
|
Some(humanoid_armor_back_spec.mesh_back(&body, loadout, generate_mesh))
|
|
|
|
},
|
|
|
|
CameraMode::FirstPerson => None,
|
|
|
|
},
|
|
|
|
match camera_mode {
|
2020-07-09 17:12:11 +00:00
|
|
|
CameraMode::ThirdPerson | CameraMode::Freefly => Some(
|
|
|
|
humanoid_armor_pants_spec.mesh_pants(&body, loadout, generate_mesh),
|
|
|
|
),
|
2020-04-24 18:37:45 +00:00
|
|
|
CameraMode::FirstPerson => None,
|
|
|
|
},
|
2020-05-27 06:41:55 +00:00
|
|
|
Some(humanoid_armor_hand_spec.mesh_left_hand(&body, loadout, generate_mesh)),
|
|
|
|
Some(humanoid_armor_hand_spec.mesh_right_hand(&body, loadout, generate_mesh)),
|
|
|
|
Some(humanoid_armor_foot_spec.mesh_left_foot(&body, loadout, generate_mesh)),
|
|
|
|
Some(humanoid_armor_foot_spec.mesh_right_foot(&body, loadout, generate_mesh)),
|
2020-04-24 18:37:45 +00:00
|
|
|
match camera_mode {
|
2020-07-09 17:12:11 +00:00
|
|
|
CameraMode::ThirdPerson | CameraMode::Freefly => {
|
2020-04-24 18:52:44 +00:00
|
|
|
Some(humanoid_armor_shoulder_spec.mesh_left_shoulder(
|
|
|
|
&body,
|
|
|
|
loadout,
|
|
|
|
generate_mesh,
|
|
|
|
))
|
|
|
|
},
|
2020-04-24 18:37:45 +00:00
|
|
|
CameraMode::FirstPerson => None,
|
|
|
|
},
|
|
|
|
match camera_mode {
|
2020-07-09 17:12:11 +00:00
|
|
|
CameraMode::ThirdPerson | CameraMode::Freefly => {
|
2020-04-24 18:52:44 +00:00
|
|
|
Some(humanoid_armor_shoulder_spec.mesh_right_shoulder(
|
|
|
|
&body,
|
|
|
|
loadout,
|
|
|
|
generate_mesh,
|
|
|
|
))
|
|
|
|
},
|
2020-04-24 18:37:45 +00:00
|
|
|
CameraMode::FirstPerson => None,
|
|
|
|
},
|
|
|
|
Some(mesh_glider(generate_mesh)),
|
|
|
|
if camera_mode != CameraMode::FirstPerson
|
|
|
|
|| character_state
|
2020-04-24 18:52:44 +00:00
|
|
|
.map(|cs| cs.is_attack() || cs.is_block() || cs.is_wield())
|
2020-04-24 18:37:45 +00:00
|
|
|
.unwrap_or_default()
|
|
|
|
{
|
|
|
|
Some(humanoid_main_weapon_spec.mesh_main_weapon(
|
|
|
|
loadout.active_item.as_ref().map(|i| &i.item.kind),
|
2020-07-01 09:51:06 +00:00
|
|
|
false,
|
|
|
|
generate_mesh,
|
|
|
|
))
|
|
|
|
} else {
|
|
|
|
None
|
|
|
|
},
|
|
|
|
if camera_mode != CameraMode::FirstPerson
|
|
|
|
|| character_state
|
|
|
|
.map(|cs| cs.is_attack() || cs.is_block() || cs.is_wield())
|
|
|
|
.unwrap_or_default()
|
|
|
|
{
|
|
|
|
Some(humanoid_main_weapon_spec.mesh_main_weapon(
|
|
|
|
loadout.second_item.as_ref().map(|i| &i.item.kind),
|
|
|
|
true,
|
2020-04-24 18:37:45 +00:00
|
|
|
generate_mesh,
|
|
|
|
))
|
|
|
|
} else {
|
|
|
|
None
|
|
|
|
},
|
|
|
|
Some(humanoid_armor_lantern_spec.mesh_lantern(&body, loadout, generate_mesh)),
|
2020-06-14 09:22:21 +00:00
|
|
|
Some(mesh_hold(generate_mesh)),
|
2020-04-24 18:37:45 +00:00
|
|
|
]
|
|
|
|
},
|
|
|
|
Body::QuadrupedSmall(body) => {
|
|
|
|
let quadruped_small_central_spec =
|
|
|
|
QuadrupedSmallCentralSpec::load_watched(manifest_indicator);
|
|
|
|
let quadruped_small_lateral_spec =
|
|
|
|
QuadrupedSmallLateralSpec::load_watched(manifest_indicator);
|
|
|
|
|
|
|
|
[
|
2020-04-24 18:52:44 +00:00
|
|
|
Some(quadruped_small_central_spec.mesh_head(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(quadruped_small_central_spec.mesh_chest(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-06-10 23:11:06 +00:00
|
|
|
Some(quadruped_small_lateral_spec.mesh_foot_fl(
|
2020-04-24 18:52:44 +00:00
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-06-10 23:11:06 +00:00
|
|
|
Some(quadruped_small_lateral_spec.mesh_foot_fr(
|
2020-04-24 18:52:44 +00:00
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-06-10 23:11:06 +00:00
|
|
|
Some(quadruped_small_lateral_spec.mesh_foot_bl(
|
2020-04-24 18:52:44 +00:00
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-06-10 23:11:06 +00:00
|
|
|
Some(quadruped_small_lateral_spec.mesh_foot_br(
|
2020-04-24 18:52:44 +00:00
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-06-01 00:33:24 +00:00
|
|
|
Some(quadruped_small_central_spec.mesh_tail(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-04-24 18:37:45 +00:00
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
]
|
|
|
|
},
|
|
|
|
Body::QuadrupedMedium(body) => {
|
|
|
|
let quadruped_medium_central_spec =
|
|
|
|
QuadrupedMediumCentralSpec::load_watched(manifest_indicator);
|
|
|
|
let quadruped_medium_lateral_spec =
|
|
|
|
QuadrupedMediumLateralSpec::load_watched(manifest_indicator);
|
|
|
|
|
|
|
|
[
|
2020-04-24 18:52:44 +00:00
|
|
|
Some(quadruped_medium_central_spec.mesh_head_upper(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(quadruped_medium_central_spec.mesh_head_lower(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(quadruped_medium_central_spec.mesh_jaw(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(quadruped_medium_central_spec.mesh_tail(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-06-10 23:11:06 +00:00
|
|
|
Some(quadruped_medium_central_spec.mesh_torso_front(
|
2020-04-24 18:52:44 +00:00
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-06-10 23:11:06 +00:00
|
|
|
Some(quadruped_medium_central_spec.mesh_torso_back(
|
2020-04-24 18:52:44 +00:00
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(quadruped_medium_central_spec.mesh_ears(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-06-10 23:11:06 +00:00
|
|
|
Some(quadruped_medium_lateral_spec.mesh_leg_fl(
|
2020-06-03 00:56:42 +00:00
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-06-10 23:11:06 +00:00
|
|
|
Some(quadruped_medium_lateral_spec.mesh_leg_fr(
|
2020-06-03 00:56:42 +00:00
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-06-10 23:11:06 +00:00
|
|
|
Some(quadruped_medium_lateral_spec.mesh_leg_bl(
|
2020-06-03 00:56:42 +00:00
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-06-10 23:11:06 +00:00
|
|
|
Some(quadruped_medium_lateral_spec.mesh_leg_br(
|
2020-06-03 00:56:42 +00:00
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-06-10 23:11:06 +00:00
|
|
|
Some(quadruped_medium_lateral_spec.mesh_foot_fl(
|
2020-04-24 18:52:44 +00:00
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-06-10 23:11:06 +00:00
|
|
|
Some(quadruped_medium_lateral_spec.mesh_foot_fr(
|
2020-04-24 18:52:44 +00:00
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-06-10 23:11:06 +00:00
|
|
|
Some(quadruped_medium_lateral_spec.mesh_foot_bl(
|
2020-04-24 18:52:44 +00:00
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-06-10 23:11:06 +00:00
|
|
|
Some(quadruped_medium_lateral_spec.mesh_foot_br(
|
2020-04-24 18:52:44 +00:00
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-04-24 18:37:45 +00:00
|
|
|
None,
|
|
|
|
]
|
|
|
|
},
|
|
|
|
Body::BirdMedium(body) => {
|
2020-04-24 18:52:44 +00:00
|
|
|
let bird_medium_center_spec =
|
|
|
|
BirdMediumCenterSpec::load_watched(manifest_indicator);
|
|
|
|
let bird_medium_lateral_spec =
|
|
|
|
BirdMediumLateralSpec::load_watched(manifest_indicator);
|
2020-04-24 18:37:45 +00:00
|
|
|
|
|
|
|
[
|
2020-04-24 18:52:44 +00:00
|
|
|
Some(bird_medium_center_spec.mesh_head(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(bird_medium_center_spec.mesh_torso(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(bird_medium_center_spec.mesh_tail(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(bird_medium_lateral_spec.mesh_wing_l(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(bird_medium_lateral_spec.mesh_wing_r(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(bird_medium_lateral_spec.mesh_foot_l(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(bird_medium_lateral_spec.mesh_foot_r(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-04-24 18:37:45 +00:00
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
]
|
|
|
|
},
|
|
|
|
Body::FishMedium(body) => [
|
|
|
|
Some(mesh_fish_medium_head(body.head, generate_mesh)),
|
|
|
|
Some(mesh_fish_medium_torso(body.torso, generate_mesh)),
|
|
|
|
Some(mesh_fish_medium_rear(body.rear, generate_mesh)),
|
|
|
|
Some(mesh_fish_medium_tail(body.tail, generate_mesh)),
|
|
|
|
Some(mesh_fish_medium_fin_l(body.fin_l, generate_mesh)),
|
|
|
|
Some(mesh_fish_medium_fin_r(body.fin_r, generate_mesh)),
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
],
|
2020-04-25 13:20:37 +00:00
|
|
|
Body::Dragon(body) => {
|
2020-05-09 22:02:27 +00:00
|
|
|
let dragon_center_spec = DragonCenterSpec::load_watched(manifest_indicator);
|
|
|
|
let dragon_lateral_spec = DragonLateralSpec::load_watched(manifest_indicator);
|
2020-04-25 13:20:37 +00:00
|
|
|
|
|
|
|
[
|
2020-05-06 00:04:56 +00:00
|
|
|
Some(dragon_center_spec.mesh_head_upper(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(dragon_center_spec.mesh_head_lower(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-05-09 22:02:27 +00:00
|
|
|
Some(dragon_center_spec.mesh_jaw(body.species, body.body_type, generate_mesh)),
|
2020-04-25 13:20:37 +00:00
|
|
|
Some(dragon_center_spec.mesh_chest_front(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(dragon_center_spec.mesh_chest_rear(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(dragon_center_spec.mesh_tail_front(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(dragon_center_spec.mesh_tail_rear(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(dragon_lateral_spec.mesh_wing_in_l(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(dragon_lateral_spec.mesh_wing_in_r(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(dragon_lateral_spec.mesh_wing_out_l(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(dragon_lateral_spec.mesh_wing_out_r(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(dragon_lateral_spec.mesh_foot_fl(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(dragon_lateral_spec.mesh_foot_fr(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(dragon_lateral_spec.mesh_foot_bl(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(dragon_lateral_spec.mesh_foot_br(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
None,
|
|
|
|
]
|
|
|
|
},
|
2020-04-24 18:37:45 +00:00
|
|
|
Body::BirdSmall(body) => [
|
|
|
|
Some(mesh_bird_small_head(body.head, generate_mesh)),
|
|
|
|
Some(mesh_bird_small_torso(body.torso, generate_mesh)),
|
|
|
|
Some(mesh_bird_small_wing_l(body.wing_l, generate_mesh)),
|
|
|
|
Some(mesh_bird_small_wing_r(body.wing_r, generate_mesh)),
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
],
|
|
|
|
Body::FishSmall(body) => [
|
|
|
|
Some(mesh_fish_small_torso(body.torso, generate_mesh)),
|
|
|
|
Some(mesh_fish_small_tail(body.tail, generate_mesh)),
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
],
|
|
|
|
Body::BipedLarge(body) => {
|
2020-04-24 18:52:44 +00:00
|
|
|
let biped_large_center_spec =
|
|
|
|
BipedLargeCenterSpec::load_watched(manifest_indicator);
|
|
|
|
let biped_large_lateral_spec =
|
|
|
|
BipedLargeLateralSpec::load_watched(manifest_indicator);
|
2020-04-24 18:37:45 +00:00
|
|
|
|
|
|
|
[
|
2020-04-24 18:52:44 +00:00
|
|
|
Some(biped_large_center_spec.mesh_head(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(biped_large_center_spec.mesh_torso_upper(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(biped_large_center_spec.mesh_torso_lower(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-07-31 06:30:54 +00:00
|
|
|
Some(biped_large_center_spec.mesh_main(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-04-24 18:52:44 +00:00
|
|
|
Some(biped_large_lateral_spec.mesh_shoulder_l(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(biped_large_lateral_spec.mesh_shoulder_r(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(biped_large_lateral_spec.mesh_hand_l(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(biped_large_lateral_spec.mesh_hand_r(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(biped_large_lateral_spec.mesh_leg_l(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(biped_large_lateral_spec.mesh_leg_r(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(biped_large_lateral_spec.mesh_foot_l(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(biped_large_lateral_spec.mesh_foot_r(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-04-24 18:37:45 +00:00
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
]
|
|
|
|
},
|
2020-04-26 01:09:03 +00:00
|
|
|
Body::Golem(body) => {
|
|
|
|
let golem_center_spec = GolemCenterSpec::load_watched(manifest_indicator);
|
|
|
|
let golem_lateral_spec = GolemLateralSpec::load_watched(manifest_indicator);
|
|
|
|
|
|
|
|
[
|
|
|
|
Some(golem_center_spec.mesh_head(body.species, body.body_type, generate_mesh)),
|
|
|
|
Some(golem_center_spec.mesh_torso_upper(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(golem_lateral_spec.mesh_shoulder_l(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(golem_lateral_spec.mesh_shoulder_r(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(golem_lateral_spec.mesh_hand_l(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(golem_lateral_spec.mesh_hand_r(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(golem_lateral_spec.mesh_leg_l(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(golem_lateral_spec.mesh_leg_r(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(golem_lateral_spec.mesh_foot_l(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(golem_lateral_spec.mesh_foot_r(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
]
|
|
|
|
},
|
2020-04-24 18:37:45 +00:00
|
|
|
Body::Critter(body) => {
|
2020-04-24 18:52:44 +00:00
|
|
|
let critter_center_spec = CritterCenterSpec::load_watched(manifest_indicator);
|
2020-04-24 18:37:45 +00:00
|
|
|
|
|
|
|
[
|
2020-04-24 18:52:44 +00:00
|
|
|
Some(critter_center_spec.mesh_head(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(critter_center_spec.mesh_chest(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(critter_center_spec.mesh_feet_f(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(critter_center_spec.mesh_feet_b(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(critter_center_spec.mesh_tail(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-04-24 18:37:45 +00:00
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
2020-06-01 23:56:50 +00:00
|
|
|
]
|
|
|
|
},
|
|
|
|
Body::QuadrupedLow(body) => {
|
|
|
|
let quadruped_low_central_spec =
|
|
|
|
QuadrupedLowCentralSpec::load_watched(manifest_indicator);
|
|
|
|
let quadruped_low_lateral_spec =
|
|
|
|
QuadrupedLowLateralSpec::load_watched(manifest_indicator);
|
|
|
|
|
|
|
|
[
|
|
|
|
Some(quadruped_low_central_spec.mesh_head_upper(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(quadruped_low_central_spec.mesh_head_lower(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(quadruped_low_central_spec.mesh_jaw(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-06-05 02:04:07 +00:00
|
|
|
Some(quadruped_low_central_spec.mesh_chest(
|
2020-06-01 23:56:50 +00:00
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-06-05 02:04:07 +00:00
|
|
|
Some(quadruped_low_central_spec.mesh_tail_front(
|
2020-06-01 23:56:50 +00:00
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
2020-06-05 02:04:07 +00:00
|
|
|
Some(quadruped_low_central_spec.mesh_tail_rear(
|
2020-06-01 23:56:50 +00:00
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(quadruped_low_lateral_spec.mesh_foot_fl(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(quadruped_low_lateral_spec.mesh_foot_fr(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(quadruped_low_lateral_spec.mesh_foot_bl(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
Some(quadruped_low_lateral_spec.mesh_foot_br(
|
|
|
|
body.species,
|
|
|
|
body.body_type,
|
|
|
|
generate_mesh,
|
|
|
|
)),
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
2020-06-04 21:15:38 +00:00
|
|
|
None,
|
2020-04-24 18:37:45 +00:00
|
|
|
]
|
|
|
|
},
|
|
|
|
Body::Object(object) => [
|
|
|
|
Some(mesh_object(object, generate_mesh)),
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
],
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-08-21 01:19:02 +00:00
|
|
|
pub fn get_or_create_model(
|
|
|
|
&mut self,
|
|
|
|
renderer: &mut Renderer,
|
|
|
|
body: Body,
|
2020-03-15 18:44:47 +00:00
|
|
|
loadout: Option<&Loadout>,
|
2019-08-21 01:19:02 +00:00
|
|
|
tick: u64,
|
2019-08-18 13:19:32 +00:00
|
|
|
camera_mode: CameraMode,
|
2019-08-18 09:01:57 +00:00
|
|
|
character_state: Option<&CharacterState>,
|
2020-04-24 18:37:45 +00:00
|
|
|
) -> &([Model<FigurePipeline>; 3], Skel::Attr)
|
2020-01-26 00:22:48 +00:00
|
|
|
where
|
|
|
|
for<'a> &'a common::comp::Body: std::convert::TryInto<Skel::Attr>,
|
|
|
|
Skel::Attr: Default,
|
|
|
|
{
|
2020-03-16 11:32:57 +00:00
|
|
|
let key = if let Some(loadout) = loadout {
|
2019-08-18 09:01:57 +00:00
|
|
|
FigureKey::Complex(
|
|
|
|
body,
|
|
|
|
camera_mode,
|
2020-03-16 21:04:49 +00:00
|
|
|
CharacterCacheKey::from(character_state, loadout),
|
2019-08-18 09:01:57 +00:00
|
|
|
)
|
2019-08-21 01:19:02 +00:00
|
|
|
} else {
|
|
|
|
FigureKey::Simple(body)
|
|
|
|
};
|
|
|
|
|
2020-01-26 00:22:48 +00:00
|
|
|
match self.models.entry(key) {
|
|
|
|
Entry::Occupied(o) => {
|
|
|
|
let (model, last_used) = o.into_mut();
|
2019-08-21 01:19:02 +00:00
|
|
|
*last_used = tick;
|
2020-01-26 00:22:48 +00:00
|
|
|
model
|
2020-02-01 20:39:39 +00:00
|
|
|
},
|
2020-01-26 00:22:48 +00:00
|
|
|
Entry::Vacant(v) => {
|
|
|
|
&v.insert((
|
|
|
|
{
|
|
|
|
let skeleton_attr = (&body)
|
|
|
|
.try_into()
|
|
|
|
.ok()
|
|
|
|
.unwrap_or_else(<Skel::Attr as Default>::default);
|
|
|
|
|
2020-04-24 18:37:45 +00:00
|
|
|
let manifest_indicator = &mut self.manifest_indicator;
|
|
|
|
let mut make_model = |generate_mesh| {
|
|
|
|
let mut mesh = Mesh::new();
|
2020-04-24 18:52:44 +00:00
|
|
|
Self::bone_meshes(
|
|
|
|
body,
|
|
|
|
loadout,
|
|
|
|
character_state,
|
|
|
|
camera_mode,
|
|
|
|
manifest_indicator,
|
|
|
|
generate_mesh,
|
|
|
|
)
|
|
|
|
.iter()
|
|
|
|
.enumerate()
|
|
|
|
.filter_map(|(i, bm)| bm.as_ref().map(|bm| (i, bm)))
|
|
|
|
.for_each(|(i, bone_mesh)| {
|
|
|
|
mesh.push_mesh_map(bone_mesh, |vert| vert.with_bone_idx(i as u8))
|
|
|
|
});
|
2020-04-24 18:37:45 +00:00
|
|
|
renderer.create_model(&mesh).unwrap()
|
|
|
|
};
|
|
|
|
|
2020-04-24 18:52:44 +00:00
|
|
|
fn generate_mesh(
|
|
|
|
segment: &Segment,
|
|
|
|
offset: Vec3<f32>,
|
|
|
|
) -> Mesh<FigurePipeline> {
|
|
|
|
Meshable::<FigurePipeline, FigurePipeline>::generate_mesh(
|
|
|
|
segment,
|
|
|
|
(offset, Vec3::one()),
|
|
|
|
)
|
|
|
|
.0
|
2020-04-24 18:37:45 +00:00
|
|
|
}
|
|
|
|
|
2020-04-24 18:52:44 +00:00
|
|
|
fn generate_mesh_lod_mid(
|
|
|
|
segment: &Segment,
|
|
|
|
offset: Vec3<f32>,
|
|
|
|
) -> Mesh<FigurePipeline> {
|
2020-04-24 18:37:45 +00:00
|
|
|
let lod_scale = Vec3::broadcast(0.6);
|
2020-04-24 18:52:44 +00:00
|
|
|
Meshable::<FigurePipeline, FigurePipeline>::generate_mesh(
|
|
|
|
&segment.scaled_by(lod_scale),
|
|
|
|
(offset * lod_scale, Vec3::one() / lod_scale),
|
|
|
|
)
|
|
|
|
.0
|
2020-04-24 18:37:45 +00:00
|
|
|
}
|
|
|
|
|
2020-04-24 18:52:44 +00:00
|
|
|
fn generate_mesh_lod_low(
|
|
|
|
segment: &Segment,
|
|
|
|
offset: Vec3<f32>,
|
|
|
|
) -> Mesh<FigurePipeline> {
|
2020-04-24 18:37:45 +00:00
|
|
|
let lod_scale = Vec3::broadcast(0.3);
|
2020-04-24 18:52:44 +00:00
|
|
|
Meshable::<FigurePipeline, FigurePipeline>::generate_mesh(
|
|
|
|
&segment.scaled_by(lod_scale),
|
|
|
|
(offset * lod_scale, Vec3::one() / lod_scale),
|
|
|
|
)
|
|
|
|
.0
|
2020-04-24 18:37:45 +00:00
|
|
|
}
|
2020-01-26 00:22:48 +00:00
|
|
|
|
2020-04-24 18:52:44 +00:00
|
|
|
(
|
|
|
|
[
|
|
|
|
make_model(generate_mesh),
|
|
|
|
make_model(generate_mesh_lod_mid),
|
|
|
|
make_model(generate_mesh_lod_low),
|
|
|
|
],
|
|
|
|
skeleton_attr,
|
|
|
|
)
|
2020-01-26 00:22:48 +00:00
|
|
|
},
|
|
|
|
tick,
|
|
|
|
))
|
|
|
|
.0
|
2020-02-01 20:39:39 +00:00
|
|
|
},
|
2019-08-21 01:19:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn clean(&mut self, tick: u64) {
|
2019-08-24 23:18:47 +00:00
|
|
|
// Check for reloaded manifests
|
|
|
|
// TODO: maybe do this in a different function, maintain?
|
|
|
|
if self.manifest_indicator.reloaded() {
|
|
|
|
self.models.clear();
|
|
|
|
}
|
2019-08-21 01:19:02 +00:00
|
|
|
// TODO: Don't hard-code this.
|
|
|
|
self.models
|
|
|
|
.retain(|_, (_, last_used)| *last_used + 60 > tick);
|
|
|
|
}
|
|
|
|
}
|