packages feed

dx9d3d-0.1: DirectX9/D3D/Shader.hs

module DirectX9.D3D.Shader
where
import DirectX9.Types
import DirectX9.Error
import DirectX9.D3D.Raw
import DirectX9.D3D.Device

import Foreign              ( alloca, castPtr, withArray )

type VertexShader = ComObject IDirect3DVertexShader9

---------------------------------------------------------------------------
-- VertexShader

devCreateVertexShader :: Device -> Ptr DWORD -> IO VertexShader
devCreateVertexShader dev ptr = withCom dev
    $ \dev -> alloca
    $ \ret -> do
        hrFail "IDirect3DDevice9::CreateVertexShader" $
            c_IDirect3DDevice9_CreateVertexShader dev (castPtr ptr) ret
        peek ret >>= comMake

devCreateVertexShader' :: Device -> [DWORD] -> IO VertexShader
devCreateVertexShader' dev shader
    = withArray shader $ devCreateVertexShader dev

devSetVertexShader :: Device -> Maybe VertexShader -> IO ()
devSetVertexShader dev shader = withCom dev
    $ \dev -> case shader of
        Nothing     -> set dev nullPtr
        Just x      -> withCom x $ set dev
    where set dev shader = do
            hrFail "IDirect3DDevice9::SetVertexShader" 
                (c_IDirect3DDevice9_SetVertexShader dev shader)
            return ()


---------------------------------------------------------------------------
-- PixelShader

type PixelShader = ComObject IDirect3DPixelShader9

devCreatePixelShader :: Device -> Ptr DWORD -> IO PixelShader
devCreatePixelShader dev ptr = withCom dev
    $ \dev -> alloca
    $ \ret -> do
        hrFail "IDirect3DDevice9::CreatePixelShader" $
            c_IDirect3DDevice9_CreatePixelShader dev (castPtr ptr) ret
        peek ret >>= comMake

devCreatePixelShader' :: Device -> [DWORD] -> IO PixelShader
devCreatePixelShader' dev shader =
    withArray shader $ devCreatePixelShader dev

devSetPixelShader :: Device -> Maybe PixelShader -> IO ()
devSetPixelShader dev shader = withCom dev
    $ \dev -> case shader of
        Nothing     -> set dev nullPtr
        Just x      -> withCom x $ set dev
    where set dev shader = do
            hrFail "IDirect3DDevice9::SetPixelShader" 
                (c_IDirect3DDevice9_SetPixelShader dev shader)
            return ()



---------------------------------------------------------------------------
-- Shader Constants
-- The boring, repetitive way

devSetPixelShaderConstantB :: Device -> Int -> Ptr a -> Int -> IO ()
devSetPixelShaderConstantB dev idx buf count = withCom dev
    $ \dev -> do
        hrFail "IDirect3DDevice9::SetPixelShaderConstantB" $
            c_IDirect3DDevice9_SetPixelShaderConstantB
            dev (fromIntegral idx) (castPtr buf) (fromIntegral count)
        return ()
devSetPixelShaderConstantI :: Device -> Int -> Ptr a -> Int -> IO ()
devSetPixelShaderConstantI dev idx buf count = withCom dev
    $ \dev -> do
        hrFail "IDirect3DDevice9::SetPixelShaderConstantI" $
            c_IDirect3DDevice9_SetPixelShaderConstantI
            dev (fromIntegral idx) (castPtr buf) (fromIntegral count)
        return ()
devSetPixelShaderConstantF :: Device -> Int -> Ptr a -> Int -> IO ()
devSetPixelShaderConstantF dev idx buf count = withCom dev
    $ \dev -> do
        hrFail "IDirect3DDevice9::SetPixelShaderConstantF" $
            c_IDirect3DDevice9_SetPixelShaderConstantF
            dev (fromIntegral idx) (castPtr buf) (fromIntegral count)
        return ()
devSetVertexShaderConstantB :: Device -> Int -> Ptr a -> Int -> IO ()
devSetVertexShaderConstantB dev idx buf count = withCom dev
    $ \dev -> do
        hrFail "IDirect3DDevice9::SetVertexShaderConstantB" $
            c_IDirect3DDevice9_SetVertexShaderConstantB
            dev (fromIntegral idx) (castPtr buf) (fromIntegral count)
        return ()
devSetVertexShaderConstantI :: Device -> Int -> Ptr a -> Int -> IO ()
devSetVertexShaderConstantI dev idx buf count = withCom dev
    $ \dev -> do
        hrFail "IDirect3DDevice9::SetVertexShaderConstantI" $
            c_IDirect3DDevice9_SetVertexShaderConstantI
            dev (fromIntegral idx) (castPtr buf) (fromIntegral count)
        return ()
devSetVertexShaderConstantF :: Device -> Int -> Ptr a -> Int -> IO ()
devSetVertexShaderConstantF dev idx buf count = withCom dev
    $ \dev -> do
        hrFail "IDirect3DDevice9::SetVertexShaderConstantF" $
            c_IDirect3DDevice9_SetVertexShaderConstantF
            dev (fromIntegral idx) (castPtr buf) (fromIntegral count)
        return ()