Decent asset loading
This commit is contained in:
@@ -31,13 +31,6 @@ Asset::~Asset()
|
||||
{
|
||||
}
|
||||
|
||||
void Asset::updateByteSize()
|
||||
{
|
||||
ArchiveBuffer buffer;
|
||||
save(buffer);
|
||||
byteSize = buffer.size();
|
||||
}
|
||||
|
||||
std::string Asset::getFolderPath() const
|
||||
{
|
||||
return folderPath;
|
||||
|
||||
@@ -23,14 +23,13 @@ public:
|
||||
virtual void save(ArchiveBuffer& buffer) const = 0;
|
||||
virtual void load(ArchiveBuffer& buffer) = 0;
|
||||
|
||||
bool isModified() const;
|
||||
// returns the assets name
|
||||
std::string getName() const;
|
||||
// returns the (virtual) folder path
|
||||
std::string getFolderPath() const;
|
||||
// returns the identifier with which it can be found from the asset registry
|
||||
std::string getAssetIdentifier() const;
|
||||
// returns the size of the assets data in bytes(excluding name and folder)
|
||||
uint64 getByteSize() const { return byteSize; }
|
||||
|
||||
constexpr Status getStatus()
|
||||
{
|
||||
|
||||
@@ -77,12 +77,12 @@ PMaterialAsset AssetRegistry::findMaterial(const std::string &filePath)
|
||||
return folder->materials.at(fileName);
|
||||
}
|
||||
|
||||
std::ofstream AssetRegistry::createWriteStream(const std::string& relativePath, std::ios_base::openmode openmode)
|
||||
std::ofstream AssetRegistry::createWriteStream(const std::filesystem::path& relativePath, std::ios_base::openmode openmode)
|
||||
{
|
||||
return get().internalCreateWriteStream(relativePath, openmode);
|
||||
}
|
||||
|
||||
std::ifstream AssetRegistry::createReadStream(const std::string& relativePath, std::ios_base::openmode openmode)
|
||||
std::ifstream AssetRegistry::createReadStream(const std::filesystem::path& relativePath, std::ios_base::openmode openmode)
|
||||
{
|
||||
return get().internalCreateReadStream(relativePath, openmode);
|
||||
}
|
||||
@@ -229,9 +229,6 @@ void AssetRegistry::loadAsset(ArchiveBuffer& buffer)
|
||||
std::string folderPath;
|
||||
Serialization::load(buffer, folderPath);
|
||||
|
||||
uint64 assetSize;
|
||||
Serialization::load(buffer, assetSize);
|
||||
|
||||
AssetFolder* folder = getOrCreateFolder(folderPath);
|
||||
|
||||
PAsset asset;
|
||||
@@ -294,7 +291,7 @@ void AssetRegistry::saveAsset(PAsset asset, uint64 identifier, const std::filesy
|
||||
if (name.empty())
|
||||
return;
|
||||
|
||||
std::string path = (folderPath / name).string().append(".asset");
|
||||
std::string path = (folderPath / name).replace_extension("asset").string();
|
||||
auto assetStream = createWriteStream(std::move(path), std::ios::binary);
|
||||
ArchiveBuffer assetBuffer(graphics);
|
||||
// write identifier
|
||||
@@ -303,13 +300,9 @@ void AssetRegistry::saveAsset(PAsset asset, uint64 identifier, const std::filesy
|
||||
Serialization::save(assetBuffer, name);
|
||||
// write folder
|
||||
Serialization::save(assetBuffer, folderPath.string());
|
||||
// write the asset size
|
||||
asset->updateByteSize();
|
||||
Serialization::save(assetBuffer, asset->getByteSize());
|
||||
// write asset data
|
||||
asset->save(assetBuffer);
|
||||
assetBuffer.writeToStream(assetStream);
|
||||
|
||||
}
|
||||
|
||||
std::filesystem::path AssetRegistry::getRootFolder()
|
||||
@@ -367,17 +360,17 @@ AssetRegistry::AssetFolder* AssetRegistry::getOrCreateFolder(std::string fullPat
|
||||
return result;
|
||||
}
|
||||
|
||||
std::ofstream AssetRegistry::internalCreateWriteStream(const std::string& relativePath, std::ios_base::openmode openmode)
|
||||
std::ofstream AssetRegistry::internalCreateWriteStream(const std::filesystem::path& relativePath, std::ios_base::openmode openmode)
|
||||
{
|
||||
auto fullPath = rootFolder;
|
||||
fullPath.append(relativePath);
|
||||
auto fullPath = rootFolder / relativePath;
|
||||
std::filesystem::create_directories(fullPath.parent_path());
|
||||
return std::ofstream(fullPath.string(), openmode);
|
||||
}
|
||||
|
||||
std::ifstream AssetRegistry::internalCreateReadStream(const std::string& relativePath, std::ios_base::openmode openmode)
|
||||
std::ifstream AssetRegistry::internalCreateReadStream(const std::filesystem::path& relativePath, std::ios_base::openmode openmode)
|
||||
{
|
||||
auto fullPath = rootFolder;
|
||||
fullPath.append(relativePath);
|
||||
auto fullPath = rootFolder / relativePath;
|
||||
std::filesystem::create_directories(fullPath.parent_path());
|
||||
return std::ifstream(fullPath.string(), openmode);
|
||||
}
|
||||
|
||||
|
||||
@@ -25,8 +25,8 @@ public:
|
||||
static PFontAsset findFont(const std::string& name);
|
||||
static PMaterialAsset findMaterial(const std::string& filePath);
|
||||
|
||||
static std::ofstream createWriteStream(const std::string& relativePath, std::ios_base::openmode openmode = std::ios::out);
|
||||
static std::ifstream createReadStream(const std::string& relativePath, std::ios_base::openmode openmode = std::ios::in);
|
||||
static std::ofstream createWriteStream(const std::filesystem::path& relativePath, std::ios_base::openmode openmode = std::ios::out);
|
||||
static std::ifstream createReadStream(const std::filesystem::path& relativePath, std::ios_base::openmode openmode = std::ios::in);
|
||||
|
||||
static void set(AssetRegistry registry);
|
||||
|
||||
@@ -63,8 +63,8 @@ private:
|
||||
void registerFont(PFontAsset font);
|
||||
void registerMaterial(PMaterialAsset material);
|
||||
|
||||
std::ofstream internalCreateWriteStream(const std::string& relativePath, std::ios_base::openmode openmode = std::ios::out);
|
||||
std::ifstream internalCreateReadStream(const std::string& relaitvePath, std::ios_base::openmode openmode = std::ios::in);
|
||||
std::ofstream internalCreateWriteStream(const std::filesystem::path& relativePath, std::ios_base::openmode openmode = std::ios::out);
|
||||
std::ifstream internalCreateReadStream(const std::filesystem::path& relaitvePath, std::ios_base::openmode openmode = std::ios::in);
|
||||
|
||||
std::filesystem::path rootFolder;
|
||||
AssetFolder* assetRoot;
|
||||
|
||||
@@ -25,8 +25,7 @@ TextureAsset::~TextureAsset()
|
||||
|
||||
void TextureAsset::save(ArchiveBuffer& buffer) const
|
||||
{
|
||||
/*Array<uint8> textureData;
|
||||
ktxTexture2* kTexture;
|
||||
/*ktxTexture2* kTexture;
|
||||
ktxTextureCreateInfo createInfo = {
|
||||
.vkFormat = (uint32_t)texture->getFormat(),
|
||||
.baseWidth = texture->getSizeX(),
|
||||
@@ -47,8 +46,9 @@ void TextureAsset::save(ArchiveBuffer& buffer) const
|
||||
{
|
||||
// technically, downloading cant be const, because we have to allocate temporary buffers and change layouts
|
||||
// but practically the texture stays the same
|
||||
const_cast<Gfx::Texture*>(texture.getHandle())->download(0, depth, face, textureData);
|
||||
KTX_CHECK(ktxTexture_SetImageFromMemory(ktxTexture(kTexture), 0, depth, face, textureData.data(), textureData.size()));
|
||||
Array<uint8> faceData;
|
||||
const_cast<Gfx::Texture*>(texture.getHandle())->download(0, depth, face, faceData);
|
||||
KTX_CHECK(ktxTexture_SetImageFromMemory(ktxTexture(kTexture), 0, depth, face, faceData.data(), faceData.size()));
|
||||
}
|
||||
}
|
||||
char writer[100];
|
||||
@@ -57,7 +57,7 @@ void TextureAsset::save(ArchiveBuffer& buffer) const
|
||||
(ktx_uint32_t)strlen(writer) + 1,
|
||||
writer);
|
||||
|
||||
//ktx_error_code_e error = ktxTexture2_CompressBasis(kTexture, 0);
|
||||
KTX_CHECK(ktxTexture2_CompressAstc(kTexture, 0));
|
||||
|
||||
ktx_uint8_t* texData;
|
||||
ktx_size_t texSize;
|
||||
@@ -65,29 +65,24 @@ void TextureAsset::save(ArchiveBuffer& buffer) const
|
||||
|
||||
Array<uint8> rawData(texSize);
|
||||
std::memcpy(rawData.data(), texData, texSize);
|
||||
free(texData);
|
||||
*/
|
||||
Serialization::save(buffer, textureData);
|
||||
Serialization::save(buffer, rawData);
|
||||
free(texData);*/
|
||||
assert(false); // TODO
|
||||
}
|
||||
|
||||
void TextureAsset::load(ArchiveBuffer& buffer)
|
||||
{
|
||||
Gfx::PGraphics graphics = buffer.getGraphics();
|
||||
Array<uint8> rawData;
|
||||
Serialization::load(buffer, rawData);
|
||||
createFromMemory(std::move(rawData), buffer.getGraphics());
|
||||
}
|
||||
|
||||
void TextureAsset::createFromMemory(Array<uint8> memory, Gfx::PGraphics graphics)
|
||||
{
|
||||
textureData = std::move(memory);
|
||||
ktxTexture2* kTexture;
|
||||
std::cout << "Loading texture " << name << std::endl;
|
||||
KTX_CHECK(ktxTexture_CreateFromMemory(textureData.data(),
|
||||
textureData.size(),
|
||||
KTX_CHECK(ktxTexture_CreateFromMemory(rawData.data(),
|
||||
rawData.size(),
|
||||
KTX_TEXTURE_CREATE_LOAD_IMAGE_DATA_BIT,
|
||||
(ktxTexture**)&kTexture));
|
||||
|
||||
ktxTexture2_TranscodeBasis(kTexture, KTX_TTF_BC7_RGBA, 0);
|
||||
ktx_error_code_e e = ktxTexture2_TranscodeBasis(kTexture, KTX_TTF_BC7_RGBA, 0);
|
||||
assert(e == ktx_error_code_e::KTX_SUCCESS);
|
||||
|
||||
TextureCreateInfo createInfo = {
|
||||
.resourceData = {
|
||||
@@ -118,4 +113,4 @@ void TextureAsset::createFromMemory(Array<uint8> memory, Gfx::PGraphics graphics
|
||||
}
|
||||
texture->transferOwnership(Gfx::QueueType::GRAPHICS);
|
||||
ktxTexture_Destroy(ktxTexture(kTexture));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,6 @@ public:
|
||||
virtual ~TextureAsset();
|
||||
virtual void save(ArchiveBuffer& buffer) const override;
|
||||
virtual void load(ArchiveBuffer& buffer) override;
|
||||
void createFromMemory(Array<uint8> memory, Gfx::PGraphics graphics);
|
||||
void setTexture(Gfx::PTexture _texture)
|
||||
{
|
||||
texture = _texture;
|
||||
@@ -23,7 +22,6 @@ public:
|
||||
return texture;
|
||||
}
|
||||
private:
|
||||
Array<uint8> textureData;
|
||||
Gfx::PTexture texture;
|
||||
friend class TextureLoader;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user