#pragma once
#include "..\Header\FileInterface.h"


struct ChunkHeader {
	char name[5];
	std::uint32_t size;
	std::streampos position;
};

enum ModelTyp {
	null,
	dynamicMesh,
	cloth,
	bone,
	staticMesh,
	shadowMesh = 6
};

class MshFile : public FileInterface
{
public:
	explicit MshFile(QString path, QObject *parent = Q_NULLPTR);
	virtual ~MshFile();

private:
	ModelTyp m_currentType = ModelTyp::null;
	std::int32_t m_currentRenderFlag = -1;

	virtual void import() Q_DECL_OVERRIDE Q_DECL_FINAL;

	void loadChunks(std::list<ChunkHeader*> &destination, std::streampos start, const std::uint32_t length);

	void analyseMsh2Chunks(std::list<ChunkHeader*> &chunkList);

	void analyseMatdChunks(std::list<ChunkHeader*> &chunkList);

	void analyseModlChunks(Model* dataDestination, std::list<ChunkHeader*> &chunkList);
	void analyseGeomChunks(Model* dataDestination, std::list<ChunkHeader*> &chunkList);
	void analyseSegmChunks(Model* dataDestination, std::list<ChunkHeader*> &chunkList);
	void analyseClthChunks(Model* dataDestination, std::list<ChunkHeader*> &chunkList);

	void readVertex(Segment* dataDestination, std::streampos position);
	void readUV(Segment* dataDestination, std::streampos position);

	void loadTexture(QOpenGLTexture*& destination, QString filepath);

	QMatrix4x4 getParentMatrix(std::string parent) const;
	QQuaternion getParentRotation(std::string parent) const;
};