157 lines
4.1 KiB
ObjectPascal

unit Unit1;
{
-For using OpenGl with BGRABitmap and LCl:
-Add two packages (take a look at project inspector!)
-Then you need a TOpenGLControl and do create stuff and setting events
-If you want OpenGl speed you should use a texture again and again, dont make it each time unless it is necceray so here we will load them once
-For making texture you can use TBGLBitmap or IBGLTexture
-TBGLBitmap is like a TBGRABitmap with OpenGl stuff and a texture property, you can draw, load and whatever here and then use its texture and if you dont need it later free it.
-IBGLTexture is an interface so you dont need to free it,just use it and note that it will use less memory
-After loading you need to draw background with BGLViewPort
-After that draw your textures with BGLCanvas. for more info just take a look at it's class
-In the end do SwapBuffers so all you paint goes to buffer and will draw
-For more info you should check other demos, classes, Wiki or ask on the forum
http://forum.lazarus.freepascal.org/index.php?board=46.0
}
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
OpenGLContext, BGRABitmap, BGRABitmapTypes, BGRAOpenGL;
type
{ TForm1 }
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ private declarations }
OriginalBounds: TRect;
OriginalWindowState: TWindowState;
procedure SwitchFullScreen;
public
bmp: TBGLBitmap;
Tex: IBGLTexture;
OpenGLControl: TOpenGLControl;
DataLoaded: boolean;
procedure Load;
procedure Unload;
procedure OpenGLControlDblClick(Sender: TObject);
procedure OpenGLControlPaint(Sender: TObject);
procedure OpenGLControlMouseMove(Sender: TObject; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: integer);
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.SwitchFullScreen;
begin
if BorderStyle <> bsNone then begin
// To full screen
OriginalWindowState := WindowState;
OriginalBounds := BoundsRect;
BorderStyle := bsNone;
BoundsRect := Screen.MonitorFromWindow(Handle).BoundsRect;
end else begin
// From full screen
BorderStyle := bsSizeable;
if OriginalWindowState = wsMaximized then
WindowState := wsMaximized
else
BoundsRect := OriginalBounds;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
OpenGLControl := TOpenGLControl.Create(Self);
with OpenGLControl do
begin
Align := alClient;
Parent := Self;
OnPaint := @OpenGLControlPaint;
OnMouseMove := @OpenGLControlMouseMove;
OnDblClick := @OpenGLControlDblClick;
//If you dont do it,you will have some problems
AutoResizeViewport := True;
end;
DataLoaded := False;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
OpenGLControl.Free;
end;
procedure TForm1.Load;
var path: string;
begin
if not DataLoaded then
begin
path := ExtractFilePath(Application.ExeName) + '..' + PathDelim + 'tux_game' + PathDelim + 'ground.png';
//Do this :
//Way1
//Tex := BGLTexture(path);
//Or this for more editing options
//Way2
bmp := TBGLBitmap.Create(path);
bmp.Rectangle(0,0,bmp.Width,bmp.Height,BGRABlack,dmSet);
Tex:=bmp.MakeTextureAndFree;
//Or whatever you want!
DataLoaded := True;
end;
end;
procedure TForm1.Unload;
begin
if DataLoaded then
begin
Tex := nil;
DataLoaded := False;
end;
end;
// double-click to switch to full screen
procedure TForm1.OpenGLControlDblClick(Sender: TObject);
begin
Unload; //context may change when switching to full-screen
SwitchFullScreen;
end;
procedure TForm1.OpenGLControlPaint(Sender: TObject);
var
mousePos: TPoint;
begin
{ Load data }
Load;
{ Draw Background }
BGLViewPort(OpenGLControl.Width, OpenGLControl.Height, BGRAWhite);
{ Draw Texture }
mousePos := ScreenToClient(Mouse.CursorPos);
BGLCanvas.PutImage(mousePos.x - Tex.Width div 2, mousePos.y - Tex.Height div 2, Tex);
{ Update }
OpenGLControl.SwapBuffers;
end;
procedure TForm1.OpenGLControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer);
begin
OpenGLControl.DoOnPaint;
end;
end.