157 lines
4.1 KiB
ObjectPascal
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.
|