From 6dfa233cc46c6c463354419c09c0ed94a2d25ed4 Mon Sep 17 00:00:00 2001
From: Joshua Barretto <joshua.s.barretto@gmail.com>
Date: Sat, 24 Jul 2021 15:05:36 +0100
Subject: [PATCH] Fixed bad non-humanoid lantern offset

---
 voxygen/anim/src/biped_large/mod.rs      |  2 +-
 voxygen/anim/src/biped_small/mod.rs      |  2 +-
 voxygen/anim/src/bird_large/mod.rs       |  2 +-
 voxygen/anim/src/bird_medium/mod.rs      |  2 +-
 voxygen/anim/src/character/mod.rs        |  2 +-
 voxygen/anim/src/dragon/mod.rs           |  2 +-
 voxygen/anim/src/fish_medium/mod.rs      |  2 +-
 voxygen/anim/src/fish_small/mod.rs       |  2 +-
 voxygen/anim/src/fixture/mod.rs          |  2 +-
 voxygen/anim/src/golem/mod.rs            |  2 +-
 voxygen/anim/src/lib.rs                  |  2 +-
 voxygen/anim/src/object/mod.rs           |  2 +-
 voxygen/anim/src/quadruped_low/mod.rs    |  2 +-
 voxygen/anim/src/quadruped_medium/mod.rs |  2 +-
 voxygen/anim/src/quadruped_small/mod.rs  |  2 +-
 voxygen/anim/src/ship/mod.rs             |  2 +-
 voxygen/anim/src/theropod/mod.rs         |  2 +-
 voxygen/src/scene/figure/mod.rs          | 11 ++++++++---
 18 files changed, 25 insertions(+), 20 deletions(-)

diff --git a/voxygen/anim/src/biped_large/mod.rs b/voxygen/anim/src/biped_large/mod.rs
index 9ced7b2b1c..e712e3c272 100644
--- a/voxygen/anim/src/biped_large/mod.rs
+++ b/voxygen/anim/src/biped_large/mod.rs
@@ -128,7 +128,7 @@ impl Skeleton for BipedLargeSkeleton {
             make_bone(upper_torso_mat * control_mat * hand_l_mat * Mat4::<f32>::from(self.hold)),
         ];
         Offsets {
-            lantern: Vec3::default(),
+            lantern: None,
             // TODO: see quadruped_medium for how to animate this
             mount_bone: Transform {
                 position: common::comp::Body::BipedLarge(body)
diff --git a/voxygen/anim/src/biped_small/mod.rs b/voxygen/anim/src/biped_small/mod.rs
index fa3c6ccedf..1188cb19f3 100644
--- a/voxygen/anim/src/biped_small/mod.rs
+++ b/voxygen/anim/src/biped_small/mod.rs
@@ -68,7 +68,7 @@ impl Skeleton for BipedSmallSkeleton {
             make_bone(base_mat * Mat4::<f32>::from(self.foot_r)),
         ];
         Offsets {
-            lantern: Vec3::default(),
+            lantern: None,
             // TODO: see quadruped_medium for how to animate this
             mount_bone: Transform {
                 position: common::comp::Body::BipedSmall(body)
diff --git a/voxygen/anim/src/bird_large/mod.rs b/voxygen/anim/src/bird_large/mod.rs
index 671908a5f9..432cd57338 100644
--- a/voxygen/anim/src/bird_large/mod.rs
+++ b/voxygen/anim/src/bird_large/mod.rs
@@ -97,7 +97,7 @@ impl Skeleton for BirdLargeSkeleton {
             make_bone(foot_r_mat),
         ];
         Offsets {
-            lantern: Vec3::default(),
+            lantern: None,
             // TODO: see quadruped_medium for how to animate this
             mount_bone: Transform {
                 position: common::comp::Body::BirdLarge(body)
diff --git a/voxygen/anim/src/bird_medium/mod.rs b/voxygen/anim/src/bird_medium/mod.rs
index aa6ceb4929..8e3d8e056d 100644
--- a/voxygen/anim/src/bird_medium/mod.rs
+++ b/voxygen/anim/src/bird_medium/mod.rs
@@ -51,7 +51,7 @@ impl Skeleton for BirdMediumSkeleton {
             make_bone(base_mat * Mat4::<f32>::from(self.leg_r)),
         ];
         Offsets {
-            lantern: Vec3::default(),
+            lantern: None,
             // TODO: see quadruped_medium for how to animate this
             mount_bone: Transform {
                 position: common::comp::Body::BirdMedium(body)
diff --git a/voxygen/anim/src/character/mod.rs b/voxygen/anim/src/character/mod.rs
index c8e6333b25..6355124ff7 100644
--- a/voxygen/anim/src/character/mod.rs
+++ b/voxygen/anim/src/character/mod.rs
@@ -141,7 +141,7 @@ impl Skeleton for CharacterSkeleton {
             make_bone(control_mat * hand_l_mat * Mat4::<f32>::from(self.hold)),
         ];
         Offsets {
-            lantern: (lantern_mat * Vec4::new(0.0, 0.0, -4.0, 1.0)).xyz(),
+            lantern: Some((lantern_mat * Vec4::new(0.0, 0.0, -4.0, 1.0)).xyz()),
             // TODO: see quadruped_medium for how to animate this
             mount_bone: Transform {
                 position: common::comp::Body::Humanoid(body)
diff --git a/voxygen/anim/src/dragon/mod.rs b/voxygen/anim/src/dragon/mod.rs
index bb9d922c12..135ad304ac 100644
--- a/voxygen/anim/src/dragon/mod.rs
+++ b/voxygen/anim/src/dragon/mod.rs
@@ -72,7 +72,7 @@ impl Skeleton for DragonSkeleton {
             make_bone(chest_rear_mat * Mat4::<f32>::from(self.foot_br)),
         ];
         Offsets {
-            lantern: Vec3::default(),
+            lantern: None,
             // TODO: see quadruped_medium for how to animate this
             mount_bone: Transform {
                 position: common::comp::Body::Dragon(body)
diff --git a/voxygen/anim/src/fish_medium/mod.rs b/voxygen/anim/src/fish_medium/mod.rs
index 03e4b7446f..9675f3322c 100644
--- a/voxygen/anim/src/fish_medium/mod.rs
+++ b/voxygen/anim/src/fish_medium/mod.rs
@@ -51,7 +51,7 @@ impl Skeleton for FishMediumSkeleton {
             make_bone(chest_front_mat * Mat4::<f32>::from(self.fin_r)),
         ];
         Offsets {
-            lantern: Vec3::default(),
+            lantern: None,
             // TODO: see quadruped_medium for how to animate this
             mount_bone: Transform {
                 position: common::comp::Body::FishMedium(body)
diff --git a/voxygen/anim/src/fish_small/mod.rs b/voxygen/anim/src/fish_small/mod.rs
index e388455d9e..8935974732 100644
--- a/voxygen/anim/src/fish_small/mod.rs
+++ b/voxygen/anim/src/fish_small/mod.rs
@@ -42,7 +42,7 @@ impl Skeleton for FishSmallSkeleton {
             make_bone(chest_mat * Mat4::<f32>::from(self.fin_r)),
         ];
         Offsets {
-            lantern: Vec3::default(),
+            lantern: None,
             // TODO: see quadruped_medium for how to animate this
             mount_bone: Transform {
                 position: common::comp::Body::FishSmall(body)
diff --git a/voxygen/anim/src/fixture/mod.rs b/voxygen/anim/src/fixture/mod.rs
index 89b88b6da4..aa5b3e85fd 100644
--- a/voxygen/anim/src/fixture/mod.rs
+++ b/voxygen/anim/src/fixture/mod.rs
@@ -35,7 +35,7 @@ impl Skeleton for FixtureSkeleton {
     ) -> Offsets {
         buf[0] = make_bone(base_mat);
         Offsets {
-            lantern: Vec3::default(),
+            lantern: None,
             mount_bone: Transform::default(),
         }
     }
diff --git a/voxygen/anim/src/golem/mod.rs b/voxygen/anim/src/golem/mod.rs
index 6383dee947..6088e64beb 100644
--- a/voxygen/anim/src/golem/mod.rs
+++ b/voxygen/anim/src/golem/mod.rs
@@ -74,7 +74,7 @@ impl Skeleton for GolemSkeleton {
             make_bone(leg_r_mat * Mat4::<f32>::from(self.foot_r)),
         ];
         Offsets {
-            lantern: Vec3::default(),
+            lantern: None,
             // TODO: see quadruped_medium for how to animate this
             mount_bone: Transform {
                 position: common::comp::Body::Golem(body)
diff --git a/voxygen/anim/src/lib.rs b/voxygen/anim/src/lib.rs
index 4077a42807..b6637cb39a 100644
--- a/voxygen/anim/src/lib.rs
+++ b/voxygen/anim/src/lib.rs
@@ -100,7 +100,7 @@ pub fn init() { lazy_static::initialize(&LIB); }
 
 // Offsets that will be returned after computing the skeleton matrices
 pub struct Offsets {
-    pub lantern: Vec3<f32>,
+    pub lantern: Option<Vec3<f32>>,
     pub mount_bone: Transform<f32, f32, f32>,
 }
 
diff --git a/voxygen/anim/src/object/mod.rs b/voxygen/anim/src/object/mod.rs
index 8e0aff9997..2125edd791 100644
--- a/voxygen/anim/src/object/mod.rs
+++ b/voxygen/anim/src/object/mod.rs
@@ -40,7 +40,7 @@ impl Skeleton for ObjectSkeleton {
             make_bone(scale_mat * Mat4::<f32>::from(self.bone1)), /* Decorellated from ori */
         ];
         Offsets {
-            lantern: Vec3::default(),
+            lantern: None,
             // TODO: see quadruped_medium for how to animate this
             mount_bone: Transform {
                 position: common::comp::Body::Object(body)
diff --git a/voxygen/anim/src/quadruped_low/mod.rs b/voxygen/anim/src/quadruped_low/mod.rs
index 8324f102a8..82dc1bab30 100644
--- a/voxygen/anim/src/quadruped_low/mod.rs
+++ b/voxygen/anim/src/quadruped_low/mod.rs
@@ -70,7 +70,7 @@ impl Skeleton for QuadrupedLowSkeleton {
             make_bone(chest_mat * Mat4::<f32>::from(self.foot_br)),
         ];
         Offsets {
-            lantern: Vec3::default(),
+            lantern: None,
             // TODO: see quadruped_medium for how to animate this
             mount_bone: Transform {
                 position: common::comp::Body::QuadrupedLow(body)
diff --git a/voxygen/anim/src/quadruped_medium/mod.rs b/voxygen/anim/src/quadruped_medium/mod.rs
index 0421678fd5..4726b65ae9 100644
--- a/voxygen/anim/src/quadruped_medium/mod.rs
+++ b/voxygen/anim/src/quadruped_medium/mod.rs
@@ -103,7 +103,7 @@ impl Skeleton for QuadrupedMediumSkeleton {
         let mount_orientation = mount_bone_ori;
 
         Offsets {
-            lantern: Vec3::default(),
+            lantern: None,
             mount_bone: Transform {
                 position: mount_position,
                 orientation: mount_orientation,
diff --git a/voxygen/anim/src/quadruped_small/mod.rs b/voxygen/anim/src/quadruped_small/mod.rs
index ea644f4de6..578dcb955d 100644
--- a/voxygen/anim/src/quadruped_small/mod.rs
+++ b/voxygen/anim/src/quadruped_small/mod.rs
@@ -56,7 +56,7 @@ impl Skeleton for QuadrupedSmallSkeleton {
             make_bone(chest_mat * Mat4::<f32>::from(self.tail)),
         ];
         Offsets {
-            lantern: Vec3::default(),
+            lantern: None,
             // TODO: see quadruped_medium for how to animate this
             mount_bone: Transform {
                 position: common::comp::Body::QuadrupedSmall(body)
diff --git a/voxygen/anim/src/ship/mod.rs b/voxygen/anim/src/ship/mod.rs
index 3b75b0aaf9..afecb5e600 100644
--- a/voxygen/anim/src/ship/mod.rs
+++ b/voxygen/anim/src/ship/mod.rs
@@ -40,7 +40,7 @@ impl Skeleton for ShipSkeleton {
             make_bone(bone0_mat * Mat4::<f32>::from(self.bone3)),
         ];
         Offsets {
-            lantern: Vec3::default(),
+            lantern: None,
             // TODO: see quadruped_medium for how to animate this
             mount_bone: Transform {
                 position: common::comp::Body::Ship(body)
diff --git a/voxygen/anim/src/theropod/mod.rs b/voxygen/anim/src/theropod/mod.rs
index 9cb1bef771..b76b0652e9 100644
--- a/voxygen/anim/src/theropod/mod.rs
+++ b/voxygen/anim/src/theropod/mod.rs
@@ -75,7 +75,7 @@ impl Skeleton for TheropodSkeleton {
             make_bone(leg_r_mat * Mat4::<f32>::from(self.foot_r)),
         ];
         Offsets {
-            lantern: Vec3::default(),
+            lantern: None,
             // TODO: see quadruped_medium for how to animate this
             mount_bone: Transform {
                 position: common::comp::Body::Theropod(body)
diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs
index 593a74e29d..239cc0bf25 100644
--- a/voxygen/src/scene/figure/mod.rs
+++ b/voxygen/src/scene/figure/mod.rs
@@ -454,8 +454,13 @@ impl FigureMgr {
                 } else {
                     (vek::Rgb::zero(), 0.0, 0.0, true)
                 };
-            if let Some(state) = body.and_then(|body| self.states.get_mut(body, &entity)) {
-                light_anim.offset = vek::Vec3::from(state.lantern_offset);
+            if let Some(lantern_offset) = body
+                .and_then(|body| self.states.get_mut(body, &entity))
+                .and_then(|state| state.lantern_offset)
+            {
+                light_anim.offset = vek::Vec3::from(lantern_offset);
+            } else if let Some(body) = body {
+                light_anim.offset = body.default_light_offset();
             }
             if !light_anim.strength.is_normal() {
                 light_anim.strength = 0.0;
@@ -5257,7 +5262,7 @@ impl FigureColLights {
 }
 
 pub struct FigureStateMeta {
-    lantern_offset: anim::vek::Vec3<f32>,
+    lantern_offset: Option<anim::vek::Vec3<f32>>,
     // Animation to be applied to mounter of this entity
     mount_transform: anim::vek::Transform<f32, f32, f32>,
     // Contains the position of this figure or if it is a mounter it will contain the mountee's