#ifndef GE_D3D9C_H
#define GE_D3D9C_H

/*
	Ripatti Artem (c) 2011

	Это заголовочный файл реализации интерфейса XGraphicEngine
	при помощи Direct3D 9c.
*/

#include "ge_iface.h"
#pragma comment (lib, "d3d9.lib")
#pragma comment (lib, "d3dx9.lib")
#include <d3d9.h>
#include <d3dx9.h>

namespace ge
{
	struct VERTEX
	{
		float x, y, z;
	};

	struct VERTEX2D
	{
		VERTEX v;		// вершинка (имеет 3 координатки, z ставить 0.5f)
		float rhw;		// хрень. Ставить 1.0f
		DWORD clr;		// цвет
		float tx, ty;	// текстурные координаты
	};

	struct PICTURE
	{
		VERTEX2D v1;	// правый нижний угол
		VERTEX2D v2;	// левый нижний угол
		VERTEX2D v3;	// правый верхний угол
		VERTEX2D v4;	// левый верхний угол
	};

	#define MAX_TEXTURE 256

	class GraphicEngineD3D9c : public XGraphicEngine
	{
		LPDIRECT3D9					g_D3D;
		LPDIRECT3DDEVICE9			g_Device;
		LPDIRECT3DTEXTURE9			g_Texture[MAX_TEXTURE];
		float						ScTexX[MAX_TEXTURE], ScTexY[MAX_TEXTURE];
		ID3DXFont*					g_Font;
		LPDIRECT3DVERTEXBUFFER9		g_Buffer;
		LPDIRECT3DSURFACE9			OLD_RT, RT;
		D3DPRESENT_PARAMETERS		d3dPP;

		BYTE BitR[1024][1024];
		BYTE BitG[1024][1024];
		BYTE BitB[1024][1024];
		BYTE BitA[1024][1024];

		int cur_tex;			// текущая тексура
		float ScaleX, ScaleY;

		VERTEX2D verts[128000];
		int texN[32000];
		int v_sz;

		int cur_tris;
		int tris;

		void render_stream();
		PICTURE pict_to_picture(PICT & Pict);
	public:
		// конструктор
		// дескриптор окна, разрешение, в окошечке ли
		GraphicEngineD3D9c(HWND hWnd, int scr_x=800, int scr_y=600, bool windowed=false);

		// деструктор
		~GraphicEngineD3D9c();

		// говнисто загрузить текстуру из файла File в слот N
		// зато поддерживается много форматов.
		// загружать текстуры рекомендуется на слоты с 4 до MAX_TEXTURE-1
		void load_texture(int N, const char * File);

		// нормально загрузить текстуру из файла File в слот N.
		// поддерживаюься только 24-битные bmp
		// Alpha - имя файла текстуры. Так же можно использовать:
		// "Null" - ничего не загружать (картинка будет полностью непрозрачна)
		// "Auto" - прозрачен будет только чорный цвет
		// загружать текстуры рекомендуется на слоты с 4 до MAX_TEXTURE-1
		void load_texture(int N, const char * File, const char * Alpha);

		//обновить
		//void reset();

		// количество треугольников, отрисованных в предыдущем фрейме
		int get_tris();

		// далее перегруженные функции

		// с этого надо начинать фрейм
		virtual void begin_scene();

		// залить все цветом (R,G,B)
		virtual void clear_scene(float R=0.f, float G=0.f, float B=0.f);

		// вывести сцену на экран. этим надо заканчивать фрейм
		virtual void render_scene();

		// назначить текстуру T текущей
		virtual void set_texture(int T);

		// отрисовать картинку Pict
		virtual void draw_pict(PICT & pict);

		// выбор текстуры для отрисовки (-1 - рисовать не в текстуру, а на экран)
		// тут могут быть потенциальные баги
		virtual void render_to_texture(int T = -1);

		// написать ch в точке (x,y) цветом (R,G,B,A)
		virtual void write(float x, float y, const char * ch,
			float R=0.f, float G=1.f, float B=0.f, float A=0.94f);
	};

}

#endif