summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: fe1782e)
raw | patch | inline | side by side (parent: fe1782e)
author | DeaDDooMER <deaddoomer@deadsoftware.ru> | |
Mon, 31 Jan 2022 17:15:35 +0000 (20:15 +0300) | ||
committer | DeaDDooMER <deaddoomer@deadsoftware.ru> | |
Fri, 9 Jun 2023 08:09:07 +0000 (11:09 +0300) |
src/game/Doom2DF.lpr | patch | blob | history | |
src/game/g_gui.pas | patch | blob | history | |
src/game/g_menu.pas | patch | blob | history | |
src/game/opengl/r_game.pas | patch | blob | history | |
src/game/opengl/r_gui.pas | [new file with mode: 0644] | patch | blob |
src/game/opengl/r_render.pas | patch | blob | history |
diff --git a/src/game/Doom2DF.lpr b/src/game/Doom2DF.lpr
index 4d4edc34d03d854e0091387e3f92fdb7a8dd469a..84b47a70f9d66bf71c9dea21a2fc00a7ec3585fd 100644 (file)
--- a/src/game/Doom2DF.lpr
+++ b/src/game/Doom2DF.lpr
{$IFDEF ENABLE_MENU}
g_gui in 'g_gui.pas',
g_menu in 'g_menu.pas',
+ r_gui in 'opengl/r_gui.pas',
{$ENDIF}
{$ENDIF}
g_Game_Init;
{$IFDEF ENABLE_MENU}
g_Menu_Init;
- g_GUI_Init;
{$ENDIF}
g_Game_Process_Params;
// TODO reload GAME textures
diff --git a/src/game/g_gui.pas b/src/game/g_gui.pas
index fe15869bee62b7ab781b7d04015caf5a7285c987..7e1c60353a920c72263a2f8e0cf04ee6e5b47a2d 100644 (file)
--- a/src/game/g_gui.pas
+++ b/src/game/g_gui.pas
uses
{$IFDEF USE_MEMPOOL}mempool,{$ENDIF}
- g_base, r_graphics, e_input, e_log, g_playermodel, g_basic, MAPDEF, utils;
+ g_base, e_input, e_log, g_playermodel, g_basic, MAPDEF, utils;
const
MAINMENU_HEADER_COLOR: TRGB = (R:255; G:255; B:255);
KEYREAD_TIMEOUT = 24;
MAPPREVIEW_WIDTH = 8;
MAPPREVIEW_HEIGHT = 8;
- BOX1 = 'BOX1';
- BOX2 = 'BOX2';
- BOX3 = 'BOX3';
- BOX4 = 'BOX4';
- BOX5 = 'BOX5';
- BOX6 = 'BOX6';
- BOX7 = 'BOX7';
- BOX8 = 'BOX8';
- BOX9 = 'BOX9';
BSCROLL_UPA = 'BSCROLL_UP_A';
BSCROLL_UPU = 'BSCROLL_UP_U';
BSCROLL_DOWNA = 'BSCROLL_DOWN_A';
TFont = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF}
private
- ID: DWORD;
+ FID: DWORD;
FScale: Single;
FFontType: TFontType;
public
procedure Draw(X, Y: Integer; Text: string; R, G, B: Byte);
procedure GetTextSize(Text: string; var w, h: Word);
property Scale: Single read FScale write FScale;
+ property ID: DWORD read FID;
end;
TGUIControl = class;
constructor Create;
procedure OnMessage(var Msg: TMessage); virtual;
procedure Update; virtual;
- procedure Draw; virtual;
function GetWidth(): Integer; virtual;
function GetHeight(): Integer; virtual;
function WantActivationKey (key: LongInt): Boolean; virtual;
property Name: string read FName write FName;
property UserData: Pointer read FUserData write FUserData;
property RightAlign: Boolean read FRightAlign write FRightAlign; // for menu
+ property CMaxWidth: Integer read FMaxWidth;
+
+ property Window: TGUIWindow read FWindow;
end;
TGUIWindow = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF}
function AddChild(Child: TGUIControl): TGUIControl;
procedure OnMessage(var Msg: TMessage);
procedure Update;
- procedure Draw;
procedure SetActive(Control: TGUIControl);
function GetControl(Name: string): TGUIControl;
property OnKeyDown: TOnKeyDownEvent read FOnKeyDown write FOnKeyDown;
property BackTexture: string read FBackTexture write FBackTexture;
property MainWindow: Boolean read FMainWindow write FMainWindow;
property UserData: Pointer read FUserData write FUserData;
+
+ property ActiveControl: TGUIControl read FActiveControl;
end;
TGUITextButton = class(TGUIControl)
destructor Destroy(); override;
procedure OnMessage(var Msg: TMessage); override;
procedure Update(); override;
- procedure Draw(); override;
- function GetWidth(): Integer; override;
- function GetHeight(): Integer; override;
procedure Click(Silent: Boolean = False);
property Caption: string read FText write FText;
property Color: TRGB read FColor write FColor;
public
constructor Create(Text: string; FontID: DWORD);
procedure OnMessage(var Msg: TMessage); override;
- procedure Draw; override;
- function GetWidth: Integer; override;
- function GetHeight: Integer; override;
property OnClick: TOnClickEvent read FOnClickEvent write FOnClickEvent;
property FixedLength: Word read FFixedLen write FFixedLen;
property Text: string read FText write FText;
private
FValue: Integer;
FMax: Word;
- FLeftID: DWORD;
- FRightID: DWORD;
- FMiddleID: DWORD;
- FMarkerID: DWORD;
FOnChangeEvent: TOnChangeEvent;
procedure FSetValue(a: Integer);
public
constructor Create();
procedure OnMessage(var Msg: TMessage); override;
procedure Update; override;
- procedure Draw; override;
- function GetWidth(): Integer; override;
property OnChange: TOnChangeEvent read FOnChangeEvent write FOnChangeEvent;
property Max: Word read FMax write FMax;
property Value: Integer read FValue write FSetValue;
- end;
+ end;
+
+ TGUIItemsList = array of string;
TGUISwitch = class(TGUIControl)
private
FFont: TFont;
- FItems: array of string;
+ FItems: TGUIItemsList;
FIndex: Integer;
FColor: TRGB;
FOnChangeEvent: TOnChangeEvent;
procedure OnMessage(var Msg: TMessage); override;
procedure AddItem(Item: string);
procedure Update; override;
- procedure Draw; override;
- function GetWidth(): Integer; override;
function GetText: string;
property ItemIndex: Integer read FIndex write FIndex;
property Color: TRGB read FColor write FColor;
property Font: TFont read FFont write FFont;
property OnChange: TOnChangeEvent read FOnChangeEvent write FOnChangeEvent;
+ property Items: TGUIItemsList read FItems;
end;
TGUIEdit = class(TGUIControl)
FText: string;
FColor: TRGB;
FOnlyDigits: Boolean;
- FLeftID: DWORD;
- FRightID: DWORD;
- FMiddleID: DWORD;
FOnChangeEvent: TOnChangeEvent;
FOnEnterEvent: TOnEnterEvent;
FInvalid: Boolean;
constructor Create(FontID: DWORD);
procedure OnMessage(var Msg: TMessage); override;
procedure Update; override;
- procedure Draw; override;
- function GetWidth(): Integer; override;
property OnChange: TOnChangeEvent read FOnChangeEvent write FOnChangeEvent;
property OnEnter: TOnEnterEvent read FOnEnterEvent write FOnEnterEvent;
property Width: Word read FWidth write FWidth;
property Color: TRGB read FColor write FColor;
property Font: TFont read FFont write FFont;
property Invalid: Boolean read FInvalid write FInvalid;
+
+ property CaretPos: Integer read FCaretPos;
end;
TGUIKeyRead = class(TGUIControl)
public
constructor Create(FontID: DWORD);
procedure OnMessage(var Msg: TMessage); override;
- procedure Draw; override;
- function GetWidth(): Integer; override;
function WantActivationKey (key: LongInt): Boolean; override;
property Key: Word read FKey write FKey;
property Color: TRGB read FColor write FColor;
property Font: TFont read FFont write FFont;
+
+ property IsQuery: Boolean read FIsQuery;
end;
// can hold two keys
public
constructor Create(FontID: DWORD);
procedure OnMessage(var Msg: TMessage); override;
- procedure Draw; override;
- function GetWidth(): Integer; override;
function WantActivationKey (key: LongInt): Boolean; override;
property Key0: Word read FKey0 write FKey0;
property Key1: Word read FKey1 write FKey1;
property Color: TRGB read FColor write FColor;
property Font: TFont read FFont write FFont;
+
+ property IsQuery: Boolean read FIsQuery;
+ property MaxKeyNameWdt: Integer read FMaxKeyNameWdt;
+ property KeyIdx: Integer read FKeyIdx;
end;
TGUIModelView = class(TGUIControl)
procedure NextAnim();
procedure NextWeapon();
procedure Update; override;
- procedure Draw; override;
property Model: TPlayerModel read FModel;
end;
PanelType: Word;
end;
+ TPreviewPanelArray = array of TPreviewPanel;
+
TGUIMapPreview = class(TGUIControl)
private
- FMapData: array of TPreviewPanel;
+ FMapData: TPreviewPanelArray;
FMapSize: TDFPoint;
FScale: Single;
public
procedure SetMap(Res: string);
procedure ClearMap();
procedure Update(); override;
- procedure Draw(); override;
function GetScaleStr: String;
+
+ property MapData: TPreviewPanelArray read FMapData;
+ property MapSize: TDFPoint read FMapSize;
+ property Scale: Single read FScale;
end;
TGUIImage = class(TGUIControl)
procedure SetImage(Res: string);
procedure ClearImage();
procedure Update(); override;
- procedure Draw(); override;
+
property DefaultRes: string read FDefaultRes write FDefaultRes;
+ property ImageRes: string read FImageRes;
end;
TGUIListBox = class(TGUIControl)
public
constructor Create(FontID: DWORD; Width, Height: Word);
procedure OnMessage(var Msg: TMessage); override;
- procedure Draw(); override;
procedure AddItem(Item: String);
function ItemExists (item: String): Boolean;
procedure SelectItem(Item: String);
procedure Clear();
- function GetWidth(): Integer; override;
- function GetHeight(): Integer; override;
function SelectedItem(): String;
property OnChange: TOnChangeEvent read FOnChangeEvent write FOnChangeEvent;
property ActiveColor: TRGB read FActiveColor write FActiveColor;
property UnActiveColor: TRGB read FUnActiveColor write FUnActiveColor;
property Font: TFont read FFont write FFont;
+
+ property Width: Word read FWidth;
+ property Height: Word read FHeight;
+ property StartLine: Integer read FStartLine;
end;
TGUIFileListBox = class(TGUIListBox)
public
constructor Create(FontID: DWORD; Width, Height: Word);
procedure OnMessage(var Msg: TMessage); override;
- procedure Draw; override;
procedure Clear;
- function GetWidth(): Integer; override;
- function GetHeight(): Integer; override;
procedure SetText(Text: string);
property DrawBack: Boolean read FDrawBack write FDrawBack;
property DrawScrollBar: Boolean read FDrawScroll write FDrawScroll;
property Color: TRGB read FColor write FColor;
property Font: TFont read FFont write FFont;
+
+ property Width: Word read FWidth;
+ property Height: Word read FHeight;
+ property StartLine: Integer read FStartLine;
+ property Lines: SSArray read FLines;
end;
+ TGUITextButtonList = array of TGUITextButton;
+
TGUIMainMenu = class(TGUIControl)
private
- FButtons: array of TGUITextButton;
+ FButtons: TGUITextButtonList;
FHeader: TGUILabel;
- FLogo: DWord;
FIndex: Integer;
FFontID: DWORD;
- FCounter: Byte;
- FMarkerID1: DWORD;
- FMarkerID2: DWORD;
+ FCounter: Byte; // !!! update it within render
public
- constructor Create(FontID: DWORD; Logo, Header: string);
+ constructor Create(FontID: DWORD; Header: string);
destructor Destroy; override;
procedure OnMessage(var Msg: TMessage); override;
function AddButton(fProc: Pointer; Caption: string; ShowWindow: string = ''): TGUITextButton;
procedure EnableButton(aName: string; e: Boolean);
procedure AddSpace();
procedure Update; override;
- procedure Draw; override;
+
+ property Header: TGUILabel read FHeader;
+ property Buttons: TGUITextButtonList read FButtons;
+ property Index: Integer read FIndex;
+ property Counter: Byte read FCounter;
end;
TControlType = class of TGUIControl;
ControlType: TControlType;
Control: TGUIControl;
end;
+ TMenuItemList = array of TMenuItem;
TGUIMenu = class(TGUIControl)
private
- FItems: array of TMenuItem;
+ FItems: TMenuItemList;
FHeader: TGUILabel;
FIndex: Integer;
FFontID: DWORD;
procedure ReAlign();
function GetControl(aName: string): TGUIControl;
function GetControlsText(aName: string): TGUILabel;
- procedure Draw; override;
procedure Update; override;
procedure UpdateIndex();
property Align: Boolean read FAlign write FAlign;
property Left: Integer read FLeft write FLeft;
property YesNo: Boolean read FYesNo write FYesNo;
+
+ property Header: TGUILabel read FHeader;
+ property Counter: Byte read FCounter;
+ property Index: Integer read FIndex;
+ property Items: TMenuItemList read FItems;
+ property FontID: DWORD read FFontID;
end;
var
g_ActiveWindow: TGUIWindow = nil;
g_GUIGrabInput: Boolean = False;
-procedure g_GUI_Init();
function g_GUI_AddWindow(Window: TGUIWindow): TGUIWindow;
function g_GUI_GetWindow(Name: string): TGUIWindow;
procedure g_GUI_ShowWindow(Name: string);
{$IFDEF ENABLE_TOUCH}
g_system,
{$ENDIF}
- g_sound, SysUtils, e_res, r_textures,
- g_game, Math, StrUtils, g_player, g_options, g_console, r_playermodel,
+ {$IFDEF ENABLE_RENDER}
+ r_gui, r_textures, r_graphics,
+ {$ENDIF}
+ g_sound, SysUtils, e_res,
+ g_game, Math, StrUtils, g_player, g_options, g_console,
g_map, g_weapons, xdynrec, wadreader;
var
- Box: Array [0..8] of DWORD;
Saved_Windows: SSArray;
function GetLines (text: string; FontID: DWORD; MaxWidth: Word): SSArray;
end;
end;
-procedure g_GUI_Init();
-begin
- g_Texture_Get(BOX1, Box[0]);
- g_Texture_Get(BOX2, Box[1]);
- g_Texture_Get(BOX3, Box[2]);
- g_Texture_Get(BOX4, Box[3]);
- g_Texture_Get(BOX5, Box[4]);
- g_Texture_Get(BOX6, Box[5]);
- g_Texture_Get(BOX7, Box[6]);
- g_Texture_Get(BOX8, Box[7]);
- g_Texture_Get(BOX9, Box[8]);
-end;
-
function g_GUI_Destroy(): Boolean;
var
i: Integer;
end;
end;
-procedure DrawBox(X, Y: Integer; Width, Height: Word);
-begin
- e_Draw(Box[0], X, Y, 0, False, False);
- e_DrawFill(Box[1], X+4, Y, Width*4, 1, 0, False, False);
- e_Draw(Box[2], X+4+Width*16, Y, 0, False, False);
- e_DrawFill(Box[3], X, Y+4, 1, Height*4, 0, False, False);
- e_DrawFill(Box[4], X+4, Y+4, Width, Height, 0, False, False);
- e_DrawFill(Box[5], X+4+Width*16, Y+4, 1, Height*4, 0, False, False);
- e_Draw(Box[6], X, Y+4+Height*16, 0, False, False);
- e_DrawFill(Box[7], X+4, Y+4+Height*16, Width*4, 1, 0, False, False);
- e_Draw(Box[8], X+4+Width*16, Y+4+Height*16, 0, False, False);
-end;
-
-procedure DrawScroll(X, Y: Integer; Height: Word; Up, Down: Boolean);
-var
- ID: DWORD;
-begin
- if Height < 3 then Exit;
-
- if Up then
- g_Texture_Get(BSCROLL_UPA, ID)
- else
- g_Texture_Get(BSCROLL_UPU, ID);
- e_Draw(ID, X, Y, 0, False, False);
-
- if Down then
- g_Texture_Get(BSCROLL_DOWNA, ID)
- else
- g_Texture_Get(BSCROLL_DOWNU, ID);
- e_Draw(ID, X, Y+(Height-1)*16, 0, False, False);
-
- g_Texture_Get(BSCROLL_MIDDLE, ID);
- e_DrawFill(ID, X, Y+16, 1, Height-2, 0, False, False);
-end;
-
{ TGUIWindow }
constructor TGUIWindow.Create(Name: string);
if Childs[i] <> nil then Childs[i].Update;
end;
-procedure TGUIWindow.Draw;
-var
- i: Integer;
- ID: DWORD;
- tw, th: Word;
-begin
- if FBackTexture <> '' then // Here goes code duplication from g_game.pas:DrawMenuBackground()
- if g_Texture_Get(FBackTexture, ID) then
- begin
- e_Clear(0, 0, 0);
- e_GetTextureSize(ID, @tw, @th);
- if tw = th then
- tw := round(tw * 1.333 * (gScreenHeight / th))
- else
- tw := trunc(tw * (gScreenHeight / th));
- e_DrawSize(ID, (gScreenWidth - tw) div 2, 0, 0, False, False, tw, gScreenHeight);
- end
- else
- e_Clear(0.5, 0.5, 0.5);
-
- // small hack here
- if FName = 'AuthorsMenu' then
- e_DarkenQuadWH(0, 0, gScreenWidth, gScreenHeight, 150);
-
- for i := 0 to High(Childs) do
- if Childs[i] <> nil then Childs[i].Draw;
-end;
-
procedure TGUIWindow.OnMessage(var Msg: TMessage);
begin
if FActiveControl <> nil then FActiveControl.OnMessage(Msg);
begin
end;
-procedure TGUIControl.Draw();
-begin
-end;
-
function TGUIControl.WantActivationKey (key: LongInt): Boolean;
begin
result := false;
end;
-function TGUIControl.GetWidth(): Integer;
-begin
- result := 0;
-end;
+ function TGUIControl.GetWidth (): Integer;
+ {$IFDEF ENABLE_RENDER}
+ var h: Integer;
+ {$ENDIF}
+ begin
+ {$IFDEF ENABLE_RENDER}
+ r_GUI_GetSize(Self, Result, h);
+ {$ELSE}
+ Result := 0;
+ {$ENDIF}
+ end;
-function TGUIControl.GetHeight(): Integer;
-begin
- result := 0;
-end;
+ function TGUIControl.GetHeight (): Integer;
+ {$IFDEF ENABLE_RENDER}
+ var w: Integer;
+ {$ENDIF}
+ begin
+ {$IFDEF ENABLE_RENDER}
+ r_GUI_GetSize(Self, w, Result);
+ {$ELSE}
+ Result := 0;
+ {$ENDIF}
+ end;
{ TGUITextButton }
inherited;
end;
-procedure TGUITextButton.Draw;
-begin
- FFont.Draw(FX, FY, FText, FColor.R, FColor.G, FColor.B)
-end;
-
-function TGUITextButton.GetHeight: Integer;
-var
- w, h: Word;
-begin
- FFont.GetTextSize(FText, w, h);
- Result := h;
-end;
-
-function TGUITextButton.GetWidth: Integer;
-var
- w, h: Word;
-begin
- FFont.GetTextSize(FText, w, h);
- Result := w;
-end;
-
procedure TGUITextButton.OnMessage(var Msg: TMessage);
begin
if not FEnabled then Exit;
constructor TFont.Create(FontID: DWORD; FontType: TFontType);
begin
- ID := FontID;
-
+ FID := FontID;
FScale := 1;
FFontType := FontType;
end;
@@ -1113,6 +1026,7 @@ function TGUIMainMenu.AddButton(fProc: Pointer; Caption: string; ShowWindow: str
var
a, _x: Integer;
h, hh: Word;
+ lw: Word = 0;
lh: Word = 0;
begin
FIndex := 0;
if FButtons[a] <> nil then
_x := Min(_x, (gScreenWidth div 2)-(FButtons[a].GetWidth div 2));
- if FLogo <> 0 then e_GetTextureSize(FLogo, nil, @lh);
+ if FHeader = nil then
+ r_GUI_GetLogoSize(lw, lh);
hh := FButtons[High(FButtons)].GetHeight;
- if FLogo <> 0 then h := lh + hh * (1 + Length(FButtons)) + MAINMENU_SPACE * (Length(FButtons) - 1)
+ if FHeader = nil then h := lh + hh * (1 + Length(FButtons)) + MAINMENU_SPACE * (Length(FButtons) - 1)
else h := hh * (2 + Length(FButtons)) + MAINMENU_SPACE * (Length(FButtons) - 1);
h := (gScreenHeight div 2) - (h div 2);
FY := h;
end;
- if FLogo <> 0 then Inc(h, lh)
+ if FHeader = nil then Inc(h, lh)
else Inc(h, hh*2);
for a := 0 to High(FButtons) do
FButtons[High(FButtons)] := nil;
end;
-constructor TGUIMainMenu.Create(FontID: DWORD; Logo, Header: string);
+constructor TGUIMainMenu.Create(FontID: DWORD; Header: string);
begin
inherited Create();
FFontID := FontID;
FCounter := MAINMENU_MARKERDELAY;
- g_Texture_Get(MAINMENU_MARKER1, FMarkerID1);
- g_Texture_Get(MAINMENU_MARKER2, FMarkerID2);
-
- if not g_Texture_Get(Logo, FLogo) then
+ if Header <> '' then
begin
FHeader := TGUILabel.Create(Header, FFontID);
with FHeader do
inherited;
end;
-procedure TGUIMainMenu.Draw;
-var
- a: Integer;
- w, h: Word;
-
-begin
- inherited;
-
- if FHeader <> nil then FHeader.Draw
- else begin
- e_GetTextureSize(FLogo, @w, @h);
- e_Draw(FLogo, ((gScreenWidth div 2) - (w div 2)), FButtons[0].FY - FButtons[0].GetHeight - h, 0, True, False);
- end;
-
- if FButtons <> nil then
- begin
- for a := 0 to High(FButtons) do
- if FButtons[a] <> nil then FButtons[a].Draw;
-
- if FIndex <> -1 then
- e_Draw(FMarkerID1, FButtons[FIndex].FX-48, FButtons[FIndex].FY, 0, True, False);
- end;
-end;
-
procedure TGUIMainMenu.EnableButton(aName: string; e: Boolean);
var
a: Integer;
end;
procedure TGUIMainMenu.Update;
-var
- t: DWORD;
begin
inherited;
-
- if FCounter = 0 then
- begin
- t := FMarkerID1;
- FMarkerID1 := FMarkerID2;
- FMarkerID2 := t;
-
- FCounter := MAINMENU_MARKERDELAY;
- end else Dec(FCounter);
+ FCounter := (FCounter + 1) MOD (2 * MAINMENU_MARKERDELAY)
end;
{ TGUILabel }
FOnClickEvent := nil;
end;
-procedure TGUILabel.Draw;
-var
- w, h: Word;
-begin
- if RightAlign then
- begin
- FFont.GetTextSize(FText, w, h);
- FFont.Draw(FX+FMaxWidth-w, FY, FText, FColor.R, FColor.G, FColor.B);
- end
- else
- begin
- FFont.Draw(FX, FY, FText, FColor.R, FColor.G, FColor.B);
- end;
-end;
-
-function TGUILabel.GetHeight: Integer;
-var
- w, h: Word;
-begin
- FFont.GetTextSize(FText, w, h);
- Result := h;
-end;
-
-function TGUILabel.GetWidth: Integer;
-var
- w, h: Word;
-begin
- if FFixedLen = 0 then
- FFont.GetTextSize(FText, w, h)
- else
- w := e_CharFont_GetMaxWidth(FFont.ID)*FFixedLen;
- Result := w;
-end;
-
procedure TGUILabel.OnMessage(var Msg: TMessage);
begin
if not FEnabled then Exit;
inherited;
end;
-procedure TGUIMenu.Draw;
-var
- a, locx, locy: Integer;
-begin
- inherited;
-
- if FHeader <> nil then FHeader.Draw;
-
- if FItems <> nil then
- for a := 0 to High(FItems) do
- begin
- if FItems[a].Text <> nil then FItems[a].Text.Draw;
- if FItems[a].Control <> nil then FItems[a].Control.Draw;
- end;
-
- if (FIndex <> -1) and (FCounter > MENU_MARKERDELAY div 2) then
- begin
- locx := 0;
- locy := 0;
-
- if FItems[FIndex].Text <> nil then
- begin
- locx := FItems[FIndex].Text.FX;
- locy := FItems[FIndex].Text.FY;
- //HACK!
- if FItems[FIndex].Text.RightAlign then
- begin
- locx := locx+FItems[FIndex].Text.FMaxWidth-FItems[FIndex].Text.GetWidth;
- end;
- end
- else if FItems[FIndex].Control <> nil then
- begin
- locx := FItems[FIndex].Control.FX;
- locy := FItems[FIndex].Control.FY;
- end;
-
- locx := locx-e_CharFont_GetMaxWidth(FFontID);
-
- e_CharFont_PrintEx(FFontID, locx, locy, #16, _RGB(255, 0, 0));
- end;
-end;
-
function TGUIMenu.GetControl(aName: String): TGUIControl;
var
a: Integer;
FMax := 0;
FOnChangeEvent := nil;
-
- g_Texture_Get(SCROLL_LEFT, FLeftID);
- g_Texture_Get(SCROLL_RIGHT, FRightID);
- g_Texture_Get(SCROLL_MIDDLE, FMiddleID);
- g_Texture_Get(SCROLL_MARKER, FMarkerID);
-end;
-
-procedure TGUIScroll.Draw;
-var
- a: Integer;
-begin
- inherited;
-
- e_Draw(FLeftID, FX, FY, 0, True, False);
- e_Draw(FRightID, FX+8+(FMax+1)*8, FY, 0, True, False);
-
- for a := 0 to FMax do
- e_Draw(FMiddleID, FX+8+a*8, FY, 0, True, False);
-
- e_Draw(FMarkerID, FX+8+FValue*8, FY, 0, True, False);
end;
procedure TGUIScroll.FSetValue(a: Integer);
if a > FMax then FValue := FMax else FValue := a;
end;
-function TGUIScroll.GetWidth: Integer;
-begin
- Result := 16+(FMax+1)*8;
-end;
-
procedure TGUIScroll.OnMessage(var Msg: TMessage);
begin
if not FEnabled then Exit;
FFont := TFont.Create(FontID, TFontType.Character);
end;
-procedure TGUISwitch.Draw;
-begin
- inherited;
-
- FFont.Draw(FX, FY, FItems[FIndex], FColor.R, FColor.G, FColor.B);
-end;
-
function TGUISwitch.GetText: string;
begin
if FIndex <> -1 then Result := FItems[FIndex]
else Result := '';
end;
-function TGUISwitch.GetWidth: Integer;
-var
- a: Integer;
- w, h: Word;
-begin
- Result := 0;
-
- if FItems = nil then Exit;
-
- for a := 0 to High(FItems) do
- begin
- FFont.GetTextSize(FItems[a], w, h);
- if w > Result then Result := w;
- end;
-end;
-
procedure TGUISwitch.OnMessage(var Msg: TMessage);
begin
if not FEnabled then Exit;
FMaxLength := 0;
FWidth := 0;
FInvalid := false;
-
- g_Texture_Get(EDIT_LEFT, FLeftID);
- g_Texture_Get(EDIT_RIGHT, FRightID);
- g_Texture_Get(EDIT_MIDDLE, FMiddleID);
-end;
-
-procedure TGUIEdit.Draw;
-var
- c, w, h: Word;
- r, g, b: Byte;
-begin
- inherited;
-
- e_Draw(FLeftID, FX, FY, 0, True, False);
- e_Draw(FRightID, FX+8+FWidth*16, FY, 0, True, False);
-
- for c := 0 to FWidth-1 do
- e_Draw(FMiddleID, FX+8+c*16, FY, 0, True, False);
-
- r := FColor.R;
- g := FColor.G;
- b := FColor.B;
- if FInvalid and (FWindow.FActiveControl <> self) then begin r := 128; g := 128; b := 128; end;
- FFont.Draw(FX+8, FY, FText, r, g, b);
-
- if (FWindow.FActiveControl = self) then
- begin
- FFont.GetTextSize(Copy(FText, 1, FCaretPos), w, h);
- h := e_CharFont_GetMaxHeight(FFont.ID);
- e_DrawLine(2, FX+8+w, FY+h-3, FX+8+w+EDIT_CURSORLEN, FY+h-3,
- EDIT_CURSORCOLOR.R, EDIT_CURSORCOLOR.G, EDIT_CURSORCOLOR.B);
- end;
-end;
-
-function TGUIEdit.GetWidth: Integer;
-begin
- Result := 16+FWidth*16;
end;
procedure TGUIEdit.OnMessage(var Msg: TMessage);
FFont := TFont.Create(FontID, TFontType.Character);
end;
-procedure TGUIKeyRead.Draw;
-begin
- inherited;
-
- FFont.Draw(FX, FY, IfThen(FIsQuery, KEYREAD_QUERY, IfThen(FKey <> 0, e_KeyNames[FKey], KEYREAD_CLEAR)),
- FColor.R, FColor.G, FColor.B);
-end;
-
-function TGUIKeyRead.GetWidth: Integer;
-var
- a: Byte;
- w, h: Word;
-begin
- Result := 0;
-
- for a := 0 to 255 do
- begin
- FFont.GetTextSize(e_KeyNames[a], w, h);
- Result := Max(Result, w);
- end;
-
- FFont.GetTextSize(KEYREAD_QUERY, w, h);
- if w > Result then Result := w;
-
- FFont.GetTextSize(KEYREAD_CLEAR, w, h);
- if w > Result then Result := w;
-end;
-
function TGUIKeyRead.WantActivationKey (key: LongInt): Boolean;
begin
result :=
if w > FMaxKeyNameWdt then FMaxKeyNameWdt := w;
end;
-procedure TGUIKeyRead2.Draw;
- procedure drawText (idx: Integer);
- var
- x, y: Integer;
- r, g, b: Byte;
- kk: DWORD;
- begin
- if idx = 0 then kk := FKey0 else kk := FKey1;
- y := FY;
- if idx = 0 then x := FX+8 else x := FX+8+FMaxKeyNameWdt+16;
- r := 255;
- g := 0;
- b := 0;
- if FKeyIdx = idx then begin r := 255; g := 255; b := 255; end;
- if FIsQuery and (FKeyIdx = idx) then
- FFont.Draw(x, y, KEYREAD_QUERY, r, g, b)
- else
- FFont.Draw(x, y, IfThen(kk <> 0, e_KeyNames[kk], KEYREAD_CLEAR), r, g, b);
- end;
-
-begin
- inherited;
-
- //FFont.Draw(FX+8, FY, IfThen(FIsQuery and (FKeyIdx = 0), KEYREAD_QUERY, IfThen(FKey0 <> 0, e_KeyNames[FKey0], KEYREAD_CLEAR)), FColor.R, FColor.G, FColor.B);
- //FFont.Draw(FX+8+FMaxKeyNameWdt+16, FY, IfThen(FIsQuery and (FKeyIdx = 1), KEYREAD_QUERY, IfThen(FKey1 <> 0, e_KeyNames[FKey1], KEYREAD_CLEAR)), FColor.R, FColor.G, FColor.B);
- drawText(0);
- drawText(1);
-end;
-
-function TGUIKeyRead2.GetWidth: Integer;
-begin
- Result := FMaxKeyNameWdt*2+8+8+16;
-end;
-
function TGUIKeyRead2.WantActivationKey (key: LongInt): Boolean;
begin
case key of
inherited;
end;
-procedure TGUIModelView.Draw;
-begin
- inherited;
-
- DrawBox(FX, FY, 4, 4);
-
- if FModel <> nil then
- r_PlayerModel_Draw(FModel, FX+4, FY+4);
-end;
-
procedure TGUIModelView.NextAnim();
begin
if FModel = nil then
inherited;
end;
-procedure TGUIMapPreview.Draw();
-var
- a: Integer;
- r, g, b: Byte;
-begin
- inherited;
-
- DrawBox(FX, FY, MAPPREVIEW_WIDTH, MAPPREVIEW_HEIGHT);
-
- if (FMapSize.X <= 0) or (FMapSize.Y <= 0) then
- Exit;
-
- e_DrawFillQuad(FX+4, FY+4,
- FX+4 + Trunc(FMapSize.X / FScale) - 1,
- FY+4 + Trunc(FMapSize.Y / FScale) - 1,
- 32, 32, 32, 0);
-
- if FMapData <> nil then
- for a := 0 to High(FMapData) do
- with FMapData[a] do
- begin
- if X1 > MAPPREVIEW_WIDTH*16 then Continue;
- if Y1 > MAPPREVIEW_HEIGHT*16 then Continue;
-
- if X2 < 0 then Continue;
- if Y2 < 0 then Continue;
-
- if X2 > MAPPREVIEW_WIDTH*16 then X2 := MAPPREVIEW_WIDTH*16;
- if Y2 > MAPPREVIEW_HEIGHT*16 then Y2 := MAPPREVIEW_HEIGHT*16;
-
- if X1 < 0 then X1 := 0;
- if Y1 < 0 then Y1 := 0;
-
- case PanelType of
- PANEL_WALL:
- begin
- r := 255;
- g := 255;
- b := 255;
- end;
- PANEL_CLOSEDOOR:
- begin
- r := 255;
- g := 255;
- b := 0;
- end;
- PANEL_WATER:
- begin
- r := 0;
- g := 0;
- b := 192;
- end;
- PANEL_ACID1:
- begin
- r := 0;
- g := 176;
- b := 0;
- end;
- PANEL_ACID2:
- begin
- r := 176;
- g := 0;
- b := 0;
- end;
- else
- begin
- r := 128;
- g := 128;
- b := 128;
- end;
- end;
-
- if ((X2-X1) > 0) and ((Y2-Y1) > 0) then
- e_DrawFillQuad(FX+4 + X1, FY+4 + Y1,
- FX+4 + X2 - 1, FY+4 + Y2 - 1, r, g, b, 0);
- end;
-end;
-
procedure TGUIMapPreview.OnMessage(var Msg: TMessage);
begin
inherited;
FDrawScroll := True;
end;
-procedure TGUIListBox.Draw;
-var
- w2, h2: Word;
- a: Integer;
- s: string;
-begin
- inherited;
-
- if FDrawBack then DrawBox(FX, FY, FWidth+1, FHeight);
- if FDrawScroll then
- DrawScroll(FX+4+FWidth*16, FY+4, FHeight, (FStartLine > 0) and (FItems <> nil),
- (FStartLine+FHeight-1 < High(FItems)) and (FItems <> nil));
-
- if FItems <> nil then
- for a := FStartLine to Min(High(FItems), FStartLine+FHeight-1) do
- begin
- s := Items[a];
-
- FFont.GetTextSize(s, w2, h2);
- while (Length(s) > 0) and (w2 > FWidth*16) do
- begin
- SetLength(s, Length(s)-1);
- FFont.GetTextSize(s, w2, h2);
- end;
-
- if a = FIndex then
- FFont.Draw(FX+4, FY+4+(a-FStartLine)*16, s, FActiveColor.R, FActiveColor.G, FActiveColor.B)
- else
- FFont.Draw(FX+4, FY+4+(a-FStartLine)*16, s, FUnActiveColor.R, FUnActiveColor.G, FUnActiveColor.B);
- end;
-end;
-
-function TGUIListBox.GetHeight: Integer;
-begin
- Result := 8+FHeight*16;
-end;
-
-function TGUIListBox.GetWidth: Integer;
-begin
- Result := 8+(FWidth+1)*16;
-end;
-
procedure TGUIListBox.OnMessage(var Msg: TMessage);
var
a: Integer;
FDrawScroll := True;
end;
-procedure TGUIMemo.Draw;
-var
- a: Integer;
-begin
- inherited;
-
- if FDrawBack then DrawBox(FX, FY, FWidth+1, FHeight);
- if FDrawScroll then
- DrawScroll(FX+4+FWidth*16, FY+4, FHeight, (FStartLine > 0) and (FLines <> nil),
- (FStartLine+FHeight-1 < High(FLines)) and (FLines <> nil));
-
- if FLines <> nil then
- for a := FStartLine to Min(High(FLines), FStartLine+FHeight-1) do
- FFont.Draw(FX+4, FY+4+(a-FStartLine)*16, FLines[a], FColor.R, FColor.G, FColor.B);
-end;
-
-function TGUIMemo.GetHeight: Integer;
-begin
- Result := 8+FHeight*16;
-end;
-
-function TGUIMemo.GetWidth: Integer;
-begin
- Result := 8+(FWidth+1)*16;
-end;
-
procedure TGUIMemo.OnMessage(var Msg: TMessage);
begin
if not FEnabled then Exit;
inherited;
end;
-procedure TGUIimage.Draw();
-var
- ID: DWORD;
-begin
- inherited;
-
- if FImageRes = '' then
- begin
- if g_Texture_Get(FDefaultRes, ID) then e_Draw(ID, FX, FY, 0, True, False);
- end
- else
- if g_Texture_Get(FImageRes, ID) then e_Draw(ID, FX, FY, 0, True, False);
-end;
-
procedure TGUIimage.OnMessage(var Msg: TMessage);
begin
inherited;
diff --git a/src/game/g_menu.pas b/src/game/g_menu.pas
index 5084420bb4baecac491241ba71b8974d8f1ba2dd..ffd2c9bab51fed4fa54d85f21ea1751ce5af3964 100644 (file)
--- a/src/game/g_menu.pas
+++ b/src/game/g_menu.pas
{$IFDEF ENABLE_CORPSES}
g_corpses,
{$ENDIF}
- g_gui, r_textures, r_graphics, g_game, g_map,
+ {$IFDEF ENABLE_RENDER}
+ r_render, r_game,
+ {$ENDIF}
+ {$IFDEF ENABLE_SYSTEM}
+ g_system,
+ {$ENDIF}
+ g_gui, g_game, g_map,
g_base, g_basic, g_console, g_sound, g_player, g_options, g_weapons,
e_log, SysUtils, CONFIG, g_playermodel, DateUtils,
MAPDEF, Math, g_saveload,
g_language, e_res,
g_net, g_netmsg, g_netmaster, g_items, e_input,
- utils, wadreader, g_system, r_render, r_game;
+ utils, wadreader;
type TYNCallback = procedure (yes:Boolean);
slWaitStr := _lc[I_NET_SLIST_WAIT];
- r_Render_Draw;
- sys_Repaint;
+ {$IFDEF ENABLE_RENDER}
+ r_Render_Draw;
+ {$ENDIF}
+ {$IFDEF ENABLE_SYSTEM}
+ sys_Repaint;
+ {$ENDIF}
slReturnPressed := True;
if g_Net_Slist_Fetch(slCurrent) then
begin
e_WriteLog('Loading menu data...', TMsgType.Notify);
- g_Texture_CreateWADEx('MAINMENU_LOGO', GameWAD+':TEXTURES\MAINLOGO');
- g_Texture_CreateWADEx('MAINMENU_MARKER1', GameWAD+':TEXTURES\MARKER1');
- g_Texture_CreateWADEx('MAINMENU_MARKER2', GameWAD+':TEXTURES\MARKER2');
- g_Texture_CreateWADEx('SCROLL_LEFT', GameWAD+':TEXTURES\SLEFT');
- g_Texture_CreateWADEx('SCROLL_RIGHT', GameWAD+':TEXTURES\SRIGHT');
- g_Texture_CreateWADEx('SCROLL_MIDDLE', GameWAD+':TEXTURES\SMIDDLE');
- g_Texture_CreateWADEx('SCROLL_MARKER', GameWAD+':TEXTURES\SMARKER');
- g_Texture_CreateWADEx('EDIT_LEFT', GameWAD+':TEXTURES\ELEFT');
- g_Texture_CreateWADEx('EDIT_RIGHT', GameWAD+':TEXTURES\ERIGHT');
- g_Texture_CreateWADEx('EDIT_MIDDLE', GameWAD+':TEXTURES\EMIDDLE');
- g_Texture_CreateWADEx('BOX1', GameWAD+':TEXTURES\BOX1');
- g_Texture_CreateWADEx('BOX2', GameWAD+':TEXTURES\BOX2');
- g_Texture_CreateWADEx('BOX3', GameWAD+':TEXTURES\BOX3');
- g_Texture_CreateWADEx('BOX4', GameWAD+':TEXTURES\BOX4');
- g_Texture_CreateWADEx('BOX5', GameWAD+':TEXTURES\BOX5');
- g_Texture_CreateWADEx('BOX6', GameWAD+':TEXTURES\BOX6');
- g_Texture_CreateWADEx('BOX7', GameWAD+':TEXTURES\BOX7');
- g_Texture_CreateWADEx('BOX8', GameWAD+':TEXTURES\BOX8');
- g_Texture_CreateWADEx('BOX9', GameWAD+':TEXTURES\BOX9');
- g_Texture_CreateWADEx('BSCROLL_UP_A', GameWAD+':TEXTURES\SCROLLUPA');
- g_Texture_CreateWADEx('BSCROLL_UP_U', GameWAD+':TEXTURES\SCROLLUPU');
- g_Texture_CreateWADEx('BSCROLL_DOWN_A', GameWAD+':TEXTURES\SCROLLDOWNA');
- g_Texture_CreateWADEx('BSCROLL_DOWN_U', GameWAD+':TEXTURES\SCROLLDOWNU');
- g_Texture_CreateWADEx('BSCROLL_MIDDLE', GameWAD+':TEXTURES\SCROLLMIDDLE');
- g_Texture_CreateWADEx('NOPIC', GameWAD+':TEXTURES\NOPIC');
-
g_Sound_CreateWADEx('MENU_SELECT', GameWAD+':SOUNDS\MENUSELECT');
g_Sound_CreateWADEx('MENU_OPEN', GameWAD+':SOUNDS\MENUOPEN');
g_Sound_CreateWADEx('MENU_CLOSE', GameWAD+':SOUNDS\MENUCLOSE');
procedure MenuFreeData();
begin
- e_CharFont_Remove(gMenuFont);
- e_CharFont_Remove(gMenuSmallFont);
-
- g_Texture_Delete('MAINMENU_LOGO');
- g_Texture_Delete('MAINMENU_MARKER1');
- g_Texture_Delete('MAINMENU_MARKER2');
- g_Texture_Delete('SCROLL_LEFT');
- g_Texture_Delete('SCROLL_RIGHT');
- g_Texture_Delete('SCROLL_MIDDLE');
- g_Texture_Delete('SCROLL_MARKER');
- g_Texture_Delete('EDIT_LEFT');
- g_Texture_Delete('EDIT_RIGHT');
- g_Texture_Delete('EDIT_MIDDLE');
- g_Texture_Delete('BOX1');
- g_Texture_Delete('BOX2');
- g_Texture_Delete('BOX3');
- g_Texture_Delete('BOX4');
- g_Texture_Delete('BOX5');
- g_Texture_Delete('BOX6');
- g_Texture_Delete('BOX7');
- g_Texture_Delete('BOX8');
- g_Texture_Delete('BOX9');
- g_Texture_Delete('BSCROLL_UP_A');
- g_Texture_Delete('BSCROLL_UP_U');
- g_Texture_Delete('BSCROLL_DOWN_A');
- g_Texture_Delete('BSCROLL_DOWN_U');
- g_Texture_Delete('BSCROLL_MIDDLE');
- g_Texture_Delete('NOPIC');
-
g_Sound_Delete('MENU_SELECT');
g_Sound_Delete('MENU_OPEN');
g_Sound_Delete('MENU_CLOSE');
begin
Menu := TGUIWindow.Create('FirstLanguageMenu');
- with TGUIMainMenu(Menu.AddChild(TGUIMainMenu.Create(gMenuFont, '', ' '))) do
+ with TGUIMainMenu(Menu.AddChild(TGUIMainMenu.Create(gMenuFont, ' '))) do // space to prevent show logo
begin
Name := 'mmFirstLanguageMenu';
AddButton(@ProcSetFirstRussianLanguage, 'Ðóññêèé', '');
//list: SSArray;
begin
Menu := TGUIWindow.Create('MainMenu');
- with TGUIMainMenu(Menu.AddChild(TGUIMainMenu.Create(gMenuFont, 'MAINMENU_LOGO', _lc[I_MENU_MAIN_MENU]))) do
+ with TGUIMainMenu(Menu.AddChild(TGUIMainMenu.Create(gMenuFont, '' (*_lc[I_MENU_MAIN_MENU]*) ))) do
begin
Name := 'mmMainMenu';
AddButton(nil, _lc[I_MENU_NEW_GAME], 'NewGameMenu');
g_GUI_AddWindow(Menu);
Menu := TGUIWindow.Create('NewGameMenu');
- with TGUIMainMenu(Menu.AddChild(TGUIMainMenu.Create(gMenuFont, '', _lc[I_MENU_NEW_GAME]))) do
+ with TGUIMainMenu(Menu.AddChild(TGUIMainMenu.Create(gMenuFont, _lc[I_MENU_NEW_GAME]))) do
begin
Name := 'mmNewGameMenu';
AddButton(@ProcSingle1Player, _lc[I_MENU_1_PLAYER]);
g_GUI_AddWindow(Menu);
Menu := TGUIWindow.Create('NetGameMenu');
- with TGUIMainMenu(Menu.AddChild(TGUIMainMenu.Create(gMenuFont, '', _lc[I_MENU_MULTIPLAYER]))) do
+ with TGUIMainMenu(Menu.AddChild(TGUIMainMenu.Create(gMenuFont, _lc[I_MENU_MULTIPLAYER]))) do
begin
Name := 'mmNetGameMenu';
AddButton(@ProcRecallAddress, _lc[I_MENU_START_CLIENT], 'NetClientMenu');
g_GUI_AddWindow(Menu);
Menu := TGUIWindow.Create('OptionsMenu');
- with TGUIMainMenu(Menu.AddChild(TGUIMainMenu.Create(gMenuFont, '', _lc[I_MENU_OPTIONS]))) do
+ with TGUIMainMenu(Menu.AddChild(TGUIMainMenu.Create(gMenuFont, _lc[I_MENU_OPTIONS]))) do
begin
Name := 'mmOptionsMenu';
AddButton(nil, _lc[I_MENU_VIDEO_OPTIONS], 'OptionsVideoMenu');
g_GUI_AddWindow(Menu);
Menu := TGUIWindow.Create('GameSingleMenu');
- with TGUIMainMenu(Menu.AddChild(TGUIMainMenu.Create(gMenuFont, '', _lc[I_MENU_MAIN_MENU]))) do
+ with TGUIMainMenu(Menu.AddChild(TGUIMainMenu.Create(gMenuFont, _lc[I_MENU_MAIN_MENU]))) do
begin
Name := 'mmGameSingleMenu';
AddButton(nil, _lc[I_MENU_LOAD_GAME], 'LoadMenu');
g_GUI_AddWindow(Menu);
Menu := TGUIWindow.Create('GameCustomMenu');
- with TGUIMainMenu(Menu.AddChild(TGUIMainMenu.Create(gMenuFont, '', _lc[I_MENU_MAIN_MENU]))) do
+ with TGUIMainMenu(Menu.AddChild(TGUIMainMenu.Create(gMenuFont, _lc[I_MENU_MAIN_MENU]))) do
begin
Name := 'mmGameCustomMenu';
AddButton(nil, _lc[I_MENU_CHANGE_PLAYERS], 'TeamMenu');
g_GUI_AddWindow(Menu);
Menu := TGUIWindow.Create('GameServerMenu');
- with TGUIMainMenu(Menu.AddChild(TGUIMainMenu.Create(gMenuFont, '', _lc[I_MENU_MAIN_MENU]))) do
+ with TGUIMainMenu(Menu.AddChild(TGUIMainMenu.Create(gMenuFont, _lc[I_MENU_MAIN_MENU]))) do
begin
Name := 'mmGameServerMenu';
AddButton(nil, _lc[I_MENU_CHANGE_PLAYERS], 'TeamMenu');
g_GUI_AddWindow(Menu);
Menu := TGUIWindow.Create('GameClientMenu');
- with TGUIMainMenu(Menu.AddChild(TGUIMainMenu.Create(gMenuFont, '', _lc[I_MENU_MAIN_MENU]))) do
+ with TGUIMainMenu(Menu.AddChild(TGUIMainMenu.Create(gMenuFont, _lc[I_MENU_MAIN_MENU]))) do
begin
Name := 'mmGameClientMenu';
AddButton(nil, _lc[I_MENU_CHANGE_PLAYERS], 'TeamMenu');
g_GUI_AddWindow(Menu);
Menu := TGUIWindow.Create('TeamMenu');
- with TGUIMainMenu(Menu.AddChild(TGUIMainMenu.Create(gMenuFont, '', _lc[I_MENU_CHANGE_PLAYERS]))) do
+ with TGUIMainMenu(Menu.AddChild(TGUIMainMenu.Create(gMenuFont, _lc[I_MENU_CHANGE_PLAYERS]))) do
begin
Name := 'mmTeamMenu';
AddButton(@ProcJoinRed, _lc[I_MENU_JOIN_RED], '').Name := 'tmJoinRed';
index ae631e1aec39677c1e37cb8e62cc73d0ca54f3f5..81ed2d311ec6d4babc0aa024f256bab4535d08a7 100644 (file)
g_holmes,
{$ENDIF}
{$IFDEF ENABLE_MENU}
- g_gui, g_menu,
+ g_gui, g_menu, r_gui,
{$ENDIF}
{$IFDEF ENABLE_GFX}
g_gfx, r_gfx,
procedure r_Game_Free;
begin
+ e_CharFont_Remove(gMenuFont);
+ e_CharFont_Remove(gMenuSmallFont);
g_Texture_Delete('NOTEXTURE');
g_Texture_Delete('TEXTURE_PLAYER_HUD');
g_Texture_Delete('TEXTURE_PLAYER_HUDBG');
//e_DrawFillQuad(0, 0, gScreenWidth-1, gScreenHeight-1, 48, 48, 48, 180);
e_DarkenQuadWH(0, 0, gScreenWidth, gScreenHeight, 150);
end;
- g_ActiveWindow.Draw();
+ r_GUI_Draw_Window(g_ActiveWindow);
end;
{$ENDIF}
diff --git a/src/game/opengl/r_gui.pas b/src/game/opengl/r_gui.pas
--- /dev/null
@@ -0,0 +1,607 @@
+(* Copyright (C) Doom 2D: Forever Developers
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License ONLY.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *)
+{$INCLUDE ../../shared/a_modes.inc}
+unit r_gui;
+
+interface
+
+ uses g_gui;
+
+ procedure r_GUI_Load;
+ procedure r_GUI_Free;
+
+ procedure r_GUI_GetSize (ctrl: TGUIControl; out w, h: Integer);
+ procedure r_GUI_GetLogoSize (out w, h: WORD);
+ procedure r_GUI_Draw_Window (win: TGUIWindow);
+
+implementation
+
+ uses
+ Classes, Math,
+ MAPDEF, utils,
+ g_basic, g_base, e_input, g_options,
+ r_graphics, r_textures, r_playermodel, r_game,
+ g_game, g_menu
+ ;
+
+ const
+ BOX1 = 'BOX1';
+ BOX2 = 'BOX2';
+ BOX3 = 'BOX3';
+ BOX4 = 'BOX4';
+ BOX5 = 'BOX5';
+ BOX6 = 'BOX6';
+ BOX7 = 'BOX7';
+ BOX8 = 'BOX8';
+ BOX9 = 'BOX9';
+
+ var
+ Box: Array [0..8] of DWORD;
+ MarkerID: array [Boolean] of DWORD;
+ ScrollLeft, ScrollRight, ScrollMiddle, ScrollMarker: DWORD;
+ EditLeft, EditRight, EditMiddle: DWORD;
+
+ Font: array [boolean] of TFont; (* Small[FALSE] / Big[TRUE] *)
+ LogoTex: DWORD;
+
+ procedure r_GUI_GetLogoSize (out w, h: WORD);
+ begin
+ w := 0;
+ h := 0;
+ if LogoTex <> 0 then
+ e_GetTextureSize(LogoTex, @w, @h);
+ end;
+
+ procedure r_GUI_Load;
+ begin
+ g_Texture_CreateWADEx('MAINMENU_LOGO', GameWAD + ':TEXTURES\MAINLOGO');
+ g_Texture_CreateWADEx('MAINMENU_MARKER1', GameWAD + ':TEXTURES\MARKER1');
+ g_Texture_CreateWADEx('MAINMENU_MARKER2', GameWAD + ':TEXTURES\MARKER2');
+ g_Texture_CreateWADEx('SCROLL_LEFT', GameWAD + ':TEXTURES\SLEFT');
+ g_Texture_CreateWADEx('SCROLL_RIGHT', GameWAD + ':TEXTURES\SRIGHT');
+ g_Texture_CreateWADEx('SCROLL_MIDDLE', GameWAD + ':TEXTURES\SMIDDLE');
+ g_Texture_CreateWADEx('SCROLL_MARKER', GameWAD + ':TEXTURES\SMARKER');
+ g_Texture_CreateWADEx('EDIT_LEFT', GameWAD + ':TEXTURES\ELEFT');
+ g_Texture_CreateWADEx('EDIT_RIGHT', GameWAD + ':TEXTURES\ERIGHT');
+ g_Texture_CreateWADEx('EDIT_MIDDLE', GameWAD + ':TEXTURES\EMIDDLE');
+ g_Texture_CreateWADEx('BOX1', GameWAD + ':TEXTURES\BOX1');
+ g_Texture_CreateWADEx('BOX2', GameWAD + ':TEXTURES\BOX2');
+ g_Texture_CreateWADEx('BOX3', GameWAD + ':TEXTURES\BOX3');
+ g_Texture_CreateWADEx('BOX4', GameWAD + ':TEXTURES\BOX4');
+ g_Texture_CreateWADEx('BOX5', GameWAD + ':TEXTURES\BOX5');
+ g_Texture_CreateWADEx('BOX6', GameWAD + ':TEXTURES\BOX6');
+ g_Texture_CreateWADEx('BOX7', GameWAD + ':TEXTURES\BOX7');
+ g_Texture_CreateWADEx('BOX8', GameWAD + ':TEXTURES\BOX8');
+ g_Texture_CreateWADEx('BOX9', GameWAD + ':TEXTURES\BOX9');
+ g_Texture_CreateWADEx('BSCROLL_UP_A', GameWAD + ':TEXTURES\SCROLLUPA');
+ g_Texture_CreateWADEx('BSCROLL_UP_U', GameWAD + ':TEXTURES\SCROLLUPU');
+ g_Texture_CreateWADEx('BSCROLL_DOWN_A', GameWAD + ':TEXTURES\SCROLLDOWNA');
+ g_Texture_CreateWADEx('BSCROLL_DOWN_U', GameWAD + ':TEXTURES\SCROLLDOWNU');
+ g_Texture_CreateWADEx('BSCROLL_MIDDLE', GameWAD + ':TEXTURES\SCROLLMIDDLE');
+ g_Texture_CreateWADEx('NOPIC', GameWAD + ':TEXTURES\NOPIC');
+
+ g_Texture_Get(MAINMENU_MARKER1, MarkerID[FALSE]);
+ g_Texture_Get(MAINMENU_MARKER2, MarkerID[TRUE]);
+
+ g_Texture_Get(BOX1, Box[0]);
+ g_Texture_Get(BOX2, Box[1]);
+ g_Texture_Get(BOX3, Box[2]);
+ g_Texture_Get(BOX4, Box[3]);
+ g_Texture_Get(BOX5, Box[4]);
+ g_Texture_Get(BOX6, Box[5]);
+ g_Texture_Get(BOX7, Box[6]);
+ g_Texture_Get(BOX8, Box[7]);
+ g_Texture_Get(BOX9, Box[8]);
+
+ g_Texture_Get(SCROLL_LEFT, ScrollLeft);
+ g_Texture_Get(SCROLL_RIGHT, ScrollRight);
+ g_Texture_Get(SCROLL_MIDDLE, ScrollMiddle);
+ g_Texture_Get(SCROLL_MARKER, ScrollMarker);
+
+ g_Texture_Get(EDIT_LEFT, EditLeft);
+ g_Texture_Get(EDIT_RIGHT, EditRight);
+ g_Texture_Get(EDIT_MIDDLE, EditMiddle);
+
+ Font[FALSE] := TFont.Create(gMenuSmallFont, TFontType.Character);
+ Font[TRUE] := TFont.Create(gMenuFont, TFontType.Character);
+
+ g_Texture_Get('MAINMENU_LOGO', LogoTex)
+ end;
+
+ procedure r_GUI_Free;
+ begin
+ g_Texture_Delete('MAINMENU_LOGO');
+ g_Texture_Delete('MAINMENU_MARKER1');
+ g_Texture_Delete('MAINMENU_MARKER2');
+ g_Texture_Delete('SCROLL_LEFT');
+ g_Texture_Delete('SCROLL_RIGHT');
+ g_Texture_Delete('SCROLL_MIDDLE');
+ g_Texture_Delete('SCROLL_MARKER');
+ g_Texture_Delete('EDIT_LEFT');
+ g_Texture_Delete('EDIT_RIGHT');
+ g_Texture_Delete('EDIT_MIDDLE');
+ g_Texture_Delete('BOX1');
+ g_Texture_Delete('BOX2');
+ g_Texture_Delete('BOX3');
+ g_Texture_Delete('BOX4');
+ g_Texture_Delete('BOX5');
+ g_Texture_Delete('BOX6');
+ g_Texture_Delete('BOX7');
+ g_Texture_Delete('BOX8');
+ g_Texture_Delete('BOX9');
+ g_Texture_Delete('BSCROLL_UP_A');
+ g_Texture_Delete('BSCROLL_UP_U');
+ g_Texture_Delete('BSCROLL_DOWN_A');
+ g_Texture_Delete('BSCROLL_DOWN_U');
+ g_Texture_Delete('BSCROLL_MIDDLE');
+ g_Texture_Delete('NOPIC');
+ end;
+
+ procedure r_GUI_GetSize_TextButton (ctrl: TGUITextButton; out w, h: Integer);
+ var ww, hh: WORD;
+ begin
+ ctrl.Font.GetTextSize(ctrl.Caption, ww, hh);
+ w := ww;
+ h := hh;
+ end;
+
+ procedure r_GUI_GetSize_Label (ctrl: TGUILabel; out w, h: Integer);
+ var ww, hh: WORD;
+ begin
+ ctrl.Font.GetTextSize(ctrl.Text, ww, hh);
+ h := hh;
+ if ctrl.FixedLength = 0 then
+ w := ww
+ else
+ w := e_CharFont_GetMaxWidth(ctrl.Font.ID) * ctrl.FixedLength
+ end;
+
+ procedure r_GUI_GetSize_Switch (ctrl: TGUISwitch; out w, h: Integer);
+ var i: Integer; ww, hh: WORD;
+ begin
+ w := 0;
+ h := 0;
+ if ctrl.Items <> nil then
+ begin
+ for i := 0 to High(ctrl.Items) do
+ begin
+ ctrl.Font.GetTextSize(ctrl.Items[i], ww, hh);
+ if ww > w then
+ w := ww;
+ end;
+ end;
+ end;
+
+ procedure r_GUI_GetSize_KeyRead (ctrl: TGUIKeyRead; out w, h: Integer);
+ var i: Integer; ww, hh: WORD;
+ begin
+ w := 0;
+ h := 0; // ??? always 0
+ for i := 0 to 255 do
+ begin
+ ctrl.Font.GetTextSize(e_KeyNames[i], ww, hh);
+ w := MAX(w, ww);
+ end;
+ ctrl.Font.GetTextSize(KEYREAD_QUERY, ww, hh);
+ if ww > w then w := ww;
+ ctrl.Font.GetTextSize(KEYREAD_CLEAR, ww, hh);
+ if ww > w then w := ww;
+ end;
+
+ procedure r_GUI_GetSize (ctrl: TGUIControl; out w, h: Integer);
+ begin
+ w := 0;
+ h := 0;
+ if ctrl is TGUITextButton then
+ r_GUI_GetSize_TextButton(ctrl as TGUITextButton, w, h)
+ else if ctrl is TGUILabel then
+ r_GUI_GetSize_Label(ctrl as TGUILabel, w, h)
+ else if ctrl is TGUIScroll then
+ w := 16 + ((ctrl as TGUIScroll).Max + 1) * 8 // ??? but h = 0
+ else if ctrl is TGUISwitch then
+ r_GUI_GetSize_Switch(ctrl as TGUISwitch, w, h)
+ else if ctrl is TGUIEdit then
+ w := 16 + (ctrl as TGUIEdit).Width * 16 // ??? but h = 0
+ else if ctrl is TGUIKeyRead then
+ r_GUI_GetSize_KeyRead(ctrl as TGUIKeyRead, w, h)
+ else if ctrl is TGUIKeyRead2 then
+ w := (ctrl as TGUIKeyRead2).MaxKeyNameWdt * 2 + 8 + 8 + 16 // ??? but h = 0
+ else if ctrl is TGUIListBox then
+ begin
+ w := 8 + ((ctrl as TGUIListBox).Width + 1) * 16; // recheck w & h
+ h := 8 + (ctrl as TGUIListBox).Height * 16;
+ end
+ else if ctrl is TGUIMemo then
+ begin
+ w := 8 + ((ctrl as TGUIMemo).Width + 1) * 16;
+ h := 8 + (ctrl as TGUIMemo).Height * 16;
+ end
+ else
+ begin
+ w := ctrl.GetWidth();
+ h := ctrl.GetHeight();
+ end;
+ end;
+
+ procedure r_GUI_Draw_Control (ctrl: TGUIControl); forward;
+
+ procedure r_GUI_Draw_TextButton (ctrl: TGUITextButton);
+ begin
+ ctrl.Font.Draw(ctrl.X, ctrl.Y, ctrl.Caption, ctrl.Color.R, ctrl.Color.G, ctrl.Color.B)
+ end;
+
+ procedure r_GUI_Draw_Label (ctrl: TGUILabel);
+ var w, h: Word;
+ begin
+ if ctrl.RightAlign then
+ begin
+ ctrl.Font.GetTextSize(ctrl.Text, w, h);
+ ctrl.Font.Draw(ctrl.X + ctrl.CMaxWidth - w, ctrl.Y, ctrl.Text, ctrl.Color.R, ctrl.Color.G, ctrl.Color.B);
+ end
+ else
+ ctrl.Font.Draw(ctrl.X, ctrl.Y, ctrl.Text, ctrl.Color.R, ctrl.Color.G, ctrl.Color.B);
+ end;
+
+ procedure r_GUI_Draw_Scroll (ctrl: TGUIScroll);
+ var a: Integer;
+ begin
+ e_Draw(ScrollLeft, ctrl.X, ctrl.Y, 0, True, False);
+ e_Draw(ScrollRight, ctrl.X + 8 + (ctrl.Max + 1) * 8, ctrl.Y, 0, True, False);
+ for a := 0 to ctrl.Max do
+ e_Draw(ScrollMiddle, ctrl.X + 8 + a * 8, ctrl.Y, 0, True, False);
+ e_Draw(ScrollMarker, ctrl.X + 8 + ctrl.Value * 8, ctrl.Y, 0, True, False);
+ end;
+
+ procedure r_GUI_Draw_Switch (ctrl: TGUISwitch);
+ begin
+ ctrl.Font.Draw(ctrl.X, ctrl.Y, ctrl.Items[ctrl.ItemIndex], ctrl.Color.R, ctrl.Color.G, ctrl.Color.B);
+ end;
+
+ procedure r_GUI_Draw_Edit (ctrl: TGUIEdit);
+ var c, w, h: Word; r, g, b: Byte;
+ begin
+ e_Draw(EditLeft, ctrl.X, ctrl.Y, 0, True, False);
+ e_Draw(EditRight, ctrl.X + 8 + ctrl.Width * 16, ctrl.Y, 0, True, False);
+ for c := 0 to ctrl.Width - 1 do
+ e_Draw(EditMiddle, ctrl.X + 8 + c * 16, ctrl.Y, 0, True, False);
+ r := ctrl.Color.R;
+ g := ctrl.Color.G;
+ b := ctrl.Color.B;
+ if ctrl.Invalid and (ctrl.Window.ActiveControl <> ctrl) then
+ begin
+ r := 128;
+ g := 128;
+ b := 128;
+ end;
+ ctrl.Font.Draw(ctrl.X + 8, ctrl.Y, ctrl.Text, r, g, b);
+ if ctrl.Window.ActiveControl = ctrl then
+ begin
+ ctrl.Font.GetTextSize(Copy(ctrl.Text, 1, ctrl.CaretPos), w, h);
+ h := e_CharFont_GetMaxHeight(ctrl.Font.ID);
+ e_DrawLine(2, ctrl.X + 8 + w, ctrl.Y + h - 3, ctrl.X + 8 + w + EDIT_CURSORLEN, ctrl.Y + h - 3, EDIT_CURSORCOLOR.R, EDIT_CURSORCOLOR.G, EDIT_CURSORCOLOR.B);
+ end;
+ end;
+
+ procedure r_GUI_Draw_KeyRead (ctrl: TGUIKeyRead);
+ var k: AnsiString;
+ begin
+ if ctrl.IsQuery then
+ k := KEYREAD_QUERY
+ else if ctrl.Key <> 0 then
+ k := e_KeyNames[ctrl.Key]
+ else
+ k := KEYREAD_CLEAR;
+ ctrl.Font.Draw(ctrl.X, ctrl.Y, k, ctrl.Color.R, ctrl.Color.G, ctrl.Color.B);
+ end;
+
+ procedure r_GUI_Draw_KeyRead2 (ctrl: TGUIKeyRead2);
+
+ procedure drawText (idx: Integer);
+ var x, y: Integer; r, g, b: Byte; kk: DWORD; str: AnsiString;
+ begin
+ if idx = 0 then kk := ctrl.Key0 else kk := ctrl.Key1;
+ y := ctrl.Y;
+ if idx = 0 then x := ctrl.X + 8 else x := ctrl.X + 8 + ctrl.MaxKeyNameWdt + 16;
+ r := 255;
+ g := 0;
+ b := 0;
+ if ctrl.KeyIdx = idx then
+ begin
+ r := 255; g := 255; b := 255;
+ end;
+ if ctrl.IsQuery and (ctrl.KeyIdx = idx) then
+ begin
+ ctrl.Font.Draw(x, y, KEYREAD_QUERY, r, g, b)
+ end
+ else
+ begin
+ if kk <> 0 then
+ str := e_KeyNames[kk]
+ else
+ str := KEYREAD_CLEAR;
+ ctrl.Font.Draw(x, y, str, r, g, b);
+ end
+ end;
+
+ begin
+ drawText(0);
+ drawText(1);
+ end;
+
+ procedure DrawBox(X, Y: Integer; Width, Height: Word);
+ begin
+ e_Draw(Box[0], X, Y, 0, False, False);
+ e_DrawFill(Box[1], X + 4, Y, Width * 4, 1, 0, False, False);
+ e_Draw(Box[2], X + 4 + Width * 16, Y, 0, False, False);
+ e_DrawFill(Box[3], X, Y + 4, 1, Height * 4, 0, False, False);
+ e_DrawFill(Box[4], X + 4, Y + 4, Width, Height, 0, False, False);
+ e_DrawFill(Box[5], X + 4 + Width * 16, Y + 4, 1, Height * 4, 0, False, False);
+ e_Draw(Box[6], X, Y + 4 + Height * 16, 0, False, False);
+ e_DrawFill(Box[7], X + 4, Y + 4 + Height * 16, Width * 4, 1, 0, False, False);
+ e_Draw(Box[8], X + 4 + Width * 16, Y + 4 + Height * 16, 0, False, False);
+ end;
+
+ procedure r_GUI_Draw_ModelView (ctrl: TGUIModelView);
+ begin
+ DrawBox(ctrl.X, ctrl.Y, 4, 4);
+ if ctrl.Model <> nil then
+ r_PlayerModel_Draw(ctrl.Model, ctrl.X + 4, ctrl.Y + 4);
+ end;
+
+ procedure r_GUI_Draw_MapPreview (ctrl: TGUIMapPreview);
+ var a: Integer; r, g, b: Byte;
+ begin
+ DrawBox(ctrl.X, ctrl.Y, MAPPREVIEW_WIDTH, MAPPREVIEW_HEIGHT);
+ if (ctrl.MapSize.X <= 0) or (ctrl.MapSize.Y <= 0) then
+ Exit;
+ e_DrawFillQuad(ctrl.X + 4, ctrl.Y + 4, ctrl.X + 4 + Trunc(ctrl.MapSize.X / ctrl.Scale) - 1, ctrl.Y + 4 + Trunc(ctrl.MapSize.Y / ctrl.Scale) - 1, 32, 32, 32, 0);
+ if ctrl.MapData <> nil then
+ for a := 0 to High(ctrl.MapData) do
+ with ctrl.MapData[a] do
+ begin
+ if X1 > MAPPREVIEW_WIDTH * 16 then Continue;
+ if Y1 > MAPPREVIEW_HEIGHT * 16 then Continue;
+ if X2 < 0 then Continue;
+ if Y2 < 0 then Continue;
+ if X2 > MAPPREVIEW_WIDTH * 16 then X2 := MAPPREVIEW_WIDTH * 16;
+ if Y2 > MAPPREVIEW_HEIGHT * 16 then Y2 := MAPPREVIEW_HEIGHT * 16;
+ if X1 < 0 then X1 := 0;
+ if Y1 < 0 then Y1 := 0;
+ case PanelType of
+ PANEL_WALL:
+ begin
+ r := 255; g := 255; b := 255;
+ end;
+ PANEL_CLOSEDOOR:
+ begin
+ r := 255; g := 255; b := 0;
+ end;
+ PANEL_WATER:
+ begin
+ r := 0; g := 0; b := 192;
+ end;
+ PANEL_ACID1:
+ begin
+ r := 0; g := 176; b := 0;
+ end;
+ PANEL_ACID2:
+ begin
+ r := 176; g := 0; b := 0;
+ end;
+ else
+ r := 128; g := 128; b := 128;
+ end;
+ if ((X2 - X1) > 0) and ((Y2 - Y1) > 0) then
+ e_DrawFillQuad(ctrl.X + 4 + X1, ctrl.Y + 4 + Y1, ctrl.X + 4 + X2 - 1, ctrl.Y + 4 + Y2 - 1, r, g, b, 0);
+ end;
+ end;
+
+ procedure r_GUI_Draw_Image (ctrl: TGUIImage);
+ var ID: DWORD;
+ begin
+ if ctrl.ImageRes = '' then
+ begin
+ if g_Texture_Get(ctrl.DefaultRes, ID) then
+ e_Draw(ID, ctrl.X, ctrl.Y, 0, True, False);
+ end
+ else
+ begin
+ if g_Texture_Get(ctrl.ImageRes, ID) then
+ e_Draw(ID, ctrl.X, ctrl.Y, 0, True, False);
+ end;
+ end;
+
+ procedure DrawScroll(X, Y: Integer; Height: Word; Up, Down: Boolean);
+ var ID: DWORD;
+ begin
+ if Height < 3 then
+ Exit;
+ if Up then
+ g_Texture_Get(BSCROLL_UPA, ID)
+ else
+ g_Texture_Get(BSCROLL_UPU, ID);
+ e_Draw(ID, X, Y, 0, False, False);
+ if Down then
+ g_Texture_Get(BSCROLL_DOWNA, ID)
+ else
+ g_Texture_Get(BSCROLL_DOWNU, ID);
+ e_Draw(ID, X, Y + (Height - 1) * 16, 0, False, False);
+ g_Texture_Get(BSCROLL_MIDDLE, ID);
+ e_DrawFill(ID, X, Y + 16, 1, Height - 2, 0, False, False);
+ end;
+
+ procedure r_GUI_Draw_ListBox (ctrl: TGUIListBox); // + TGUIFileListBox
+ var w2, h2: Word; a: Integer; s: string;
+ begin
+ if ctrl.DrawBack then
+ DrawBox(ctrl.X, ctrl.Y, ctrl.Width + 1, ctrl.Height);
+ if ctrl.DrawScrollBar then
+ DrawScroll(ctrl.X + 4 + ctrl.Width * 16, ctrl.Y + 4, ctrl.Height, (ctrl.StartLine > 0) and (ctrl.Items <> nil), (ctrl.StartLine + ctrl.Height - 1 < High(ctrl.Items)) and (ctrl.Items <> nil));
+ if ctrl.Items <> nil then
+ begin
+ for a := ctrl.StartLine to Min(High(ctrl.Items), ctrl.StartLine + ctrl.Height - 1) do
+ begin
+ s := ctrl.Items[a];
+ ctrl.Font.GetTextSize(s, w2, h2);
+ while (Length(s) > 0) and (w2 > ctrl.Width * 16) do
+ begin
+ SetLength(s, Length(s) - 1);
+ ctrl.Font.GetTextSize(s, w2, h2);
+ end;
+ if a = ctrl.ItemIndex then
+ ctrl.Font.Draw(ctrl.X + 4, ctrl.Y + 4 + (a - ctrl.StartLine) * 16, s, ctrl.ActiveColor.R, ctrl.ActiveColor.G, ctrl.ActiveColor.B)
+ else
+ ctrl.Font.Draw(ctrl.X + 4, ctrl.Y + 4 + (a - ctrl.StartLine) * 16, s, ctrl.UnActiveColor.R, ctrl.UnActiveColor.G, ctrl.UnActiveColor.B);
+ end;
+ end;
+ end;
+
+ procedure r_GUI_Draw_Memo (ctrl: TGUIMemo);
+ var a: Integer;
+ begin
+ if ctrl.DrawBack then
+ DrawBox(ctrl.X, ctrl.Y, ctrl.Width + 1, ctrl.Height);
+ if ctrl.DrawScrollBar then
+ DrawScroll(ctrl.X + 4 + ctrl.Width * 16, ctrl.Y + 4, ctrl.Height, (ctrl.StartLine > 0) and (ctrl.Lines <> nil), (ctrl.StartLine + ctrl.Height - 1 < High(ctrl.Lines)) and (ctrl.Lines <> nil));
+ if ctrl.Lines <> nil then
+ for a := ctrl.StartLine to Min(High(ctrl.Lines), ctrl.StartLine + ctrl.Height - 1) do
+ ctrl.Font.Draw(ctrl.X + 4, ctrl.Y + 4 + (a - ctrl.StartLine) * 16, ctrl.Lines[a], ctrl.Color.R, ctrl.Color.G, ctrl.Color.B);
+ end;
+
+ procedure r_GUI_Draw_MainMenu (ctrl: TGUIMainMenu);
+ var a: Integer; w, h: Word; ID: DWORD;
+ begin
+ if ctrl.Header <> nil then
+ begin
+ r_GUI_Draw_Label(ctrl.Header)
+ end
+ else if LogoTex <> 0 then
+ begin
+ e_GetTextureSize(LogoTex, @w, @h);
+ e_Draw(LogoTex, ((gScreenWidth div 2) - (w div 2)), ctrl.Buttons[0].Y - ctrl.Buttons[0].GetHeight - h, 0, True, False);
+ end;
+ if ctrl.Buttons <> nil then
+ begin
+ for a := 0 to High(ctrl.Buttons) do
+ if ctrl.Buttons[a] <> nil then
+ r_GUI_Draw_TextButton(ctrl.Buttons[a]);
+ if ctrl.Index <> -1 then
+ begin
+ ID := MarkerID[ctrl.Counter DIV MAINMENU_MARKERDELAY MOD 2 <> 0];
+ e_Draw(ID, ctrl.Buttons[ctrl.Index].X - 48, ctrl.Buttons[ctrl.Index].Y, 0, True, False);
+ end
+ end;
+ end;
+
+ procedure r_GUI_Draw_Menu (ctrl: TGUIMenu);
+ var a, locx, locy: Integer;
+ begin
+ if ctrl.Header <> nil then
+ r_GUI_Draw_Label(ctrl.Header);
+ if ctrl.Items <> nil then
+ begin
+ for a := 0 to High(ctrl.Items) do
+ begin
+ if ctrl.Items[a].Text <> nil then
+ r_GUI_Draw_Control(ctrl.Items[a].Text);
+ if ctrl.Items[a].Control <> nil then
+ r_GUI_Draw_Control(ctrl.Items[a].Control);
+ end;
+ end;
+ if (ctrl.Index <> -1) and (ctrl.Counter > MENU_MARKERDELAY div 2) then
+ begin
+ locx := 0;
+ locy := 0;
+ if ctrl.Items[ctrl.Index].Text <> nil then
+ begin
+ locx := ctrl.Items[ctrl.Index].Text.X;
+ locy := ctrl.Items[ctrl.Index].Text.Y;
+ //HACK!
+ if ctrl.Items[ctrl.Index].Text.RightAlign then
+ begin
+ locx := locx + ctrl.Items[ctrl.Index].Text.CMaxWidth - ctrl.Items[ctrl.Index].Text.GetWidth;
+ end;
+ end
+ else if ctrl.Items[ctrl.Index].Control <> nil then
+ begin
+ locx := ctrl.Items[ctrl.Index].Control.X;
+ locy := ctrl.Items[ctrl.Index].Control.Y;
+ end;
+ locx := locx - e_CharFont_GetMaxWidth(ctrl.FontID);
+ e_CharFont_PrintEx(ctrl.FontID, locx, locy, #16, _RGB(255, 0, 0));
+ end;
+ end;
+
+ procedure r_GUI_Draw_Control (ctrl: TGUIControl);
+ begin
+ if ctrl is TGUITextButton then
+ r_GUI_Draw_TextButton(TGUITextButton(ctrl))
+ else if ctrl is TGUILabel then
+ r_GUI_Draw_Label(TGUILabel(ctrl))
+ else if ctrl is TGUIScroll then
+ r_GUI_Draw_Scroll(TGUIScroll(ctrl))
+ else if ctrl is TGUISwitch then
+ r_GUI_Draw_Switch(TGUISwitch(ctrl))
+ else if ctrl is TGUIEdit then
+ r_GUI_Draw_Edit(TGUIEdit(ctrl))
+ else if ctrl is TGUIKeyRead then
+ r_GUI_Draw_KeyRead(TGUIKeyRead(ctrl))
+ else if ctrl is TGUIKeyRead2 then
+ r_GUI_Draw_KeyRead2(TGUIKeyRead2(ctrl))
+ else if ctrl is TGUIModelView then
+ r_GUI_Draw_ModelView(TGUIModelView(ctrl))
+ else if ctrl is TGUIMapPreview then
+ r_GUI_Draw_MapPreview(TGUIMapPreview(ctrl))
+ else if ctrl is TGUIImage then
+ r_GUI_Draw_Image(TGUIImage(ctrl))
+ else if ctrl is TGUIListBox then
+ r_GUI_Draw_ListBox(TGUIListBox(ctrl)) // + TGUIFileListBox
+ else if ctrl is TGUIMemo then
+ r_GUI_Draw_Memo(TGUIMemo(ctrl))
+ else if ctrl is TGUIMainMenu then
+ r_GUI_Draw_MainMenu(TGUIMainMenu(ctrl))
+ else if ctrl is TGUIMenu then
+ r_GUI_Draw_Menu(TGUIMenu(ctrl))
+ else
+ Assert(False)
+ end;
+
+ procedure r_GUI_Draw_Window (win: TGUIWindow);
+ var i: Integer; ID: DWORD; tw, th: Word;
+ begin
+ // Here goes code duplication from g_game.pas:DrawMenuBackground()
+ if win.BackTexture <> '' then
+ if g_Texture_Get(win.BackTexture, ID) then
+ begin
+ e_Clear(0, 0, 0);
+ e_GetTextureSize(ID, @tw, @th);
+ if tw = th then
+ tw := round(tw * 1.333 * (gScreenHeight / th))
+ else
+ tw := trunc(tw * (gScreenHeight / th));
+ e_DrawSize(ID, (gScreenWidth - tw) div 2, 0, 0, False, False, tw, gScreenHeight);
+ end
+ else
+ e_Clear(0.5, 0.5, 0.5);
+
+ // small hack here
+ if win.Name = 'AuthorsMenu' then
+ e_DarkenQuadWH(0, 0, gScreenWidth, gScreenHeight, 150);
+ for i := 0 to High(win.Childs) do
+ if win.Childs[i] <> nil then
+ r_GUI_Draw_Control(win.Childs[i]);
+ end;
+
+end.
index ffb1c4d53018c6a22c6ba48882fbe74420974338..a7ba452761e0b3ad51710e7a7ad4784838358ed3 100644 (file)
{$IFDEF ENABLE_SYSTEM}
g_system,
{$ENDIF}
+ {$IFDEF ENABLE_MENU}
+ r_gui,
+ {$ENDIF}
SysUtils, Classes, Math,
e_log, utils,
g_game, g_options, g_console,
{$IFDEF ENABLE_GFX}
r_GFX_Load;
{$ENDIF}
+ {$IFDEF ENABLE_MENU}
+ r_GUI_Load;
+ {$ENDIF}
end;
procedure r_Render_Free;
begin
+ {$IFDEF ENABLE_MENU}
+ r_GUI_Free;
+ {$ENDIF}
{$IFDEF ENABLE_GFX}
r_GFX_Free;
{$ENDIF}