8#include "../drivers/Mutex.h"
15const size_t kMaxIdleVertices = 32768;
19const uint32_t kUsesBeforeHandle = 2;
21std::vector<GuiSharedMesh *> entries;
22size_t idleVertices = 0;
23uint32_t clockTick = 0;
24Mutex * lockPtr =
nullptr;
30 lockPtr =
new Mutex();
38 VideoDriver * video = platform ? platform->getVideo() :
nullptr;
47bool GuiMeshKey::operator==(
const GuiMeshKey& o)
const
54GuiSharedMesh::GuiSharedMesh(
const GuiMeshKey& k) :
55 key(k), mesh(k.feather, k.tolerance), handle(nullptr), noHandle(false), uses(0), refs(0), idleStamp(0)
65 for(
size_t i = 0; i < entries.size(); i++)
71 idleVertices -= m->mesh.
size();
88 std::vector<std::pair<GuiSharedMesh *, void *> > evicted;
95 m->idleStamp = ++clockTick;
96 idleVertices += m->mesh.
size();
99 while(idleVertices > kMaxIdleVertices)
101 size_t oldest = entries.size();
102 for(
size_t i = 0; i < entries.size(); i++)
104 if(entries[i]->refs == 0 && (oldest == entries.size() || entries[i]->idleStamp < entries[oldest]->idleStamp))
107 if(oldest == entries.size())
109 idleVertices -= entries[oldest]->mesh.size();
110 evicted.push_back(std::make_pair(entries[oldest], entries[oldest]->handle));
111 entries.erase(entries.begin() + oldest);
116 for(
size_t i = 0; i < evicted.size(); i++)
117 destroyEntry(evicted[i].first, evicted[i].second);
122 std::vector<std::pair<GuiSharedMesh *, void *> > freed;
126 for(
size_t i = 0; i < entries.size();)
128 if(entries[i]->refs == 0)
130 freed.push_back(std::make_pair(entries[i], entries[i]->handle));
131 entries.erase(entries.begin() + i);
139 for(
size_t i = 0; i < freed.size(); i++)
140 destroyEntry(freed[i].first, freed[i].second);
147 const std::vector<MeshVertex>& src = m->mesh.
vertices();
151 ImageRenderer * images = platform->getVideo()->getImageRenderer();
154 if(!m->handle && !m->noHandle && m->uses >= kUsesBeforeHandle)
156 m->handle = images->
createMesh(src.data(), src.size());
163 if(m->handle && alpha == 255)
169 scratch.resize(src.size());
170 for(
size_t i = 0; i < src.size(); i++)
172 scratch[i].x = x + src[i].x * scaleX;
173 scratch[i].y = y + src[i].y * scaleY;
174 scratch[i].c = src[i].c;
176 scratch[i].c.a = (uint8_t)((src[i].c.a * alpha + 127) / 255);
178 images->
drawMesh(scratch.data(), scratch.size());
Umbrella header for the platform-agnostic libgui core.
static void draw(GuiSharedMesh *mesh, float x, float y, float scaleX, float scaleY, uint8_t alpha, std::vector< MeshVertex > &scratch)
Draws a mesh with its (0,0) at (x, y), stretched by scaleX/scaleY about that point.
static GuiSharedMesh * acquire(const GuiMeshKey &key)
Finds or builds the mesh for a key and takes a reference to it. Pair with release().
static void flush()
Frees every mesh nothing is holding, including the backend's copies (call when leaving the menu to gi...
static void release(GuiSharedMesh *mesh)
Gives back a reference from acquire().
size_t size() const
Gets the number of vertices (a multiple of 3)
const std::vector< MeshVertex > & vertices() const
Gets the triangle list.
Platform image/texture backend GuiImageData and GuiImage delegate to.
virtual void destroyMesh(void *mesh)
Releases a mesh from createMesh().
virtual void drawMeshInstance(void *mesh, float x, float y, float scaleX, float scaleY)
Draws a mesh from createMesh() fully opaque, as its vertex colors say.
virtual void * createMesh(const MeshVertex *vertices, size_t count)
Hands a triangle list to the backend to keep in its own ready-to-draw form (a GX display list,...
virtual void drawMesh(const MeshVertex *vertices, size_t count)=0
Draws a triangle list: three vertices per triangle, each with its own color.
RAII lock guard - locks on construction, unlocks on destruction.
A simple mutual-exclusion lock.
Platform video backend owning the frame lifecycle (init/render/clear, screen size,...
virtual ImageRenderer * getImageRenderer()=0
void GuiAddPaintedShape(GuiMesh &mesh, SHAPE shape, const GuiRect &r, const GuiCorners &corners, const GuiPaint &paint)
Adds a painted shape to a mesh: shadow first, then fill, then outline.
float bl
Bottom-left radius.
float tr
Top-right radius.
float br
Bottom-right radius.
Everything that decides what a shape's triangles are.
float tolerance
Curve tolerance, see GuiMesh.
int width
Width in design-canvas pixels.
GuiCorners corners
Corner radii of a rectangle.
GuiPaint paint
Fill, outline and shadow.
SHAPE kind
Rectangle or ellipse.
float feather
Anti-aliasing fringe width, see GuiMesh.
int height
Height in design-canvas pixels.
An axis-aligned rectangle (top-left origin) in design-canvas pixels.