summaryrefslogtreecommitdiffstats
path: root/src/WiimotePlayer.hs
diff options
context:
space:
mode:
authorMatthias Schiffer <matthias@gamezock.de>2010-04-10 16:25:27 +0200
committerMatthias Schiffer <matthias@gamezock.de>2010-04-10 16:25:27 +0200
commitd2be8eb4103f266eb2078135960779bcbb82c492 (patch)
tree34caa580d6fc2eec1d3761225fd0fae164c1d556 /src/WiimotePlayer.hs
parent2ff529b0b12e176f02c976833c53a50ef6bad789 (diff)
downloadhtanks-d2be8eb4103f266eb2078135960779bcbb82c492.tar
htanks-d2be8eb4103f266eb2078135960779bcbb82c492.zip
Renamed WiimotePlayer to HWiidPlayer
Diffstat (limited to 'src/WiimotePlayer.hs')
-rw-r--r--src/WiimotePlayer.hs148
1 files changed, 0 insertions, 148 deletions
diff --git a/src/WiimotePlayer.hs b/src/WiimotePlayer.hs
deleted file mode 100644
index 697cdb0..0000000
--- a/src/WiimotePlayer.hs
+++ /dev/null
@@ -1,148 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-
-module WiimotePlayer ( WiimotePlayer
- , newWiimotePlayer
- ) where
-
-import Control.Monad
-import Data.Bits
-import Data.Function (on)
-import Data.List (sortBy)
-import Data.Maybe
-import Data.Ratio ((%))
-import Data.Typeable
-import HWiid
-import Graphics.Rendering.OpenGL.GL (GLfloat, Vector3(..))
-import Graphics.Rendering.OpenGL.GL.BeginEnd (unsafeRenderPrimitive, PrimitiveMode(..))
-import Graphics.Rendering.OpenGL.GL.CoordTrans (unsafePreservingMatrix, translate)
-import Graphics.Rendering.OpenGL.GL.VertexSpec
-
-
-import Player
-import Tank
-
-
-data WiimotePlayer = WiimotePlayer Wiimote WiimoteAccCal [(Float, Float)]
- deriving (Typeable, Show)
-
-instance Player WiimotePlayer where
- playerUpdate (WiimotePlayer wiimote cal oldaims) tank = do
- state <- getState wiimote
- messages <- getMesg wiimote
-
- let buttons = stateButtons state
- shoot = any (\m -> (mesgType m == mesgTypeButton) && (test (mesgButtons m) buttonB)) $ messages
- foo = any (\m -> (mesgType m == mesgTypeButton) && (test (mesgButtons m) buttonA)) $ messages
- x = (if (test buttons buttonLeft) then (-1) else 0) + (if (test buttons buttonRight) then 1 else 0)
- y = (if (test buttons buttonDown) then (-1) else 0) + (if (test buttons buttonUp) then 1 else 0)
- ext = stateExt state
-
- (mx, my) = if (extType ext) /= extNunchuk
- then (x, y)
- else
- let nx = ((fromIntegral . extNunchukStickX $ ext) - 0x80)/0x80
- ny = ((fromIntegral . extNunchukStickY $ ext) - 0x80)/0x80
- in if (nx*nx + ny*ny) < 0.4 then (x, y) else (x+nx, y+ny)
-
- iraim = handleIR state cal
- newaims = if isJust iraim then take irSmooth ((fromJust iraim):oldaims) else oldaims
- newaim = if null newaims then (0, 0) else mulV (1/(fromIntegral $ length newaims)) (foldr addV (0, 0) newaims)
- aims = if not (null newaims) && (lengthV $ subV (head newaims) newaim) > irSkip
- then take irSkipSmooth newaims
- else newaims
- (aimx, aimy) = if null aims then (0, 0) else mulV (1/(fromIntegral $ length aims)) (foldr addV (0, 0) aims)
- ax = aimx - (fromRational . toRational . tankX $ tank)
- ay = aimy - (fromRational . toRational . tankY $ tank)
- aangle = if (ax /= 0 || ay /= 0) then Just $ fromRational $ round ((atan2 ay ax)*1000000*180/pi)%1000000 else Nothing
-
- move = (mx /= 0 || my /= 0)
- angle = atan2 my mx
- moveangle = if move then Just $ fromRational $ round ((angle - (sin $ 8*x)/8)*1000000*180/pi)%1000000 else Nothing
- when foo $ print state
- return (WiimotePlayer wiimote cal aims, moveangle, move, aangle, shoot)
-
- renderPlayer (WiimotePlayer _ _ []) = return ()
- renderPlayer (WiimotePlayer _ _ aims) = unsafePreservingMatrix $ do
- let (x, y) = mulV (1/(fromIntegral $ length aims)) $ foldr addV (0, 0) aims
-
- translate $ Vector3 x y (0 :: GLfloat)
-
- unsafeRenderPrimitive Quads $ do
- texCoord $ TexCoord2 (0 :: GLfloat) (0 :: GLfloat)
- vertex $ Vertex2 (-0.2 :: GLfloat) (-0.2 :: GLfloat)
-
- texCoord $ TexCoord2 (0 :: GLfloat) (1 :: GLfloat)
- vertex $ Vertex2 (-0.2 :: GLfloat) (0.2 :: GLfloat)
-
- texCoord $ TexCoord2 (1 :: GLfloat) (1 :: GLfloat)
- vertex $ Vertex2 (0.2 :: GLfloat) (0.2 :: GLfloat)
-
- texCoord $ TexCoord2 (1 :: GLfloat) (0 :: GLfloat)
- vertex $ Vertex2 (0.2 :: GLfloat) (-0.2 :: GLfloat)
-
-
-irSmooth = 10
-irSkip = 0.2
-irSkipSmooth = 4
-
-irXScale :: Float
-irXScale = 20
-
-irXTranslate :: Float
-irXTranslate = 0 + 7
-
-irYScale :: Float
-irYScale = 20
-
-irYTranslate :: Float
-irYTranslate = -10 + 8
-
-handleIR :: WiimoteState -> WiimoteAccCal -> Maybe (Float, Float)
-handleIR state cal = handle $ sortIRSourcesByPos $ take 2 $ sortIRSourcesBySize $ stateIRSources state
- where
- handle [ira,irb] = let pa = pos ira
- pb = pos irb
- p = negV pa
- b = pb `subV` pa
- x = (p `dotV` b)/(lengthV b)
- y = (sqrt ((lengthSqV p) - x*x)) * (signum $ sinV b p)
- in Just ((x - (lengthV b)/2)*irXScale + irXTranslate, y*irYScale + irYTranslate)
-
- handle _ = Nothing
-
- pos src = (((fromIntegral $ irPosX src) - hMaxX)/hMaxX, ((fromIntegral $ irPosY src) - hMaxY)/hMaxY)
-
- rot (x, y) = let fi = fromIntegral
- s = ((fi . stateAccX $ state)-(fi . accCalZeroX $ cal))/((fi . accCalOneX $ cal)-(fi . accCalZeroX $ cal))
- c = ((fi . stateAccZ $ state)-(fi . accCalZeroZ $ cal))/((fi . accCalOneZ $ cal)-(fi . accCalZeroZ $ cal))
- in (c*x + s*y, -s*x + c*y)
-
- hMaxX = (fromIntegral irMaxX)/2
- hMaxY = (fromIntegral irMaxY)/2
-
- sortIRSourcesBySize :: [WiimoteIRSource] -> [WiimoteIRSource]
- sortIRSourcesBySize = sortBy (flip compare `on` irSize)
-
- sortIRSourcesByPos :: [WiimoteIRSource] -> [WiimoteIRSource]
- sortIRSourcesByPos = sortBy (compare `on` (fst . rot . pos))
-
-negV (a1, a2) = (-a1, -a2)
-addV (a1, a2) (b1, b2) = (a1+b1, a2+b2)
-subV (a1, a2) (b1, b2) = (a1-b1, a2-b2)
-dotV (a1, a2) (b1, b2) = a1*b1 + a2*b2
-mulV x (a1, a2) = (x*a1, x*a2)
-sinV (a1, a2) (b1, b2) = (a1 * b2 - b1 * a2)
-lengthSqV a = dotV a a
-lengthV a = sqrt $ lengthSqV a
-
-
-newWiimotePlayer :: IO WiimotePlayer
-newWiimotePlayer = do
- wiimote <- open bdAddrAny (flagMesgInterface .|. flagNonblock)
- when (wiimote == nullWiimote) $ fail "Wiimote error"
- setReportMode wiimote (reportButtons .|. reportAcc .|. reportIR .|. reportNunchuk)
- cal <- getAccCal wiimote extNone
- return $ WiimotePlayer wiimote cal []
-
-test :: (Bits a) => a -> a -> Bool
-test field bits = (field .&. bits) == bits