Пример #1
0
int CMetaWater::CopyMetaData( const CMetaWater& Src )
{

	//m_listWaterGroup = Src->m_listWaterGroup;
	MetaDataRelease();

	SWaterGroup * pWaterGroupDest = NULL;
	const SWaterGroup * pWaterGroupSrc  = NULL;

	int iSrcGroupNum = Src.m_listWaterGroup.Num();

	for( int i = 0; i < iSrcGroupNum; i++ )
	{
		pWaterGroupDest = new SWaterGroup;
		pWaterGroupSrc  = Src.m_listWaterGroup[i];

		appMemzero( pWaterGroupDest->szNameTexture1, sizeof(char)*WATER_TEXTURENAME_SIZE );
		appMemzero( pWaterGroupDest->szNameTexture2, sizeof(char)*WATER_TEXTURENAME_SIZE );
		appMemzero( pWaterGroupDest->szNameTextureSpecular, sizeof(char)*WATER_TEXTURENAME_SIZE );
		appMemzero( pWaterGroupDest->szNameTextureGloss, sizeof(char)*WATER_TEXTURENAME_SIZE );

		pWaterGroupDest->iID = pWaterGroupSrc->iID;

		if( m_iGroupIDCounter <= pWaterGroupSrc->iID )
		{
			m_iGroupIDCounter = pWaterGroupSrc->iID+1;
		}

		appStrcpy( pWaterGroupDest->szNameTexture1, pWaterGroupSrc->szNameTexture1 );
		appStrcpy( pWaterGroupDest->szNameTexture2, pWaterGroupSrc->szNameTexture2 );
		appStrcpy( pWaterGroupDest->szNameTextureSpecular, pWaterGroupSrc->szNameTextureSpecular );
		appStrcpy( pWaterGroupDest->szNameTextureGloss, pWaterGroupSrc->szNameTextureGloss );
		pWaterGroupDest->WaterIdxBuffer = pWaterGroupSrc->WaterIdxBuffer;
		pWaterGroupDest->WaterVtxBuffer = pWaterGroupSrc->WaterVtxBuffer;
		pWaterGroupDest->fTextureURepeat = pWaterGroupSrc->fTextureURepeat;
		pWaterGroupDest->fTextureVLength = pWaterGroupSrc->fTextureVLength;

		m_listWaterGroup.AddItem(pWaterGroupDest);
	}
	return 0;
}
Пример #2
0
// vps编译接口
UBOOL D3D9CompileShader(
	const TCHAR* ShaderFilename,
	const TCHAR* FunctionName,
	FShaderTarget Target,
	const FShaderCompilerEnvironment& Environment,
	FShaderCompilerOutput& Output,
	UBOOL bDebugDump = FALSE
	)
{
	// translate the input Environment's defines to D3DXMACROs
	vector<D3DXMACRO> Macros;
	for( map<FString, FString>::const_iterator it = Environment.Definitions.begin(); it != Environment.Definitions.end(); ++it )
	{
		FString Name = it->first;
		FString Definition = it->second;

		D3DXMACRO Macro;
		Macro.Name = new ANSICHAR[Name.size()+1];
		appStrncpyANSI((ANSICHAR*)Macro.Name, TCHAR_TO_ANSI(Name.c_str()), Name.size()+1);
		Macro.Definition = new ANSICHAR[Definition.size()+1];
		appStrncpyANSI((ANSICHAR*)Macro.Definition, TCHAR_TO_ANSI(Definition.c_str()), Definition.size()+1);

		Macros.push_back(Macro);
	}

	DWORD CompileFlags = D3DXSHADER_ENABLE_BACKWARDS_COMPATIBILITY;
	const TCHAR* ShaderPath = appShaderDir();

	TCHAR Profile[32];
	if( Target.Platform == SP_SM3 )
	{
		if( Target.Frequency == SF_Pixel )
		{
			appStrcpy(Profile, TEXT("ps_3_0"));
		}
		else if( Target.Frequency == SF_Vertex )
		{
			appStrcpy(Profile, TEXT("vs_3_0"));
		}
	}
	else if( Target.Platform == SP_SM2 )
	{
		if( Target.Frequency == SF_Pixel )
		{
			appStrcpy(Profile, TEXT("ps_2_0"));
		}
		else if( Target.Frequency == SF_Vertex )
		{
			appStrcpy(Profile, TEXT("vs_2_0"));
		}
	}

	vector<FD3D9ConstantDesc> Constants;
	FString DisassemblyString;
	FString ErrorString;
	UBOOL bCompileFailed = TRUE;
	bCompileFailed = !D3D9CompileShaderWrapper(
		ShaderFilename,
		FunctionName,
		Profile,
		CompileFlags,
		Environment,
		Macros,
		Output,
		Constants,
		DisassemblyString,
		ErrorString
		);

	if( bCompileFailed )
	{
		FString ErrorShaderFile = FStringUtil::Sprintf(TEXT("%sErrorShader-%s.vps"), ShaderPath, ShaderFilename);
		appSaveStringToFile(ErrorString, ErrorShaderFile.c_str());
	}

	if( bCompileFailed || bDebugDump )
	{
		const FString SourceFile = LoadShaderSourceFile(ShaderFilename);
		D3D9PreProcessShader(ShaderFilename, SourceFile, Macros, Environment, ShaderPath);
	}

	for(UINT i = 0; i < Macros.size(); ++i)
	{
		delete Macros[i].Name;
		delete Macros[i].Definition;
	}
	Macros.clear();

	UINT NumInstructions = 0;
	if( !bCompileFailed )
	{
		// fetch the number of instruction
		Parse(DisassemblyString.c_str(), TEXT("// approximately"), (DWORD&)NumInstructions);

		// 在ShaderModel3.0下支持的指令数,最少为512,最多至D3DCAPS9.MaxVertexShader30InstructionSlots
		// 因指令数在运行时刻检查,所以在编译器给出提示
		if( NumInstructions > 512 && Target.Platform == SP_SM3 )
		{
			bCompileFailed = TRUE;
			debugf(NAME_Warning, TEXT("Shader use too many instructions for Shader Model 3.0 (Used %u, Minimum guaranteed in SM3.0 is 512)"), NumInstructions);
		}
	}

	if( bCompileFailed )
	{
		return FALSE;
	}

	check(Output.ShaderCode.size() > 0);

	for(UINT ConstantIndex = 0; ConstantIndex < Constants.size(); ++ConstantIndex)
	{
		const FD3D9ConstantDesc& Desc = Constants.at(ConstantIndex);
		if( Desc.bIsSampler )
		{
			Output.ParameterMap.AddParameter(
				ANSI_TO_TCHAR(Desc.Name),
				Desc.RegisterIndex,
				Desc.RegisterCount,
				1
				);
		}
		else
		{
			Output.ParameterMap.AddParameter(
				ANSI_TO_TCHAR(Desc.Name),
				Desc.RegisterIndex * sizeof(FLOAT) * 4,
				Desc.RegisterCount * sizeof(FLOAT) * 4,
				0
				);
		}
	}

	Output.Target = Target;
	Output.NumInstructions = NumInstructions;

	if( bDebugDump )
	{
		FString ASMShaderFile = FStringUtil::Sprintf(TEXT("%s%s.asm"), ShaderPath, ShaderFilename);

		appSaveStringToFile(DisassemblyString, ASMShaderFile.c_str());
	}

	return TRUE;
}