#ifndef GE_ADAPTER_H
#define GE_ADAPTER_H

/*
	Ripatti Artem (c) 2012

	преобразует все запросы к графическому движку
	в разрешении 320х240

	320х240 на современных карточках выставить нельзя
	поэтому сначала все рисуем в текстуру
	а потом полученную текстуру рисуем уже на экране растягивая в 2 раза

	может быть позже из этого получится самостоятельный крутой компонент:)

	адаптер только треобразует
	сам ничего не уничтожает
*/

#include "../core/ge_iface.h"

namespace ge
{
	class ZGraphicEngineAdapter : public XGraphicEngine
	{
		XGraphicEngine * _child_ge;
		int _x, _y, _sx, _sy;
	public:
		ZGraphicEngineAdapter( XGraphicEngine * child_ge, int x=0, int y=0, int sx=640, int sy=480 )
		{
			_child_ge = child_ge;
			_x = x; _y = y; _sx = sx; _sy = sy;
		}

		virtual void begin_scene()
		{
			_child_ge->begin_scene();
			_child_ge->render_to_texture( 0 );
		}

		virtual void clear_scene(float R=0.f, float G=0.f, float B=0.f)
		{
			_child_ge->clear_scene( R, G, B );
		}

		virtual void render_scene()
		{
			_child_ge->render_to_texture( -1 );
			_child_ge->set_texture( 0 );

			_child_ge->clear_scene( 0.f, 0.f, 0.f );

			_child_ge->draw_pict( ge::PICT( (float)_x, (float)_y, (float)_sx, (float)_sy).
				set_tex( ((512.f-320.f)*0.5f)/512.f, 8.f/256.f, 320.f/512.f, 240.f/256.f ).
				flip_ver() );

			_child_ge->render_scene();
		}

		virtual void set_texture(int T)
		{
			_child_ge->set_texture( T );
		}

		virtual void draw_pict(PICT & Pict)
		{
			ge::PICT tmp = Pict;
			for (int a=0; a<4; a++)
			{
				tmp.v[a].x = tmp.v[a].x + (512.f-320.f)*0.5f;
				tmp.v[a].y = tmp.v[a].y + 8.f;
			}
			_child_ge->draw_pict( tmp );
		}

		virtual void render_to_texture(int T = -1)
		{
			// вообще ничо не будем делать XD
		}

		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)
		{
			_child_ge->write( x + (512-320)/2.f, y + 8.f, ch, R, G, B, A );
		}
	};
};

#endif
