index 0339454519237989607b5ea2e78d7254b6eb78ec..a35980d798eb0b9f5f301152f515435f31832a3f 100644 (file)
interface
- uses g_panel, MAPDEF; // TPanel, TDFColor
+ uses g_panel, MAPDEF, binheap; // TPanel, TDFColor
procedure r_Map_Initialize;
procedure r_Map_Finalize;
procedure r_Panel_Draw (constref p: TPanel; hasAmbient: Boolean; constref ambColor: TDFColor);
procedure r_Panel_DrawShadowVolume (constref p: TPanel; lightX, lightY: Integer; radius: Integer);
+ type
+ TBinHeapPanelDrawCmp = class
+ public
+ class function less (const a, b: TPanel): Boolean; inline;
+ end;
+
+ TBinHeapPanelDraw = specialize TBinaryHeapBase<TPanel, TBinHeapPanelDrawCmp>;
+
+ var
+ gDrawPanelList: TBinHeapPanelDraw = nil; // binary heap of all walls we have to render, populated by `g_Map_CollectDrawPanels()`
+
implementation
uses
{$INCLUDE ../nogl/noGLuses.inc}
SysUtils, Classes, Math, e_log, wadreader, CONFIG, utils, g_language,
- r_graphics, r_animations, r_textures, g_textures,
+ r_graphics, r_animations, r_textures, g_animations,
g_base, g_basic, g_game, g_options,
g_map
;
FlagFrames: array [FLAG_RED..FLAG_BLUE] of DWORD;
FlagAnim: TAnimState;
+ class function TBinHeapPanelDrawCmp.less (const a, b: TPanel): Boolean; inline;
+ begin
+ if (a.tag < b.tag) then begin result := true; exit; end;
+ if (a.tag > b.tag) then begin result := false; exit; end;
+ result := (a.arrIdx < b.arrIdx);
+ end;
+
procedure r_Map_Initialize;
begin
FlagAnim := TAnimState.Create(True, 8, 5);