{-# LANGUAGE ForeignFunctionInterface #-} module DirectX9.D3D.Raw where import Foreign.Ptr ( Ptr, plusPtr, castPtr ) import Foreign.Storable ( peekByteOff ) import DirectX9.Types import DirectX9.D3D.Format type D3DCOLOR = DWORD data RECT = RECT !LONG !LONG !LONG !LONG type LPRECT = Ptr RECT instance Storable RECT where sizeOf _ = 4*(sizeOf (undefined::LONG)) alignment _ = 4 poke buf (RECT v1 v2 v3 v4) = return buf >>= pokeHelp v1 >>= pokeHelp v2 >>= pokeHelp v3 >>= pokeHelp v4 >> return () peek b = do p1 <- peekByteOff b 0 b <- return $ plusPtr b (sizeOf p1) p2 <- peekByteOff b 0 b <- return $ plusPtr b (sizeOf p1) p3 <- peekByteOff b 0 b <- return $ plusPtr b (sizeOf p1) p4 <- peekByteOff b 0 return $ RECT p1 p2 p3 p4 data D3DMATRIX = D3DMATRIX { d3dm11, d3dm12, d3dm13, d3dm14, d3dm21, d3dm22, d3dm23, d3dm24, d3dm31, d3dm32, d3dm33, d3dm34, d3dm41, d3dm42, d3dm43, d3dm44 :: !Float } deriving (Show,Eq, Ord) instance Storable D3DMATRIX where sizeOf _ = 16*(sizeOf (undefined::Float)) alignment _ = alignment (undefined::Float) poke buf m = return buf >>= pokeHelp (d3dm11 m) >>= pokeHelp (d3dm12 m) >>= pokeHelp (d3dm13 m) >>= pokeHelp (d3dm14 m) >>= pokeHelp (d3dm21 m) >>= pokeHelp (d3dm22 m) >>= pokeHelp (d3dm23 m) >>= pokeHelp (d3dm24 m) >>= pokeHelp (d3dm31 m) >>= pokeHelp (d3dm32 m) >>= pokeHelp (d3dm33 m) >>= pokeHelp (d3dm34 m) >>= pokeHelp (d3dm41 m) >>= pokeHelp (d3dm42 m) >>= pokeHelp (d3dm43 m) >>= pokeHelp (d3dm44 m) >> return () peek b = do p1 <- peekByteOff b 0 b <- return $ plusPtr b (sizeOf p1) p2 <- peekByteOff b 0 b <- return $ plusPtr b (sizeOf p1) p3 <- peekByteOff b 0 b <- return $ plusPtr b (sizeOf p1) p4 <- peekByteOff b 0 b <- return $ plusPtr b (sizeOf p1) p5 <- peekByteOff b 0 b <- return $ plusPtr b (sizeOf p1) p6 <- peekByteOff b 0 b <- return $ plusPtr b (sizeOf p1) p7 <- peekByteOff b 0 b <- return $ plusPtr b (sizeOf p1) p8 <- peekByteOff b 0 b <- return $ plusPtr b (sizeOf p1) p9 <- peekByteOff b 0 b <- return $ plusPtr b (sizeOf p1) p10 <- peekByteOff b 0 b <- return $ plusPtr b (sizeOf p1) p11 <- peekByteOff b 0 b <- return $ plusPtr b (sizeOf p1) p12 <- peekByteOff b 0 b <- return $ plusPtr b (sizeOf p1) p13 <- peekByteOff b 0 b <- return $ plusPtr b (sizeOf p1) p14 <- peekByteOff b 0 b <- return $ plusPtr b (sizeOf p1) p15 <- peekByteOff b 0 b <- return $ plusPtr b (sizeOf p1) p16 <- peekByteOff b 0 return $ D3DMATRIX p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 d3DCOLOR_COLORVALUE :: Float -> Float -> Float -> Float -> D3DCOLOR d3DCOLOR_COLORVALUE r g b a = d3DCOLOR_RGBA (f r) (f g) (f b) (f a) where f :: Float -> Int f a = truncate $ a*255 d3DCOLOR_RGBA :: (Num a, Integral a) => a -> a -> a -> a -> D3DCOLOR d3DCOLOR_RGBA r g b a = (fromIntegral a)*16777216 + (fromIntegral r)*65536 + (fromIntegral g)*256 + (fromIntegral b) d3DTS_WORLDMATRIX :: (Integral a) => a-> D3DTRANSFORMSTATETYPE d3DTS_WORLDMATRIX n = fromIntegral n+256 d3DTS_WORLD :: D3DTRANSFORMSTATETYPE d3DTS_WORLD = d3DTS_WORLDMATRIX (0::Int) pokeHelp :: (Storable b) => b -> Ptr a -> IO (Ptr a) pokeHelp v buf = do poke (castPtr buf) v return $ plusPtr buf $ sizeOf v foreign import stdcall unsafe "fake.h Direct3DCreate9" c_Direct3DCreate9 :: UINT -> IO (Ptr IDirect3D9) #include "d3d_h.h"