X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fopengl%2Fr_map.pas;h=9a6235c8b1b3b1d153a39358ed001620d0a63cf8;hb=6837a957a80cae5f212cc5a1447b2e7dac15c159;hp=d34100da06db6f9ccf48591bf9177694cc057f4f;hpb=46a80085210de073e82948959f872b0e93c22135;p=d2df-sdl.git diff --git a/src/game/opengl/r_map.pas b/src/game/opengl/r_map.pas index d34100d..9a6235c 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; @@ -26,11 +26,10 @@ interface procedure r_Map_Free; procedure r_Map_LoadTextures; - // TODO procedure r_Map_FreeTextures + procedure r_Map_FreeTextures; procedure r_Map_Update; - procedure r_Map_DrawBack (dx, dy: Integer); procedure r_Map_DrawPanels (PanelType: Word; hasAmbient: Boolean; constref ambColor: TDFColor); // unaccelerated procedure r_Map_CollectDrawPanels (x0, y0, wdt, hgt: Integer); procedure r_Map_DrawPanelShadowVolumes (lightX: Integer; lightY: Integer; radius: Integer); @@ -39,11 +38,22 @@ 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, + SysUtils, Classes, Math, e_log, wadreader, CONFIG, utils, g_language, r_graphics, r_animations, r_textures, g_textures, g_base, g_basic, g_game, g_options, g_map @@ -56,17 +66,23 @@ implementation Anim: Boolean; end; FlagFrames: array [FLAG_RED..FLAG_BLUE] of DWORD; - FlagAnim: TAnimationState; + 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 := TAnimationState.Create(True, 8, 5); + FlagAnim := TAnimState.Create(True, 8, 5); end; procedure r_Map_Finalize; begin - FlagAnim.Free; - FlagAnim := nil; + FlagAnim.Invalidate; end; procedure r_Map_Load; @@ -185,6 +201,11 @@ implementation end end; + procedure r_Map_FreeTextures; + begin + // TODO + end; + procedure dplClear (); begin if (gDrawPanelList = nil) then gDrawPanelList := TBinHeapPanelDraw.Create() else gDrawPanelList.clear(); @@ -244,14 +265,6 @@ begin it.release(); end; -procedure r_Map_DrawBack(dx, dy: Integer); -begin - if gDrawBackGround and (BackID <> DWORD(-1)) then - e_DrawSize(BackID, dx, dy, 0, False, False, gBackSize.X, gBackSize.Y) - else - e_Clear(GL_COLOR_BUFFER_BIT, 0, 0, 0); -end; - procedure r_Map_DrawFlags; var i, dx, tx, ty: Integer; Mirror: TMirrorType; f: PFlag; begin @@ -268,7 +281,7 @@ end; else Mirror := TMirrorType.None; dx := IfThen(f.Direction = TDirection.D_LEFT, -1, +1); - r_AnimationState_Draw(FlagFrames[i], FlagAnim, tx + dx, ty + 1, Mirror); + r_AnimState_Draw(FlagFrames[i], FlagAnim, tx + dx, ty + 1, 0, Mirror, False); if g_debug_Frames then e_DrawQuad(tx + f.Obj.Rect.X, ty + f.Obj.Rect.Y, tx + f.Obj.Rect.X + f.Obj.Rect.Width - 1, ty + f.Obj.Rect.Y + f.Obj.Rect.Height - 1, 0, 255, 0) end @@ -304,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, TMirrorType.None); + r_AnimState_Draw(FramesID, p.TextureIDs[p.FCurTexture].AnTex, tx + xx * w, ty + yy * h, p.Alpha, TMirrorType.None, p.Blending); end end else