packages feed

dx9base-0.1: gen/extract-d3dx.hs

module Main
where
import Parser
import System.Environment

---------------------------------------------------------------------------
-- Main

main = do
    (path:_) <- getArgs
    e <- mapM (readEnum path) d3dx_enums
    i <- mapM (readInterface path) d3dx_interfaces
    s <- mapM (readStruct path) d3dx_structures

    writeFile "d3dx_c.h" $ concat [
        concatMap c_def_if i
        ]
    writeFile "d3dx_h.h" $ concat [
        concatMap h_def_s s,
        concatMap h_def_i i,
        concatMap (h_def_e enum_types) e
        ]
    return ()


enum_types = [
    ("D3DDECLTYPE", "BYTE"),
    ("D3DDECLMETHOD", "BYTE"),
    ("D3DDECLUSAGE", "BYTE")
    ]


d3dx_enums = [
    "D3DXCALLBACK_SEARCH_FLAGS",
    "D3DXCLEANTYPE",
    "D3DXCOMPRESSION_FLAGS",
    "D3DXEFFECTDEFAULTTYPE",
    --"D3DXERR",
    "D3DXEVENT_TYPE",
    "D3DXIMAGE_FILEFORMAT",
    "D3DXIMT_FLAGS",
    "D3DXINCLUDE_TYPE",
    "D3DXMESH",
    "D3DXMESHDATATYPE",
    "D3DXMESHOPT",
    "D3DXMESHSIMP",
    "D3DXPARAMETER_CLASS",
    "D3DXPARAMETER_TYPE",
    "D3DXPATCHMESH",
    "D3DXPATCHMESHTYPE",
    "D3DXPLAYBACK_TYPE",
    "D3DXPRIORITY_TYPE",
    "D3DXREGISTER_SET",
    "D3DXSHCOMPRESSQUALITYTYPE",
    "D3DXSHGPUSIMOPT",
    "D3DXTANGENT",
    "D3DXTRANSITION_TYPE",
    "D3DXWeldEpsilonsFLAGS"
    --"MAX_FVF_DECL_SIZE"
    ]


d3dx_interfaces = [
    ("ID3DXAllocateHierarchy"  ,"IUnknown",             id),
    ("ID3DXAnimationCallbackHandler"  ,"IUnknown",             id),
    ("ID3DXAnimationController"  ,"IUnknown",             id),
    ("ID3DXAnimationSet"  ,"IUnknown",             id),
    ("ID3DXBaseEffect"  ,"IUnknown",             fix_base_eff),
    ("ID3DXBaseMesh"  ,"IUnknown",             id),
    ("ID3DXBuffer"  ,"IUnknown",             id),
    ("ID3DXCompressedAnimationSet"  ,"IUnknown",             id),
    ("ID3DXConstantTable"  ,"IUnknown",             id),
    ("ID3DXEffect"  ,"IUnknown",             id),
    ("ID3DXEffectCompiler"  ,"IUnknown",             id),
    --("ID3DXEffectPool"  ,"IUnknown",             id),
    ("ID3DXEffectStateManager"  ,"IUnknown",             id),
    ("ID3DXFont"  ,"IUnknown",             fix_font),
    ("ID3DXFile", "IUnknown",             id),
    ("ID3DXFileData", "IUnknown",             id),
    ("ID3DXFileEnumObject", "IUnknown",             id),
    ("ID3DXFileSaveData", "IUnknown",             id),
    ("ID3DXFileSaveObject", "IUnknown",             fix_file_so),
    ("ID3DXFragmentLinker"  ,"IUnknown",             id),
    ("ID3DXInclude"  ,"IUnknown",             id),
    ("ID3DXKeyframedAnimationSet"  ,"IUnknown",             id),
    ("ID3DXLine"  ,"IUnknown",             id),
    --("ID3DXLoadUserData"  ,"IUnknown",             id),  --user callbacks, but causes errors
    --("ID3DXMATRIXStack"  ,"IUnknown",             id),
    ("ID3DXMesh"  ,"IUnknown",             id),
    ("ID3DXPatchMesh"  ,"IUnknown",             id),
    ("ID3DXPMesh"  ,"IUnknown",             id),
    ("ID3DXPRTBuffer"  ,"IUnknown",             id),
    ("ID3DXPRTCompBuffer"  ,"IUnknown",             id),
    ("ID3DXPRTEngine"  ,"IUnknown",             id),
    ("ID3DXRenderToEnvMap"  ,"IUnknown",             id),
    ("ID3DXRenderToSurface"  ,"IUnknown",             id),
    -- ("ID3DXSaveUserData"  ,"IUnknown",             id),  -- user callbacks, errors
    ("ID3DXSkinInfo"  ,"IUnknown",             id),
    ("ID3DXSPMesh"  ,"IUnknown",             id),
    ("ID3DXSprite"  ,"IUnknown",             id),
    ("ID3DXTextureGutterHelper"  ,"IUnknown",             id),
    ("ID3DXTextureShader"  ,"IUnknown",             id)
    ]


fix_file_so :: (String, String, [(String,Type,[(String,Type)])]) -> (String, String, [(String,Type,[(String,Type)])])
fix_file_so (n,b,f) = (n,b,funs f)
    where 
        funs [] = []
        funs (x:xs) = (fun x):(funs xs)
        fun (f,t,p)
            | f=="GetFile"       = 
                ("GetFile", Base "HRESULT", [("ppFile", Pointer $ Pointer $ Base "ID3DXFile")])
            | otherwise             = (f,t,p)

fix_base_eff :: (String, String, [(String,Type,[(String,Type)])]) -> (String, String, [(String,Type,[(String,Type)])])
fix_base_eff  (n,b,f) = (n,b,funs f)
    where 
        funs [] = []
        funs (x:xs) = (fun x):(funs xs)
        fun (f,t,p)
            | f=="GetValue"       = 
                ("GetValue", Base "HRESULT", [
                    ("hParam1", Base "D3DXHANDLE"), -- ("hParam2", Base "D3DXHANDLE"),
                    ("pData", Pointer $ Base "void"), ("Bytes", Base "UINT")])
            | otherwise             = (f,t,p)


fix_font :: (String, String, [(String,Type,[(String,Type)])]) -> (String, String, [(String,Type,[(String,Type)])])
fix_font (n,b,f) = (n,b,funs f)
    where 
        funs [] = []
        funs (x:xs) = (fun x):(funs xs)
        fun (f,t,p)
            | f=="GetDesc"          = ("GetDescW",t,p)
            | f=="PreloadText"      = ("PreloadTextW",t,p)
            | otherwise             = (f,t,p)

d3dx_structures = [
    "D3DXATTRIBUTERANGE",
    "D3DXATTRIBUTEWEIGHTS",
    "D3DXBONECOMBINATION",
    "D3DXCOLOR",
    "D3DXCONSTANT_DESC",
    "D3DXCONSTANTTABLE_DESC",
    "D3DXEFFECTDEFAULT",
    "D3DXEFFECTINSTANCE",
    "D3DXEFFECT_DESC",
    "D3DXFLOAT16",
    "D3DXFONT_DESC",
    "D3DXFRAGMENT_DESC",
    "D3DXFRAME",
    "D3DXFUNCTION_DESC",
    "D3DXIMAGE_INFO",
    "D3DXINTERSECTINFO",
    "D3DXKEY_CALLBACK",
    "D3DXKEY_QUATERNION",
    "D3DXKEY_VECTOR3",
    "D3DXMACRO",
    "D3DXMATERIAL",
    --"D3DXMATRIX",
    --"D3DXMATRIXA16",
    "D3DXMESHCONTAINER",
    -- "D3DXMESHDATA",  -- uses union
    "D3DXPASS_DESC",
    "D3DXPATCHINFO",
    "D3DXPLANE",
    "D3DXQUATERNION",
    "D3DXRTE_DESC",
    "D3DXRTS_DESC",
    "D3DXSEMANTIC",
    "D3DXSHADER_CONSTANTINFO",
    "D3DXSHADER_CONSTANTTABLE",
    "D3DXSHADER_STRUCTMEMBERINFO",
    "D3DXSHADER_TYPEINFO",
    "D3DXSHMATERIAL",
    "D3DXSHPRTSPLITMESHCLUSTERDATA",
    "D3DXSHPRTSPLITMESHVERTDATA",
    "D3DXTRACK_DESC",
    "D3DXTECHNIQUE_DESC",
    "D3DXVECTOR2",
    "D3DXVECTOR3",
    "D3DXVECTOR4"
    --"D3DXWeldEpsilons"
    ]