X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fopengl%2Fr_map.pas;h=a35980d798eb0b9f5f301152f515435f31832a3f;hb=df1f12c26369a0d5e9e996583b30c9879570fe99;hp=a2f3d18e39ead7935bc9b8b8ecb23582c8089c82;hpb=442a04f5de7ff8d8dd302f1b46685d4f23866ec7;p=d2df-sdl.git diff --git a/src/game/opengl/r_map.pas b/src/game/opengl/r_map.pas index a2f3d18..a35980d 100644 --- a/src/game/opengl/r_map.pas +++ b/src/game/opengl/r_map.pas @@ -17,7 +17,7 @@ unit r_map; interface - uses g_panel, MAPDEF; // TPanel, TDFColor + uses g_panel, MAPDEF, binheap; // TPanel, TDFColor procedure r_Map_Initialize; procedure r_Map_Finalize; @@ -38,12 +38,23 @@ interface 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; + + 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 ; @@ -57,6 +68,13 @@ implementation 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); @@ -299,14 +317,14 @@ end; IsAnim := RenTextures[Texture].Anim; if IsAnim then begin - if p.TextureIDs[p.FCurTexture].AnTex <> nil then + if p.TextureIDs[p.FCurTexture].AnTex.IsValid() then begin FramesID := RenTextures[Texture].ID; w := RenTextures[Texture].Width; h := RenTextures[Texture].Height; for xx := 0 to tw div w - 1 do for yy := 0 to th div h - 1 do - r_AnimationState_Draw(FramesID, p.TextureIDs[p.FCurTexture].AnTex, tx + xx * w, ty + yy * h, p.Alpha, TMirrorType.None, p.Blending); + r_AnimState_Draw(FramesID, p.TextureIDs[p.FCurTexture].AnTex, tx + xx * w, ty + yy * h, p.Alpha, TMirrorType.None, p.Blending); end end else