Remove terrain readiness diagnostic and fix graphics container name
Sync changed files to Google Drive / sync (push) Successful in 3m1s

This commit is contained in:
admin_d committed 2026-10-10 03:02:42 +05:00
1 parent d6676896d4
commit f1b253e842
22 files changed
+2989 -352

No files matched your search

-99
View File
@@ -15,13 +15,6 @@ type
dsiSeekReadConsistency
);
TTerrainReadinessDiagnosticStageId = (
trsiRxTilesLoad,
trsiMapStreamLoad,
trsiMapHeader,
trsiTileRecords
);
TGraphicsReadinessDiagnosticStageId = (
grsiContextReady, grsiPhysicalSurface, grsiRendererSizeMatch,
grsiTextureBackend, grsiSampledProgram, grsiMaxTextureSize
@@ -56,11 +49,6 @@ type
Value: TDiagnosticStageId;
end;
TOptionalTerrainReadinessDiagnosticStageId = record
HasValue: Boolean;
Value: TTerrainReadinessDiagnosticStageId;
end;
TOptionalGraphicsReadinessDiagnosticStageId = record
HasValue: Boolean;
Value: TGraphicsReadinessDiagnosticStageId;
@@ -103,24 +91,6 @@ type
Stream: TFileIODiagnosticStreamResult;
end;
TTerrainReadinessDiagnosticEvidence = record
RxTilesLoaded: TOptionalBoolean;
GeneratedTransitionsReady: TOptionalBoolean;
MapX: TOptionalInt64;
MapY: TOptionalInt64;
GameRev: TOptionalInt64;
ExpectedTileCount: TOptionalInt64;
CompletedTileCount: TOptionalInt64;
end;
TTerrainReadinessDiagnosticResult = record
Status: TDiagnosticStatus;
FailureStage: TOptionalTerrainReadinessDiagnosticStageId;
Error: TDiagnosticError;
Stages: array[TTerrainReadinessDiagnosticStageId] of TDiagnosticStatus;
Evidence: TTerrainReadinessDiagnosticEvidence;
end;
TGraphicsReadinessDiagnosticEvidence = record
ContextAvailable, RendererContextSynced, PhysicalSizeKnown,
TextureBackendReady, SampledProgramReady: TOptionalBoolean;
@@ -199,7 +169,6 @@ type
SelectedMap: TDiagnosticSelectedMapMetadata;
OverallStatus: TDiagnosticStatus;
FileIO: TFileIODiagnosticResult;
TerrainReadiness: TTerrainReadinessDiagnosticResult;
GraphicsReadiness: TGraphicsReadinessDiagnosticResult;
GraphicsTexture: TGraphicsTextureDiagnosticResult;
GraphicsVisibleDraw: TGraphicsVisibleDrawDiagnosticResult;
@@ -207,8 +176,6 @@ type
function CurrentDiagnosticReport: TDiagnosticReportState;
procedure ReplaceFileIODiagnosticResult(const AResult: TFileIODiagnosticResult);
procedure ReplaceTerrainReadinessDiagnosticResult(
const AResult: TTerrainReadinessDiagnosticResult);
procedure ReplaceGraphicsReadinessDiagnosticResult(
const AResult: TGraphicsReadinessDiagnosticResult);
procedure ReplaceGraphicsTextureDiagnosticResult(
@@ -217,8 +184,6 @@ procedure ReplaceGraphicsVisibleDrawDiagnosticResult(
const AResult: TGraphicsVisibleDrawDiagnosticResult);
function DiagnosticStatusToken(const AStatus: TDiagnosticStatus): string;
function DiagnosticStageIdToken(const AStage: TDiagnosticStageId): string;
function TerrainReadinessDiagnosticStageIdToken(
const AStage: TTerrainReadinessDiagnosticStageId): string;
function GraphicsReadinessDiagnosticStageIdToken(
const AStage: TGraphicsReadinessDiagnosticStageId): string;
function GraphicsTextureDiagnosticStageIdToken(
@@ -234,7 +199,6 @@ uses
var
CurrentFileIO: TFileIODiagnosticResult;
CurrentTerrainReadiness: TTerrainReadinessDiagnosticResult;
CurrentGraphicsReadiness: TGraphicsReadinessDiagnosticResult;
CurrentGraphicsTexture: TGraphicsTextureDiagnosticResult;
CurrentGraphicsVisibleDraw: TGraphicsVisibleDrawDiagnosticResult;
@@ -298,17 +262,6 @@ begin
end;
end;
function TerrainReadinessDiagnosticStageIdToken(
const AStage: TTerrainReadinessDiagnosticStageId): string;
begin
case AStage of
trsiRxTilesLoad: Result := 'rx_tiles_load';
trsiMapStreamLoad: Result := 'map_stream_load';
trsiMapHeader: Result := 'map_header';
trsiTileRecords: Result := 'tile_records';
end;
end;
function CurrentDiagnosticReport: TDiagnosticReportState;
begin
Result.ApplicationInfo.Name := 'kam_mobile';
@@ -323,18 +276,15 @@ begin
Result.SelectedMap.RelativePath := SelectedMapRelativePath;
Result.SelectedMap.Url := SelectedMapUrl;
Result.FileIO := CurrentFileIO;
Result.TerrainReadiness := CurrentTerrainReadiness;
Result.GraphicsReadiness := CurrentGraphicsReadiness;
Result.GraphicsTexture := CurrentGraphicsTexture;
Result.GraphicsVisibleDraw := CurrentGraphicsVisibleDraw;
if (Result.FileIO.Status = dsFail)
or (Result.TerrainReadiness.Status = dsFail)
or (Result.GraphicsReadiness.Status = dsFail)
or (Result.GraphicsTexture.Status = dsFail)
or (Result.GraphicsVisibleDraw.Status = dsFail) then
Result.OverallStatus := dsFail
else if (Result.FileIO.Status = dsPass)
and (Result.TerrainReadiness.Status = dsPass)
and (Result.GraphicsReadiness.Status = dsPass)
and (Result.GraphicsTexture.Status = dsPass)
and (Result.GraphicsVisibleDraw.Status = dsPass) then
@@ -348,12 +298,6 @@ begin
CurrentFileIO := AResult;
end;
procedure ReplaceTerrainReadinessDiagnosticResult(
const AResult: TTerrainReadinessDiagnosticResult);
begin
CurrentTerrainReadiness := AResult;
end;
procedure ReplaceGraphicsReadinessDiagnosticResult(
const AResult: TGraphicsReadinessDiagnosticResult);
begin
@@ -446,48 +390,6 @@ begin
AActions.Add(Action);
end;
procedure AppendTerrainReadinessJson(AActions: TJSONArray; const AResult: TTerrainReadinessDiagnosticResult);
var
Action, Stage, Evidence: TJSONObject;
Stages: TJSONArray;
TerrainStageId: TTerrainReadinessDiagnosticStageId;
begin
Action := TJSONObject.Create;
Action.Add('id', 'terrain_readiness');
Action.Add('status', DiagnosticStatusToken(AResult.Status));
if AResult.FailureStage.HasValue then
Action.Add('failure_stage', TerrainReadinessDiagnosticStageIdToken(
AResult.FailureStage.Value))
else
Action.Add('failure_stage', TJSONNull.Create);
Action.Add('error', DiagnosticErrorJson(AResult.Error));
Stages := TJSONArray.Create;
for TerrainStageId := Low(TTerrainReadinessDiagnosticStageId)
to High(TTerrainReadinessDiagnosticStageId) do
begin
Stage := TJSONObject.Create;
Stage.Add('id', TerrainReadinessDiagnosticStageIdToken(TerrainStageId));
Stage.Add('status', DiagnosticStatusToken(
AResult.Stages[TerrainStageId]));
Stages.Add(Stage);
end;
Action.Add('stages', Stages);
Evidence := TJSONObject.Create;
Evidence.Add('rx_tiles_loaded', OptionalBooleanJson(
AResult.Evidence.RxTilesLoaded));
Evidence.Add('generated_transitions_ready', OptionalBooleanJson(
AResult.Evidence.GeneratedTransitionsReady));
Evidence.Add('map_x', OptionalInt64Json(AResult.Evidence.MapX));
Evidence.Add('map_y', OptionalInt64Json(AResult.Evidence.MapY));
Evidence.Add('game_rev', OptionalInt64Json(AResult.Evidence.GameRev));
Evidence.Add('expected_tile_count', OptionalInt64Json(
AResult.Evidence.ExpectedTileCount));
Evidence.Add('completed_tile_count', OptionalInt64Json(
AResult.Evidence.CompletedTileCount));
Action.Add('evidence', Evidence);
AActions.Add(Action);
end;
procedure AppendGraphicsReadinessJson(AActions: TJSONArray; const AResult: TGraphicsReadinessDiagnosticResult);
var
Action, Stage, Evidence: TJSONObject;
@@ -661,7 +563,6 @@ begin
Root.Add('overall_status', DiagnosticStatusToken(State.OverallStatus));
Actions := TJSONArray.Create;
AppendFileIOJson(Actions, State.FileIO);
AppendTerrainReadinessJson(Actions, State.TerrainReadiness);
AppendGraphicsReadinessJson(Actions, State.GraphicsReadiness);
AppendGraphicsTextureJson(Actions, State.GraphicsTexture);
-148
View File
@@ -1,148 +0,0 @@
unit GameDiagnosticsTerrainReadiness;
{$mode objfpc}{$H+}
interface
procedure RunTerrainReadinessDiagnostic;
implementation
uses
GameSelectedMap, GameDiagnosticsReport, KM_ResSprites, KM_ResTypes,
KM_CommonClasses, KM_Utils, KM_TerrainUtils, KM_TerrainTypes, SysUtils;
procedure InitializeResult(out AResult: TTerrainReadinessDiagnosticResult);
var
Stage: TTerrainReadinessDiagnosticStageId;
begin
FillChar(AResult, SizeOf(AResult), 0);
AResult.Status := dsNotRun;
for Stage := Low(TTerrainReadinessDiagnosticStageId) to
High(TTerrainReadinessDiagnosticStageId) do
AResult.Stages[Stage] := dsNotRun;
end;
procedure FailStage(var AResult: TTerrainReadinessDiagnosticResult;
const AStage: TTerrainReadinessDiagnosticStageId; const AMessage: string;
const AException: Exception = nil);
begin
AResult.Stages[AStage] := dsFail;
AResult.Status := dsFail;
AResult.FailureStage.HasValue := True;
AResult.FailureStage.Value := AStage;
AResult.Error.Present := True;
AResult.Error.MessageText.HasValue := True;
AResult.Error.MessageText.Value := AMessage;
if AException <> nil then
begin
AResult.Error.ClassName.HasValue := True;
AResult.Error.ClassName.Value := AException.ClassName;
end;
end;
procedure FailException(var AResult: TTerrainReadinessDiagnosticResult;
const AStage: TTerrainReadinessDiagnosticStageId; const AException: Exception);
begin
FailStage(AResult, AStage, AException.Message, AException);
end;
procedure RunTerrainReadinessDiagnostic;
var
ResultData: TTerrainReadinessDiagnosticResult;
SpriteOwner: TKMResSprites;
MapStream: TKMemoryStreamBinary;
MapUrl: string;
MapX, MapY, GameRev: Integer;
TileBasic: TKMTerrainTileBasic;
begin
InitializeResult(ResultData);
SpriteOwner := nil;
MapStream := nil;
try
try
SpriteOwner := TKMResSprites.Create(nil, nil, False);
if not SpriteOwner.LoadSprites(rxTiles, False) then
begin
ResultData.Evidence.RxTilesLoaded.HasValue := True;
ResultData.Evidence.RxTilesLoaded.Value := False;
ResultData.Evidence.GeneratedTransitionsReady.HasValue := True;
ResultData.Evidence.GeneratedTransitionsReady.Value := False;
FailStage(ResultData, trsiRxTilesLoad,
'Canonical rxTiles loading did not succeed');
end
else
begin
ResultData.Stages[trsiRxTilesLoad] := dsPass;
ResultData.Evidence.RxTilesLoaded.HasValue := True;
ResultData.Evidence.RxTilesLoaded.Value := True;
ResultData.Evidence.GeneratedTransitionsReady.HasValue := True;
ResultData.Evidence.GeneratedTransitionsReady.Value := True;
end;
except
on E: Exception do
FailException(ResultData, trsiRxTilesLoad, E);
end;
if ResultData.Status = dsNotRun then
try
MapUrl := SelectedMapUrl;
MapStream := TKMemoryStreamBinary.Create;
MapStream.LoadFromFile(MapUrl);
ResultData.Stages[trsiMapStreamLoad] := dsPass;
except
on E: Exception do
FailException(ResultData, trsiMapStreamLoad, E);
end;
if ResultData.Status = dsNotRun then
try
LoadMapHeader(MapStream, MapX, MapY, GameRev);
ResultData.Stages[trsiMapHeader] := dsPass;
ResultData.Evidence.MapX.HasValue := True;
ResultData.Evidence.MapX.Value := Int64(MapX);
ResultData.Evidence.MapY.HasValue := True;
ResultData.Evidence.MapY.Value := Int64(MapY);
ResultData.Evidence.GameRev.HasValue := True;
ResultData.Evidence.GameRev.Value := Int64(GameRev);
ResultData.Evidence.ExpectedTileCount.HasValue := True;
ResultData.Evidence.ExpectedTileCount.Value := Int64(MapX) * Int64(MapY);
ResultData.Evidence.CompletedTileCount.HasValue := True;
ResultData.Evidence.CompletedTileCount.Value := 0;
except
on E: Exception do
FailException(ResultData, trsiMapHeader, E);
end;
if ResultData.Status = dsNotRun then
try
while ResultData.Evidence.CompletedTileCount.Value <
ResultData.Evidence.ExpectedTileCount.Value do
begin
ReadTileFromStream(MapStream, TileBasic, GameRev);
Inc(ResultData.Evidence.CompletedTileCount.Value);
end;
if ResultData.Evidence.CompletedTileCount.Value =
ResultData.Evidence.ExpectedTileCount.Value then
begin
ResultData.Stages[trsiTileRecords] := dsPass;
ResultData.Status := dsPass;
end;
except
on E: Exception do
FailException(ResultData, trsiTileRecords, E);
end;
finally
try
ReplaceTerrainReadinessDiagnosticResult(ResultData);
finally
try
MapStream.Free;
finally
SpriteOwner.Free;
end;
end;
end;
end;
end.
+19 -97
View File
@@ -24,14 +24,10 @@ type
FTitleLabel, FGraphicsFeedbackLabel: TCastleLabel;
FExportButton: TCastleButton;
FGraphicsReadinessButton, FTextureButton, FVisible2DButton: TCastleButton;
FTerrainReadinessButton: TCastleButton;
FTerrainReadinessStatusLabel: TCastleLabel;
FTerrainReadinessDetailsLabel: TCastleLabel;
FGraphicsReadinessStatusLabel, FGraphicsReadinessDetailsLabel: TCastleLabel;
FTextureStatusLabel, FTextureDetailsLabel: TCastleLabel;
FVisible2DStatusLabel, FVisible2DDetailsLabel: TCastleLabel;
FFileIOInProgress, FExportInProgress: Boolean;
FTerrainReadinessInProgress: Boolean;
FGraphicsSession: TGraphicsDiagnosticSession;
FGraphicsCompletionNotifiedDuringDispatch: Boolean;
procedure RefreshReport;
@@ -43,7 +39,6 @@ type
procedure GraphicsVisible2DClick(Sender: TObject);
procedure GraphicsResultPublished(Sender: TObject);
procedure FileIOClick(Sender: TObject);
procedure TerrainReadinessClick(Sender: TObject);
procedure ExportClick(Sender: TObject);
procedure ExportComplete(const AOutcome: TDiagnosticExportOutcome);
public
@@ -56,8 +51,7 @@ type
implementation
uses
SysUtils, Math, GameDiagnosticsFileIO, GameDiagnosticsReport,
GameDiagnosticsTerrainReadiness;
SysUtils, Math, GameDiagnosticsFileIO, GameDiagnosticsReport;
const
LayoutMargin = 16;
@@ -117,10 +111,6 @@ begin
FVisible2DButton.AutoSize := False;
FVisible2DButton.Enabled := True;
FVisible2DButton.OnClick := @GraphicsVisible2DClick;
FTerrainReadinessButton := TCastleButton.Create(Self);
FTerrainReadinessButton.AutoSize := False;
FTerrainReadinessStatusLabel := TCastleLabel.Create(Self);
FTerrainReadinessDetailsLabel := TCastleLabel.Create(Self);
FGraphicsReadinessStatusLabel := TCastleLabel.Create(Self);
FGraphicsReadinessDetailsLabel := TCastleLabel.Create(Self);
FTextureStatusLabel := TCastleLabel.Create(Self);
@@ -130,8 +120,6 @@ begin
FContent.InsertFront(FStatusLabel);
FContent.InsertFront(FDetailsLabel);
FContent.InsertFront(FTerrainReadinessStatusLabel);
FContent.InsertFront(FTerrainReadinessDetailsLabel);
FContent.InsertFront(FGraphicsReadinessStatusLabel);
FContent.InsertFront(FGraphicsReadinessDetailsLabel);
FContent.InsertFront(FTextureStatusLabel);
@@ -154,9 +142,6 @@ begin
FActionRegion.InsertFront(FTextureButton);
FVisible2DButton.Caption := 'Test Visible 2D' + LineEnding + 'RGBA / Brightness';
FActionRegion.InsertFront(FVisible2DButton);
FTerrainReadinessButton.Caption := 'Test MAP/RXX Terrain Readiness';
FTerrainReadinessButton.OnClick := @TerrainReadinessClick;
FActionRegion.InsertFront(FTerrainReadinessButton);
FFileIOButton.Caption := 'Test File I/O';
FFileIOButton.OnClick := @FileIOClick;
FActionRegion.InsertFront(FFileIOButton);
@@ -197,7 +182,7 @@ end;
procedure TDiagnosticsView.DispatchGraphicsRequest(const ARequest: TGraphicsRequest);
var
Accepted: Boolean;
Container: TCastleContainer;
ViewContainer: TCastleContainer;
begin
if (FGraphicsSession <> nil) and FGraphicsSession.Busy then
begin
@@ -210,8 +195,8 @@ begin
if FGraphicsSession = nil then
begin
Container := Self.Container;
if Container = nil then
ViewContainer := Self.Container;
if ViewContainer = nil then
begin
FGraphicsReadinessButton.Enabled := True;
FTextureButton.Enabled := True;
@@ -220,7 +205,7 @@ begin
Exit;
end;
try
FGraphicsSession := TGraphicsDiagnosticSession.Create(Container);
FGraphicsSession := TGraphicsDiagnosticSession.Create(ViewContainer);
FGraphicsSession.OnResultPublished := @GraphicsResultPublished;
except
if FGraphicsSession <> nil then
@@ -306,9 +291,9 @@ var
TitleHeight, GraphicsFeedbackRowHeight, ExportFeedbackRowHeight: Single;
FreeHeight: Single;
Columns, Rows, Index, Column, Row: Integer;
Buttons: array[0..5] of TCastleButton;
StatusLabels: array[0..4] of TCastleLabel;
DetailsLabels: array[0..4] of TCastleLabel;
Buttons: array[0..4] of TCastleButton;
StatusLabels: array[0..3] of TCastleLabel;
DetailsLabels: array[0..3] of TCastleLabel;
begin
ViewWidth := EffectiveWidth;
ViewHeight := EffectiveHeight;
@@ -321,7 +306,7 @@ begin
ActionWidth := Min(AvailableWidth, Columns * 296 + (Columns - 1) * 6 + 16);
Inset := Min(8, Max(0, (ActionWidth - 1) / 2));
CellWidth := Max(1, (ActionWidth - 2 * Inset - (Columns - 1) * 6) / Columns);
Rows := (6 + Columns - 1) div Columns;
Rows := (5 + Columns - 1) div Columns;
FActionRegion.Width := ActionWidth;
FActionRegion.Anchor(hpMiddle);
@@ -340,11 +325,10 @@ begin
FTitleLabel.Anchor(vpTop, -Inset);
Buttons[0] := FFileIOButton;
Buttons[1] := FTerrainReadinessButton;
Buttons[2] := FGraphicsReadinessButton;
Buttons[3] := FTextureButton;
Buttons[4] := FVisible2DButton;
Buttons[5] := FExportButton;
Buttons[1] := FGraphicsReadinessButton;
Buttons[2] := FTextureButton;
Buttons[3] := FVisible2DButton;
Buttons[4] := FExportButton;
for Index := 0 to High(Buttons) do
begin
Column := Index mod Columns;
@@ -385,14 +369,12 @@ begin
StatusLabels[0] := FStatusLabel;
DetailsLabels[0] := FDetailsLabel;
StatusLabels[1] := FTerrainReadinessStatusLabel;
DetailsLabels[1] := FTerrainReadinessDetailsLabel;
StatusLabels[2] := FGraphicsReadinessStatusLabel;
DetailsLabels[2] := FGraphicsReadinessDetailsLabel;
StatusLabels[3] := FTextureStatusLabel;
DetailsLabels[3] := FTextureDetailsLabel;
StatusLabels[4] := FVisible2DStatusLabel;
DetailsLabels[4] := FVisible2DDetailsLabel;
StatusLabels[1] := FGraphicsReadinessStatusLabel;
DetailsLabels[1] := FGraphicsReadinessDetailsLabel;
StatusLabels[2] := FTextureStatusLabel;
DetailsLabels[2] := FTextureDetailsLabel;
StatusLabels[3] := FVisible2DStatusLabel;
DetailsLabels[3] := FVisible2DDetailsLabel;
for Index := 0 to High(StatusLabels) do
begin
StatusLabels[Index].MaxWidth := Max(1, FScroll.Width - 2 * LayoutMargin - 16);
@@ -434,49 +416,6 @@ begin
Result := Details;
end;
function TerrainReadinessDetails(const State: TDiagnosticReportState): string;
var
TerrainStage: TTerrainReadinessDiagnosticStageId;
Details: string;
begin
Details := '';
for TerrainStage := Low(TTerrainReadinessDiagnosticStageId)
to High(TTerrainReadinessDiagnosticStageId) do
begin
if Details <> '' then Details := Details + LineEnding;
Details := Details + TerrainReadinessDiagnosticStageIdToken(TerrainStage) + ': ' +
DiagnosticStatusToken(State.TerrainReadiness.Stages[TerrainStage]);
end;
if State.TerrainReadiness.FailureStage.HasValue then
Details := Details + LineEnding + 'failure_stage: ' +
TerrainReadinessDiagnosticStageIdToken(
State.TerrainReadiness.FailureStage.Value);
if State.TerrainReadiness.Error.Present then
begin
Details := Details + LineEnding + 'error class: ' +
OptionalStringText(State.TerrainReadiness.Error.ClassName);
Details := Details + LineEnding + 'error message: ' +
OptionalStringText(State.TerrainReadiness.Error.MessageText);
end;
with State.TerrainReadiness.Evidence do
begin
if RxTilesLoaded.HasValue then
Details := Details + LineEnding + 'rx_tiles_loaded: ' +
OptionalBooleanText(RxTilesLoaded);
if GeneratedTransitionsReady.HasValue then
Details := Details + LineEnding + 'generated_transitions_ready: ' +
OptionalBooleanText(GeneratedTransitionsReady);
if MapX.HasValue then Details := Details + LineEnding + 'map_x: ' + OptionalInt64Text(MapX);
if MapY.HasValue then Details := Details + LineEnding + 'map_y: ' + OptionalInt64Text(MapY);
if GameRev.HasValue then Details := Details + LineEnding + 'game_rev: ' + OptionalInt64Text(GameRev);
if ExpectedTileCount.HasValue then
Details := Details + LineEnding + 'expected_tile_count: ' + OptionalInt64Text(ExpectedTileCount);
if CompletedTileCount.HasValue then
Details := Details + LineEnding + 'completed_tile_count: ' + OptionalInt64Text(CompletedTileCount);
end;
Result := Details;
end;
function GraphicsReadinessDetails(const State: TDiagnosticReportState): string;
var
ReadinessStage: TGraphicsReadinessDiagnosticStageId;
@@ -692,9 +631,6 @@ begin
State := CurrentDiagnosticReport;
FStatusLabel.Caption := 'File I/O: ' + DiagnosticStatusToken(State.FileIO.Status);
FDetailsLabel.Caption := FileIODetails(State);
FTerrainReadinessStatusLabel.Caption := 'MAP/RXX terrain readiness: ' +
DiagnosticStatusToken(State.TerrainReadiness.Status);
FTerrainReadinessDetailsLabel.Caption := TerrainReadinessDetails(State);
FGraphicsReadinessStatusLabel.Caption := 'Graphics readiness/current surface: ' +
DiagnosticStatusToken(State.GraphicsReadiness.Status);
FGraphicsReadinessDetailsLabel.Caption := GraphicsReadinessDetails(State);
@@ -733,20 +669,6 @@ begin
end;
end;
procedure TDiagnosticsView.TerrainReadinessClick(Sender: TObject);
begin
if FTerrainReadinessInProgress then Exit;
FTerrainReadinessInProgress := True;
FTerrainReadinessButton.Enabled := False;
try
RunTerrainReadinessDiagnostic;
RefreshReport;
finally
FTerrainReadinessButton.Enabled := True;
FTerrainReadinessInProgress := False;
end;
end;
procedure TDiagnosticsView.ExportClick(Sender: TObject);
begin
if FExportInProgress then Exit;