rodecomp/Source/Render/Textures/SpriteAtlas.h
ragnarok-clanker 15ee30e2aa Maintenance: [forced, user-approved] R9: remove the invented TextureDX9Context, SurfaceDX9Context and RendererDX9Operations, plus the
Batch #10258 by ragnarok-clanker: forced by an admin (9 lower score(s), 44 changed function(s)); checked with 318 compiled unit(s), including every includer of Source/Render/DX9/DeviceOwnerDX9.h, Source/Render/DX9/RenderSystemDX9.h, Source/Render/DX9/RendererDX9.h, Source/Render/DX9/RendererFogDX9.h, Source/Render/DX9/SurfaceDX9.h, Source/Render/DX9/TextureDX9.h, Source/Render/Renderer.h, Source/Render/RendererDX7.h, Source/Render/Textures/SpriteAtlas.h, Source/Render/DX9/RendererDX9Operations.h.
Deletes: Source/Render/DX9/RendererDX9Operations.h
2026-11-03 13:19:27 +00:00

87 lines
2.8 KiB
C++

#ifndef RAGNAROK_SOURCE_RENDER_TEXTURES_SPRITEATLAS_H
#define RAGNAROK_SOURCE_RENDER_TEXTURES_SPRITEATLAS_H
#include "Render/Textures/SpritePixels.h"
#include <cstddef>
#include <cstdint>
#include <unordered_map>
#include <vector>
class CTexture;
class CRenderSystemBase;
struct SpriteAtlasPage;
struct SpriteAtlasRecord {
/* 0000 */ const SpriteRleImage* image;
/* 0004 */ const std::uint32_t* palette;
/* 0008 */ std::uint32_t lastUsed;
/* 000C */ float u0;
/* 0010 */ float v0;
/* 0014 */ float u1;
/* 0018 */ float v1;
/* 001C */ std::uint32_t x;
/* 0020 */ std::uint32_t y;
/* 0024 */ SpriteAtlasPage* page;
};
struct SpriteAtlasPage {
/* 0000 */ CTexture* texture;
/* 0004 */ std::uint32_t cellWidth;
/* 0008 */ std::uint32_t cellHeight;
/* 000C */ std::vector<SpriteAtlasRecord> records;
/* 0018 */ std::uint32_t lastUsed;
};
class SpriteAtlas {
public:
SpriteAtlas();
~SpriteAtlas();
void Initialize(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
);
void ClearExpired(std::uint32_t reuseDelay);
private:
struct Node {
/* 0000 */ Node* next;
/* 0004 */ SpriteAtlasPage page;
};
struct Key {
/* 0000 */ const SpriteRleImage* image;
/* 0004 */ 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();
/* 0000 */ Node* m_classes[25];
/* 0064 */ std::unordered_map<Key, SpriteAtlasRecord*, Hash> m_lookup;
/* 0084 */ std::vector<CTexture*> m_spare;
};
#if defined(_WIN32) && !defined(_WIN64)
static_assert(sizeof(SpriteAtlasRecord) == 40);
static_assert(offsetof(SpriteAtlasRecord, palette) == 0x04);
static_assert(offsetof(SpriteAtlasRecord, lastUsed) == 0x08);
static_assert(offsetof(SpriteAtlasRecord, u0) == 0x0C);
static_assert(offsetof(SpriteAtlasRecord, v0) == 0x10);
static_assert(offsetof(SpriteAtlasRecord, u1) == 0x14);
static_assert(offsetof(SpriteAtlasRecord, v1) == 0x18);
static_assert(offsetof(SpriteAtlasRecord, x) == 0x1C);
static_assert(offsetof(SpriteAtlasRecord, y) == 0x20);
static_assert(offsetof(SpriteAtlasRecord, page) == 0x24);
static_assert(sizeof(SpriteAtlasPage) == 28);
static_assert(offsetof(SpriteAtlasPage, cellWidth) == 0x04);
static_assert(offsetof(SpriteAtlasPage, cellHeight) == 0x08);
static_assert(offsetof(SpriteAtlasPage, records) == 0x0C);
static_assert(offsetof(SpriteAtlasPage, lastUsed) == 0x18);
static_assert(sizeof(SpriteAtlas) == 144);
#endif
#endif