Administrative source import: native x86 compilation passed for 423 authored units. Source placement and submission states are migrated separately; this commit does not imply peer acceptance.
Previous head: 35d2a8cb36
Payload SHA256: 592f016d2730c5593bb653aa054c1e5f76a6df72c8f5a09e66f74876e2e33dee
72 lines
1.8 KiB
C++
72 lines
1.8 KiB
C++
#ifndef RAGNAROK_SOURCE_RENDER_TEXTURES_SPRITEATLAS_H
|
|
#define RAGNAROK_SOURCE_RENDER_TEXTURES_SPRITEATLAS_H
|
|
|
|
#include "Render/Textures/SpritePixels.h"
|
|
|
|
#include <cstdint>
|
|
#include <unordered_map>
|
|
#include <vector>
|
|
|
|
class CTexture;
|
|
class CRenderSystemBase;
|
|
struct SpriteAtlasPage;
|
|
|
|
struct SpriteAtlasRecord {
|
|
const SpriteRleImage* image;
|
|
const std::uint32_t* palette;
|
|
std::uint32_t lastUsed;
|
|
float u0;
|
|
float v0;
|
|
float u1;
|
|
float v1;
|
|
std::uint32_t x;
|
|
std::uint32_t y;
|
|
SpriteAtlasPage* page;
|
|
};
|
|
|
|
struct SpriteAtlasPage {
|
|
CTexture* texture;
|
|
std::uint32_t cellWidth;
|
|
std::uint32_t cellHeight;
|
|
std::vector<SpriteAtlasRecord> records;
|
|
std::uint32_t lastUsed;
|
|
};
|
|
|
|
class SpriteAtlas {
|
|
public:
|
|
SpriteAtlas();
|
|
~SpriteAtlas();
|
|
void Initialize(CRenderSystemBase& system, unsigned spareCount);
|
|
void Clear();
|
|
CTexture* Find(const SpriteRleImage* image, const std::uint32_t* palette, SpriteAtlasRecord& output);
|
|
CTexture* Insert(
|
|
CRenderSystemBase& system, const SpriteRleImage* image, const std::uint32_t* palette, SpriteAtlasRecord& output, int serviceType, std::uint32_t reuseDelay
|
|
);
|
|
|
|
private:
|
|
struct Node {
|
|
Node* next;
|
|
SpriteAtlasPage page;
|
|
};
|
|
struct Key {
|
|
const SpriteRleImage* image;
|
|
const std::uint32_t* palette;
|
|
bool operator==(const Key&) const = default;
|
|
};
|
|
struct Hash {
|
|
std::size_t operator()(const Key& key) const;
|
|
};
|
|
SpriteAtlasPage* Allocate(CRenderSystemBase& system, unsigned category, unsigned width, unsigned height);
|
|
void ClearSpare();
|
|
Node* m_classes[25];
|
|
std::unordered_map<Key, SpriteAtlasRecord*, Hash> m_lookup;
|
|
std::vector<CTexture*> m_spare;
|
|
};
|
|
|
|
#if defined(_WIN32) && !defined(_WIN64)
|
|
static_assert(sizeof(SpriteAtlasRecord) == 40);
|
|
static_assert(sizeof(SpriteAtlasPage) == 28);
|
|
static_assert(sizeof(SpriteAtlas) == 144);
|
|
#endif
|
|
|
|
#endif
|