leocad/common/lc_library.h

252 lines
6.5 KiB
C
Raw Normal View History

#pragma once
2013-08-09 06:57:18 +02:00
#include "lc_context.h"
2013-08-09 06:57:18 +02:00
#include "lc_math.h"
#include "lc_meshloader.h"
2013-08-09 06:57:18 +02:00
class PieceInfo;
class lcTrainTrackInfo;
2013-08-09 06:57:18 +02:00
class lcZipFile;
class lcLibraryMeshData;
2024-07-12 00:04:07 +02:00
class lcThumbnailManager;
2013-08-09 06:57:18 +02:00
enum class lcStudStyle
{
Plain,
ThinLinesLogo,
OutlineLogo,
SharpTopLogo,
RoundedTopLogo,
FlattenedLogo,
HighContrast,
HighContrastLogo,
Count
};
2021-11-15 03:34:24 +01:00
constexpr bool lcIsHighContrast(lcStudStyle StudStyle)
2021-01-26 23:58:02 +01:00
{
return StudStyle == lcStudStyle::HighContrast || StudStyle == lcStudStyle::HighContrastLogo;
}
2021-01-18 21:09:33 +01:00
enum class lcZipFileType
{
2021-01-18 21:09:33 +01:00
Official,
Unofficial,
2021-01-20 13:19:29 +01:00
StudStyle,
2021-01-18 21:09:33 +01:00
Count
};
enum class lcLibraryFolderType
{
Official,
Unofficial,
Count
};
enum class lcPrimitiveState
{
2021-01-18 22:38:17 +01:00
NotLoaded,
Loading,
Loaded
};
2013-08-09 06:57:18 +02:00
class lcLibraryPrimitive
{
public:
explicit lcLibraryPrimitive(QString&& FileName, const char* Name, lcZipFileType ZipFileType, quint32 ZipFileIndex, bool Stud, bool StudStyle, bool SubFile)
2019-06-03 22:23:04 +02:00
: mFileName(std::move(FileName))
2013-08-09 06:57:18 +02:00
{
2020-12-19 21:10:10 +01:00
strncpy(mName, Name, sizeof(mName)-1);
2013-08-09 06:57:18 +02:00
mName[sizeof(mName) - 1] = 0;
mZipFileType = ZipFileType;
2013-08-09 06:57:18 +02:00
mZipFileIndex = ZipFileIndex;
2021-01-18 22:38:17 +01:00
mState = lcPrimitiveState::NotLoaded;
2013-08-09 06:57:18 +02:00
mStud = Stud;
mStudStyle = StudStyle;
2013-08-09 06:57:18 +02:00
mSubFile = SubFile;
}
2019-06-03 22:23:04 +02:00
void SetZipFile(lcZipFileType ZipFileType, quint32 ZipFileIndex)
{
mZipFileType = ZipFileType;
mZipFileIndex = ZipFileIndex;
}
2019-09-24 01:55:24 +02:00
void Unload()
{
2021-01-18 22:38:17 +01:00
mState = lcPrimitiveState::NotLoaded;
2021-03-07 03:54:24 +01:00
mMeshData.Clear();
2019-09-24 01:55:24 +02:00
}
QString mFileName;
2019-02-28 15:47:09 +01:00
char mName[LC_MAXNAME];
lcZipFileType mZipFileType;
2017-12-02 21:22:04 +01:00
quint32 mZipFileIndex;
lcPrimitiveState mState;
2013-08-09 06:57:18 +02:00
bool mStud;
bool mStudStyle;
2013-08-09 06:57:18 +02:00
bool mSubFile;
lcLibraryMeshData mMeshData;
};
enum class lcLibrarySourceType
{
Library,
2021-01-20 13:19:29 +01:00
StudStyle
};
struct lcLibrarySource
{
2021-11-15 03:34:24 +01:00
lcLibrarySource() = default;
~lcLibrarySource()
{
for (const auto& PrimitiveIt : Primitives)
delete PrimitiveIt.second;
}
2021-11-15 03:34:24 +01:00
lcLibrarySource(const lcLibrarySource&) = delete;
lcLibrarySource(lcLibrarySource&&) = delete;
lcLibrarySource& operator=(const lcLibrarySource&) = delete;
lcLibrarySource& operator=(lcLibrarySource&&) = delete;
lcLibrarySourceType Type;
std::map<std::string, lcLibraryPrimitive*> Primitives;
};
2017-01-23 04:28:05 +01:00
class lcPiecesLibrary : public QObject
2013-08-09 06:57:18 +02:00
{
2017-01-23 04:28:05 +01:00
Q_OBJECT
2013-08-09 06:57:18 +02:00
public:
lcPiecesLibrary();
~lcPiecesLibrary();
lcPiecesLibrary(const lcPiecesLibrary&) = delete;
2021-11-15 03:34:24 +01:00
lcPiecesLibrary(lcPiecesLibrary&&) = delete;
lcPiecesLibrary& operator=(const lcPiecesLibrary&) = delete;
2021-11-15 03:34:24 +01:00
lcPiecesLibrary& operator=(lcPiecesLibrary&&) = delete;
2024-07-12 00:04:07 +02:00
lcThumbnailManager* GetThumbnailManager() const
{
return mThumbnailManager.get();
}
bool Load(const QString& LibraryPath, bool ShowProgress);
2021-01-22 22:40:16 +01:00
void LoadColors();
2013-08-09 06:57:18 +02:00
void Unload();
void RemoveTemporaryPieces();
2015-02-22 03:39:15 +01:00
void RemovePiece(PieceInfo* Info);
2013-08-09 06:57:18 +02:00
2017-07-24 04:35:18 +02:00
void RenamePiece(PieceInfo* Info, const char* NewName);
PieceInfo* FindPiece(const char* PieceName, Project* Project, bool CreatePlaceholder, bool SearchProjectFolder);
2017-01-23 04:28:05 +01:00
void LoadPieceInfo(PieceInfo* Info, bool Wait, bool Priority);
void ReleasePieceInfo(PieceInfo* Info);
2014-09-11 21:55:34 +02:00
bool LoadBuiltinPieces();
2017-01-23 04:28:05 +01:00
bool LoadPieceData(PieceInfo* Info);
void LoadQueuedPiece();
void WaitForLoadQueue();
2013-08-09 06:57:18 +02:00
lcTexture* FindTexture(const char* TextureName, Project* CurrentProject, bool SearchProjectFolder);
2013-08-09 06:57:18 +02:00
bool LoadTexture(lcTexture* Texture);
void ReleaseTexture(lcTexture* Texture);
2013-08-09 06:57:18 +02:00
2017-02-08 03:55:54 +01:00
bool PieceInCategory(PieceInfo* Info, const char* CategoryKeywords) const;
2024-05-25 04:26:01 +02:00
void GetCategoryEntries(int CategoryIndex, bool GroupPieces, std::vector<PieceInfo*>& SinglePieces, std::vector<PieceInfo*>& GroupedPieces);
void GetCategoryEntries(const char* CategoryKeywords, bool GroupPieces, std::vector<PieceInfo*>& SinglePieces, std::vector<PieceInfo*>& GroupedPieces);
void GetParts(std::vector<PieceInfo*>& Parts) const;
std::vector<PieceInfo*> GetTrainTrackParts(const lcTrainTrackInfo* TrainTrackInfo) const;
2019-12-07 18:52:46 +01:00
2019-12-09 01:54:12 +01:00
std::vector<PieceInfo*> GetPartsFromSet(const std::vector<std::string>& PartIds) const;
std::string GetPartId(const PieceInfo* Info) const;
2013-08-09 06:57:18 +02:00
void GetPrimitiveFile(lcLibraryPrimitive* Primitive, std::function<void(lcFile& File)> Callback);
void GetPieceFile(const char* FileName, std::function<void(lcFile& File)> Callback);
bool IsPrimitive(const char* Name) const;
lcLibraryPrimitive* FindPrimitive(const char* Name) const;
bool LoadPrimitive(lcLibraryPrimitive* Primitive);
2021-01-20 13:19:29 +01:00
bool SupportsStudStyle() const;
void SetStudStyle(lcStudStyle StudStyle, bool Reload, bool StudCylinderColorEnabled);
lcStudStyle GetStudStyle() const
{
2021-01-20 13:19:29 +01:00
return mStudStyle;
}
void SetOfficialPieces()
{
2021-01-18 21:09:33 +01:00
if (mZipFiles[static_cast<int>(lcZipFileType::Official)])
mNumOfficialPieces = (int)mPieces.size();
}
bool ShouldCancelLoading() const
{
return mCancelLoading;
}
void UpdateBuffers(lcContext* Context);
void UnloadUnusedParts();
2017-07-24 04:35:18 +02:00
std::map<std::string, PieceInfo*> mPieces;
2013-08-09 06:57:18 +02:00
int mNumOfficialPieces;
2019-07-05 02:06:26 +02:00
std::vector<lcTexture*> mTextures;
2013-08-09 06:57:18 +02:00
QDir mLibraryDir;
2013-08-09 06:57:18 +02:00
bool mBuffersDirty;
lcVertexBuffer mVertexBuffer;
lcIndexBuffer mIndexBuffer;
2017-01-23 04:28:05 +01:00
signals:
void PartLoaded(PieceInfo* Info);
2021-01-22 22:40:16 +01:00
void ColorsLoaded();
2017-01-23 04:28:05 +01:00
2013-08-09 06:57:18 +02:00
protected:
bool OpenArchive(const QString& FileName, lcZipFileType ZipFileType);
2020-12-19 20:12:31 +01:00
bool OpenArchive(std::unique_ptr<lcFile> File, lcZipFileType ZipFileType);
bool OpenDirectory(const QDir& LibraryDir, bool ShowProgress);
void ReadArchiveDescriptions(const QString& OfficialFileName, const QString& UnofficialFileName);
void ReadDirectoryDescriptions(const QFileInfoList (&FileLists)[static_cast<int>(lcLibraryFolderType::Count)], bool ShowProgress);
2013-08-09 06:57:18 +02:00
bool ReadArchiveCacheFile(const QString& FileName, lcMemFile& CacheFile);
bool WriteArchiveCacheFile(const QString& FileName, lcMemFile& CacheFile);
bool LoadCacheIndex(const QString& FileName);
bool SaveArchiveCacheIndex(const QString& FileName);
2013-08-09 06:57:18 +02:00
bool LoadCachePiece(PieceInfo* Info);
bool SaveCachePiece(PieceInfo* Info);
bool ReadDirectoryCacheFile(const QString& FileName, lcMemFile& CacheFile);
bool WriteDirectoryCacheFile(const QString& FileName, lcMemFile& CacheFile);
2013-08-09 06:57:18 +02:00
static bool IsStudPrimitive(const char* FileName);
static bool IsStudStylePrimitive(const char* FileName);
2021-01-20 13:19:29 +01:00
void UpdateStudStyleSource();
void ReleaseBuffers();
std::vector<std::unique_ptr<lcLibrarySource>> mSources;
2021-07-06 02:00:41 +02:00
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
QRecursiveMutex mLoadMutex;
#else
2017-01-23 04:28:05 +01:00
QMutex mLoadMutex;
2021-07-06 02:00:41 +02:00
#endif
2017-01-23 04:28:05 +01:00
QList<QFuture<void>> mLoadFutures;
QList<PieceInfo*> mLoadQueue;
QMutex mTextureMutex;
lcStudStyle mStudStyle;
bool mStudCylinderColorEnabled;
2019-09-24 01:55:24 +02:00
2024-07-12 00:04:07 +02:00
std::unique_ptr<lcThumbnailManager> mThumbnailManager;
QString mCachePath;
qint64 mArchiveCheckSum[4];
2021-01-18 21:09:33 +01:00
std::unique_ptr<lcZipFile> mZipFiles[static_cast<int>(lcZipFileType::Count)];
bool mHasUnofficial;
bool mCancelLoading;
2013-08-09 06:57:18 +02:00
};