/** * パラメータ解析 */ BOOL CPostEffectConverter::ExportParameter() { IZ_UINT nAnnIdx = 0; izanagi::S_PES_PARAM_HEADER paramHader; { paramHader.numParameter = 0; paramHader.numParamAnn = 0; } // Blank for pass's header. izanagi::tool::CIoStreamSeekHelper cSeekHelper(&m_Out); VRETURN(cSeekHelper.Skip(sizeof(paramHader))); // For description. CGparameter param = ::cgGetFirstEffectParameter(m_pCgEffect); while (param != NULL) { if (CParamUtil::IsParameter(param) && !_IgnoreParameter(param)) { // For Debug... IZ_PCSTR name = ::cgGetParameterName(param); VRETURN(CParamUtil::IsValidParameter(param)); izanagi::S_PES_PARAMETER sParam; FILL_ZERO(&sParam, sizeof(sParam)); sParam.DoNotStrip = CParamUtil::DoNotStrip(param); if (sParam.DoNotStrip || DoNotRemoveParam(param)) { CParamUtil::SetNameAndSemantic(sParam, param); VRETURN( CParamUtil::SetDescValue( sParam, param)); if (sParam.hasAnn) { sParam.AnnotationIdx = nAnnIdx++; } // Register initial value. VRETURN( CParamUtil::GetInitValue( sParam, param)); m_ParamList.push_back(param); // 出力 VRETURN(ExportData(sParam)); paramHader.numParameter++; } } param = ::cgGetNextParameter(param); } VRETURN(ExportParamAnn(paramHader, nAnnIdx)); // Export initial value. m_PesHeader.sizeValueBuffer = CDataBuffer::GetInstance().GetBufferSize(); if (m_PesHeader.sizeValueBuffer > 0) { const void* pBuf = CDataBuffer::GetInstance().GetBuffer(); IZ_OUTPUT_WRITE_VRETURN( &m_Out, pBuf, 0, m_PesHeader.sizeValueBuffer); } // Return to paremter's header position with anchor. VRETURN(cSeekHelper.ReturnWithAnchor()); // Export paramter's header. IZ_OUTPUT_WRITE_VRETURN(&m_Out, ¶mHader, 0, sizeof(paramHader)); // Return to anchored position. VRETURN(cSeekHelper.ReturnToAnchor()); return TRUE; }
/** * パラメータ解析 */ BOOL CShaderConverter::ExportParameter(const SShaderConfig& config) { _ExportChunkHeader(m_Out, izanagi::shader::SHD_CHUNK_MAGIC_NUMBER_PARAM); izanagi::shader::S_SHD_PARAM_HEADER sParamHeader; FILL_ZERO(&sParamHeader, sizeof(sParamHeader)); // Blank for parameter's header. izanagi::tool::CIoStreamSeekHelper cSeekHelper(&m_Out); VRETURN(_BeginExportChunk(sParamHeader, cSeekHelper)); IZ_UINT nAnnIdx = 0; // For description. CGparameter param = ::cgGetFirstEffectParameter(m_pCgEffect); while (param != NULL) { if (CParamUtil::IsParameter(param)) { // For Debug... IZ_PCSTR name = ::cgGetParameterName(param); VRETURN(CParamUtil::IsValidParameter(param)); izanagi::shader::S_SHD_PARAMETER sParam; FILL_ZERO(&sParam, sizeof(sParam)); sParam.DoNotStrip = CParamUtil::DoNotStrip(param); BOOL bIsUsedInEffect = ::cgIsParameterUsed(param, m_pCgEffect); #if 0 if (sParam.DoNotStrip || DoNotRemoveParam(param)) #else if (bIsUsedInEffect || sParam.DoNotStrip) #endif { CParamUtil::SetNameAndSemantic(sParam, param); VRETURN( CParamUtil::SetDescValue( config, sParam, param)); if (sParam.hasAnn) { sParam.AnnotationIdx = nAnnIdx++; } // Register initial value. VRETURN( CParamUtil::GetInitValue( sParam, param)); if (config.type == izanagi::E_PLATFORM_GLES2) { // For GLES2 #if 0 if (izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT1x1 <= sParam.Type && sParam.Type <= izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT4x4) { // TODO sParam.Type = izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT4; sParam.Elements = (sParam.Elements > 0 ? sParam.Elements * 4 : 4); } #else switch (sParam.Type) { case izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT1x1: case izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT1x2: case izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT1x3: case izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT1x4: sParam.Type = izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT; //sParam.Elements = (sParam.Elements > 0 ? sParam.Elements * 1 : 1); break; case izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT2x1: case izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT2x2: case izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT2x3: case izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT2x4: sParam.Type = izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT2; //sParam.Elements = (sParam.Elements > 0 ? sParam.Elements * 2 : 2); break; case izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT3x1: case izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT3x2: case izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT3x3: case izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT3x4: sParam.Type = izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT3; //sParam.Elements = (sParam.Elements > 0 ? sParam.Elements * 3 : 3); break; case izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT4x1: case izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT4x2: case izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT4x3: case izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT4x4: sParam.Type = izanagi::shader::E_SHADER_PARAMETER_TYPE_FLOAT4; //sParam.Elements = (sParam.Elements > 0 ? sParam.Elements * 4 : 4); break; } //printf(" Rows(%d) Columns(%d) Elements(%d)\n", sParam.Rows, sParam.Columns, sParam.Elements); #endif } m_ParamList.push_back(param); // 出力 VRETURN(ExportData(sParam)); sParamHeader.numParameter++; } } param = ::cgGetNextParameter(param); } VRETURN(ExportParamAnn(sParamHeader, nAnnIdx)); // Export initial value. sParamHeader.sizeValueBuffer = CDataBuffer::GetInstance().GetBufferSize(); if (sParamHeader.sizeValueBuffer > 0) { const void* pBuf = CDataBuffer::GetInstance().GetBuffer(); IZ_OUTPUT_WRITE_VRETURN( &m_Out, pBuf, 0, sParamHeader.sizeValueBuffer); } //m_ShdHeader.numParam = sParamHeader.numParameter; VRETURN(_EndExportChunk(sParamHeader, cSeekHelper)); return TRUE; }