ObjLoading: Be able to load and index IWD files

This commit is contained in:
Jan
2020-01-01 18:46:33 +01:00
parent a4d55ffae7
commit 0abdb64832
27 changed files with 667 additions and 252 deletions

View File

@ -27,7 +27,7 @@ bool FileAPI::DirectoryExists(const std::string& directoryName)
FileAPI::File FileAPI::Open(const std::string& filename, const Mode mode)
{
const char* modeStr;
switch(mode)
switch (mode)
{
default:
case Mode::MODE_READ:
@ -38,14 +38,14 @@ FileAPI::File FileAPI::Open(const std::string& filename, const Mode mode)
modeStr = "wb";
break;
}
FILE* handle;
if (fopen_s(&handle, filename.c_str(), modeStr) != 0)
{
return File(nullptr);
}
return File(handle);
FILE* handle;
if (fopen_s(&handle, filename.c_str(), modeStr) != 0)
{
return File(nullptr);
}
return File(handle);
}
FileAPI::File::File()
@ -55,7 +55,7 @@ FileAPI::File::File()
FileAPI::File::File(void* handle)
{
this->m_handle = handle;
this->m_handle = handle;
}
FileAPI::File::File(File&& f) noexcept
@ -66,7 +66,7 @@ FileAPI::File::File(File&& f) noexcept
FileAPI::File::~File()
{
this->Close();
this->Close();
}
FileAPI::File& FileAPI::File::operator=(File&& f) noexcept
@ -79,43 +79,48 @@ FileAPI::File& FileAPI::File::operator=(File&& f) noexcept
bool FileAPI::File::IsOpen()
{
return this->m_handle != nullptr;
return this->m_handle != nullptr;
}
size_t FileAPI::File::Read(void* buffer, const size_t elementSize, const size_t elementCount)
{
if (!this->IsOpen())
return 0;
if (!this->IsOpen())
return 0;
return fread(buffer, elementSize, elementCount, static_cast<FILE*>(m_handle));
return fread(buffer, elementSize, elementCount, static_cast<FILE*>(m_handle));
}
size_t FileAPI::File::Write(const void* data, const size_t elementSize, const size_t elementCount)
{
if (!this->IsOpen())
return 0;
if (!this->IsOpen())
return 0;
return fwrite(data, elementSize, elementCount, static_cast<FILE*>(m_handle));
return fwrite(data, elementSize, elementCount, static_cast<FILE*>(m_handle));
}
void FileAPI::File::Skip(const size_t amount)
void FileAPI::File::Skip(const int64_t amount)
{
if(!this->IsOpen())
if (!this->IsOpen())
return;
fseek(static_cast<FILE*>(m_handle), amount, SEEK_CUR);
_fseeki64(static_cast<FILE*>(m_handle), amount, SEEK_CUR);
}
void FileAPI::File::GotoEnd()
{
_fseeki64(static_cast<FILE*>(m_handle), 0, SEEK_END);
}
size_t FileAPI::File::Printf(const char* fmt, ...)
{
va_list ap;
va_list ap;
if (!this->IsOpen())
return 0;
if (!this->IsOpen())
return 0;
va_start(ap, fmt);
va_start(ap, fmt);
const int result = vfprintf(static_cast<FILE*>(m_handle), fmt, ap);
va_end(ap);
va_end(ap);
return result;
}
@ -132,9 +137,9 @@ void FileAPI::File::Goto(const int64_t pos)
void FileAPI::File::Close()
{
if (this->m_handle != nullptr)
{
fclose(static_cast<FILE*>(m_handle));
this->m_handle = nullptr;
}
}
if (this->m_handle != nullptr)
{
fclose(static_cast<FILE*>(m_handle));
this->m_handle = nullptr;
}
}

View File

@ -20,10 +20,11 @@ public:
virtual bool IsOpen() = 0;
virtual size_t Read(void* buffer, size_t elementSize, size_t elementCount) = 0;
virtual size_t Write(const void* data, size_t elementSize, size_t elementCount) = 0;
virtual void Skip(size_t amount) = 0;
virtual void Skip(int64_t amount) = 0;
virtual size_t Printf(const char* fmt, ...) = 0;
virtual int64_t Pos() = 0;
virtual void Goto(int64_t pos) = 0;
virtual void GotoEnd() = 0;
virtual void Close() = 0;
};
@ -44,10 +45,11 @@ public:
bool IsOpen() override;
size_t Read(void* buffer, size_t elementSize, size_t elementCount) override;
size_t Write(const void* data, size_t elementSize, size_t elementCount) override;
void Skip(size_t amount) override;
void Skip(int64_t amount) override;
size_t Printf(const char* fmt, ...) override;
int64_t Pos() override;
void Goto(int64_t pos) override;
void GotoEnd() override;
void Close() override;
};

View File

@ -0,0 +1,26 @@
#pragma once
#include <functional>
template <typename BaseIteratorType, typename SourceType, typename TargetType>
class TransformIterator
{
BaseIteratorType m_base;
std::function<TargetType(SourceType)> m_transform;
public:
TransformIterator(BaseIteratorType base, std::function<TargetType(SourceType)> transform)
: m_base(base), m_transform(transform)
{
}
TransformIterator& operator++()
{
++m_base;
return *this;
}
bool operator==(TransformIterator other) const { return m_base == other.m_base; }
bool operator!=(TransformIterator other) const { return !(m_base == other.m_base); }
TargetType operator*() { return m_transform(*m_base); }
};