// RU: Этот дефайн необходим только в главном модуле.
// EN: This define is needed only in main unit.
#define ZGL_IMPORT

#include "zglHeader.h"

const char* DirApp;
const char* DirHome;

void Init()
{
	// RU: Тут можно выполнять загрузку основных ресурсов.
	// EN: Here can be loading of main resources.
}

void Draw()
{
	// RU: Тут "рисуем" что угодно :)
	// EN: Here "draw" anything :)
}

void Update( double dt )
{
	// RU: Эта функция наземенима для реализация плавного движения чего-либо, т.к. точность таймеров ограничена FPS.
	// EN: This function is the best way to implement smooth moving of something, because accuracy of timers are restricted by FPS.
}

void Timer()
{
	// RU: Будем в заголовке показывать количество кадров в секунду.
	// EN: Caption will show the frames per second.
	char caption[256];
	sprintf_s( caption, "01 - Initialization[ FPS: %i ]", (int)zgl_Get( RENDER_FPS ) );
	wnd_SetCaption( caption );
}

void Quit()
{
  //
}

int CALLBACK WinMain (
	__in HINSTANCE hInstance,
	__in_opt HINSTANCE hPrevInstance,
	__in_opt LPSTR lpCmdLine,
	__in int nShowCmd
	)
{
	if ( !zglLoad( libZenGL ) ) return 0;

	// RU: Для загрузки/создания каких-то своих настроек/профилей/etc. можно получить путь к домашенему каталогу пользователя, или к исполняемому файлу(не работает для GNU/Linux).
	// EN: For loading/creating your own options/profiles/etc. you can get path to user home directory, or to executable file(not works for GNU/Linux).
	DirApp  = (const char*)zgl_Get( DIRECTORY_APPLICATION );
	DirHome = (const char*)zgl_Get( DIRECTORY_HOME );

	// RU: Создаем таймер с интервалом 1000мс.
	// EN: Create a timer with interval 1000ms.
	timer_Add( (void*)&Timer, 1000 );

	// RU: Регистрируем процедуру, что выполнится сразу после инициализации ZenGL.
	// EN: Register the procedure, that will be executed after ZenGL initialization.
	zgl_Reg( SYS_LOAD, (void*)&Init );
	// RU: Регистрируем процедуру, где будет происходить рендер.
	// EN: Register the render procedure.
	zgl_Reg( SYS_DRAW, (void*)&Draw );
	// RU: Регистрируем процедуру, которая будет принимать разницу времени между кадрами.
	// EN: Register the procedure, that will get delta time between the frames.
	zgl_Reg( SYS_UPDATE, (void*)&Update );
	// RU: Регистрируем процедуру, которая выполнится после завершения работы ZenGL.
	// EN: Register the procedure, that will be executed after ZenGL shutdown.
	zgl_Reg( SYS_EXIT, (void*)&Quit );

	// RU: Устанавливаем заголовок окна.
	// EN: Set the caption of the window.
	wnd_SetCaption( "01 - Initialization" );

	// RU: Разрешаем курсор мыши.
	// EN: Allow to show the mouse cursor.
	wnd_ShowCursor( TRUE );

	// RU: Указываем первоначальные настройки.
	// EN: Set screen options.
	scr_SetOptions( 800, 600, REFRESH_MAXIMUM, FALSE, FALSE );

	// RU: Инициализируем ZenGL.
	// EN: Initialize ZenGL.
	zgl_Init();

	zglFree();
	return 0;
}