// パス解析 BOOL CPostEffectConverter::ExportPass() { IZ_UINT nTechIdx = 0; IZ_UINT nPassIdx = 0; IZ_UINT nConstNum = 0; IZ_UINT nSamplerNum = 0; izanagi::tool::CString strPrevPassFunctoName; CGtechnique tech = ::cgGetFirstTechnique(m_pCgEffect); while (tech != NULL) { CGpass pass = ::cgGetFirstPass(tech); while (pass != NULL) { izanagi::S_PES_PASS sPass; { FILL_ZERO(&sPass, sizeof(sPass)); IZ_PCSTR name = ::cgGetPassName(pass); IZ_UINT pos = CStringChunk::GetInstance().Register(name); //sPass.name = *(IZ_PCSTR*)(&pos); sPass.posName = pos; sPass.keyName = izanagi::CKey::GenerateValue(name); sPass.TechniqueIdx = nTechIdx; sPass.numConst = _GetUsedParamNum(m_ParamList, pass); sPass.numSampler = _GetUsedParamNum(m_SamplerList, pass); VRETURN(CPassUtil::SetVSType(sPass, pass)); sPass.sizeProgram = _GetFileSize(m_CompiledPSList[nPassIdx]); sPass.ann.RenderTargetIdx = _GetRenderTargetIdx(m_TexList, pass); sPass.ann.TexOffsetParamIdx = _GetTexOffsetParamIdx(m_ParamList, pass); for (IZ_UINT i = 0; i < izanagi::PES_FUNCTOR_ARGS_NUM; i++) { sPass.ann.FunctorArgs[i] = -1; } nConstNum += sPass.numConst; nSamplerNum += sPass.numSampler; } VRETURN( CPassUtil::SetAnnValue( sPass.ann, pass)); IZ_PCSTR pszFunctorName = CPassUtil::GetFunctorName(pass); if (pszFunctorName != IZ_NULL) { if (strPrevPassFunctoName == pszFunctorName) { sPass.ann.isSubPass = IZ_TRUE; } strPrevPassFunctoName = pszFunctorName; } // Stringで設定されているファンクタ引数 std::vector<izanagi::tool::CString> tvFunctorArgSList; CPassUtil::GetFunctorArgsString( pass, tvFunctorArgSList); if (tvFunctorArgSList.size() > 0) { ConvertFunctorArgsStrToIndex( tvFunctorArgSList, sPass.ann); } VRETURN( CPassUtil::SetStateValue( sPass.state, pass)); // 出力 VRETURN(ExportData(sPass)); pass = ::cgGetNextPass(pass); nPassIdx++; m_PesHeader.maxProgamSize = IZ_MAX(m_PesHeader.maxProgamSize, sPass.sizeProgram); m_PesHeader.numPass++; } tech = ::cgGetNextTechnique(tech); nTechIdx++; } // NOTE // 全体でのシェーダ定数、サンプラの総数を知りたい m_PesHeader.numParam = nConstNum; m_PesHeader.numSampler = nSamplerNum; return TRUE; }
// パス解析 BOOL CShaderConverter::ExportPass(const SShaderConfig& config) { _ExportChunkHeader(m_Out, izanagi::shader::SHD_CHUNK_MAGIC_NUMBER_PASS); izanagi::shader::S_SHD_PASS_HEADER sPassHeader; FILL_ZERO(&sPassHeader, sizeof(sPassHeader)); // Blank for pass's header. izanagi::tool::CIoStreamSeekHelper cSeekHelper(&m_Out); VRETURN(_BeginExportChunk(sPassHeader, cSeekHelper)); IZ_UINT nTechIdx = 0; IZ_UINT nPassIdx = 0; IZ_UINT nConstNum = 0; IZ_UINT nSamplerNum = 0; CGtechnique tech = ::cgGetFirstTechnique(m_pCgEffect); while (tech != NULL) { CGpass pass = ::cgGetFirstPass(tech); while (pass != NULL) { izanagi::shader::S_SHD_PASS sPass; { FILL_ZERO(&sPass, sizeof(sPass)); IZ_PCSTR name = ::cgGetPassName(pass); IZ_UINT pos = CStringChunk::GetInstance().Register(name); //sPass.name = *(IZ_PCSTR*)(&pos); sPass.posName = pos; sPass.keyName = izanagi::CKey::GenerateValue(name); sPass.TechniqueIdx = nTechIdx; sPass.numConst = _GetUsedParamNum(m_ParamList, pass); sPass.numSampler = _GetUsedParamNum(m_SamplerList, pass); sPass.sizeVS = _GetFileSize(config, m_CompiledVSList[nPassIdx]); sPass.sizePS = _GetFileSize(config, m_CompiledPSList[nPassIdx]); nConstNum += sPass.numConst; nSamplerNum += sPass.numSampler; } VRETURN( CPassUtil::SetStateValue( sPass.state, pass)); // 出力 VRETURN(ExportData(sPass)); pass = ::cgGetNextPass(pass); nPassIdx++; IZ_UINT nMax = IZ_MAX(sPass.sizeVS, sPass.sizePS); m_ShdHeader.maxProgamSize = IZ_MAX(m_ShdHeader.maxProgamSize, nMax); sPassHeader.numPass++; } tech = ::cgGetNextTechnique(tech); nTechIdx++; } m_ShdHeader.numPass = sPassHeader.numPass; // NOTE // 全体でのシェーダ定数、サンプラの総数を知りたい m_ShdHeader.numParam = nConstNum; m_ShdHeader.numSmpl = nSamplerNum; VRETURN(ExportUsedParamAndSamplerIdxByPass()); VRETURN(_EndExportChunk(sPassHeader, cSeekHelper)); return TRUE; }