diff --git a/src/editor/f_main.pas b/src/editor/f_main.pas
index 4d62e2ef6a0c04dfe7d373b0ac7b515dc997f174..d40610abd027e358c38bd3916a6ba3f53c979e57 100644 (file)
--- a/src/editor/f_main.pas
+++ b/src/editor/f_main.pas
procedure FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
+ LastDrawTime: UInt64;
procedure Draw();
procedure OnIdle(Sender: TObject; var Done: Boolean);
procedure RefillRecentMenu (menu: TMenuItem; start: Integer; fmt: AnsiString);
end;
UndoBuffer[i, ii].AddID := ID;
-
MainForm.miUndo.Enabled := UndoBuffer <> nil;
end;
+procedure DiscardUndoBuffer();
+var
+ i, k: Integer;
+begin
+ for i := 0 to High(UndoBuffer) do
+ for k := 0 to High(UndoBuffer[i]) do
+ with UndoBuffer[i][k] do
+ if UndoType = UNDO_DELETE_PANEL then
+ Dispose(Panel);
+
+ UndoBuffer := nil;
+end;
+
procedure FullClear();
begin
RemoveSelectFromObjects();
ClearMap();
LoadSky(gMapInfo.SkyName);
- UndoBuffer := nil;
+ DiscardUndoBuffer();
slInvalidTextures.Clear();
MapCheckForm.lbErrorList.Clear();
MapCheckForm.mErrorDescription.Clear();
procedure TMainForm.miRecentFileExecute (Sender: TObject);
var
s, fn: AnsiString;
+ n: LongInt;
begin
- s := RecentFiles[(Sender as TMenuItem).Tag];
+ n := (Sender as TMenuItem).Tag;
+ s := RecentFiles[n];
fn := g_ExtractWadName(s);
if FileExists(fn) then
OpenMap(fn, g_ExtractFilePathName(s))
else
- Application.MessageBox('', 'File not available anymore', MB_OK);
+ Application.MessageBox('File not available anymore', '', MB_OK);
// if Application.MessageBox(PChar(MsgMsgDelRecentPrompt), PChar(MsgMsgDelRecent), MB_ICONQUESTION or MB_YESNO) = idYes then
// begin
// RecentFiles.Delete(n);
else
begin
menu.Delete(i);
- MI.Destroy();
+ Application.ReleaseComponent(MI);
end;
end;
s: String;
begin
Randomize();
+ LastDrawTime := 0;
{$IFDEF DARWIN}
miApple.Enabled := True;
config := TConfig.CreateFile(CfgFileName);
+ gWADEditorLogLevel := config.ReadInt('WADEditor', 'LogLevel', DFWAD_LOG_DEFAULT);
+
if config.ReadInt('Editor', 'XPos', -1) = -1 then
Position := poDesktopCenter
else begin
e_TextureFontPrintEx(X, Y, Text, FontID, 0, 0, 0, 1.0);
end;
+procedure InitGraphics;
+begin
+ // FIXME: this is a shitty hack
+ if not gDataLoaded then
+ begin
+ e_WriteLog('Init OpenGL', MSG_NOTIFY);
+ e_InitGL();
+ e_WriteLog('Loading data', MSG_NOTIFY);
+ LoadStdFont('STDTXT', 'STDFONT', gEditorFont);
+ e_WriteLog('Loading more data', MSG_NOTIFY);
+ LoadData();
+ e_WriteLog('Loading even more data', MSG_NOTIFY);
+ gDataLoaded := True;
+ MainForm.FormResize(nil);
+ end;
+end;
+
procedure TMainForm.Draw();
var
x, y: Integer;
ObjCount: Word;
aX, aY, aX2, aY2, XX, ScaleSz: Integer;
begin
+ LastDrawTime := GetTickCount64();
ID := 0;
PID := 0;
Width := 0;
Height := 0;
+ InitGraphics();
+
e_BeginRender();
e_Clear(GL_COLOR_BUFFER_BIT,
else
a := 0;
+ glDisable(GL_TEXTURE_2D);
+ glColor3ub(GetRValue(DotColor), GetGValue(DotColor), GetBValue(DotColor));
+ glPointSize(DotSize);
+ glBegin(GL_POINTS);
x := MapOffset.X mod DotStep;
- y := MapOffset.Y mod DotStep;
-
while x < RenderPanel.Width do
begin
+ y := MapOffset.Y mod DotStep;
while y < RenderPanel.Height do
begin
- e_DrawPoint(DotSize, x + a, y + a,
- GetRValue(DotColor),
- GetGValue(DotColor),
- GetBValue(DotColor));
+ glVertex2i(x + a, y + a);
y += DotStep;
end;
x += DotStep;
- y := MapOffset.Y mod DotStep;
end;
+ glEnd();
+ glColor4ub(e_Colors.R, e_Colors.G, e_Colors.B, 255);
end;
// Превью текстуры:
else
begin
item.ItemType := lbItemList.ItemIndex + ITEM_MEDKIT_SMALL;
- if item.ItemType >= ITEM_WEAPON_KASTET then
+ if item.ItemType >= ITEM_WEAPON_IRONFIST then
item.ItemType := item.ItemType + 2;
item.X := MousePos.X-MapOffset.X;
item.Y := MousePos.Y-MapOffset.Y;
if Button = mbMiddle then
MouseMDown := False;
- DrawRect := nil;
+ if DrawRect <> nil then
+ begin
+ Dispose(DrawRect);
+ DrawRect := nil;
+ end;
+
ResizeType := RESIZETYPE_NONE;
TextureID := 0;
end;
// Клавиши мыши не зажаты:
- if (not MouseRDown) and (not MouseLDown) then
+ if (not MouseRDown) and (not MouseLDown) and (DrawRect <> nil) then
+ begin
+ Dispose(DrawRect);
DrawRect := nil;
+ end;
// Строка состояния - координаты мыши:
StatusBar.Panels[1].Text := Format('(%d:%d)',
begin
config := TConfig.CreateFile(CfgFileName);
+ config.WriteInt('WADEditor', 'LogLevel', gWADEditorLogLevel);
+
if WindowState <> wsMaximized then
begin
config.WriteInt('Editor', 'XPos', Left);
config.SaveFile(CfgFileName);
config.Free();
- slInvalidTextures.Free;
+ slInvalidTextures.Free();
+ DiscardUndoBuffer();
end;
procedure TMainForm.FormDropFiles(Sender: TObject;
end;
// Удалить выделенные объекты:
- if (Key = VK_DELETE) and (SelectedObjects <> nil) and
- RenderPanel.Focused() then
+ if (Key = VK_DELETE) and (SelectedObjects <> nil) and RenderPanel.Focused() then
DeleteSelectedObjects();
// Снять выделение:
UNDO_DELETE_PANEL:
begin
AddPanel(Panel^);
- Panel := nil;
+ Dispose(Panel);
end;
UNDO_DELETE_ITEM: AddItem(Item);
UNDO_DELETE_AREA: AddArea(Area);
end;
SetLength(UndoBuffer, Length(UndoBuffer)-1);
-
RemoveSelectFromObjects();
-
miUndo.Enabled := UndoBuffer <> nil;
end;
if ShowModal() = mrOK then
begin
b := lbTypeSelect.ItemIndex + ITEM_MEDKIT_SMALL;
- if b >= ITEM_WEAPON_KASTET then
+ if b >= ITEM_WEAPON_IRONFIST then
b := b + 2;
Values[Key] := ItemToStr(b);
vleObjectPropertyApply(Sender);
end;
procedure TMainForm.OnIdle(Sender: TObject; var Done: Boolean);
+ const MaxFPS = 60;
var f: AnsiString;
begin
- // FIXME: this is a shitty hack
- if not gDataLoaded then
+ // TODO: move refresh to user actions (ask to repaint only when something changed)
+ if GetTickCount64() - LastDrawTime >= 1000 div MaxFPS then
begin
- e_WriteLog('Init OpenGL', MSG_NOTIFY);
- e_InitGL();
- e_WriteLog('Loading data', MSG_NOTIFY);
- LoadStdFont('STDTXT', 'STDFONT', gEditorFont);
- e_WriteLog('Loading more data', MSG_NOTIFY);
- LoadData();
- e_WriteLog('Loading even more data', MSG_NOTIFY);
- gDataLoaded := True;
- MainForm.FormResize(nil);
+ PanelMap.Refresh;
end;
- Draw();
+
if StartMap <> '' then
begin
f := StartMap;