//-------------------------------------------------------------------------- void VeAssetPath::FindFileList(const VeChar8* pcDesc, VeVector<VeFixedString>& kOut) const noexcept { const VeChar8* pcFile = VeStrrchr(pcDesc, '/'); pcFile = pcFile ? (pcFile + 1) : pcDesc; AAssetDir* pkDir(nullptr); if (pcFile == pcDesc) { pkDir = AAssetManager_openDir(s_pkAssetManager, m_kPath); } else { VeChar8 acBuffer[VE_MAX_PATH_LEN]; VeChar8* pcTemp = acBuffer; if (m_kPath.GetLength()) { pcTemp += VeSprintf(acBuffer, "%s/", m_kPath.GetStr()); } VeStrncpy(pcTemp, VE_MAX_PATH_LEN, pcDesc, pcFile - pcDesc - 1); pkDir = AAssetManager_openDir(s_pkAssetManager, acBuffer); } if (pkDir) { const VeChar8* pcEntry; while ((pcEntry = AAssetDir_getNextFileName(pkDir))) { if (VeWildNameMatch(pcEntry, pcFile)) { kOut.push_back(pcEntry); } } AAssetDir_close(pkDir); } }
//-------------------------------------------------------------------------- void VeFilePath::FindFileList(const VeChar8* pcDesc, VeVector<VeFixedString>& kOut) const noexcept { # ifdef VE_PLATFORM_WIN VeChar8 acBuffer[VE_MAX_PATH_LEN]; PATH_CAT(acBuffer, m_kPath, pcDesc); _finddata_t kData; VeSizeT stHandle = _findfirst(acBuffer, &kData); if (stHandle != VE_ELF) { do { if ((kData.attrib & 0xf0) == _A_ARCH) { kOut.push_back(kData.name); } } while (VE_SUCCEEDED(_findnext(stHandle, &kData))); VE_ASSERT_EQ(_findclose(stHandle), VE_S_OK); } # else const VeChar8* pcFile = VeStrrchr(pcDesc, '/'); pcFile = pcFile ? (pcFile + 1) : pcDesc; DIR* pkDir(nullptr); if (pcFile == pcDesc) { pkDir = opendir(m_kPath.GetLength() ? m_kPath : "."); } else { VeChar8 acBuffer[VE_MAX_PATH_LEN]; VeChar8* pcTemp = acBuffer; if (m_kPath.GetLength()) { pcTemp += VeSprintf(acBuffer, "%s/", m_kPath.GetStr()); } VeStrncpy(pcTemp, VE_MAX_PATH_LEN, pcDesc, pcFile - pcDesc - 1); pkDir = opendir(acBuffer); } if (pkDir) { struct dirent* pkEntry; while ((pkEntry = readdir(pkDir))) { if (pkEntry->d_type != DT_DIR) { if (VeWildNameMatch(pkEntry->d_name, pcFile)) { kOut.push_back(pkEntry->d_name); } } } VE_ASSERT_EQ(closedir(pkDir), VE_S_OK); } # endif }
void Compile(VeChar8* pcFileName, VeChar8* pcDstDir) { VeChar8* pcFile = VeStrrchr(pcFileName, '/'); VeSizeT stNum = pcFile - pcFileName; VeChar8 acBuffer[2048]; VeMemcpy(acBuffer, pcFileName, stNum); acBuffer[stNum] = 0; ++pcFile; VeFileDir kFile(acBuffer); VeChar8* pcContent; VeChar8* pcTemp = VeStrtok(pcDstDir, "/", &pcContent); VE_ASSERT(pcTemp && *pcTemp); VeFileDir kDstFile(pcTemp); pcTemp = VeStrtok(NULL, "/", &pcContent); while(pcTemp && *pcTemp) { kDstFile.Change(pcTemp); pcTemp = VeStrtok(NULL, "/", &pcContent); } VeBinaryIStreamPtr spStream = kFile.OpenSync(pcFile); VE_ASSERT(spStream); VeXMLDocument kDoc; (*spStream) >> kDoc; VE_ASSERT(!kDoc.Error()); VeXMLElement* pkRoot = kDoc.RootElement(); VeXMLElement* pkGroup = pkRoot->FirstChildElement("Group"); while(pkGroup) { VeXMLElement* pkShader = pkGroup->FirstChildElement(); while(pkShader) { const VeChar8* pcName = pkShader->Value(); const VeChar8* pcSrc = pkShader->GetAttribute("src"); const VeChar8* pcEntry = pkShader->GetAttribute("entry"); VeStringA kFile(acBuffer); kFile += '/'; kFile += pcSrc; VeVector<const VeChar8*> kProfileList; VeXMLElement* pkProfile = pkShader->FirstChildElement("Profile"); while(pkProfile) { const VeChar8* pcProfile = pkProfile->GetAttribute("value"); kProfileList.PushBack(pcProfile); pkProfile = pkProfile->NextSiblingElement("Profile"); } VeVector<D3D_SHADER_MACRO> kMacroList; VeXMLElement* pkMacro = pkShader->FirstChildElement("Macro"); while(pkMacro) { D3D_SHADER_MACRO kMac; kMac.Name = pkMacro->GetAttribute("name"); kMac.Definition = pkMacro->GetAttribute("define"); kMacroList.PushBack(kMac); pkMacro = pkMacro->NextSiblingElement("Macro"); } D3D_SHADER_MACRO kLast = {NULL, NULL}; kMacroList.PushBack(kLast); for(VeVector<const VeChar8*>::iterator it = kProfileList.Begin(); it != kProfileList.End(); ++it) { HRESULT hRes = S_OK; ID3DBlob* pkOut; ID3DBlob* pkErrorBlob; hRes = D3DX11CompileFromFile(kFile, kMacroList.Begin(), NULL, pcEntry, *it, D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_OPTIMIZATION_LEVEL3 | D3DCOMPILE_PACK_MATRIX_COLUMN_MAJOR, 0, NULL, &pkOut, &pkErrorBlob, NULL); if(VE_FAILED(hRes)) { if(pkErrorBlob) { VE_LOG_EString("HLSLComplier", (VeChar8*)pkErrorBlob->GetBufferPointer()); } } else { VeStringA kOutputName(pcName); kOutputName += '.'; kOutputName += *it; VeMemoryOStreamPtr spOutputStream = VE_NEW VeMemoryOStream(); spOutputStream->AddBlob(pkOut->GetBufferPointer(), pkOut->GetBufferSize()); kDstFile.WriteAsync(kOutputName, spOutputStream, g_kWriteDelegate); } VE_SAFE_RELEASE(pkOut); VE_SAFE_RELEASE(pkErrorBlob); } pkShader = pkShader->NextSiblingElement(); } pkGroup = pkGroup->NextSiblingElement("Group"); } }