예제 #1
0
HRESULT Variable9::SpecializedCasts( Value* pCached, const Value& value )
{
    HRESULT hr = S_OK;

    SASVARIABLE_TYPE type = Desc().Type;
    switch( type )
    {
        case SASVT_TEXTURE:
        case SASVT_TEXTURE1D:
        case SASVT_TEXTURE2D:
        case SASVT_TEXTURE3D:
        case SASVT_TEXTURECUBE:
        {
            if( value.Type() == SASVT_STRING )
            {
                IUnknown* pTexture = NULL;
                String* strValue = (String*) ((Object&)value).Get();
                const WCHAR* str = strValue->Get();

                if(str != NULL && str[0] != L'\0' )
                {
                    SourceInfo si;
                    if(! Sas::Host::GetIntegrator()->FindFile( str , m_Effect->GetCreation()->GetDirectoryPath(), si) )
                        return E_FAIL;

                    hr = m_Effect->LoadTexture(si.GetFilePath(), (IUnknown**)&pTexture);	
                    if( FAILED(hr) )
                    {
                        Sas::Host::Out( Sas::LEVEL_WARNING, L"Unable to cast string into texture: %s", si.GetFilePath() );
                        SAFE_RELEASE(pTexture);
                        return hr;
                    }
                }

                switch(Desc().Type)
                {
                    case SASVT_TEXTURE:
                        ((Object*)pCached)->Set( Texture(pTexture) );
                        break;
                    case SASVT_TEXTURE1D:
                        ((Object*)pCached)->Set( Texture1D(pTexture) );
                        break;
                    case SASVT_TEXTURE2D:
                        ((Object*)pCached)->Set( Texture2D(pTexture) );
                        break;
                    case SASVT_TEXTURE3D:
                        ((Object*)pCached)->Set( Texture3D(pTexture) );
                        break;
                    case SASVT_TEXTURECUBE:
                        ((Object*)pCached)->Set( TextureCube(pTexture) );
                        break;
                }
                SAFE_RELEASE(pTexture);
                return S_OK;
            }
        }
    }

    return E_NOTIMPL;//we don't support that cast;
}
예제 #2
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;
}
예제 #3
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;
}