(******************************************************************************
 *          This unit is part of the Rantanplan Graphics Library              *
 *                            http://rgl.uw.hu                                *
 *                                                                            *
 * author:      Girhiny Róbert                                                *
 * web:         http://robcaa.uw.hu                                           *
 * mail:        robcaa@gmail.com                                              *
 *                                                                            *
 * decription:  base shader main unit                                         *
 *                                                                            *
 ******************************************************************************)
unit main;

interface

uses Forms,Windows,Dialogs,SysUtils,Graphics,
     dglOpengl,opengl,
     Shader;


procedure BeforeStart;
procedure Render;
procedure BeforeExit;
procedure UpdateInput;





//##############################################################################
// ABLAK KEZELÉSHEZ
//##############################################################################
type
  PKeys = ^TKeys;
  TKeys = record                       // Structure For Keyboard Stuff
   keyDown: array[0..255] of Boolean;  // Holds TRUE / FALSE For Each Key
   keyUp: array[0..255] of Boolean;
  end;
type
  PApplication = ^TApplication;
  TApplication = record                // Contains Information Vital To Applications
    hInstance: HINST;                  // Application Instance
    icon:      TIcon;                  // Application Icon
    title:     WideString;
    className: PAnsiChar;             // Application ClassName
  end;

  PGL_WindowInit = ^TGL_WindowInit;
  TGL_WindowInit = record              // Window Creation Info
    application:  PApplication;        // Application Structure
    title:        PAnsiChar;           // Window Title
    width:        Integer;             // Width
    height:       Integer;             // Height
    bitsPerPixel: Integer;             // Bits Per Pixel
    isFullScreen: Boolean;             // FullScreen?
  end;

  PGL_Window = ^TGL_Window;
  TGL_Window = record                  // Contains Information Vital To A Window
    keys:          PKeys;              // Key Structure
    h_Wnd:         HWND;               // Window Handle
    h_DC:          HDC;                // Device Context
    h_RC:          HGLRC;              // Rendering Context
    init:          TGL_WindowInit;     // Window Init
    isVisible:     Boolean;            // Window Visible?
    lastTickCount: DWORD;              // Tick Counter
  end;
var g_keys: PKeys;
    g_window: PGL_Window;
    g_isProgramLooping: Boolean;
    APPLICATION_WIDTH,APPLICATION_Height:integer;
    TimeCorrection    : DWORD;



//##############################################################################
implementation


var
    shader : GLhandleARB;



//##############################################################################
procedure BeforeStart;
begin
 Shader := LinkPrograms( [
      LoadShaderFromFile('shader.vert', GL_VERTEX_SHADER_ARB),
      LoadShaderFromFile('shader.frag', GL_FRAGMENT_SHADER_ARB)
    ] );
end;





//##############################################################################
procedure BeforeExit;
begin
end;






//##############################################################################
procedure UpdateInput;
begin
  if g_keys.keyDown[VK_ESCAPE] then  begin
   PostMessage(g_window^.h_Wnd, $0012, 0, 0);
   g_isProgramLooping := FALSE;
  end;
end;







//##############################################################################
procedure Render;
begin
  glClearColor(0.8, 1, 1, 1);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  glOrtho(0,APPLICATION_WIDTH,APPLICATION_HEIGHT,0,-1,1);
  glMatrixMode(GL_MODELVIEW);

  glUseProgramObjectARB( Shader );

   glcolor4f(1,1,1,1);
   glBegin(GL_TRIANGLES);
    glVertex2f(30,30);
    glVertex2f(230,30);
    glVertex2f(230,230);
   glEnd;

  glUseProgramObjectARB( 0 );

  glFlush();
end;
end.
