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; }
// 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; }