#include "texture.h"
#include "m3dt.h"
#include <iostream>

namespace M3D
{
uint32_t Texture::_max_size_ = 0;
Texture::Texture()
{}

Texture::~Texture()
{
	if ( glIsTexture( _tex_id_ ) ) glDeleteTextures( 1, &_tex_id_ );
}

void Texture::static_init( int msize )
{
	_max_size_ = msize;
}

void Texture::load( const std::string &source_file )
{
	M3DT m3dt_file;
	m3dt_file.load( source_file );
	const M3DT_Header *header = m3dt_file.get_header();
	glGenTextures( 1, &_tex_id_ );
	glBindTexture ( GL_TEXTURE_2D, _tex_id_ );

	///Все текстурные координаты больше 1.0 будут приводить к повторению текстуры
	glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
	glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
	glTexParameterf ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
	glTexParameterf ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );

	//Загрузим поочередно все LOD-уровни
	for ( int a = 0; a < header->lod_number+1; ++a )
	{
		const M3DT_Lod_Data *lod = m3dt_file.get_lod_data( a );
		if ( a == 0 ) //Базовый уровень текстуры. Заполним некоторые данные объекта
		{
			_width_ = lod->lod_info->width;
			_height_ = lod->lod_info->height;
		}
		if ( header->is_comressed ) //производим загрузку сжатого формата
		{
			glCompressedTexImage2D ( GL_TEXTURE_2D,
				       a,
				       header->internal_format,
				       lod->lod_info->width,
				       lod->lod_info->height,
				       0,
				       lod->lod_info->data_size,
				       lod->data_pointer );
			
		}
		else //грузим нежатую текстуру
		{
			glTexImage2D ( GL_TEXTURE_2D,
			               a,
			               header->internal_format,
				       lod->lod_info->width,
				       lod->lod_info->height,
				       0,
			               header->internal_format,
			               header->type,
			               lod->data_pointer );
		}
	}
}

void Texture::link_model( Model * obj )
{
	_associated_models_.insert( obj );
}

void Texture::unlink_model( Model * obj )
{
	_associated_models_.erase( obj );
}

void Texture::bind( )
{
	glBindTexture ( GL_TEXTURE_2D, _tex_id_ );
}
}

