Go to the documentation of this file.
35 #include <unordered_map>
37 #include "../../../Primitives/interface/BasicTypes.h"
38 #include "../../../Common/interface/HashUtils.hpp"
89 return !(*
this == rhs);
112 void Free(Region&& R);
116 VERIFY_EXPR(m_FreeRegionsByWidth.size() == m_FreeRegionsByHeight.size());
117 return static_cast<Uint32>(m_FreeRegionsByWidth.size());
121 #define CMP(Member) \
122 if (R0.Member < R1.Member) \
124 else if (R0.Member > R1.Member) \
153 void DbgVerifyRegion(
const Region& R)
const;
154 void DbgVerifyConsistency()
const;
156 void DbgRecursiveVerifyConsistency(
const Node& N,
Uint32& Area)
const;
165 bool IsAllocated =
false;
166 Node* Parent =
nullptr;
168 void Split(
const std::initializer_list<Region>& Regions);
169 bool CanMergeChildren()
const;
170 void MergeChildren();
171 bool HasChildren()
const
173 VERIFY_EXPR(NumChildren == 0 && !Children || NumChildren != 0 && Children);
174 VERIFY(!IsAllocated || NumChildren == 0,
"Allocated nodes can't have children");
175 return NumChildren != 0;
178 const Node& Child(
Uint32 i)
const
189 template <
typename ProcessChildType>
190 void ProcessChildren(ProcessChildType ProcessChild)
const
192 for (
Uint32 i = 0; i < NumChildren; ++i)
193 ProcessChild(Child(i));
195 template <
typename ProcessChildType>
196 void ProcessChildren(ProcessChildType ProcessChild)
198 for (
Uint32 i = 0; i < NumChildren; ++i)
199 ProcessChild(Child(i));
203 void Validate()
const;
207 std::unique_ptr<Node[]> Children;
209 std::unique_ptr<Node> m_Root{
new Node};
211 void RegisterNode(Node& N);
212 void UnregisterNode(
const Node& N);
215 std::map<Region, Node*, WidthFirstCompare> m_FreeRegionsByWidth;
217 std::map<Region, Node*, HeightFirstCompare> m_FreeRegionsByHeight;
219 std::unordered_map<Region, Node*, Region::Hasher> m_AllocatedRegions;
DynamicAtlasManager(Uint32 Width, Uint32 Height)
Definition: DynamicAtlasManager.cpp:113
Dynamic 2D atlas manager.
Definition: DynamicAtlasManager.hpp:44
bool operator()(const Region &R0, const Region &R1) const
Definition: DynamicAtlasManager.hpp:140
bool operator()(const Region &R0, const Region &R1) const
Definition: DynamicAtlasManager.hpp:129
Uint32 y
Definition: DynamicAtlasManager.hpp:50
Definition: DynamicAtlasManager.hpp:47
Uint32 x
Definition: DynamicAtlasManager.hpp:49
Uint32 GetFreeRegionCount() const
Definition: DynamicAtlasManager.hpp:114
Definition: DynamicAtlasManager.hpp:92
Region(Uint32 _x, Uint32 _y, Uint32 _width, Uint32 _height)
Definition: DynamicAtlasManager.hpp:64
bool operator==(const Region &rhs) const
Definition: DynamicAtlasManager.hpp:78
~DynamicAtlasManager()
Definition: DynamicAtlasManager.cpp:122
uint32_t Uint32
32-bit unsigned integer
Definition: BasicTypes.h:51
DynamicAtlasManager & operator=(const DynamicAtlasManager &)=delete
std::size_t ComputeHash(const ArgsType &... Args)
Definition: HashUtils.hpp:57
Region Allocate(Uint32 Width, Uint32 Height)
Definition: DynamicAtlasManager.cpp:184
Definition: DynamicAtlasManager.hpp:127
#define CMP(Member)
Definition: DynamicAtlasManager.hpp:121
Uint32 width
Definition: DynamicAtlasManager.hpp:52
Definition: DynamicAtlasManager.hpp:138
bool IsEmpty() const
Definition: DynamicAtlasManager.hpp:73
#define VERIFY_EXPR(...)
Definition: DebugUtilities.hpp:79
Region & operator=(const Region &)=default
#define VERIFY(...)
Definition: DebugUtilities.hpp:76
size_t operator()(const Region &R) const
Definition: DynamicAtlasManager.hpp:94
Uint32 height
Definition: DynamicAtlasManager.hpp:53
void Free(Region &&R)
Definition: DynamicAtlasManager.cpp:326
bool operator!=(const Region &rhs) const
Definition: DynamicAtlasManager.hpp:87
The library uses Direct3D-style math:
Definition: AdvancedMath.hpp:37