1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
#ifndef IMODELPARSER_H
#define IMODELPARSER_H
#include <unordered_map>
#include <vector>
#include <string>
#include "System/Threading/SpringMutex.h"
struct S3DModel;
struct S3DModelPiece;
class IModelParser
{
public:
virtual ~IModelParser() {}
virtual S3DModel* Load(const std::string& name) = 0;
};
class CModelLoader
{
public:
static CModelLoader& GetInstance();
void Init();
void Kill();
S3DModel* LoadModel(std::string name, bool preload = false);
std::string FindModelPath(std::string name) const;
bool IsValid() const { return (!formats.empty()); }
void PreloadModel(const std::string& name);
public:
typedef std::unordered_map<std::string, unsigned int> ModelMap; // "armflash.3do" --> id
typedef std::unordered_map<std::string, unsigned int> FormatMap; // "3do" --> MODELTYPE_3DO
typedef std::unordered_map<unsigned int, IModelParser*> ParserMap; // MODELTYPE_3DO --> parser
private:
S3DModel* LoadCachedModel(const std::string& name, bool preload);
S3DModel* CreateModel(const std::string& name, const std::string& path, bool preload);
S3DModel* ParseModel(const std::string& name, const std::string& path);
IModelParser* GetFormatParser(const std::string& pathExt);
void KillModels();
void KillParsers();
void AddModelToCache(S3DModel* model, const std::string& name, const std::string& path);
void CreateLists(S3DModel* o);
void CreateListsNow(S3DModelPiece* o);
private:
ModelMap cache;
FormatMap formats;
ParserMap parsers;
spring::mutex mutex;
// all unique models loaded so far
std::vector<S3DModel*> models;
};
#define modelLoader (CModelLoader::GetInstance())
#endif /* IMODELPARSER_H */
|