DEADSOFTWARE

anim: add static variant of TAnimationState
[d2df-sdl.git] / src / game / g_textures.pas
index aaa91b793fe590d5e3bec09c6f432b148141b148..fbbbf9270f4cbb82dfc64726ec1b948a434f496d 100644 (file)
@@ -20,23 +20,19 @@ interface
 uses
   SysUtils, Classes,
   {$IFDEF USE_MEMPOOL}mempool,{$ENDIF}
-  g_base, r_graphics, MAPDEF, ImagingTypes, Imaging, ImagingUtility;
+  g_base, MAPDEF;
 
 type
   TLevelTexture = record
-    textureName: AnsiString;
-    width, height: Word;
-    case anim: Boolean of
-      false: (textureID: LongWord);
-      true: (framesID: LongWord; framesCount: Byte; speed: Byte);
+    TextureName: AnsiString; // as stored in wad
+    FullName: AnsiString; // full path to texture // !!! merge it with TextureName
+    framesCount, speed: Byte;
   end;
 
   TLevelTextureArray = array of TLevelTexture;
 
   TAnimationState = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF}
   private
-    mAlpha: Byte;
-    mBlending: Boolean;
     mCounter: Byte; // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
     mSpeed: Byte; // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
     mCurrentFrame: Integer; // Òåêóùèé êàäð (íà÷èíàÿ ñ 0)
@@ -58,8 +54,8 @@ type
     procedure disable ();
     procedure revert (r: Boolean);
 
-    procedure saveState (st: TStream);
-    procedure loadState (st: TStream);
+    procedure saveState (st: TStream; mAlpha: Byte; mBlending: Boolean);
+    procedure loadState (st: TStream; out mAlpha: Byte; out mBlending: Boolean);
 
     function totalFrames (): Integer; inline;
 
@@ -73,29 +69,25 @@ type
     property currentFrame: Integer read mCurrentFrame write mCurrentFrame;
     property currentCounter: Byte read mCounter write mCounter;
     property counter: Byte read mCounter;
-    property blending: Boolean read mBlending write mBlending;
-    property alpha: Byte read mAlpha write mAlpha;
+    property length: Integer read mLength;
   end;
 
-  TAnimation = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF}
+  TAnimState = record
   private
-    mId: LongWord;
-    mAlpha: Byte;
-    mBlending: Boolean;
     mCounter: Byte; // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
     mSpeed: Byte; // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
     mCurrentFrame: Integer; // Òåêóùèé êàäð (íà÷èíàÿ ñ 0)
     mLoop: Boolean; // Ïåðåõîäèòü íà ïåðâûé êàäð ïîñëå ïîñëåäíåãî?
     mEnabled: Boolean; // Ðàáîòà ðàçðåøåíà?
     mPlayed: Boolean; // Ïðîèãðàíà âñÿ õîòÿ áû ðàç?
-    mHeight: Word;
-    mWidth: Word;
     mMinLength: Byte; // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
     mRevert: Boolean; // Ñìåíà êàäðîâ îáðàòíàÿ?
 
+    mLength: Integer;
+
   public
-    constructor Create (aframesID: LongWord; aloop: Boolean; aspeed: Byte);
-    destructor  Destroy (); override;
+    constructor Create (aloop: Boolean; aspeed: Byte; len: Integer);
+    procedure Destroy;
 
     procedure reset ();
     procedure update ();
@@ -103,8 +95,8 @@ type
     procedure disable ();
     procedure revert (r: Boolean);
 
-    procedure saveState (st: TStream);
-    procedure loadState (st: TStream);
+    procedure saveState (st: TStream; mAlpha: Byte; mBlending: Boolean);
+    procedure loadState (st: TStream; out mAlpha: Byte; out mBlending: Boolean);
 
     function totalFrames (): Integer; inline;
 
@@ -118,24 +110,15 @@ type
     property currentFrame: Integer read mCurrentFrame write mCurrentFrame;
     property currentCounter: Byte read mCounter write mCounter;
     property counter: Byte read mCounter;
-    property blending: Boolean read mBlending write mBlending;
-    property alpha: Byte read mAlpha write mAlpha;
-    property framesId: LongWord read mId;
-    property width: Word read mWidth;
-    property height: Word read mHeight;
-
-    property id: LongWord read mId;
+    property length: Integer read mLength;
   end;
 
 implementation
 
 uses
-  g_game, e_log, g_basic, g_console, wadreader, r_animations,
+  g_game, e_log, g_basic, g_console, wadreader,
   g_language, utils, xstreams;
 
-
-
-
 constructor TAnimationState.Create (aloop: Boolean; aspeed: Byte; len: Integer);
 begin
   assert(len >= 0);
@@ -146,7 +129,6 @@ begin
   mSpeed := aspeed;
   mEnabled := true;
   mCurrentFrame := 0;
-  mAlpha := 0;
   mPlayed := false;
 end;
 
@@ -241,7 +223,7 @@ begin
   result := mLength
 end;
 
-procedure TAnimationState.saveState (st: TStream);
+procedure TAnimationState.saveState (st: TStream; mAlpha: Byte; mBlending: Boolean);
 begin
   if (st = nil) then exit;
 
@@ -270,7 +252,7 @@ begin
 end;
 
 
-procedure TAnimationState.loadState (st: TStream);
+procedure TAnimationState.loadState (st: TStream; out mAlpha: Byte; out mBlending: Boolean);
 begin
   if (st = nil) then exit;
 
@@ -299,39 +281,27 @@ begin
 end;
 
 
+(* ------------- *)
 
-
-
-
-constructor TAnimation.Create (aframesID: LongWord; aloop: Boolean; aspeed: Byte);
+constructor TAnimState.Create (aloop: Boolean; aspeed: Byte; len: Integer);
 begin
-  if (aframesID >= Length(framesArray)) then
-  begin
-    //raise Exception.Create('trying to create inexisting frame: something is very wrong here');
-    e_LogWritefln('trying to create inexisting frame %u of %u: something is very wrong here', [aframesID, LongWord(Length(framesArray))], TMsgType.Warning);
-    aframesID := 0;
-    if (Length(framesArray) = 0) then raise Exception.Create('trying to create inexisting frame: something is very wrong here');
-  end;
-  mId := aframesID;
+  assert(len >= 0);
+  mLength := len;
+
   mMinLength := 0;
   mLoop := aloop;
   mSpeed := aspeed;
   mEnabled := true;
   mCurrentFrame := 0;
   mPlayed := false;
-  mAlpha := 0;
-  mWidth := framesArray[mId].FrameWidth;
-  mHeight := framesArray[mId].FrameHeight;
 end;
 
-
-destructor TAnimation.Destroy ();
+procedure TAnimState.Destroy;
 begin
-  inherited;
+  Self := Default(TAnimState);
 end;
 
-
-procedure TAnimation.update ();
+procedure TAnimState.update;
 begin
   if (not mEnabled) then exit;
 
@@ -339,40 +309,36 @@ begin
 
   if (mCounter >= mSpeed) then
   begin
-    // Îæèäàíèå ìåæäó êàäðàìè çàêîí÷èëîñü
-    // Îáðàòíûé ïîðÿäîê êàäðîâ?
     if mRevert then
     begin
-      // Äîøëè äî êîíöà àíèìàöèè. Âîçìîæíî, æäåì åùå
       if (mCurrentFrame = 0) then
       begin
-        if (Length(framesArray[mId].TexturesID)*mSpeed+mCounter < mMinLength) then exit;
+        if (mLength * mSpeed + mCounter < mMinLength) then exit;
       end;
 
       mCurrentFrame -= 1;
       mPlayed := (mCurrentFrame < 0);
 
-      // Ïîâòîðÿòü ëè àíèìàöèþ ïî êðóãó?
       if mPlayed then
       begin
-        if mLoop then mCurrentFrame := High(framesArray[mId].TexturesID) else mCurrentFrame += 1;
+        if mLoop then
+          mCurrentFrame := mLength - 1
+        else
+          mCurrentFrame += 1
       end;
 
       mCounter := 0;
     end
     else
     begin
-      // Ïðÿìîé ïîðÿäîê êàäðîâ
-      // Äîøëè äî êîíöà àíèìàöèè. Âîçìîæíî, æäåì åùå
-      if (mCurrentFrame = High(framesArray[mId].TexturesID)) then
+      if (mCurrentFrame = mLength - 1) then
       begin
-        if (Length(framesArray[mId].TexturesID)*mSpeed+mCounter < mMinLength) then exit;
+        if (mLength * mSpeed + mCounter < mMinLength) then exit;
       end;
 
       mCurrentFrame += 1;
-      mPlayed := (mCurrentFrame > High(framesArray[mId].TexturesID));
+      mPlayed := (mCurrentFrame > mLength - 1);
 
-      // Ïîâòîðÿòü ëè àíèìàöèþ ïî êðóãó?
       if mPlayed then
       begin
         if mLoop then mCurrentFrame := 0 else mCurrentFrame -= 1;
@@ -383,84 +349,73 @@ begin
   end;
 end;
 
-
-procedure TAnimation.reset ();
+procedure TAnimState.reset;
 begin
-  if mRevert then mCurrentFrame := High(framesArray[mId].TexturesID) else mCurrentFrame := 0;
+  if mRevert then
+    mCurrentFrame := mLength - 1
+  else
+    mCurrentFrame := 0;
   mCounter := 0;
-  mPlayed := false;
+  mPlayed := false
 end;
 
+procedure TAnimState.disable;
+begin
+  mEnabled := false
+end;
 
-procedure TAnimation.disable (); begin mEnabled := false; end;
-procedure TAnimation.enable (); begin mEnabled := true; end;
-
-
-function TAnimation.totalFrames (): Integer; inline; begin result := Length(framesArray[mId].TexturesID); end;
-
+procedure TAnimState.enable;
+begin
+  mEnabled := true
+end;
 
-procedure TAnimation.revert (r: Boolean);
+procedure TAnimState.revert (r: Boolean);
 begin
   mRevert := r;
-  reset();
+  reset
 end;
 
+function TAnimState.totalFrames (): Integer; inline;
+begin
+  result := mLength
+end;
 
-procedure TAnimation.saveState (st: TStream);
+procedure TAnimState.saveState (st: TStream; mAlpha: Byte; mBlending: Boolean);
 begin
   if (st = nil) then exit;
 
   utils.writeSign(st, 'ANIM');
   utils.writeInt(st, Byte(0)); // version
-  // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
   utils.writeInt(st, Byte(mCounter));
-  // Òåêóùèé êàäð
   utils.writeInt(st, LongInt(mCurrentFrame));
-  // Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì
   utils.writeBool(st, mPlayed);
-  // Alpha-êàíàë âñåé òåêñòóðû
   utils.writeInt(st, Byte(mAlpha));
-  // Ðàçìûòèå òåêñòóðû
   utils.writeInt(st, Byte(mBlending));
-  // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
   utils.writeInt(st, Byte(mSpeed));
-  // Çàöèêëåíà ëè àíèìàöèÿ
   utils.writeBool(st, mLoop);
-  // Âêëþ÷åíà ëè
   utils.writeBool(st, mEnabled);
-  // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
   utils.writeInt(st, Byte(mMinLength));
-  // Îáðàòíûé ëè ïîðÿäîê êàäðîâ
   utils.writeBool(st, mRevert);
 end;
 
 
-procedure TAnimation.loadState (st: TStream);
+procedure TAnimState.loadState (st: TStream; out mAlpha: Byte; out mBlending: Boolean);
 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');
-  // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
   mCounter := utils.readByte(st);
-  // Òåêóùèé êàäð
   mCurrentFrame := utils.readLongInt(st);
-  // Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì
   mPlayed := utils.readBool(st);
-  // Alpha-êàíàë âñåé òåêñòóðû
   mAlpha := utils.readByte(st);
-  // Ðàçìûòèå òåêñòóðû
   mBlending := utils.readBool(st);
-  // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
   mSpeed := utils.readByte(st);
-  // Çàöèêëåíà ëè àíèìàöèÿ
   mLoop := utils.readBool(st);
-  // Âêëþ÷åíà ëè
   mEnabled := utils.readBool(st);
-  // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
   mMinLength := utils.readByte(st);
-  // Îáðàòíûé ëè ïîðÿäîê êàäðîâ
   mRevert := utils.readBool(st);
 end;
 
+
 end.