Пример #1
0
//--------------------------------------------------------------------------------------
HRESULT Effect9::FromSource( IDirect3DDevice9* pDevice, const SourceInfo& sf, const D3DXMACRO* pDefines, ID3DXInclude* pInclude, DWORD flags, Effect9** ppEffectOut )
{
    HRESULT hr;
    hr = S_OK;
    if( NULL == ppEffectOut )
        return E_INVALIDARG;

    // Clear the output parameter
    *ppEffectOut = NULL;

    // Attempt to create the D3DXEffect
    ID3DXEffect* pD3DXEffect = NULL;
    ID3DXBuffer* pErrors = NULL;

    if(sf.GetSourceType() == SOURCEINFO_RESOURCE)
    {
        hr = SASCreateEffectFromResource(
                pDevice,
                sf.GetResourceModule(),
                sf.GetResourceName(),
                sf.GetResourceType(),
                pDefines,
                pInclude,
                flags,
                NULL,
                &pD3DXEffect,
                &pErrors );
    }
    else if(sf.GetSourceType() == SOURCEINFO_FILE)
    {
        hr = D3DXCreateEffectFromFile( 
                pDevice, 
                sf.GetFilePath(), 
                pDefines, 
                pInclude, 
                flags, 
                NULL, 
                &pD3DXEffect, 
                &pErrors );
        if( hr == E_NOTIMPL)
            hr = D3DXCreateEffectFromFile( 
                    pDevice, 
                    sf.GetFilePath(), 
                    pDefines, 
                    pInclude, 
                    (flags | D3DXSHADER_USE_LEGACY_D3DX9_31_DLL), 
                    NULL, 
                    &pD3DXEffect, 
                    &pErrors );
    }

    if( pErrors )
        Sas::Host::OutAnsi( FAILED(hr)?LEVEL_ERROR:LEVEL_WARNING, "%s", (LPSTR)pErrors->GetBufferPointer() );

    if( FAILED(hr) )
        goto e_Exit;

    D3DXHANDLE technique = NULL;
    hr= pD3DXEffect->FindNextValidTechnique(NULL, &technique);
    if( FAILED(hr) )
    {
        Sas::Host::Out( LEVEL_ERROR, L"No technique in the effect is valid on your hardware." );
        goto e_Exit;
    }
    
    pD3DXEffect->SetTechnique(technique);

    // Now that we have a D3DXEffect we can create a Sas::Effect
    hr = FromD3DXEffect( pD3DXEffect, sf, ppEffectOut );

e_Exit:
    SAFE_RELEASE(pErrors);
    SAFE_RELEASE( pD3DXEffect );

    if(SUCCEEDED(hr))
        Sas::Host::Out( LEVEL_STATUS, L"Loading effect '%s'", sf.GetDescription() );
    else
        Sas::Host::Out( LEVEL_ERROR, L"Could not load effect '%s'", sf.GetDescription() );

    return hr;
}
Пример #2
0
//--------------------------------------------------------------------------------------
HRESULT Effect10::FromSource( ID3D10Device* pDevice, const SourceInfo& sf, const D3D10_SHADER_MACRO* pDefines, ID3D10Include* pInclude, DWORD HlslFlags, DWORD FxFlags, Effect10** ppEffectOut )
{
    HRESULT hr;

    if( NULL == ppEffectOut )
        return E_INVALIDARG;

    // Clear the output parameter
    *ppEffectOut = NULL;

    // Attempt to create the D3DXEffect
    ID3D10Effect* pD3DEffect = NULL;
    ID3D10Blob* pErrors = NULL;


    if(sf.GetSourceType() == SOURCEINFO_RESOURCE)
    {
        hr = D3DX10CreateEffectFromResource( 
                sf.GetResourceModule(), 
                sf.GetResourceName(), 
                sf.GetResourceName(), 
                pDefines, 
                pInclude,
                "fx_4_0",
                HlslFlags, 
                FxFlags,
                pDevice,
                NULL,
                NULL,
                &pD3DEffect,
                &pErrors,
                NULL );
    }
    else if(sf.GetSourceType() == SOURCEINFO_FILE)
    {

        hr = D3DX10CreateEffectFromFile( 
                sf.GetFilePath(), 
                pDefines, 
                pInclude,
                "fx_4_0",
                HlslFlags, 
                FxFlags, 
                pDevice, 
                NULL, 
                NULL, 
                &pD3DEffect, 
                &pErrors,
                NULL );
    }

    if( pErrors )
        Sas::Host::OutAnsi( FAILED(hr)?LEVEL_ERROR:LEVEL_WARNING, "%s",(LPSTR)pErrors->GetBufferPointer() );

    if( FAILED(hr) )
        goto e_Exit;

    D3D10_EFFECT_DESC desc;
    pD3DEffect->GetDesc(&desc);
    if(desc.Techniques <= 0)
    {
        Sas::Host::Out( LEVEL_ERROR, L"Effect does not have a Technique10." );
        hr = E_FAIL;
        goto e_Exit;
    }


    // Now that we have a D3DXEffect we can create a Sas::Effect
    hr = FromD3DEffect( pD3DEffect, sf, ppEffectOut );

e_Exit:
    SAFE_RELEASE(pErrors);
    SAFE_RELEASE( pD3DEffect );

    if(SUCCEEDED(hr))
        Sas::Host::Out( LEVEL_STATUS, L"Loading effect '%s'", sf.GetDescription() );
    else
        Sas::Host::Out( LEVEL_ERROR, L"Could not load effect '%s'", sf.GetDescription() );

    return hr;
}