#pragma once
#include <stdint.h>
#include <string>
#include "mmap.h"

namespace M3D
{
enum PRIMITIVE_TYPE
{
    TRIANGLES = 0x0,
    TRIANGLE_STRIP = 0x1
};
const uint16_t M3DME_VER_MAGIC = 1;
const char M3DME_SIGNATURE[] = "M3DME";
#pragma pack(push, 1)
struct M3DME_Header
{
	char signature[ 5 ];
	uint16_t version;
	int32_t vertex_data_size;
	uint32_t vertex_data_offset;
	int32_t index_data_size;
	uint32_t index_data_offset;
	uint8_t primitive_type;
};
struct M3DME_Vertex_Data
{
	//Группа коогдинат вершины
	float x;
	float y;
	float z;
	//Текстурные координаты
	float u;
	float v;
	//Нормаль вершины
	float n_x;
	float n_y;
	float n_z;
};
struct M3DME_Index_Data
{
	uint32_t index;
};
#pragma pack(pop) 
/**
	@author Denis A. Biryukov <denis.birukov@gmail.com>
*/
class M3DME
{
	public:
		M3DME();
		~M3DME();
		/**
		 * Производит загрузку указанного файла в память.
		 * @param fname имя файла для загрузки.
		 */
		void load ( std::string fname );

		/**
		 * Производит сохранение данных в указанный файл. 
		 * Если такой файл уже существует то он заменяется. 
		 * Все смещения, указанные в заголовке пересчитываются.
		 * @param fname имя файла для сохранения данных
		 */
		void save ( std::string fname );

		/**
		 * Производит установку информации для заголовка файла.
		 * @param value заголовок
		 */
		void set_header ( M3DME_Header* value ) ;
		/**
		 * Получение информации из заголовка файла.
		 * @return константный указатель на заголовок
		 */
		const M3DME_Header* get_header() const { return _header_;};

		/**
		 * Производит установку вершинных данных для записи в файл
		 * @param value данные
		 */
		void set_vertex_data ( M3DME_Vertex_Data* value ) { _vertex_data_ = value;}
		/**
		 * Получение вершинных данных из файла
		 * @return константный указатель на данные
		 */
		const M3DME_Vertex_Data* get_vertex_data() const { return _vertex_data_;};
		
		/**
		 * Производит установку индексных данных для записи в файл
		 * @param value данные
		 */
		void set_index_data ( M3DME_Index_Data* value ) { _index_data_ = value;}
		/**
		 * Получение индексных данных из файла
		 * @return константный указатель на данные
		 */
		const M3DME_Index_Data* get_index_data() const { return _index_data_;};

		
	private:
		M3DME_Header *_header_;
		M3DME_Vertex_Data *_vertex_data_;
		M3DME_Index_Data *_index_data_;
		MMAP _mapped_file_;
};

}


