add opportunity to pack atlas and meta data in same file
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
#include "Host/ResourceLoader.hpp"
|
||||
#include <fstream>
|
||||
#include <utf8.h>
|
||||
#include "Image/ImageLoader.hpp"
|
||||
|
||||
namespace OpenVulkano::Scene
|
||||
{
|
||||
@@ -40,6 +41,16 @@ namespace OpenVulkano::Scene
|
||||
return textDefaultShader;
|
||||
}
|
||||
|
||||
TextDrawable::TextDrawable(const Array<char>& atlasMetadata, const TextConfig& config)
|
||||
: TextDrawable(atlasMetadata, nullptr, config)
|
||||
{
|
||||
}
|
||||
|
||||
TextDrawable::TextDrawable(const std::string& atlasMetadataFile, const TextConfig& config)
|
||||
: TextDrawable(OpenVulkano::Utils::ReadFile(atlasMetadataFile), nullptr, config)
|
||||
{
|
||||
}
|
||||
|
||||
TextDrawable::TextDrawable(const std::string& atlasMetadataFile, Texture* atlasTex, const TextConfig& config)
|
||||
: TextDrawable(OpenVulkano::Utils::ReadFile(atlasMetadataFile), atlasTex, config)
|
||||
{
|
||||
@@ -47,20 +58,46 @@ namespace OpenVulkano::Scene
|
||||
|
||||
TextDrawable::TextDrawable(const Array<char>& atlasMetadata, Texture* atlasTex, const TextConfig& config)
|
||||
{
|
||||
size_t len = atlasMetadata.Size();
|
||||
size_t read_bytes = 0;
|
||||
uint32_t isPacked;
|
||||
std::memcpy(&isPacked, atlasMetadata.Data() + (atlasMetadata.Size() - sizeof(uint32_t)), sizeof(uint32_t));
|
||||
uint64_t metadataBytes;
|
||||
std::memcpy(&metadataBytes, atlasMetadata.Data() + (atlasMetadata.Size() - sizeof(uint32_t) - sizeof(uint64_t)),
|
||||
sizeof(uint64_t));
|
||||
uint64_t offsetToMetadata = atlasMetadata.Size() - metadataBytes - sizeof(uint32_t) - sizeof(uint64_t);
|
||||
if (isPacked)
|
||||
{
|
||||
m_material.texture = new Texture();
|
||||
m_img = Image::IImageLoader::loadData((const uint8_t*) atlasMetadata.Data(),
|
||||
offsetToMetadata);
|
||||
m_material.texture->format = m_img->dataFormat;
|
||||
m_material.texture->resolution = m_img->resolution;
|
||||
m_material.texture->size = m_img->data.Size(); // 1 channel
|
||||
m_material.texture->textureBuffer = m_img->data.Data();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (atlasTex == nullptr) { throw std::runtime_error("Atlas texture cannot be null with non-packed atlas metadata"); }
|
||||
m_material.texture = atlasTex;
|
||||
}
|
||||
|
||||
// metadata info
|
||||
size_t read_bytes = offsetToMetadata;
|
||||
size_t readMetadataBytes = 0;
|
||||
uint32_t unicode = 0;
|
||||
std::memcpy(&m_meta, atlasMetadata.Data(), sizeof(AtlasMetadata));
|
||||
|
||||
std::memcpy(&m_meta, atlasMetadata.Data() + read_bytes, sizeof(AtlasMetadata));
|
||||
read_bytes += sizeof(AtlasMetadata);
|
||||
while (read_bytes < len)
|
||||
readMetadataBytes += sizeof(AtlasMetadata);
|
||||
while (readMetadataBytes < metadataBytes)
|
||||
{
|
||||
std::memcpy(&unicode, atlasMetadata.Data() + read_bytes, sizeof(uint32_t));
|
||||
read_bytes += sizeof(uint32_t);
|
||||
readMetadataBytes += sizeof(uint32_t);
|
||||
GlyphInfo& info = m_glyphs[unicode];
|
||||
std::memcpy(&info, atlasMetadata.Data() + read_bytes, sizeof(GlyphInfo));
|
||||
read_bytes += sizeof(GlyphInfo);
|
||||
readMetadataBytes += sizeof(GlyphInfo);
|
||||
}
|
||||
m_material.texture = atlasTex;
|
||||
m_cfg = config;
|
||||
m_uniBuffer.Init(sizeof(TextConfig), &m_cfg, 3);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user