@@ -824,7 +824,9 @@ export function applyArticulation(refs: AvatarRigRefs, a: AvatarArticulation): v
824824 fist : { current : Group | null } | undefined ,
825825 grip : number ,
826826 ) => {
827- const gripping = grip > 0.5
827+ // A native hand is hidden only when a mounted replacement can take its
828+ // place. Some heavy weapons deliberately use the model hands instead.
829+ const gripping = grip > 0.5 && fist ?. current != null
828830 // Switch on one threshold: the replacement never overlaps a visible
829831 // native hand, including during weapon-change interpolation.
830832 if ( bone ?. current ) bone . current . scale . setScalar ( gripping ? HAND_COLLAPSE : 1 )
@@ -1711,6 +1713,14 @@ export function twoHanded(weapon: string): boolean {
17111713 return grip !== 'none' && GRIPS [ grip ] . foregrip > 0 && leftGripFor ( weapon ) !== null
17121714}
17131715
1716+ /** The minigun reads better with the Pascaline model's native hands: its
1717+ * broad two-arm carry already lands both wrists on the grips, while the small
1718+ * procedural hands make the heavy body look offset to one side. Thin tools
1719+ * such as the knife still need a posed hand wrapped around their handle. */
1720+ export function usesPosedGripHands ( weapon : string ) : boolean {
1721+ return weapon !== 'minigun'
1722+ }
1723+
17141724/**
17151725 * The held weapon, in THE ARM FRAME: hanging −y from the shoulder, barrel down
17161726 * the arm (weapon-models contract: grip at the origin, barrel down −Z), muzzle
@@ -1737,6 +1747,7 @@ function HeldWeapon({
17371747 const muzzle = refs . fx ? remoteMuzzle ( weapon ) : null
17381748 const hold = holdFor ( weapon )
17391749 const support = twoHanded ( weapon ) ? hold . left : null
1750+ const posedHands = usesPosedGripHands ( weapon )
17401751 const qR = useMemo ( ( ) => gripQuaternion ( hold . right , 'R' , new Quaternion ( ) ) , [ hold ] )
17411752 const qL = useMemo ( ( ) => ( support ? gripQuaternion ( support , 'L' , new Quaternion ( ) ) : null ) , [ support ] )
17421753 if ( ! Weapon ) return null
@@ -1771,10 +1782,12 @@ function HeldWeapon({
17711782 />
17721783 </ group >
17731784 ) : null }
1774- < group position = { [ r [ 0 ] , r [ 1 ] , r [ 2 ] ] } quaternion = { qR } ref = { refs . fistR } visible = { false } >
1775- < HandMesh pose = { hold . right . pose } side = "R" scale = { AVATAR_GRIP_HAND_SCALE } />
1776- </ group >
1777- { support && qL ? (
1785+ { posedHands ? (
1786+ < group position = { [ r [ 0 ] , r [ 1 ] , r [ 2 ] ] } quaternion = { qR } ref = { refs . fistR } visible = { false } >
1787+ < HandMesh pose = { hold . right . pose } side = "R" scale = { AVATAR_GRIP_HAND_SCALE } />
1788+ </ group >
1789+ ) : null }
1790+ { posedHands && support && qL ? (
17781791 < group
17791792 position = { [ support . position [ 0 ] , support . position [ 1 ] , support . position [ 2 ] ] }
17801793 quaternion = { qL }
0 commit comments