mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-06-11 07:18:11 -05:00
ObjLoading: Be able to load and index IWD files
This commit is contained in:
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
26
src/Utils/Utils/TransformIterator.h
Normal file
26
src/Utils/Utils/TransformIterator.h
Normal 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); }
|
||||
};
|
Reference in New Issue
Block a user