rendered paste bodyunit win;
interface
Uses OpenGL, Windows, Textures;
type
PBoolean = ^Boolean;
Pwindow = ^TWindow;
PAppWindow = ^TAppWindow;
TAppWindow = Record
Width, Height : Integer;
CaptionBarHeight : Integer;
end;
// Structure for the mouse
PMouse = ^TMouse;
TMouse = Record
X, Y : Integer;
Button : Integer; // 1=left, 2=right, 3=middle
end;
TMouseDrag = Record
Drag : Boolean; // window draggin enabled
X, Y : Integer; // X and Y coords when drag started
Window : PWindow;
end;
PButton = ^TButton;
TButton = Object
X, Y : Integer;
Width, Height : Integer;
Caption : String;
Pressed : Boolean;
Index : Integer;
Parent : PWindow;
onClick : procedure;
procedure Init(bX, bY, bWidth, bHeight : Integer; bCaption : String);
Procedure Render;
end;
TText = Object
X, Y : Integer;
Visible : Boolean;
Caption : String;
Parent : PWindow;
procedure Init(tX, tY : Integer; Text : String);
Procedure Render;
end;
TPanel = Object
X, Y : Integer;
Width, Height : Integer;
Visible : Boolean;
Parent : PWindow;
procedure Init(pX, pY, pWidth, pHeight : Integer);
Procedure Render;
end;
TMap = Object
X, Y : Integer;
Width, Height : Integer;
Visible : Boolean;
Parent : PWindow;
Tile : gluint;
Procedure LoadTile;
procedure Init(pX, pY, pWidth, pHeight : Integer);
Procedure Render;
end;
TCheckbox = Object
X, Y : Integer;
Visible : Boolean;
Checked : Boolean;
Parent : PWindow;
onClick : procedure;
procedure Init(cbX, cbY : Integer; cbChecked : Boolean);
Procedure Render;
end;
TRadioButton = Object
X, Y : Integer;
Visible : Boolean;
Checked : Boolean;
Group : Integer;
Parent : PWindow;
onClick : procedure;
procedure Init(rbX, rbY, rbGroup : Integer; rbChecked : Boolean);
Procedure Render;
end;
TWindow = Object
X, Y : Integer;
Width, Height : Integer;
Visible : Boolean;
ZOrder : single;
Alpha : Single;
Button : Array of TButton;
Text : Array of TText;
Map : Array of TMap;
Panel : Array of TPanel;
Checkbox : Array of TCheckBox;
RadioButton : Array of TRadioButton;
ChildWindow : Array of PWindow;
procedure Init(wX, wY, wWidth, wHeight : Integer);
Procedure AddButton(btnX, btnY, btnWidth, btnHeight : Integer; btnCaption : String);
Procedure AddText(tX, tY : Integer; tCaption : String);
procedure AddMap(pX, pY, pWidth, pHeight : Integer);
Procedure AddPanel(pX, pY, pWidth, pHeight : Integer);
Procedure AddCheckbox(cbX, cbY : Integer; Checked : Boolean);
Procedure AddRadioButton(rbX, rbY, rbGroup : Integer; Checked : Boolean);
Procedure AddWindow(Child : PWindow);
Procedure Render;
end;
var
GUITexture : glUint; // the GUI texture
FontTexture : glUint; // the font texture
Window : TAppWindow = (Width:800; Height:600; CaptionBarHeight:26);
Mouse : TMouse;
procedure BuildFont;
Procedure drawMouse;
procedure onMouseUp;
function onMouseDown(Wnd : PWindow) : boolean;
implementation
procedure glBindTexture(target: GLenum; texture: GLuint); stdcall; external opengl32;
var ButtonPressed : PButton; // used to remember which button was pressed
MouseDrag : TMouseDrag;
FontList : glUint; // font display list
FontWidth : Array[0..255] of Byte; // array of font character widths
procedure TMap.LoadTile;
begin
LoadTexture('C:\Tile.bmp',Tile,false);
end;
{------------------------------------------------------------------}
{ Procedure to create the font display list }
{------------------------------------------------------------------}
procedure BuildFont;
var I : Integer;
X, Y, xs : glFloat;
F : File of Byte;
W : Byte;
begin
// Load the character widths from the font.fnt file
AssignFile(F, 'font.fnt');
{$I-}
Reset(F);
{$I+}
if IOResult <> 0 then
begin
MessageBox(0, 'Unable to find font.fnt', 'Font Loader', MB_OK);
exit;
end;
For I :=0 to 255 do
begin
Read(F, w);
FontWidth[I] :=W;
end;
CloseFile(F);
// create the font display list
FontList := glGenLists(256); // Storage For 128 Characters
for I := 0 to 255 do
begin
x := (I mod 16) / 16; // X Position Of Current Character
y := (I div 16) / 16; // Y Position Of Current Character
glNewList(FontTexture+I, GL_COMPILE); // Start Building A List
glBegin(GL_QUADS);
xs := (16-FontWidth[I])/2/256;
glTexCoord2f(x+xs,1-y-0.0625); glVertex2i(0, 0);
glTexCoord2f(x+xs + FontWidth[I]/256 + 1/512, 1-y-0.0625); glVertex2i( FontWidth[I], 0);
glTexCoord2f(x+xs + FontWidth[I]/256 + 1/512, 1-y); glVertex2i( FontWidth[I], 16);
glTexCoord2f(x+xs,1-y); glVertex2i(0, 16);
glEnd();
glTranslate(FontWidth[I]+1, 0, 0);
glEndList();
end;
end;
{------------------------------------------------------------------}
{ Write a pice of text using the font DL }
{------------------------------------------------------------------}
procedure glWrite(x, y : Integer; text : String);
begin
glBindTexture(GL_TEXTURE_2D, FontTexture);
glPushMatrix();
glTranslate(x, y, 0.05);
glListBase(FontList+1);
glCallLists(length(text), GL_BYTE, PChar(text));
glPopMatrix();
glBindTexture(GL_TEXTURE_2D, GUITexture);
end;
{ TWindow }
{------------------------------------------------------------------}
{ Adds a button onto the window }
{------------------------------------------------------------------}
procedure TWindow.AddButton(btnX, btnY, btnWidth, btnHeight : Integer; btnCaption : String);
begin
SetLength(Button, High(Button)+2);
Button[High(Button)].Init(btnX, btnY, btnWidth, btnHeight, btnCaption);
Button[High(Button)].Parent :=@self;
Button[High(Button)].Index :=High(Button);
end;
{------------------------------------------------------------------}
{ Adds text to a window }
{------------------------------------------------------------------}
procedure TWindow.AddText(tX, tY: Integer; tCaption : String);
begin
SetLength(Text, High(Text)+2);
Text[High(Text)].Init(tX, tY, tCaption);
Text[High(Text)].Parent :=@self;
end;
{------------------------------------------------------------------}
{ Adds a map onto the window }
{------------------------------------------------------------------}
Procedure TWindow.AddMap(pX, pY, pWidth, pHeight : Integer);
begin
SetLength(Map, High(Map)+2);
Map[High(Map)].Init(pX, pY, pWidth, pHeight);
Map[High(Map)].Parent :=@self;
end;
{------------------------------------------------------------------}
{ Adds a panel onto the window }
{------------------------------------------------------------------}
procedure TWindow.AddPanel(pX, pY, pWidth, pHeight: Integer);
begin
SetLength(Panel, High(Panel)+2);
Panel[High(Panel)].Init(pX, pY, pWidth, pHeight);
Panel[High(Panel)].Parent :=@self;
end;
{------------------------------------------------------------------}
{ Adds a checkbox onto the window }
{------------------------------------------------------------------}
procedure TWindow.AddCheckbox(cbX, cbY: Integer; Checked: Boolean);
begin
SetLength(Checkbox, High(Checkbox)+2);
Checkbox[High(Checkbox)].Init(cbX, cbY, Checked);
Checkbox[High(Checkbox)].Parent :=@self;
end;
{------------------------------------------------------------------}
{ Adds a radiobutton onto the window }
{------------------------------------------------------------------}
procedure TWindow.AddRadioButton(rbX, rbY, rbGroup: Integer; Checked: Boolean);
begin
SetLength(RadioButton, High(RadioButton)+2);
RadioButton[High(RadioButton)].Init(rbX, rbY, rbGroup, Checked);
RadioButton[High(RadioButton)].Parent :=@self;
end;
{------------------------------------------------------------------}
{ Adds a new child window }
{------------------------------------------------------------------}
procedure TWindow.AddWindow(Child : PWindow);
begin
SetLength(ChildWindow, High(ChildWindow)+2);
ChildWindow[High(ChildWindow)] :=Child;
end;
{------------------------------------------------------------------}
{ Initialise window and setup defaults }
{------------------------------------------------------------------}
procedure TWindow.Init(wX, wY, wWidth, wHeight: Integer);
begin
X :=wX;
Y :=wY;
zOrder :=0; // used if you specifically want to set a window higher
Width :=wWidth;
Height :=wHeight;
Visible :=TRUE; // start off visible
Alpha :=0.9; // defult for alpha blending
end;
{------------------------------------------------------------------}
{ Render the window. Calls render button, child windows ... }
{------------------------------------------------------------------}
procedure TWindow.Render;
var I : Integer;
begin
if Visible then
begin
glBindTexture(GL_TEXTURE_2D, GUITexture);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glColor4f(1.0, 1.0, 1.0, Alpha);
glPushMatrix();
glTranslate(X, Window.Height - Window.CaptionBarHeight-Y, zOrder);
glBegin(GL_QUADS);
// top left corner of window.
glTexCoord2f( 0/128, 1); glVertex2f(0, 0);
glTexCoord2f( 0/128, 1-27/128); glVertex2f(0, -27);
glTexCoord2f(64/128, 1-27/128); glVertex2f(63, -27);
glTexCoord2f(64/128, 1); glVertex2f(63, 0);
// top of window.
glTexCoord2f(64/128, 1); glVertex2f(63, 0);
glTexCoord2f(64/128, 1-27/128); glVertex2f(63, -27);
glTexCoord2f(96/128, 1-27/128); glVertex2f(Width-32, -27);
glTexCoord2f(96/128, 1); glVertex2f(Width-32, 0);
// top right corder of window.
glTexCoord2f(96/128, 1); glVertex2f(Width-32, 0);
glTexCoord2f(96/128, 1-27/128); glVertex2f(Width-32, -27);
glTexCoord2f(1, 1-27/128); glVertex2f(Width, -27);
glTexCoord2f(1, 1); glVertex2f(Width, 0);
// left side of window.
glTexCoord2f(0/128, 1-27/128); glVertex2f(0, -27);
glTexCoord2f(0/128, 27/128); glVertex2f(0, -Height+27);
glTexCoord2f(6/128, 27/128); glVertex2f(6,-Height+27);
glTexCoord2f(6/128, 1-27/128); glVertex2f(6, -27);
// draw the main body of the window
glTexCoord( 9/128, 96/128); glVertex2f(6, 0);
glTexCoord( 9/128, 64/128); glVertex2f(6, 25-Height);
glTexCoord(39/128, 64/128); glVertex2f(Width-7, 25-Height);
glTexCoord(39/128, 96/128); glVertex2f(Width-7, 0);
// right side of window.
glTexCoord2f(1-7/128, 1-27/128);glVertex2f(Width-7, -27);
glTexCoord2f(1-7/128, 27/128); glVertex2f(Width-7, -Height+27);
glTexCoord2f(1, 27/128); glVertex2f(Width,-Height+27);
glTexCoord2f(1, 1-27/128); glVertex2f(Width, -27);
// bottom left corner of window.
glTexCoord2f( 0/128, 27/128); glVertex2f(0, 27-Height);
glTexCoord2f( 0/128, 0/128); glVertex2f(0, -Height);
glTexCoord2f(64/128, 0/128); glVertex2f(63, -Height);
glTexCoord2f(64/128, 27/128); glVertex2f(63, 27-Height);
// bottom of window.
glTexCoord2f(64/128, 27/128); glVertex2f(63, 27-Height);
glTexCoord2f(64/128, 0/128); glVertex2f(63, -Height);
glTexCoord2f(96/128, 0/128); glVertex2f(Width-32, -Height);
glTexCoord2f(96/128, 27/128); glVertex2f(Width-32, 27-Height);
// bottom right corder of window.
glTexCoord2f(96/128, 27/128); glVertex2f(Width-32, 27-Height);
glTexCoord2f(96/128, 0/128); glVertex2f(Width-32, -Height);
glTexCoord2f(1, 0/128); glVertex2f(Width, -Height);
glTexCoord2f(1, 27/128); glVertex2f(Width, 27-Height);
// window close button
glTexCoord2f(104/128, 96/128); glVertex3f(Width-22, -8, 0.01);
glTexCoord2f(104/128, 80/128); glVertex3f(Width-22, -24, 0.01);
glTexCoord2f(120/128, 80/128); glVertex3f(Width-6, -24, 0.01);
glTexCoord2f(120/128, 96/128); glVertex3f(Width-6, -8, 0.01);
glEnd();
// draw the Panels
glTranslate(0, 0, 0.02);
for I :=0 to High(Panel) do
Panel[I].Render;
// draw the Buttons
glTranslate(0, 0, 0.02);
for I :=0 to High(Button) do
Button[I].Render;
// draw the Checkboxes
for I :=0 to High(Checkbox) do
Checkbox[I].Render;
// draw the RadioButtons
for I :=0 to High(RadioButton) do
RadioButton[I].Render;
// draw the Text
for I :=0 to High(Text) do
Text[I].Render;
glPopMatrix();
glBlendFunc(GL_ONE,GL_ONE);
glDisable(GL_BLEND);
// draw the child windows
glPushMatrix();
glTranslate(0, 0, 0.1);
for I :=0 to High(ChildWindow) do
ChildWindow[I].Render;
glPopMatrix();
end;
end;
{ TButton }
{------------------------------------------------------------------}
{ Initialise a button }
{------------------------------------------------------------------}
procedure TButton.Init(bX, bY, bWidth, bHeight: Integer; bCaption : String);
begin
X :=bx;
Y :=bY;
Width :=bWidth;
Height :=bHeight;
Caption :=bCaption;
end;
{------------------------------------------------------------------}
{ Render the button }
{------------------------------------------------------------------}
procedure TButton.Render;
begin
if Pressed then
begin
glBegin(GL_QUADS);
// left side
glTexCoord2f(57/128, 95/128); glVertex2f(X, -Y);
glTexCoord2f(57/128, 70/128); glVertex2f(X, -Y-Height);
glTexCoord2f(62/128, 70/128); glVertex2f(X+6,-Y-Height);
glTexCoord2f(62/128, 95/128); glVertex2f(X+6, -Y);
// middle
glTexCoord2f(62/128, 95/128); glVertex2f(X+6, -Y);
glTexCoord2f(62/128, 70/128); glVertex2f(X+6, -Y-Height);
glTexCoord2f(66/128, 70/128); glVertex2f(X+Width-6, -Y-Height);
glTexCoord2f(66/128, 95/128); glVertex2f(X+Width-6, -Y);
// right side
glTexCoord2f(66/128, 95/128); glVertex2f(X+Width-6, -Y);
glTexCoord2f(66/128, 70/128); glVertex2f(X+Width-6, -Y-Height);
glTexCoord2f(71/128, 70/128); glVertex2f(X+Width, -Y-Height);
glTexCoord2f(71/128, 95/128); glVertex2f(X+Width, -Y);
glEnd();
glWrite(X + 1 + (Width-Length(Caption)*6) DIV 2, -Y-21, Caption);
end
else
begin
glBegin(GL_QUADS);
// left side
glTexCoord2f(41/128, 95/128); glVertex2f(X, -Y);
glTexCoord2f(41/128, 70/128); glVertex2f(X, -Y-Height);
glTexCoord2f(46/128, 70/128); glVertex2f(X+6,-Y-Height);
glTexCoord2f(46/128, 95/128); glVertex2f(X+6, -Y);
// middle
glTexCoord2f(46/128, 95/128); glVertex2f(X+6, -Y);
glTexCoord2f(46/128, 70/128); glVertex2f(X+6, -Y-Height);
glTexCoord2f(50/128, 70/128); glVertex2f(X+Width-6, -Y-Height);
glTexCoord2f(50/128, 95/128); glVertex2f(X+Width-6, -Y);
// right side
glTexCoord2f(50/128, 95/128); glVertex2f(X+Width-6, -Y);
glTexCoord2f(50/128, 70/128); glVertex2f(X+Width-6, -Y-Height);
glTexCoord2f(55/128, 70/128); glVertex2f(X+Width, -Y-Height);
glTexCoord2f(55/128, 95/128); glVertex2f(X+Width, -Y);
glEnd();
glWrite(X + (Width-Length(Caption)*6) DIV 2, -Y-20, Caption);
end;
end;
{ TPanel }
{------------------------------------------------------------------}
{ Initialise a Map }
{------------------------------------------------------------------}
procedure TMap.Init(pX, pY, pWidth, pHeight: Integer);
begin
X :=pX;
Y :=pY;
Width :=pWidth;
Height :=pHeight;
Visible :=TRUE;
end;
{------------------------------------------------------------------}
{ Render the Map }
{------------------------------------------------------------------}
procedure TMap.Render;
begin
if Visible then
begin
glBegin(GL_QUADS);
// top left corner of panel.
glTexCoord2f( 8/128, 64/128); glVertex2f(X, -Y);
glTexCoord2f( 8/128, 54/128); glVertex2f(X, -Y-10);
glTexCoord2f(18/128, 54/128); glVertex2f(X+10, -Y-10);
glTexCoord2f(18/128, 64/128); glVertex2f(X+10, -Y);
// top of panel.
glTexCoord2f(18/128, 64/128); glVertex2f(X+10, -Y);
glTexCoord2f(18/128, 54/128); glVertex2f(X+10, -Y-10);
glTexCoord2f(30/128, 54/128); glVertex2f(X+10+(Width-20), -Y-10);
glTexCoord2f(30/128, 64/128); glVertex2f(X+10+(Width-20), -Y);
// top right corder of panel.
glTexCoord2f(30/128, 64/128); glVertex2f(X+Width-10, -Y);
glTexCoord2f(30/128, 54/128); glVertex2f(X+Width-10, -Y-10);
glTexCoord2f(40/128, 54/128); glVertex2f(X+Width, -Y-10);
glTexCoord2f(40/128, 64/128); glVertex2f(X+Width, -Y);
// left side of panel.
glTexCoord2f( 8/128, 54/128); glVertex2f(X, -Y-10);
glTexCoord2f( 8/128, 42/128); glVertex2f(X, -Y-Height+10);
glTexCoord2f(18/128, 42/128); glVertex2f(X+10, -Y-Height+10);
glTexCoord2f(18/128, 54/128); glVertex2f(X+10, -Y-10);
// middle of panel.
glTexCoord2f(18/128, 54/128); glVertex2f(X+10, -Y-10);
glTexCoord2f(18/128, 42/128); glVertex2f(X+10, -Y-Height+10);
glTexCoord2f(30/128, 42/128); glVertex2f(X+10+(Width-20), -Y-Height+10);
glTexCoord2f(30/128, 54/128); glVertex2f(X+10+(Width-20), -Y-10);
// right side of panel.
glTexCoord2f(30/128, 54/128); glVertex2f(X+Width-10, -Y-10);
glTexCoord2f(30/128, 42/128); glVertex2f(X+Width-10, -Y-Height+10);
glTexCoord2f(40/128, 42/128); glVertex2f(X+Width, -Y-Height+10);
glTexCoord2f(40/128, 54/128); glVertex2f(X+Width, -Y-10);
// bottom left corner of panel.
glTexCoord2f( 8/128, 42/128); glVertex2f(X, -Y-Height+10);
glTexCoord2f( 8/128, 32/128); glVertex2f(X, -Y-Height);
glTexCoord2f(18/128, 32/128); glVertex2f(X+10, -Y-Height);
glTexCoord2f(18/128, 42/128); glVertex2f(X+10, -Y-Height+10);
// bottom middle of panel.
glTexCoord2f(18/128, 42/128); glVertex2f(X+10, -Y-Height+10);
glTexCoord2f(18/128, 32/128); glVertex2f(X+10, -Y-Height);
glTexCoord2f(30/128, 32/128); glVertex2f(X+10+(Width-20), -Y-Height);
glTexCoord2f(30/128, 42/128); glVertex2f(X+10+(Width-20), -Y-Height+10);
// bottom right corner of panel.
glTexCoord2f(30/128, 42/128); glVertex2f(X+Width-10, -Y-Height+10);
glTexCoord2f(30/128, 32/128); glVertex2f(X+Width-10, -Y-Height);
glTexCoord2f(40/128, 32/128); glVertex2f(X+Width, -Y-Height);
glTexCoord2f(40/128, 42/128); glVertex2f(X+Width, -Y-Height+10);
glEnd();
end;
end;
{------------------------------------------------------------------}
{ Initialise a panel }
{------------------------------------------------------------------}
procedure TPanel.Init(pX, pY, pWidth, pHeight: Integer);
begin
X :=pX;
Y :=pY;
Width :=pWidth;
Height :=pHeight;
Visible :=TRUE;
end;
{------------------------------------------------------------------}
{ Render the Panel }
{------------------------------------------------------------------}
procedure TPanel.Render;
begin
if Visible then
begin
glBegin(GL_QUADS);
// top left corner of panel.
glTexCoord2f( 8/128, 64/128); glVertex2f(X, -Y);
glTexCoord2f( 8/128, 54/128); glVertex2f(X, -Y-10);
glTexCoord2f(18/128, 54/128); glVertex2f(X+10, -Y-10);
glTexCoord2f(18/128, 64/128); glVertex2f(X+10, -Y);
// top of panel.
glTexCoord2f(18/128, 64/128); glVertex2f(X+10, -Y);
glTexCoord2f(18/128, 54/128); glVertex2f(X+10, -Y-10);
glTexCoord2f(30/128, 54/128); glVertex2f(X+10+(Width-20), -Y-10);
glTexCoord2f(30/128, 64/128); glVertex2f(X+10+(Width-20), -Y);
// top right corder of panel.
glTexCoord2f(30/128, 64/128); glVertex2f(X+Width-10, -Y);
glTexCoord2f(30/128, 54/128); glVertex2f(X+Width-10, -Y-10);
glTexCoord2f(40/128, 54/128); glVertex2f(X+Width, -Y-10);
glTexCoord2f(40/128, 64/128); glVertex2f(X+Width, -Y);
// left side of panel.
glTexCoord2f( 8/128, 54/128); glVertex2f(X, -Y-10);
glTexCoord2f( 8/128, 42/128); glVertex2f(X, -Y-Height+10);
glTexCoord2f(18/128, 42/128); glVertex2f(X+10, -Y-Height+10);
glTexCoord2f(18/128, 54/128); glVertex2f(X+10, -Y-10);
// middle of panel.
glTexCoord2f(18/128, 54/128); glVertex2f(X+10, -Y-10);
glTexCoord2f(18/128, 42/128); glVertex2f(X+10, -Y-Height+10);
glTexCoord2f(30/128, 42/128); glVertex2f(X+10+(Width-20), -Y-Height+10);
glTexCoord2f(30/128, 54/128); glVertex2f(X+10+(Width-20), -Y-10);
// right side of panel.
glTexCoord2f(30/128, 54/128); glVertex2f(X+Width-10, -Y-10);
glTexCoord2f(30/128, 42/128); glVertex2f(X+Width-10, -Y-Height+10);
glTexCoord2f(40/128, 42/128); glVertex2f(X+Width, -Y-Height+10);
glTexCoord2f(40/128, 54/128); glVertex2f(X+Width, -Y-10);
// bottom left corner of panel.
glTexCoord2f( 8/128, 42/128); glVertex2f(X, -Y-Height+10);
glTexCoord2f( 8/128, 32/128); glVertex2f(X, -Y-Height);
glTexCoord2f(18/128, 32/128); glVertex2f(X+10, -Y-Height);
glTexCoord2f(18/128, 42/128); glVertex2f(X+10, -Y-Height+10);
// bottom middle of panel.
glTexCoord2f(18/128, 42/128); glVertex2f(X+10, -Y-Height+10);
glTexCoord2f(18/128, 32/128); glVertex2f(X+10, -Y-Height);
glTexCoord2f(30/128, 32/128); glVertex2f(X+10+(Width-20), -Y-Height);
glTexCoord2f(30/128, 42/128); glVertex2f(X+10+(Width-20), -Y-Height+10);
// bottom right corner of panel.
glTexCoord2f(30/128, 42/128); glVertex2f(X+Width-10, -Y-Height+10);
glTexCoord2f(30/128, 32/128); glVertex2f(X+Width-10, -Y-Height);
glTexCoord2f(40/128, 32/128); glVertex2f(X+Width, -Y-Height);
glTexCoord2f(40/128, 42/128); glVertex2f(X+Width, -Y-Height+10);
glEnd();
end;
end;
{ TCheckbox }
{------------------------------------------------------------------}
{ Initialise a checkbox }
{------------------------------------------------------------------}
procedure TCheckbox.Init(cbX, cbY : Integer; cbChecked : Boolean);
begin
X :=cbX;
Y :=cbY;
Visible :=TRUE;
Checked :=cbChecked;
end;
{------------------------------------------------------------------}
{ Render a Checkbox }
{------------------------------------------------------------------}
procedure TCheckbox.Render;
begin
if Visible then
begin
if Checked then
begin
glBegin(GL_QUADS);
glTexCoord2f(88/128, 96/128); glVertex2f(X, -Y);
glTexCoord2f(88/128, 80/128); glVertex2f(X, -Y-16);
glTexCoord2f(104/128, 80/128); glVertex2f(X+16,-Y-16);
glTexCoord2f(104/128, 96/128); glVertex2f(X+16, -Y);
glEnd();
end
else
begin
glBegin(GL_QUADS);
glTexCoord2f(72/128, 96/128); glVertex2f(X, -Y);
glTexCoord2f(72/128, 80/128); glVertex2f(X, -Y-16);
glTexCoord2f(88/128, 80/128); glVertex2f(X+16,-Y-16);
glTexCoord2f(88/128, 96/128); glVertex2f(X+16, -Y);
glEnd();
end;
end;
end;
{ TRadioButton }
{------------------------------------------------------------------}
{ Initialise a Radio Button }
{------------------------------------------------------------------}
procedure TRadioButton.Init(rbX, rbY, rbGroup : Integer; rbChecked : Boolean);
begin
X :=rbX;
Y :=rbY;
Visible :=TRUE;
Checked :=rbChecked;
Group :=rbGroup;
end;
{------------------------------------------------------------------}
{ Render Radio Button }
{------------------------------------------------------------------}
procedure TRadioButton.Render;
begin
if Visible then
begin
if Checked then
begin
glBegin(GL_QUADS);
glTexCoord2f(88/128, 80/128); glVertex2f(X, -Y);
glTexCoord2f(88/128, 64/128); glVertex2f(X, -Y-16);
glTexCoord2f(104/128, 64/128); glVertex2f(X+16,-Y-16);
glTexCoord2f(104/128, 80/128); glVertex2f(X+16, -Y);
glEnd();
end
else
begin
glBegin(GL_QUADS);
glTexCoord2f(72/128, 80/128); glVertex2f(X, -Y);
glTexCoord2f(72/128, 64/128); glVertex2f(X, -Y-16);
glTexCoord2f(88/128, 64/128); glVertex2f(X+16,-Y-16);
glTexCoord2f(88/128, 80/128); glVertex2f(X+16, -Y);
glEnd();
end;
end;
end;
{ TText }
{------------------------------------------------------------------}
{ Initialise the Text }
{------------------------------------------------------------------}
procedure TText.Init(tX, tY : Integer; Text : String);
begin
X :=tX;
Y :=tY;
Caption :=Text;
end;
{------------------------------------------------------------------}
{ Render Radio Text }
{------------------------------------------------------------------}
procedure TText.Render;
begin
glWrite(X, -Y-16, Caption);
end;
{ TMouse }
{------------------------------------------------------------------}
{ Procedure to draw the mouse }
{------------------------------------------------------------------}
Procedure drawMouse;
begin
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_TEXTURE_2D);
glcolor4f(1,1,1,1);
glBegin(GL_QUADS);
glTexCoord(40/128, 64/128); glVertex(Mouse.X, Mouse.Y, 1);
glTexCoord(72/128, 64/128); glVertex(Mouse.X+32, Mouse.Y, 1);
glTexCoord(72/128, 32/128); glVertex(Mouse.X+32, Mouse.Y-32, 1);
glTexCoord(40/128, 32/128); glVertex(Mouse.X, Mouse.Y-32, 1);
glEnd();
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
end;
{------------------------------------------------------------------}
{ Procedure to check if the user clicked in a window or object }
{------------------------------------------------------------------}
function onMouseDown(Wnd : PWindow) : boolean;
var WndClick : Boolean;
I, J : Integer;
MouseX, MouseY : Integer;
begin
if Wnd.Visible = FALSE then
exit;
if MouseDrag.Drag then
begin
MouseDrag.Window^.X :=MouseDrag.X + Mouse.X;
MouseDrag.Window^.Y :=MouseDrag.Y - Mouse.Y + window.Height;
onMouseDown :=TRUE;
exit;
end;
WndClick :=FALSE;
// First check child windows since they can be on top.
for I :=0 to High(Wnd.ChildWindow) do
if (Wnd.ChildWindow[I].Visible) AND (wndClick = FALSE) then
wndClick := onMouseDown(Wnd.ChildWindow[I]);
if WndCLick then
begin
onMouseDown :=TRUE;
exit;
end;
// test to see if user clicked in a window
MouseX :=Mouse.X;
MouseY :=Window.Height - Mouse.Y - window.CaptionBarHeight;
if (MouseX > Wnd.X) AND (MouseX < Wnd.X + Wnd.Width) then
if (MouseY > Wnd.Y) AND (MouseY < Wnd.Y + Wnd.Height) then
WndClick :=TRUE;
// if something inside the window was clicked, then find the object
if WndClick then
begin
onMouseDown :=TRUE;
// Test to see if user clicked on window close icon
if (MouseX > Wnd.X + Wnd.Width-22) AND (MouseX < Wnd.X + Wnd.Width-6) then
if (MouseY > Wnd.Y+8) AND (MouseY < Wnd.Y + 24) then
begin
Wnd.Visible :=FALSE;
exit;
end;
// Test to see if user clicked in caption bar
if (MouseX > Wnd.X) AND (MouseX < Wnd.X + Wnd.Width) then
if (MouseY > Wnd.Y+1) AND (MouseY < Wnd.Y + 26) then
begin
MouseDrag.Drag :=TRUE;
MouseDrag.X :=Wnd.X - Mouse.X;
MouseDrag.Y :=Wnd.Y - (Window.Height - Mouse.Y);
MouseDrag.Window := Wnd;
exit;
end;
// recalculate coordinates relative to window
MouseX :=MouseX - Wnd.X;
MouseY :=MouseY - Wnd.Y;
// Test and execute button click
for I :=0 to High(Wnd.Button) do
begin
if (MouseX > Wnd.Button[I].X) AND (MouseX < Wnd.Button[I].X + Wnd.Button[I].Width) then
if (MouseY > Wnd.Button[I].Y) AND (MouseY < Wnd.Button[I].Y + Wnd.Button[I].Height) then
begin
Wnd.Button[I].Pressed :=TRUE;
ButtonPressed := @Wnd.Button[I];
exit;
end;
end;
// Test and execute checkbox click
for I :=0 to High(Wnd.CheckBox) do
begin
if (MouseX > Wnd.CheckBox[I].X) AND (MouseX < Wnd.CheckBox[I].X + 16) then
if (MouseY > Wnd.CheckBox[I].Y) AND (MouseY < Wnd.CheckBox[I].Y + 16) then
begin
Wnd.CheckBox[I].Checked :=NOT(Wnd.CheckBox[I].Checked);
if Assigned(Wnd.CheckBox[I].onClick) then // if there is a click procedure, run it
Wnd.CheckBox[I].onClick;
exit;
end;
end;
// Test and execute RadioButton click
for I :=0 to High(Wnd.RadioButton) do
begin
if (MouseX > Wnd.RadioButton[I].X) AND (MouseX < Wnd.RadioButton[I].X + 16) then
if (MouseY > Wnd.RadioButton[I].Y) AND (MouseY < Wnd.RadioButton[I].Y + 16) then
begin
// uncheck all the other radio buttons in this group
for J :=0 to High(Wnd.RadioButton) do
if Wnd.RadioButton[J].Group = Wnd.RadioButton[I].Group then
Wnd.RadioButton[J].Checked :=FALSE;
Wnd.RadioButton[I].Checked :=TRUE;
if Assigned(Wnd.RadioButton[I].onClick) then // if there is a click procedure, run it
Wnd.RadioButton[I].onClick;
exit;
end;
end;
end;
onMouseDown :=WndClick;
end;
{------------------------------------------------------------------}
{ Event that runs when mouse button is released }
{------------------------------------------------------------------}
procedure onMouseUp;
begin
MouseDrag.Drag :=FALSE;
Mouse.Button :=0;
if ButtonPressed <> nil then
ButtonPressed.Pressed :=FALSE;
if ButtonPressed <> nil then
begin
// if there is a click procedure, run it.
if Assigned(ButtonPressed^.onClick) then
ButtonPressed^.onClick;
ButtonPressed.Pressed :=FALSE;
end
end;
end.