/*
    QGLView
    Ivan Pelipenko peri4ko@yandex.ru

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef LOADER_3DS_H
#define LOADER_3DS_H

#include "globject.h"
#include "gltexture_manager.h"

#include <QDateTime>
#include <QFileInfo>

#define LOADER_3DS_CHUNK_MAIN           0x4D4D // [-] сцена
#define LOADER_3DS_CHUNK_COLOR_F        0x0010 // [+] цвет во float
#define LOADER_3DS_CHUNK_COLOR_B        0x0011 // [+] цвет в byte
#define LOADER_3DS_CHUNK_OBJECTS        0x3D3D // [-] всяческие объекты
#define LOADER_3DS_CHUNK_OBJECT         0x4000 // [+] объект
#define LOADER_3DS_CHUNK_MESH           0x4100 // [-] mesh-объект
#define LOADER_3DS_CHUNK_VERTLIST       0x4110 // [+] список вершин
#define LOADER_3DS_CHUNK_FACELIST       0x4120 // [+] список граней
#define LOADER_3DS_CHUNK_FACEMAT        0x4130 // [+] материалы граней
#define LOADER_3DS_CHUNK_MAPLIST        0x4140 // [+] текстурные координаты
#define LOADER_3DS_CHUNK_SMOOTH         0x4150 // [+] группы сглаживания
#define LOADER_3DS_CHUNK_TRMATRIX       0x4160 // [+] матрица перевода
#define LOADER_3DS_CHUNK_LIGHT          0x4600 // [+] источник света
#define LOADER_3DS_CHUNK_SPOTLIGHT      0x4610 // [+]
#define LOADER_3DS_CHUNK_LIGHT_OFF      0x4620 // [+]
#define LOADER_3DS_CHUNK_ATTENUATION_ON 0x4625 // [+]
#define LOADER_3DS_CHUNK_RANGE_START    0x4659 // [+]
#define LOADER_3DS_CHUNK_RANGE_END      0x465A // [+]
#define LOADER_3DS_CHUNK_MULTIPLIER     0x465B // [+]
#define LOADER_3DS_CHUNK_CAMERA         0x4700 // [+] объект-камера
#define LOADER_3DS_CHUNK_MATERIAL       0xAFFF // [-] материал
#define LOADER_3DS_CHUNK_MATERIAL_NAME  0xA000
#define LOADER_3DS_CHUNK_AMBIENT_COLOR  0xA010
#define LOADER_3DS_CHUNK_DIFFUSE_COLOR  0xA020
#define LOADER_3DS_CHUNK_SPECULAR_COLOR 0xA030
#define LOADER_3DS_CHUNK_TEXTURE_MAP    0xA200
#define LOADER_3DS_CHUNK_BUMP_MAP       0xA230
#define LOADER_3DS_CHUNK_REFLECTION_MAP 0xA220
#define LOADER_3DS_CHUNK_MAP_FILENAME   0xA300
#define LOADER_3DS_CHUNK_MAP_PARAMETERS 0xA351

namespace Loader3DS {
#pragma pack(push, 1)
struct Chunk {
	ushort id;
	uint size;
};
struct Face {
	ushort v0;
	ushort v1;
	ushort v2;
	ushort flags;
};
#pragma pack(pop)
void init3DSMesh(GLObjectBase * o, const QVector<uint> & smooth);
Material materialByName(const QVector<Material> & materials, const QString & name);
} // namespace Loader3DS

GLObjectBase * loadFrom3DSFile(const QString & filepath, float scale = 1.0);

#endif // LOADER_3DS_H
