#ifndef BUFFER_H
#define BUFFER_H
namespace fw
{
class Buffer
{
public:
friend class GameResourcesManager;
enum Type
{
File,
GPU,
Network,
Zip
};
Buffer(Type type) :
m_pBuffer(nullptr),
m_iSize(0),
m_sName(NONE),
m_bEmpty(true),
m_type(type),
m_bDone(false)
{
}
Buffer(Type type, char* pData) :
Buffer(type)
{
if (pData != nullptr)
{
m_pBuffer = pData;
}
}
virtual ~Buffer()
{
if (m_bDone)
{
SAFE_DELETE(m_pBuffer);
}
}
void Delete()
{
SAFE_DELETE(m_pBuffer);
SetEmpty(true);
}
bool IsDeleted()
{
return m_pBuffer == nullptr;
}
void SetName(const std::string& sName)
{
m_sName = sName;
}
char* GetBuffer()
{
return m_pBuffer;
}
const char* GetBuffer() const
{
return m_pBuffer;
}
fw::size_t32 GetSize()
{
return m_iSize;
}
void SetSize(fw::size_t32 iSize)
{
m_iSize = iSize;
}
std::string GetName() const
{
return m_sName;
}
bool operator== (const Buffer& f) const
{
bool resultat = (f.GetBuffer() == GetBuffer()) && (f.GetName() == GetName());
return resultat;
}
bool IsEmpty() const
{
return m_bEmpty;
}
void Done()
{
m_bDone = true;
}
protected:
char** AccessBuffer()
{
SetEmpty(false);
return &m_pBuffer;
}
void SetBuffer(char* pBuffer)
{
m_pBuffer = pBuffer;
if (pBuffer != nullptr)
{
SetEmpty(false);
}
}
Buffer& Get()
{
return *this;
}
private:
void SetEmpty(bool bEmpty)
{
m_bEmpty = bEmpty;
}
private:
char* m_pBuffer;
fw::size_t32 m_iSize;
std::string m_sName;
bool m_bEmpty;
Type m_type;
bool m_bDone;
};
class ChunkedBuffer : public Buffer
{
public:
ChunkedBuffer(Type type) :
Buffer(type)
{
}
ChunkedBuffer(Type type, char* pData) :
Buffer(type, pData)
{
}
size_t32 GetChunkSize() const
{
return m_iChunkSize;
}
size_t32 GetElementsCount() const
{
return m_iElementsCount;
}
protected:
void SetElementsCount(size_t32 iElementsCount)
{
m_iElementsCount = iElementsCount;
}
void SetChunkSize(size_t32 iChunkSize)
{
m_iChunkSize = iChunkSize;
}
private:
size_t32 m_iChunkSize = 0;
size_t32 m_iElementsCount = 0;
};
class FileBuffer : public Buffer
{
public:
friend class FileSystemManager;
FileBuffer() :
Buffer(Buffer::Type::File)
{
}
FileBuffer& Get()
{
return *this;
}
};
class CursorFileBuffer : public FileBuffer
{
public:
friend class GameResourcesManager;
CursorFileBuffer()
{
m_iImageWidth = 0;
m_iImageHeight = 0;
}
virtual ~CursorFileBuffer()
{
}
size_t GetCursorWidth()
{
return m_iImageWidth;
}
size_t GetCursorHeight()
{
return m_iImageHeight;
}
CursorFileBuffer& Get()
{
return *this;
}
private:
size_t32 m_iImageWidth;
size_t32 m_iImageHeight;
};
class TextureFileBuffer : public FileBuffer
{
public:
friend class GameResourcesManager;
TextureFileBuffer()
{
}
TextureFileBuffer& Get()
{
return *this;
}
private:
size_t32 m_iImageWidth;
size_t32 m_iImageHeight;
};
class ShaderFileBuffer : public FileBuffer
{
public:
friend class GameResourcesManager;
friend class D3DIncludeHandlerZIP;
ShaderFileBuffer()
{
}
ShaderFileBuffer& Get()
{
return *this;
}
};
class MeshFileBuffer : public FileBuffer
{
public:
friend class GameResourcesManager;
MeshFileBuffer()
{
}
MeshFileBuffer& Get()
{
return *this;
}
};
}
#endif