DEADSOFTWARE

mempool is optional now
[d2df-sdl.git] / src / game / g_textures.pas
index af3b29ff8e464f1fe8467a2b804ea384bd8d0ba5..f129b9e219d9ff88a224951a8bbddba784fff022 100644 (file)
@@ -19,7 +19,9 @@ unit g_textures;
 interface
 
 uses
-  e_graphics, MAPDEF, BinEditor, ImagingTypes, Imaging, ImagingUtility;
+  SysUtils, Classes,
+  {$IFDEF USE_MEMPOOL}mempool,{$ENDIF}
+  e_graphics, MAPDEF, ImagingTypes, Imaging, ImagingUtility;
 
 Type
   TLevelTexture = record
@@ -35,7 +37,7 @@ Type
 
   TLevelTextureArray = Array of TLevelTexture;
 
-  TAnimation = class(TObject)
+  TAnimation = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF}
   private
     ID:            DWORD;
     FAlpha:        Byte;
@@ -62,8 +64,8 @@ Type
     procedure   Enable();
     procedure   Disable();
     procedure   Revert(r: Boolean);
-    procedure   SaveState(Var Mem: TBinMemoryWriter);
-    procedure   LoadState(Var Mem: TBinMemoryReader);
+    procedure   SaveState(st: TStream);
+    procedure   LoadState(st: TStream);
     function    TotalFrames(): Integer;
 
     property    Played: Boolean read FPlayed;
@@ -114,8 +116,8 @@ function g_Texture_Light(): Integer;
 implementation
 
 uses
-  g_game, e_log, g_basic, SysUtils, g_console, wadreader,
-  g_language, GL;
+  g_game, e_log, g_basic, g_console, wadreader,
+  g_language, GL, utils, xstreams;
 
 type
   _TTexture = record
@@ -184,7 +186,7 @@ begin
   end
   else
   begin
-    e_WriteLog(Format('Error loading texture %s', [Resource]), MSG_WARNING);
+    e_WriteLog(Format('Error loading texture %s', [Resource]), TMsgType.Warning);
     //e_WriteLog(Format('WAD Reader error: %s', [WAD.GetLastErrorStr]), MSG_WARNING);
   end;
   WAD.Free();
@@ -195,7 +197,7 @@ begin
   Result := True;
   if not e_CreateTexture(FileName, ID) then
   begin
-    e_WriteLog(Format('Error loading texture %s', [FileName]), MSG_WARNING);
+    e_WriteLog(Format('Error loading texture %s', [FileName]), TMsgType.Warning);
     Result := False;
   end;
 end;
@@ -232,7 +234,7 @@ begin
   begin
     if showmsg then
     begin
-      e_WriteLog(Format('Error loading texture %s', [Resource]), MSG_WARNING);
+      e_WriteLog(Format('Error loading texture %s', [Resource]), TMsgType.Warning);
     end;
     //e_WriteLog(Format('WAD Reader error: %s', [WAD.GetLastErrorStr]), MSG_WARNING);
     result := false;
@@ -263,7 +265,7 @@ begin
     e_GetTextureSize(TexturesArray[find_id].ID, @TexturesArray[find_id].Width,
                      @TexturesArray[find_id].Height);
   end
-  else e_WriteLog(Format('Error loading texture %s', [FileName]), MSG_WARNING);
+  else e_WriteLog(Format('Error loading texture %s', [FileName]), TMsgType.Warning);
 end;
 
 function g_Texture_Get(TextureName: ShortString; var ID: DWORD): Boolean;
@@ -487,7 +489,7 @@ begin
   if not WAD.GetResource(g_ExtractFilePathName(Resource), TextureData, ResourceLength) then
   begin
     WAD.Free();
-    e_WriteLog(Format('Error loading texture %s', [Resource]), MSG_WARNING);
+    e_WriteLog(Format('Error loading texture %s', [Resource]), TMsgType.Warning);
     //e_WriteLog(Format('WAD Reader error: %s', [WAD.GetLastErrorStr]), MSG_WARNING);
     Exit;
   end;
@@ -683,15 +685,15 @@ procedure DumpTextureNames();
 var
   i: Integer;
 begin
-  e_WriteLog('BEGIN Textures:', MSG_NOTIFY);
+  e_WriteLog('BEGIN Textures:', TMsgType.Notify);
   for i := 0 to High(TexturesArray) do
-    e_WriteLog('   '+IntToStr(i)+'. '+TexturesArray[i].Name, MSG_NOTIFY);
-  e_WriteLog('END Textures.', MSG_NOTIFY);
+    e_WriteLog('   '+IntToStr(i)+'. '+TexturesArray[i].Name, TMsgType.Notify);
+  e_WriteLog('END Textures.', TMsgType.Notify);
 
-  e_WriteLog('BEGIN Frames:', MSG_NOTIFY);
+  e_WriteLog('BEGIN Frames:', TMsgType.Notify);
   for i := 0 to High(FramesArray) do
-    e_WriteLog('   '+IntToStr(i)+'. '+FramesArray[i].Name, MSG_NOTIFY);
-  e_WriteLog('END Frames.', MSG_NOTIFY);
+    e_WriteLog('   '+IntToStr(i)+'. '+FramesArray[i].Name, TMsgType.Notify);
+  e_WriteLog('END Frames.', TMsgType.Notify);
 end;
 
 { TAnimation }
@@ -820,71 +822,60 @@ begin
   Reset();
 end;
 
-procedure TAnimation.SaveState(Var Mem: TBinMemoryWriter);
-var
-  sig: DWORD;
-begin
-  if Mem = nil then
-    Exit;
-
-// Ñèãíàòóðà àíèìàöèè:
-  sig := ANIM_SIGNATURE; // 'ANIM'
-  Mem.WriteDWORD(sig);
-// Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè:
-  Mem.WriteByte(FCounter);
-// Òåêóùèé êàäð:
-  Mem.WriteInt(FCurrentFrame);
-// Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì:
-  Mem.WriteBoolean(FPlayed);
-// Alpha-êàíàë âñåé òåêñòóðû:
-  Mem.WriteByte(FAlpha);
-// Ðàçìûòèå òåêñòóðû:
-  Mem.WriteBoolean(FBlending);
-// Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè:
-  Mem.WriteByte(FSpeed);
-// Çàöèêëåíà ëè àíèìàöèÿ:
-  Mem.WriteBoolean(FLoop);
-// Âêëþ÷åíà ëè:
-  Mem.WriteBoolean(FEnabled);
-// Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ:
-  Mem.WriteByte(FMinLength);
-// Îáðàòíûé ëè ïîðÿäîê êàäðîâ:
-  Mem.WriteBoolean(FRevert);
-end;
-
-procedure TAnimation.LoadState(Var Mem: TBinMemoryReader);
-var
-  sig: DWORD;
-begin
-  if Mem = nil then
-    Exit;
-
-// Ñèãíàòóðà àíèìàöèè:
-  Mem.ReadDWORD(sig);
-  if sig <> ANIM_SIGNATURE then // 'ANIM'
-  begin
-    raise EBinSizeError.Create('TAnimation.LoadState: Wrong Animation Signature');
-  end;
-// Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè:
-  Mem.ReadByte(FCounter);
-// Òåêóùèé êàäð:
-  Mem.ReadInt(FCurrentFrame);
-// Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì:
-  Mem.ReadBoolean(FPlayed);
-// Alpha-êàíàë âñåé òåêñòóðû:
-  Mem.ReadByte(FAlpha);
-// Ðàçìûòèå òåêñòóðû:
-  Mem.ReadBoolean(FBlending);
-// Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè:
-  Mem.ReadByte(FSpeed);
-// Çàöèêëåíà ëè àíèìàöèÿ:
-  Mem.ReadBoolean(FLoop);
-// Âêëþ÷åíà ëè:
-  Mem.ReadBoolean(FEnabled);
-// Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ:
-  Mem.ReadByte(FMinLength);
-// Îáðàòíûé ëè ïîðÿäîê êàäðîâ:
-  Mem.ReadBoolean(FRevert);
+procedure TAnimation.SaveState (st: TStream);
+begin
+  if (st = nil) then exit;
+
+  utils.writeSign(st, 'ANIM');
+  utils.writeInt(st, Byte(0)); // version
+  // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
+  utils.writeInt(st, Byte(FCounter));
+  // Òåêóùèé êàäð
+  utils.writeInt(st, LongInt(FCurrentFrame));
+  // Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì
+  utils.writeBool(st, FPlayed);
+  // Alpha-êàíàë âñåé òåêñòóðû
+  utils.writeInt(st, Byte(FAlpha));
+  // Ðàçìûòèå òåêñòóðû
+  utils.writeInt(st, Byte(FBlending));
+  // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
+  utils.writeInt(st, Byte(FSpeed));
+  // Çàöèêëåíà ëè àíèìàöèÿ
+  utils.writeBool(st, FLoop);
+  // Âêëþ÷åíà ëè
+  utils.writeBool(st, FEnabled);
+  // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
+  utils.writeInt(st, Byte(FMinLength));
+  // Îáðàòíûé ëè ïîðÿäîê êàäðîâ
+  utils.writeBool(st, FRevert);
+end;
+
+procedure TAnimation.LoadState (st: TStream);
+begin
+  if (st = nil) then exit;
+
+  if not utils.checkSign(st, 'ANIM') then raise XStreamError.Create('animation chunk expected');
+  if (utils.readByte(st) <> 0) then raise XStreamError.Create('invalid animation chunk version');
+  // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
+  FCounter := utils.readByte(st);
+  // Òåêóùèé êàäð
+  FCurrentFrame := utils.readLongInt(st);
+  // Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì
+  FPlayed := utils.readBool(st);
+  // Alpha-êàíàë âñåé òåêñòóðû
+  FAlpha := utils.readByte(st);
+  // Ðàçìûòèå òåêñòóðû
+  FBlending := utils.readBool(st);
+  // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
+  FSpeed := utils.readByte(st);
+  // Çàöèêëåíà ëè àíèìàöèÿ
+  FLoop := utils.readBool(st);
+  // Âêëþ÷åíà ëè
+  FEnabled := utils.readBool(st);
+  // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
+  FMinLength := utils.readByte(st);
+  // Îáðàòíûé ëè ïîðÿäîê êàäðîâ
+  FRevert := utils.readBool(st);
 end;