1
0
Fork 0
mirror of https://github.com/AquariaOSE/Aquaria.git synced 2024-11-29 03:33:48 +00:00
Aquaria/BBGE/TextureMgr.h
fgenesis 70b8dcdc3a Rework texture loading, part 1
Major code/logic cleanups + it has a multithreaded batch mode now.
The VFS code doesn't like multiple threads at all,
so for now there's a big lock in front of where it matters.
Changed precacher, map/tileset, and worldmap loading to batched mode.

Still TODO:
- fix broken mod preview images
- reloading resources on debug key
- make mod recache entirely unnecessary
- actually drop resources when no longer needed
2023-05-31 00:55:16 +02:00

53 lines
1.3 KiB
C++

#ifndef BBGE_TEXTUREMGR_H
#define BBGE_TEXTUREMGR_H
#include <map>
#include "Texture.h"
#include "MT.h"
struct TexLoadTmp;
class TextureMgr
{
public:
TextureMgr();
~TextureMgr();
typedef void (*ProgressCallback)(size_t done, void*);
std::vector<std::string> loadFromPaths;
size_t spawnThreads(size_t n);
size_t getNumLoaded() const;
Texture *getOrLoad(const std::string& name);
void clearUnused(); // clear everything whose refcount is 1
void shutdown();
enum LoadMode
{
KEEP, // if already exists, keep unchanged
KEEP_IF_SAME, // load if we resolve to a different file than the texture that's already there, if any.
OVERWRITE, // always overwrite
};
void loadBatch(Texture *pdst[], const std::string texnames[], size_t n, LoadMode mode = KEEP, ProgressCallback cb = 0, void *cbUD = 0);
Texture *load(const std::string& texname, LoadMode mode);
void reloadAll(LoadMode mode);
private:
typedef std::map<std::string, CountedPtr<Texture> > TexCache;
TexCache cache;
BlockingQueue<void*> worktodo;
BlockingQueue<void*> workdone;
std::vector<void*> threads;
void *sem; // SDL_sem*
static int Th_Main(void *self);
void thMain(); // for int
void th_loadFromFile(TexLoadTmp& tt) const;
Texture *finalize(const TexLoadTmp& tt);
};
#endif