#include "precompiled.h"

#include "MessageHandler.h"
#include "../GameLoop.h"
#include "../CommandProc.h"

#include "renderer/Renderer.h"
#include "graphics/GameView.h"
#include "gui/GUIbase.h"
#include "gui/CGUI.h"
#include "ps/CConsole.h"
#include "ps/Game.h"
#include "maths/MathUtil.h"

#include "ps/GameSetup/Config.h"
#include "ps/GameSetup/GameSetup.h"


namespace AtlasMessage {


MESSAGEHANDLER(Init)
{
	UNUSED2(msg);

	oglInit();

	g_Quickstart = true;
	Init(g_GameLoop->argc, g_GameLoop->argv, INIT_HAVE_VMODE|INIT_NO_GUI);

#if OS_WIN
	// HACK (to stop things looking very ugly when scrolling) - should
	// use proper config system.
	if(oglHaveExtension("WGL_EXT_swap_control"))
		pwglSwapIntervalEXT(1);
#endif
}


MESSAGEHANDLER(Shutdown)
{
	UNUSED2(msg);
	
	// Empty the CommandProc, to get rid of its references to entities before
	// we kill the EntityManager
	GetCommandProc().Destroy();

	Shutdown();

	g_GameLoop->rendering = false;
}


QUERYHANDLER(Exit)
{
	UNUSED2(msg);
	g_GameLoop->running = false;
}


MESSAGEHANDLER(RenderEnable)
{
	g_GameLoop->rendering = msg->enabled;
}

//////////////////////////////////////////////////////////////////////////

MESSAGEHANDLER(SetContext)
{
	g_GameLoop->glContext = msg->context;
	Atlas_GLSetCurrent((void*)g_GameLoop->glContext);
}


MESSAGEHANDLER(ResizeScreen)
{
	g_xres = msg->width;
	g_yres = msg->height;
	if (g_xres <= 2) g_xres = 2; // avoid GL errors caused by invalid sizes
	if (g_yres <= 2) g_yres = 2;

	SViewPort vp = { 0, 0, g_xres, g_yres };

	if (g_Game)
	{
		g_Game->GetView()->GetCamera()->SetViewPort(&vp);
		g_Game->GetView()->GetCamera()->SetProjection (1, 5000, DEGTORAD(20));
	}

	g_Renderer.SetViewport(vp);
	g_Renderer.Resize(g_xres, g_yres);

	if (g_Game)
		g_Game->GetView()->GetCamera()->UpdateFrustum();

	g_GUI.UpdateResolution();

	g_Console->UpdateScreenSize(g_xres, g_yres);
}

//////////////////////////////////////////////////////////////////////////

MESSAGEHANDLER(RenderStyle)
{
	g_Renderer.SetTerrainRenderMode(msg->wireframe ? EDGED_FACES : SOLID);
	g_Renderer.SetModelRenderMode(msg->wireframe ? EDGED_FACES : SOLID);
}

}
