//полноэкранный режим
//#define FULLSCREEN
//подключить генератор шума
//#define NOISE
//#define BITMASK
#define zaplatka1() $FINCSTP;  $FFREE st;
#pragma option w32     //создание Windows GUI EXE.
//#pragma option J0      //не включать startup code.
#pragma option w       //Включить предупреждение.
//#pragma option oir-    //отключение оптимизации
#pragma option ba-     //поэлементная адресация массива

#include <Windows.h>         // включаем заголовочный файл Windows
#include "inc/class.h--"
#include "INC/MSVCRT.H--"
#include <glu.h>
#include "resurs.rc"           // Файл ресурса
#include "inc/math.h"
#include "INC/Time.h"          //Врем
#include "inc/glDraw.h"        //разные функции
#include "inc/Font2D.h"        //Вывод текста
#include "inc/Rand.h"          //случайные числа
#include "inc/quat.h"          //кватернион
#include "inc/Matrix.h"        //класс работы с матрицами
#include "inc/Frustum.h"       //все что не входит в камеру отсеить

#define WINDOW_TITLE "Sprite 2D"
char classTitle="Class - Test1 - OpenGL";
char WindowTitle="Srite 2D in OpenGL Demo";
#define WIDTH 640         //Установки в режиме полноэкранного просмотра
#define HEIGHT 480
#define BITSPERPIXEL 32
:int oldwidth, oldheight, oldbpp, oldfreq;
:DEVMODE dmScreenSettings;
RECT windowRect = {0, 0, WIDTH, HEIGHT};
char site="www.pascal.vov.ru";
:char fpsview="OpenGL, FPS %d";
:byte StringFPS[255];
:dword FPS;
//float fFPS;
:dword LastTime;
struct MSG message;
dword hInst;
dword hWnd;
dword hMenu;
//PAINTSTRUCT ps;
#define _Width_SCR_   640  // Ширина окна
#define _Height_SCR_  480  // Высота окна
BOOL bGotMsg;

//#include "INC/OPENGL.H--"  //OpenGL
DWORD WidthClientWin=0;
DWORD HeightClientWin=0;
RECT window_rect={0, 0, _Width_SCR_, _Height_SCR_};

DWORD hdc, hrc;
PAINTSTRUCT ps;
RECT rcGL;
PIXELFORMATDESCRIPTOR pfd;
//Показывать FPS --------------------------------------------------------------------------------------------

:FPSCALC()
{
	$push EBX
	EBX=EAX=GetTickCount();
	FPS++;
	IF(EAX-LastTime>=1000){
		LastTime=EBX;
		wsprintf(#StringFPS,#fpsview,FPS);
//               fFPS=float FPS;
		FPS=0;
	}
	$pop EBX

}
//-------------------------------------------------------------------------------------------------------------

//#include "inc/CWin.h"          //окно
//DirectInput ---------------------------------------------------------------
#include "inc/DInput/struct.h"
#include "inc/DInput/initDI.h"
//------------------------------------------

#include "inc/camera.h"        //Класс камеры
camera Camera;


#include "inc/sprite.h"       //работа со спрайтом
#include "inc/tga.h"


tgaImageFile tga;
sprite g_donutSprite;

InitDema()
{
//--------------------------------------------------------------------------
InitRand32(); //инит генератора случайных чисел


//загрузка tga
tga.load("base/sprites.tga");
tga.Texture();
//CreateBitMaskFromRGBA(tga.m_nImageData, tga.m_nImageWidth, tga.m_nImageHeight,
//0, 0, 0, 0, 0, 0, 0);

tga.Deload();
g_donutSprite.sprite();
EAX=tga.ID_TEX;
g_donutSprite.setTextureID( EAX );
g_donutSprite.setPositionX( 0.0f );
g_donutSprite.setPositionY( 0.0f );
g_donutSprite.setAlpha( 1.0f );
g_donutSprite.setWidth( 1.0f );
g_donutSprite.setHeight( 1.0f );
////g_donutSprite.setFrameDelay( 0.02f );
g_donutSprite.setFrameDelay( 0.033f ); //0.33*30=0.99  1.0=одна секунда=30 кадров
////g_donutSprite.setTextureAnimeInfo( 512, 512, 64, 64, 5, 6, 30, 0, 0 );
g_donutSprite.setTextureAnimeInfo( 512, 512, 64, 64, 5, 6, 30, 0, 0);



InitDI();   //Инит DirectInput;



Camera.Clear();

//
//Инит Шрифта
CreateOpenGLFont("VERDANA", 14); //Создаем шрифт


}


//----------------------------------
DeInitDema()
{


$XOR EAX, EAX;


	DestroyFont();     //Удаление шрифта


DeInitDI();  //DirectInput освобождаем


}

//-------------------------------------

 DeTexture(){


tga.DeTexture();


}



//-----------------------------------------------------------------------------------------
//
//          FFFFFF  FF      FF   FFFFFF
//          FF      FF           FF   FF
//          FF      FF      FF   FF   F
//          FFFFFF  FF      FF   FFFFF
//          FF      FF      FF   FF
//          FF      FF   F  FF   FF
//          FF      FFFFFF  FF   FF




//---------------------------------------------------------------------



float t1;
float TimeDema;


Flip(DWORD HandleWindow)
{







//---
BeginPaint(HandleWindow,#ps);
//---


t1=Timer_GetElapsedf();   //Время между кадрами
TimeDema+=t1;





//заполнение буфера GL_COLOR_BUFFER_BIT фоновым цветом и
//очистка z-буфера (или буфера глубины GL_DEPTH_BUFFER_BIT):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //// Clear screen & z-buffer
glLoadIdentity();			// Reset The matrix

//---
        //Камера
//  	gluLookAt(0.0, 0.0, 12.0,  0.0, 0.0, 0.0,   0.0, 1.0, 0.0);

	glMultMatrixf(Camera.GetMatrix());


                Camera.Clear();


                Camera.TranslatePosition(0.0, 0.0, 10.0);


//Обновление позиции Камеры
		Camera.Update();


//фрустум
glGrabMatrixFrustumCalculate();





g_donutSprite.render(TimeDema);


//FPS----------------------------------------------
glDisable(GL_TEXTURE_2D);
gl2Don();
FPSCALC();
glColor4f(1.0f, 1.0f, 0.0f, 1.0f);									// Make the next text green
glDrawText(5.0f, 15.0f, #StringFPS);
gl2Doff();
//----------------------------------------------------




//---
 glColor3f(1.0f, 1.0f, 1.0f);

glFinish();
glFlush();
SwapBuffers(hdc);
EndPaint(HandleWindow,#ps);
//---



}

//!!!
#include "inc/CWin.h"          //окно


BOOLEAN trigerW=FALSE;

AnalizKey()
{
//Лог
//WriteFile(File1 , #event_key.data1, 4, #bytes_count1, NULL );
//включение каркасного режима просмотра
IF (event_key.data1=='w') IF (event_key.ev_keyup_down==FALSE)
                          IF (trigerW==FALSE ) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); trigerW=TRUE;} //только каркас рисовать
                          ELSE { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); trigerW=FALSE;}


}


void main(){



//--------------------------------------------------
hWnd=CreateMyWindow();            //Создания окна


InitGL();                       //Инит OpenGL
//-------------------------------------------------



Timer_Create(); //Вызов через класс инициализации таймера
InitDema();

//лог
//File1=CreateFile(#nFile, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, 0 );


//-----------------------------------------------------------------------------------------------------------
PeekMessage( #message, NULL, 0, 0, PM_NOREMOVE );
    WHILE( WM_QUIT != message.message  )
     {

                ZeroMemory(#event_key, sizeof(event_key));
                GetKey2();
                AnalizKey();

		bGotMsg	 = PeekMessage( #message, NULL, 0, 0, PM_REMOVE );


		IF( bGotMsg )
        {
			// Translate and dispatch the message
			TranslateMessage( #message );
			DispatchMessage( #message );
        }
		ELSE
		{
			InvalidateRect( hWnd, NULL, FALSE );
		}


     }

//лог
// CloseHandle(File1);

DeInitDema();


//--------
#ifdef FULLSCREEN
  dmScreenSettings.dmSize                    = sizeof(dmScreenSettings);
  dmScreenSettings.dmBitsPerPel              = oldbpp;
  dmScreenSettings.dmPelsWidth               = oldwidth;
  dmScreenSettings.dmPelsHeight              = oldheight;
  dmScreenSettings.dmDisplayFrequency        = oldfreq;
  dmScreenSettings.dmFields                  = DM_BITSPERPEL+DM_PELSWIDTH+DM_PELSHEIGHT+DM_DISPLAYFREQUENCY;
  ChangeDisplaySettings(#dmScreenSettings, 0);
  ShowCursor(TRUE);
#endif
//-------








	ExitProcess(message.wParam);

}





//-------------------------------------------------------------------

