134 lines
5.2 KiB
Haskell
134 lines
5.2 KiB
Haskell
module Dodge.Creature.HandPos where
|
|
import Dodge.Data
|
|
import Dodge.Creature.Test
|
|
--import Shape
|
|
import ShapePicture
|
|
import Geometry
|
|
|
|
import Control.Lens
|
|
import Data.Maybe
|
|
|
|
-- the position of a weapon handle
|
|
aimingWeaponHandlePos :: Creature -> Item -> Float
|
|
aimingWeaponHandlePos cr it = case it ^? itUse. useAim . aimStance of
|
|
Just TwoHandTwist -> -5
|
|
Just OneHand -> 14
|
|
Just TwoHandFlat -> 1.2 * _crRad cr
|
|
Just LeaveHolstered -> 0
|
|
Nothing -> 0
|
|
aimingWeaponZeroPos :: Creature -> Item -> Float
|
|
aimingWeaponZeroPos cr it = aimingWeaponHandlePos cr it
|
|
- fromMaybe 0 (it ^? itDimension . dimPortage . handlePos)
|
|
aimingMuzzlePos :: Creature -> Item -> Float
|
|
aimingMuzzlePos cr it = aimingWeaponZeroPos cr it
|
|
+ fromMaybe 0 (it ^? itDimension . dimPortage . muzPos)
|
|
|
|
translatePointToRightHand :: Creature -> Point3 -> Point3
|
|
translatePointToRightHand cr = translatePointToRightHand' cr . mirrorV3xz
|
|
|
|
mirrorV3xz :: Point3 -> Point3
|
|
mirrorV3xz (V3 x y z) = V3 x (-y) z
|
|
|
|
translatePointToRightHand' :: Creature -> Point3 -> Point3
|
|
translatePointToRightHand' cr
|
|
| oneH cr = (+.+.+ V3 11 (-3) 20) . rotate3 0.4 -- . rotate3 (-0.5)-- . scaleSH (V3 1 1.5 1)
|
|
| twists cr = (+.+.+ V3 0 5 20) . rotate3 (-1) . (+.+.+ V3 4 (-10) 0)
|
|
| twoFlat cr = (+.+.+ V3 4 (-8) 10)
|
|
| otherwise = case cr ^? crStance . carriage of
|
|
Just (Walking sa LeftForward) -> (+.+.+ V3 (-f sa) (-off) 10)
|
|
_ -> (+.+.+ V3 0 (-off) 10)
|
|
where
|
|
off = 8
|
|
sLen = _strideLength $ _crStance cr
|
|
f i = negate 2 + negate 6 * fromIntegral (sLen - i) / fromIntegral sLen
|
|
|
|
translateToRightHand :: Creature -> SPic -> SPic
|
|
translateToRightHand cr = translateToRightHand' cr -- . mirrorSPxz
|
|
|
|
translateToRightHand' :: Creature -> SPic -> SPic
|
|
translateToRightHand' cr
|
|
| oneH cr = shoulderSP . translateSPf 11 (-3) . rotateSP (-0.5)-- . scaleSH (V3 1 1.5 1)
|
|
| twists cr = shoulderSP . translateSPf 0 5 . rotateSP (-1) . translateSPf 4 (-10)
|
|
| twoFlat cr = waistSP . translateSPf 4 (-8)
|
|
| otherwise = case cr ^? crStance . carriage of
|
|
Just (Walking sa LeftForward) -> waistSP . translateSPf (-f sa) (-off)
|
|
_ -> waistSP . translateSPf 0 (-off)
|
|
where
|
|
off = 8
|
|
sLen = _strideLength $ _crStance cr
|
|
f i = negate 2 + negate 6 * fromIntegral (sLen - i) / fromIntegral sLen
|
|
|
|
translatePointToLeftHand :: Creature -> Point3 -> Point3
|
|
translatePointToLeftHand cr
|
|
| oneH cr = (+.+.+ V3 0 0 10) . rotate3 0.4 . (+.+.+ V3 0 off 0)
|
|
| twists cr = (+.+.+ V3 0 5 20) . rotate3 (-1) . (+.+.+ V3 12 4 0) . rotate3 0.4
|
|
| twoFlat cr = (+.+.+ V3 4 8 10)
|
|
| otherwise = case cr ^? crStance . carriage of
|
|
Just (Walking sa RightForward) -> (+.+.+ V3 (-f sa) off 10)
|
|
_ -> (+.+.+ V3 0 off 10)
|
|
where
|
|
off = 8
|
|
sLen = _strideLength $ _crStance cr
|
|
f i = negate 2 + negate 6 * fromIntegral (sLen - i) / fromIntegral sLen
|
|
|
|
translateToLeftHand :: Creature -> SPic -> SPic
|
|
translateToLeftHand cr
|
|
| oneH cr = waistSP . rotateSP 0.4 . translateSPf 0 off
|
|
| twists cr = shoulderSP . translateSPf 0 5 . rotateSP (-1) . translateSPf 12 4
|
|
| twoFlat cr = waistSP . translateSPf 4 8
|
|
| otherwise = case cr ^? crStance . carriage of
|
|
Just (Walking sa RightForward) -> waistSP . translateSPf (-f sa) off
|
|
_ -> waistSP . translateSPf 0 off
|
|
where
|
|
off = 8
|
|
sLen = _strideLength $ _crStance cr
|
|
f i = negate 2 + negate 6 * fromIntegral (sLen - i) / fromIntegral sLen
|
|
|
|
translateToLeftLeg :: Creature -> SPic -> SPic
|
|
translateToLeftLeg cr = rotateSP (_crMvDir cr - _crDir cr) . case cr ^? crStance . carriage of
|
|
Just (Walking sa LeftForward) -> translateSPf ( f sa) off
|
|
Just (Walking sa RightForward) -> translateSPf (-f sa) off
|
|
_ -> translateSPf 0 off
|
|
where
|
|
off = 5
|
|
sLen = _strideLength $ _crStance cr
|
|
f i = 6 * fromIntegral (sLen - i) / fromIntegral sLen
|
|
|
|
translateToRightLeg :: Creature -> SPic -> SPic
|
|
translateToRightLeg cr = rotateSP (_crMvDir cr - _crDir cr) . case cr ^? crStance . carriage of
|
|
Just (Walking sa LeftForward) -> translateSPf (-f sa) (-off)
|
|
Just (Walking sa RightForward) -> translateSPf ( f sa) (-off)
|
|
_ -> translateSPf 0 (-off)
|
|
where
|
|
off = 5
|
|
sLen = _strideLength $ _crStance cr
|
|
f i = 6 * fromIntegral (sLen - i) / fromIntegral sLen
|
|
|
|
translateToHead :: Creature -> SPic -> SPic
|
|
translateToHead cr
|
|
| twists cr = translateSPz 20 . translateSPf 0 5 . rotateSP (-1) . translateSPf (negate 2.5) 0.25
|
|
. rotateSP 1
|
|
| oneH cr = translateSPz 20 . rotateSP 0.5 . translateSPf 2.5 0
|
|
. rotateSP (negate 0.5)
|
|
| otherwise = translateSPz 20 . translateSPf 2.5 0
|
|
|
|
translatePointToHead :: Creature -> Point3 -> Point3
|
|
translatePointToHead cr
|
|
| twists cr = (+.+.+ V3 0 5 20) . rotate3 (-1) . (+.+.+ V3 (negate 2.5) 0.25 0)
|
|
. rotate3 1
|
|
| oneH cr = (+.+.+ V3 0 0 20) . rotate3 0.5 . (+.+.+ V3 2.5 0 0)
|
|
. rotate3 (negate 0.5)
|
|
| otherwise = (+.+.+ V3 2.5 0 20)
|
|
|
|
translateToChest :: Creature -> SPic -> SPic
|
|
translateToChest cr
|
|
| oneH cr = rotateSP 0.5
|
|
-- | twists cr = translateSPf 0 5 . rotateSP (-1)
|
|
| twists cr = rotateSP (-1)
|
|
| otherwise = id
|
|
|
|
shoulderSP :: SPic -> SPic
|
|
shoulderSP = translateSPz 20
|
|
waistSP :: SPic -> SPic
|
|
waistSP = translateSPz 10
|