Skip to content

Commit

Permalink
feat: load iw5 images from raw
Browse files Browse the repository at this point in the history
  • Loading branch information
Laupetin committed Sep 22, 2024
1 parent 7b28b57 commit d4d8e83
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 3 deletions.
49 changes: 47 additions & 2 deletions src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderGfxImage.cpp
Original file line number Diff line number Diff line change
@@ -1,17 +1,62 @@
#include "AssetLoaderGfxImage.h"

#include "Game/IW5/IW5.h"
#include "ObjLoading.h"
#include "Image/IwiLoader.h"
#include "Pool/GlobalAssetPool.h"

#include <cstring>
#include <format>
#include <iostream>
#include <sstream>

using namespace IW5;

void* AssetLoaderGfxImage::CreateEmptyAsset(const std::string& assetName, MemoryManager* memory)
{
auto* asset = memory->Alloc<AssetImage::Type>();
asset->name = memory->Dup(assetName.c_str());
return asset;
}

bool AssetLoaderGfxImage::CanLoadFromRaw() const
{
return true;
}

bool AssetLoaderGfxImage::LoadFromRaw(
const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager, Zone* zone) const
{
const auto fileName = std::format("images/{}.iwi", assetName);
const auto file = searchPath->Open(fileName);
if (!file.IsOpen())
return false;

const auto fileSize = static_cast<size_t>(file.m_length);
const auto fileData = std::make_unique<char[]>(fileSize);
file.m_stream->read(fileData.get(), fileSize);

MemoryManager tempMemory;
IwiLoader iwiLoader(&tempMemory);
std::istringstream ss(std::string(fileData.get(), fileSize));
const auto texture = iwiLoader.LoadIwi(ss);
if (!texture)
{
std::cerr << std::format("Failed to load texture from: {}\n", fileName);
return false;
}

auto* image = memory->Create<GfxImage>();
memset(image, 0, sizeof(GfxImage));

image->name = memory->Dup(assetName.c_str());
return image;
image->noPicmip = !texture->HasMipMaps();
image->width = static_cast<uint16_t>(texture->GetWidth());
image->height = static_cast<uint16_t>(texture->GetHeight());
image->depth = static_cast<uint16_t>(texture->GetDepth());

image->texture.loadDef = memory->Alloc<GfxImageLoadDef>();

manager->AddAsset<AssetImage>(assetName, image);

return true;
}
5 changes: 4 additions & 1 deletion src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderGfxImage.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#pragma once

#include "AssetLoading/BasicAssetLoader.h"
#include "AssetLoading/IAssetLoadingManager.h"
#include "Game/IW5/IW5.h"
#include "SearchPath/ISearchPath.h"

Expand All @@ -10,5 +10,8 @@ namespace IW5
{
public:
_NODISCARD void* CreateEmptyAsset(const std::string& assetName, MemoryManager* memory) override;
_NODISCARD bool CanLoadFromRaw() const override;
bool
LoadFromRaw(const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager, Zone* zone) const override;
};
} // namespace IW5

0 comments on commit d4d8e83

Please sign in to comment.