DEADSOFTWARE

gl: fix panel drawing
[d2df-sdl.git] / src / game / g_map.pas
index f62f761dea919088ac2be404fe32b4c35e4075f9..c93344a6e41fb74e7125fb08afb7bff525d906d1 100644 (file)
@@ -20,7 +20,7 @@ interface
 
 uses
   SysUtils, Classes, mempool,
-  g_base, g_basic, MAPDEF, g_textures,
+  g_base, g_basic, MAPDEF,
   g_phys, utils, g_panel, g_grid, md5, binheap, xprofiler, xparser, xdynrec;
 
 type
@@ -152,6 +152,7 @@ const
   FLAG_RED  = 1;
   FLAG_BLUE = 2;
   FLAG_DOM  = 3;
+  FLAG_LAST = FLAG_DOM;
 
   FLAG_STATE_NONE     = 0;
   FLAG_STATE_NORMAL   = 1;
@@ -196,15 +197,6 @@ const
 
   GridDrawableMask = (GridTagBack or GridTagStep or GridTagWall or GridTagDoor or GridTagAcid1 or GridTagAcid2 or GridTagWater or GridTagFore);
 
-
-type
-  TBinHeapPanelDrawCmp = class
-  public
-    class function less (const a, b: TPanel): Boolean; inline;
-  end;
-
-  TBinHeapPanelDraw = specialize TBinaryHeapBase<TPanel, TBinHeapPanelDrawCmp>;
-
 var
   gWalls: TPanelArray;
   gRenderBackgrounds: TPanelArray;
@@ -222,10 +214,8 @@ var
   gExternalResources: array of TDiskFileInfo = nil;
   gMovingWallIds: array of Integer = nil;
 
-  gdbg_map_use_accel_render: Boolean = true;
   gdbg_map_use_accel_coldet: Boolean = true;
   profMapCollision: TProfiler = nil; //WARNING: FOR DEBUGGING ONLY!
-  gDrawPanelList: TBinHeapPanelDraw = nil; // binary heap of all walls we have to render, populated by `g_Map_CollectDrawPanels()`
 
   gCurrentMap: TDynRecord = nil;
   gCurrentMapFileName: AnsiString = ''; // so we can skip texture reloading
@@ -246,13 +236,17 @@ var (* private state *)
 
 implementation
 
-uses
-  e_input, e_log, e_res, g_items, g_gfx, g_console,
-  g_weapons, g_game, g_sound, e_sound, CONFIG,
-  g_options, g_triggers, g_player,
-  Math, g_monsters, g_saveload, g_language, g_netmsg,
-  sfs, xstreams, hashtable, wadreader,
-  g_res_downloader;
+  uses
+    {$IFDEF ENABLE_GFX}
+      g_gfx,
+    {$ENDIF}
+    e_input, e_log, e_res, g_items, g_console,
+    g_weapons, g_game, g_sound, e_sound, CONFIG,
+    g_options, g_triggers, g_player, g_window,
+    Math, g_monsters, g_saveload, g_language, g_netmsg,
+    sfs, xstreams, hashtable, wadreader,
+    g_res_downloader
+  ;
 
 const
   FLAGRECT: TRectWH = (X:15; Y:12; Width:33; Height:52);
@@ -513,14 +507,6 @@ begin
   end;
 end;
 
-
-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;
-
 var
   TextNameHash: THashStrInt = nil; // key: texture name; value: index in `Textures`
   BadTextNameHash: THashStrInt = nil; // set; so we won't spam with non-existing texture messages
@@ -972,11 +958,10 @@ end;
   function CreateTexture (RecName: AnsiString; Map: String; log: Boolean): Integer;
     var
       HName: AnsiString;
-      WAD, WADz: TWADFile;
+      WAD: TWADFile;
       WADName, ResName: String;
-      ResData, ReszData: Pointer;
-      ResLen, ReszLen: Integer;
-      cfg: TConfig;
+      ResData: Pointer;
+      ResLen: Integer;
       id: Integer;
   begin
     Result := -1;
@@ -1013,40 +998,13 @@ end;
           begin
             if WAD.GetResource(ResName, ResData, ResLen, log) then
             begin
-              if IsWadData(ResData, ResLen) then
-              begin
-                WADz := TWADFile.Create();
-                if WADz.ReadMemory(ResData, ResLen) then
-                begin
-                  if WADz.GetResource('TEXT/ANIM', ReszData, ReszLen) then
-                  begin
-                    cfg := TConfig.CreateMem(ReszData, ReszLen);
-                    if cfg <> nil then
-                    begin
-                      SetLength(Textures, Length(Textures) + 1);
-                      Textures[High(Textures)].TextureName := RecName;
-                      Textures[High(Textures)].FullName := WadName + ':' + ResName;
-                      Textures[High(Textures)].FramesCount := cfg.ReadInt('', 'framecount', 0);
-                      Textures[High(Textures)].Speed := cfg.ReadInt('', 'waitcount', 0);
-                      Result := High(Textures);
-                      TextNameHash.put(HName, result);
-                      cfg.Free;
-                    end;
-                    FreeMem(ReszData);
-                  end
-                end;
-                WADz.Free;
-              end
-              else
-              begin
-                SetLength(Textures, Length(Textures) + 1);
-                Textures[High(Textures)].FullName := WADName + ':' + ResName;
-                Textures[High(Textures)].TextureName := RecName;
-                Result := High(Textures);
-                TextNameHash.put(HName, result);
-              end;
+              SetLength(Textures, Length(Textures) + 1);
+              Textures[High(Textures)].FullName := WADName + ':' + ResName;
+              Textures[High(Textures)].TextureName := RecName;
+              Result := High(Textures);
+              TextNameHash.put(HName, result);
               FreeMem(ResData);
-            end
+            end;
           end;
           WAD.Free;
         end
@@ -1899,8 +1857,10 @@ begin
     g_Weapon_Init();
     g_Monsters_Init();
 
-    // Åñëè íå LoadState, òî ñîçäàåì êàðòó ñòîëêíîâåíèé:
-    if not gLoadGameMode then g_GFX_Init();
+    {$IFDEF ENABLE_GFX}
+      // Åñëè íå LoadState, òî ñîçäàåì êàðòó ñòîëêíîâåíèé:
+      if not gLoadGameMode then g_GFX_Init();
+    {$ENDIF}
 
     // Ñáðîñ ëîêàëüíûõ ìàññèâîâ:
     mapTextureList := nil;
@@ -2078,7 +2038,9 @@ procedure g_Map_Free(freeTextures: Boolean=true);
   end;
 
 begin
-  g_GFX_Free();
+  {$IFDEF ENABLE_GFX}
+    g_GFX_Free;
+  {$ENDIF}
   g_Weapon_Free();
   g_Items_Free();
   g_Triggers_Free();
@@ -2557,7 +2519,10 @@ begin
   if pan.Enabled and mapGrid.proxyEnabled[pan.proxyId] then exit;
 
   pan.Enabled := True;
-  g_Mark(pan.X, pan.Y, pan.Width, pan.Height, MARK_DOOR, true);
+
+  {$IFDEF ENABLE_GFX}
+    g_Mark(pan.X, pan.Y, pan.Width, pan.Height, MARK_DOOR, true);
+  {$ENDIF}
 
   mapGrid.proxyEnabled[pan.proxyId] := true;
   //if (pan.proxyId >= 0) then mapGrid.proxyEnabled[pan.proxyId] := true
@@ -2583,7 +2548,9 @@ begin
   if (not pan.Enabled) and (not mapGrid.proxyEnabled[pan.proxyId]) then exit;
 
   pan.Enabled := False;
-  g_Mark(pan.X, pan.Y, pan.Width, pan.Height, MARK_DOOR, false);
+  {$IFDEF ENABLE_GFX}
+    g_Mark(pan.X, pan.Y, pan.Width, pan.Height, MARK_DOOR, false);
+  {$ENDIF}
 
   mapGrid.proxyEnabled[pan.proxyId] := false;
   //if (pan.proxyId >= 0) then begin mapGrid.removeBody(pan.proxyId); pan.proxyId := -1; end;
@@ -2605,7 +2572,7 @@ begin
   tp := g_Map_PanelByGUID(pguid);
   if (tp = nil) then exit;
   tp.NextTexture(AnimLoop);
-  if g_Game_IsServer and g_Game_IsNet then MH_SEND_PanelTexture(pguid, AnimLoop);
+  if g_Game_IsServer and g_Game_IsNet then MH_SEND_PanelTexture(pguid);
 end;
 
 
@@ -2624,15 +2591,16 @@ begin
   begin
     LiftType := t;
 
-    g_Mark(X, Y, Width, Height, MARK_LIFT, false);
-    //TODO: make separate lift tags, and change tag here
-
-    case LiftType of
-      LIFTTYPE_UP:    g_Mark(X, Y, Width, Height, MARK_LIFTUP);
-      LIFTTYPE_DOWN:  g_Mark(X, Y, Width, Height, MARK_LIFTDOWN);
-      LIFTTYPE_LEFT:  g_Mark(X, Y, Width, Height, MARK_LIFTLEFT);
-      LIFTTYPE_RIGHT: g_Mark(X, Y, Width, Height, MARK_LIFTRIGHT);
-    end;
+    {$IFDEF ENABLE_GFX}
+      g_Mark(X, Y, Width, Height, MARK_LIFT, false);
+      //TODO: make separate lift tags, and change tag here
+      case LiftType of
+        LIFTTYPE_UP:    g_Mark(X, Y, Width, Height, MARK_LIFTUP);
+        LIFTTYPE_DOWN:  g_Mark(X, Y, Width, Height, MARK_LIFTDOWN);
+        LIFTTYPE_LEFT:  g_Mark(X, Y, Width, Height, MARK_LIFTLEFT);
+        LIFTTYPE_RIGHT: g_Mark(X, Y, Width, Height, MARK_LIFTRIGHT);
+      end;
+    {$ENDIF}
 
     //if g_Game_IsServer and g_Game_IsNet then MH_SEND_PanelState(pguid);
     // mark platform as interesting
@@ -2832,8 +2800,11 @@ begin
   loadPanels();
   ///// /////
 
-  // Îáíîâëÿåì êàðòó ñòîëêíîâåíèé è ñåòêó
-  g_GFX_Init();
+  {$IFDEF ENABLE_GFX}
+    // Îáíîâëÿåì êàðòó ñòîëêíîâåíèé è ñåòêó
+    g_GFX_Init();
+  {$ENDIF}
+
   //mapCreateGrid();
 
   ///// Çàãðóæàåì ìóçûêó: /////