Beispiel #1
0
/// \brief Loads info from a property bag
//
// We get out of the bag the stat, modifier and roll settings.
//
/// \param propBag	Bag containing properties to load
//
/// \sa LoadLegacy, Save
/// \return true if stat was found
//
bool Value::Load( moPropBagRef& propBag )
{
    moPropStringRef stat  ( f_statName  );
    moPropIntRef    mod   ( f_modName   );
    moPropIntRef    roll  ( f_rollName  );
    moPropStringRef notes ( f_notesName );
    //
    stat.Link( propBag );
    mod .Link( propBag );
    roll.Link( propBag );
    notes.Link( propBag );

    if( stat.HasProp() )
    {
        f_stat = StatManager::Instance().lock()->GetStat( static_cast<moName>(stat) );
        if( !f_stat )
        {
            return false;
        }
    }
    else
    {
        LoadLegacy( propBag );
    }
    //
    assert(f_stat);
    //
    if( mod.HasProp() )
    {
        f_mod = mod;
    }
    else
    {
        f_mod = 0;
    }
    //
    if( roll.HasProp() )
    {
        f_roll = roll;
    }
    else
    {
        f_roll = 0;
    }
    //
    if( notes.HasProp() )
    {
        f_notes = static_cast<moWCString>(notes).c_str();
    }
    else
    {
        f_notes = "";
    }

    return true;
}
bool FxInternal::EffectLoad(LPCSTR filename, LPDXCCSHADERPROPERTIES pRestoreProps, LPCSTR RestoreMsg)
{
	HRESULT hr= S_OK;
	MStatus status= MStatus::kSuccess; 
	LPDIRECT3DDEVICE9 pDevice= NULL;
	LPD3DXBUFFER pErrors= NULL;
	LPD3DXEFFECT pTmpEffect= NULL;


	hr= g_PreviewPipeline.AccessEngine()->GetD3DDevice( &pDevice );
	if(DXCC_FAILED(hr))
		DXCC_GOTO_EXIT(e_Exit, TRUE);

	try
	{
		D3DXMACRO sas_present[2]= { {"SAS_PRESENT", "1"}, {NULL, NULL} };
		if(DXCC_SUCCEEDED(D3DXCreateEffectFromFileA(
				pDevice,
				filename,
				sas_present,
				&g_SasIncluder,
				NULL,
				NULL,
				&pTmpEffect,
				&pErrors)))
		{
			EffectUnload();
		
			pTmpEffect->AddRef();
			Effect= pTmpEffect;
			DXCC_RELEASE(pTmpEffect);

			FxAttributeCreator AttributesCreator;

			D3DXHANDLE hGlobal= Effect->GetParameterBySemantic(NULL, "SasGlobal");
			if(hGlobal == NULL)
			{
				MGlobal::displayWarning( "DirectXShader: File is not SAS compliant (missing SasGlobal) and may not render properly FILE: \"" + MString(filename) + "\"" );
			}
			else
			{
				D3DXHANDLE hVersion= Effect->GetAnnotationByName(hGlobal, "SasVersion");
				if(hVersion == NULL)
				{
					MGlobal::displayWarning( "DirectXShader: File is not SAS compliant (missing SAS version annotation) and may not render properly FILE:\"" + MString(filename) + "\"" );
				}
				else
				{
					INT SasVersion[3] = {0,0,0};
					if(DXCC_SUCCEEDED(Effect->GetIntArray( hVersion, SasVersion, 3)))
					{
						if(SasVersion[0] != 1 
							|| SasVersion[1] != 1 
							|| SasVersion[2] != 0 )
						{
							MGlobal::displayWarning( "DirectXShader: File does not match supported SAS version(1.1.0) and may not render properly FILE:\"" + MString(filename) + "\"" );
						}
					}
				}
			}

			if(DXCC_SUCCEEDED(  AttributesCreator.Run(this) ) )
			{
				FxAttributeFiller AttributesFiller;	

				hr= AttributesFiller.Run(this, pRestoreProps, RestoreMsg);
				if(DXCC_FAILED(hr))
					DXCC_GOTO_EXIT(e_Exit, TRUE);

				LoadLegacy();
			}
			else
			{
				MGlobal::displayWarning( "DirectXShader Load Error: Unable to convert parameters to attributes on Shader Node." );

				DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, FALSE);

			}
		}
		else
		{
			MGlobal::displayWarning( MString( "DirectXShader Load Error: Compiler Output - ") + MString( (LPCSTR) pErrors->GetBufferPointer() )  );

			DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, FALSE);
		}
	}
	catch (...)
	{
		MGlobal::displayWarning( MString( "DirectXShader Load Error: Unexpected runtime exception thrown by D3DXCreateEffectFromFileA" )  );

		DXCC_STATUS_EXIT(hr, E_FAIL, e_Exit, TRUE);
	}

e_Exit:

	DXCC_RELEASE(pTmpEffect);
	DXCC_RELEASE(pDevice);
	DXCC_RELEASE(pErrors);

	return DXCC_SUCCEEDED(hr);
}