//! reads text from a file char* ShaderImpl::ReadFileText(const char* path) { File* pFile = File::Create(path, File::M_ReadBinary); pFile->Open(); pFile->SetOffset(0, File::OT_End); u32 fileSize = pFile->GetOffset(); pFile->SetOffset(0, shoot::File::OT_Start); char* pText = snew char[fileSize+1]; pFile->Read(pText, fileSize); pText[fileSize] = '\0'; pFile->Close(); sdelete(pFile); return pText; }
//! returns an instance CacheFile* CacheFile::GetFile(const std::string& strPath) { std::map<std::string, CacheFile::Info>::iterator it = m_sCache.find(strPath); if(it != m_sCache.end()) { return snew CacheFile(strPath.c_str(), it->second); } Info info; File* pNativeFile = File::CreateNative(strPath.c_str(), File::M_ReadBinary); pNativeFile->Open(); pNativeFile->SetOffset(0, File::OT_End); info.m_Size = pNativeFile->GetOffset(); info.m_pData = snew u8[info.m_Size]; pNativeFile->SetOffset(0, File::OT_Start); pNativeFile->Read(info.m_pData, info.m_Size); pNativeFile->Close(); delete pNativeFile; CacheFile* pFile = snew CacheFile(strPath.c_str(), info); m_sCache[strPath] = info; return pFile; }
//! returns the ShootFS file size uint FileSystemGenerator::GetShootFSFileSize(const char* strPath) const { auto extension = Utils::GetFileExtension(strPath); if (Utils::Equals(extension.c_str(), "xml")) { auto file = File::CreateNative(strPath, File::M_ReadBinary); file->Open(); auto fileSize = file->GetSize(); file->Close(); sdelete(file); return (uint)fileSize; } auto binPath = Utils::GetBinPath(strPath); auto dirty = true; if (File::Exists(binPath.c_str())) dirty = Utils::IsFileMoreRecent(strPath, binPath); File* binFile = NULL; uint fileSize = 0; if (dirty) { Log << "Converting " << strPath << "\n"; binFile = Utils::CreateBinFile(binPath); if (Utils::Equals(extension.c_str(), "png")) { auto textureResourcePath = Utils::GetFilePathNoExt(strPath) + ".xml"; bool _32Bits = false; if (File::Exists(textureResourcePath.c_str())) { auto textureResource = static_cast<Texture*>(ObjectManager::Instance()->Load(textureResourcePath)); _32Bits = textureResource->Is32Bits(); sdelete(textureResource); } int width = 0, height = 0, channels = 0, bpp = 0; auto data = (uchar*)PNGLoader::LoadFromRawPng(strPath, width, height, channels, bpp, binFile, _32Bits); fileSize = (uint)binFile->GetOffset(); sdelete_array(data); } else if (Utils::Equals(extension.c_str(), "fbx")) { std::string meshResourcePath = Utils::GetFilePathNoExt(strPath) + ".xml"; auto meshResource = static_cast<MeshResource*>(ObjectManager::Instance()->Load(meshResourcePath)); FBXMeshLoader(meshResource).Load(strPath, binFile, true); fileSize = (uint)binFile->GetOffset(); sdelete(meshResource); } #ifdef DX11 else if (Utils::Equals(extension.c_str(), "hlsl")) { bool bVS = path.find("vs") != std::string::npos; bool bPS = path.find("ps") != std::string::npos; SHOOT_ASSERT(bVS || bPS, "Couldn't determine type of HLSL file: %s", strPath); const char* strEntryPoint = bVS ? "VSMain" : "PSMain"; const char* strLevel = bVS ? "vs_4_0_level_9_3" : "ps_4_0_level_9_3"; COMReference<ID3DBlob> blob = ShaderDX11::CompileHLSL(strPath, strEntryPoint, strLevel); fileSize += binFile->Write(static_cast<u8*>(blob->GetBufferPointer()), blob->GetBufferSize()); } #endif else { auto file = File::CreateNative(strPath, File::M_ReadBinary); file->Open(); fileSize = (uint)file->GetSize(); auto data = new uchar[fileSize]; file->Read(data, fileSize); binFile->Write(data, fileSize); file->Close(); sdelete(file); } } else { binFile = File::CreateNative(binPath.c_str(), File::M_ReadBinary); binFile->Open(); fileSize = (uint)binFile->GetSize(); } binFile->Close(); sdelete(binFile); return fileSize; }