DEADSOFTWARE

render: remove graphics data from TAnimationState
authorDeaDDooMER <deaddoomer@deadsoftware.ru>
Tue, 18 Jan 2022 20:11:14 +0000 (23:11 +0300)
committerDeaDDooMER <deaddoomer@deadsoftware.ru>
Fri, 9 Jun 2023 07:56:50 +0000 (10:56 +0300)
12 files changed:
src/game/g_monsters.pas
src/game/g_panel.pas
src/game/g_player.pas
src/game/g_textures.pas
src/game/opengl/r_animations.pas
src/game/opengl/r_gfx.pas
src/game/opengl/r_items.pas
src/game/opengl/r_map.pas
src/game/opengl/r_monsters.pas
src/game/opengl/r_player.pas
src/game/opengl/r_playermodel.pas
src/game/opengl/r_weapons.pas

index d31219cfe4c48be4bc7ca92c9862f6d819855f3d..8f62a39c5543aeb1285fb043b6de37f1a476dfb8 100644 (file)
@@ -4142,7 +4142,7 @@ begin
   anim := (vilefire <> nil);
   utils.writeBool(st, anim);
   // Если есть - сохраняем:
-  if anim then vilefire.SaveState(st);
+  if anim then vilefire.SaveState(st, 0, False);
   // Анимации
   for i := ANIM_SLEEP to ANIM_PAIN do
   begin
@@ -4150,12 +4150,12 @@ begin
     anim := (FAnim[i, TDirection.D_LEFT] <> nil);
     utils.writeBool(st, anim);
     // Если есть - сохраняем
-    if anim then FAnim[i, TDirection.D_LEFT].SaveState(st);
+    if anim then FAnim[i, TDirection.D_LEFT].SaveState(st, 0, False);
     // Есть ли правая анимация
     anim := (FAnim[i, TDirection.D_RIGHT] <> nil);
     utils.writeBool(st, anim);
     // Если есть - сохраняем
-    if anim then FAnim[i, TDirection.D_RIGHT].SaveState(st);
+    if anim then FAnim[i, TDirection.D_RIGHT].SaveState(st, 0, False);
   end;
 end;
 
@@ -4163,8 +4163,8 @@ end;
 procedure TMonster.LoadState (st: TStream);
 var
   i: Integer;
-  b: Byte;
-  anim: Boolean;
+  b, alpha: Byte;
+  anim, blending: Boolean;
 begin
   assert(st <> nil);
 
@@ -4224,7 +4224,7 @@ begin
   if anim then
   begin
     Assert(vilefire <> nil, 'TMonster.LoadState: no vilefire anim');
-    vilefire.LoadState(st);
+    vilefire.LoadState(st, alpha, blending);
   end;
   // Анимации
   for i := ANIM_SLEEP to ANIM_PAIN do
@@ -4235,7 +4235,7 @@ begin
     if anim then
     begin
       Assert(FAnim[i, TDirection.D_LEFT] <> nil, 'TMonster.LoadState: no '+IntToStr(i)+'_left anim');
-      FAnim[i, TDirection.D_LEFT].LoadState(st);
+      FAnim[i, TDirection.D_LEFT].LoadState(st, alpha, blending);
     end;
     // Есть ли правая анимация
      anim := utils.readBool(st);
@@ -4243,7 +4243,7 @@ begin
     if anim then
     begin
       Assert(FAnim[i, TDirection.D_RIGHT] <> nil, 'TMonster.LoadState: no '+IntToStr(i)+'_right anim');
-      FAnim[i, TDirection.D_RIGHT].LoadState(st);
+      FAnim[i, TDirection.D_RIGHT].LoadState(st, alpha, blending);
     end;
   end;
   // update cache
index e3c52b0b16eee4352455895550cd27f586590e0d..c3f47cfde290c32b6a93b45bd543259789ae67b5 100644 (file)
@@ -356,8 +356,6 @@ begin
     if FTextureIDs[i].Anim then
     begin // Àíèìèðîâàííàÿ òåêñòóðà
       FTextureIDs[i].AnTex := TAnimationState.Create(True, Textures[AddTextures[i].Texture].Speed, Textures[AddTextures[i].Texture].FramesCount);
-      FTextureIDs[i].AnTex.Blending := ByteBool(PanelRec.Flags and PANEL_FLAG_BLENDING);
-      FTextureIDs[i].AnTex.Alpha := PanelRec.Alpha;
     end
   end;
 
@@ -1012,7 +1010,7 @@ begin
   end;
   utils.writeBool(st, anim);
   // Åñëè äà - ñîõðàíÿåì àíèìàöèþ
-  if anim then FTextureIDs[FCurTexture].AnTex.SaveState(st);
+  if anim then FTextureIDs[FCurTexture].AnTex.SaveState(st, FAlpha, FBlending);
 
   // moving platform state
   utils.writeInt(st, Integer(mMovingSpeed.X));
@@ -1065,7 +1063,7 @@ begin
            (FTextureIDs[FCurTexture].Anim) and
            (FTextureIDs[FCurTexture].AnTex <> nil),
            'TPanel.LoadState: No animation object');
-    FTextureIDs[FCurTexture].AnTex.LoadState(st);
+    FTextureIDs[FCurTexture].AnTex.LoadState(st, FAlpha, FBlending);
   end;
 
   // moving platform state
index 56199cee6f859fcdfb6409f085597374bc9715db..9ae2b6e1df81c4c75031e2596f1dd0a0b02c8636 100644 (file)
@@ -5944,16 +5944,16 @@ begin
   // animation
   anim := (FModel <> nil);
   utils.writeBool(st, anim);
-  if anim then FModel.AnimState.SaveState(st);
+  if anim then FModel.AnimState.SaveState(st, 0, False);
   // animation for mask (same as animation, compat with older saves)
   anim := (FModel <> nil);
   utils.writeBool(st, anim);
-  if anim then FModel.AnimState.SaveState(st);
+  if anim then FModel.AnimState.SaveState(st, 0, False);
 end;
 
 
 procedure TCorpse.LoadState (st: TStream);
-  var anim: Boolean; r, g, b: Byte; stub: TAnimationState;
+  var anim, blending: Boolean; r, g, b, alpha: Byte; stub: TAnimationState;
 begin
   assert(st <> nil);
 
@@ -5977,7 +5977,7 @@ begin
   anim := utils.readBool(st);
   if anim then
   begin
-    stub.LoadState(st);
+    stub.LoadState(st, alpha, blending);
     FModel.AnimState.CurrentFrame := Min(stub.CurrentFrame, FModel.AnimState.Length);
   end
   else
@@ -5987,7 +5987,7 @@ begin
   end;
   // animation for mask (same as animation, compat with older saves)
   anim := utils.readBool(st);
-  if anim then stub.LoadState(st);
+  if anim then stub.LoadState(st, alpha, blending);
   stub.Free;
 end;
 
index 8190ea3df814d0b7300d2a6f85fe579681497825..dcfbd1a045f2179aee421ad6b6c25ffeb96cf680 100644 (file)
@@ -33,8 +33,6 @@ type
 
   TAnimationState = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF}
   private
-    mAlpha: Byte;
-    mBlending: Boolean;
     mCounter: Byte; // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
     mSpeed: Byte; // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
     mCurrentFrame: Integer; // Òåêóùèé êàäð (íà÷èíàÿ ñ 0)
@@ -56,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;
 
@@ -71,8 +69,6 @@ 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;
 
@@ -92,7 +88,6 @@ begin
   mSpeed := aspeed;
   mEnabled := true;
   mCurrentFrame := 0;
-  mAlpha := 0;
   mPlayed := false;
 end;
 
@@ -187,7 +182,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;
 
@@ -216,7 +211,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;
 
index 74c2ebbdcddc236df3d1a84048675cea617adba9..f50ce92b382b21cb5868c22fb12d96f88226205b 100644 (file)
@@ -19,8 +19,8 @@ interface
 
   uses g_base, g_textures, MAPDEF, Imaging; // TMirrorType, TAnimationState, TDFPoint, TDynImageDataArray
 
-  procedure r_AnimationState_Draw (TID: DWORD; t: TAnimationState; x, y: Integer; mirror: TMirrorType);
-  procedure r_AnimationState_DrawEx (FID: DWORD; t: TAnimationState; x, y: Integer; mirror: TMirrorType; rpoint: TDFPoint; angle: SmallInt);
+  procedure r_AnimationState_Draw (FID: DWORD; t: TAnimationState; x, y: Integer; alpha: Byte; mirror: TMirrorType; blending: Boolean);
+  procedure r_AnimationState_DrawEx (FID: DWORD; t: TAnimationState; x, y: Integer; alpha: Byte; mirror: TMirrorType; blending: Boolean; rpoint: TDFPoint; angle: SmallInt);
 
   function g_CreateFramesImg (ia: TDynImageDataArray; ID: PDWORD; const Name: AnsiString; BackAnimation: Boolean = false): Boolean;
 
@@ -56,16 +56,16 @@ implementation
     g_language, g_game
   ;
 
-  procedure r_AnimationState_Draw (TID: DWORD; t: TAnimationState; x, y: Integer; mirror: TMirrorType);
+  procedure r_AnimationState_Draw (FID: DWORD; t: TAnimationState; x, y: Integer; alpha: Byte; mirror: TMirrorType; blending: Boolean);
   begin
     if t.enabled then
-      e_DrawAdv(framesArray[TID].TexturesID[t.currentFrame], x, y, t.alpha, true, t.blending, 0, nil, mirror)
+      e_DrawAdv(framesArray[FID].TexturesID[t.currentFrame], x, y, alpha, true, blending, 0, nil, mirror)
   end;
 
-  procedure r_AnimationState_DrawEx (FID: DWORD; t: TAnimationState; x, y: Integer; mirror: TMirrorType; rpoint: TDFPoint; angle: SmallInt);
+  procedure r_AnimationState_DrawEx (FID: DWORD; t: TAnimationState; x, y: Integer; alpha: Byte; mirror: TMirrorType; blending: Boolean; rpoint: TDFPoint; angle: SmallInt);
   begin
     if t.enabled then
-      e_DrawAdv(framesArray[FID].TexturesID[t.currentFrame], x, y, t.alpha, true, t.blending, angle, @rpoint, mirror)
+      e_DrawAdv(framesArray[FID].TexturesID[t.currentFrame], x, y, alpha, true, blending, angle, @rpoint, mirror)
   end;
 
 function allocFrameSlot (): LongWord;
index 5ec00178c0d905258d602e97c2889366cf6f24a9..79b3c2b62adf1cb753eb97af83b948eecc104ec8 100644 (file)
@@ -46,6 +46,7 @@ implementation
   type
     TOnceAnim = record
       AnimType:   Byte;
+      Alpha:      Byte;
       x, y:       Integer;
       oldX, oldY: Integer;
       Animation:  TAnimationState;
@@ -109,10 +110,11 @@ implementation
   end;
 
   procedure r_GFX_OnceAnim (AnimType, x, y: Integer);
-    var find_id: DWORD; a: TAnimationState;
+    var find_id: DWORD; a: TAnimationState; alpha: Byte;
   begin
     if not gpart_dbg_enabled then exit;
     find_id := FindOnceAnim();
+    alpha := 0;
     case AnimType of
       R_GFX_NONE: a := nil;
       R_GFX_TELEPORT: a := TAnimationState.Create(false, 6, 10); // !!! speed can be 3
@@ -137,7 +139,7 @@ implementation
       begin
         AnimType := R_GFX_SMOKE;
         a := TAnimationState.Create(false, 3, 10);
-        a.alpha := 150;
+        alpha := 150;
       end;
       R_GFX_EXPLODE_SKELFIRE: a := TAnimationState.Create(false, 8, 3);
       R_GFX_EXPLODE_PLASMA: a := TAnimationState.Create(false, 3, 4);
@@ -150,9 +152,8 @@ implementation
       assert(false)
     end;
     OnceAnims[find_id].AnimType := AnimType;
+    OnceAnims[find_id].Alpha := alpha;
     OnceAnims[find_id].Animation := a;
-//    OnceAnims[find_id].Animation.Blending := Anim.Blending;
-//    OnceAnims[find_id].Animation.alpha := Anim.alpha;
     OnceAnims[find_id].x := x;
     OnceAnims[find_id].y := y;
   end;
@@ -240,7 +241,7 @@ begin
         begin
           fx := nlerp(oldx, x, gLerpFactor);
           fy := nlerp(oldy, y, gLerpFactor);
-          r_AnimationState_Draw(gfxFrames[AnimType], Animation, x, y, TMirrorType.None);
+          r_AnimationState_Draw(gfxFrames[AnimType], Animation, x, y, Alpha, TMirrorType.None, False);
         end;
       end;
     end;
index f42cb1fdfceefaaaf4dcb52656cac31abc01a1f3..a36feece8045ce386679174a99194c52353c335b 100644 (file)
@@ -198,7 +198,7 @@ begin
         end
         else if itemFrames[it.ItemType] <> 0 then
         begin
-          r_AnimationState_Draw(itemFrames[it.ItemType], Animation, fX, fY, TMirrorType.None)
+          r_AnimationState_Draw(itemFrames[it.ItemType], Animation, fX, fY, 0, TMirrorType.None, False)
         end;
 
         if g_debug_Frames then
index 587d0daa531341671fd6e87ecfdf8162d5ecc71b..2ec57d478ebc1fd7821c2741315fff2615889037 100644 (file)
@@ -264,7 +264,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_AnimationState_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
@@ -307,7 +307,7 @@ end;
           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_AnimationState_Draw(FramesID, p.TextureIDs[p.FCurTexture].AnTex, tx + xx * w, ty + yy * h, p.Alpha, TMirrorType.None, p.Blending);
         end
       end
       else
index 8acec37b1d446cdece210df2958015afb23d5bae..7b1fcc4b0a147dda4b2ff37ddd9de3b36202d078 100644 (file)
@@ -385,7 +385,7 @@ implementation
       if MonsterType = MONSTER_VILE then
         if MonsterState = MONSTATE_SHOOT then
           if GetPos(MonsterTargetUID, @o) then
-            r_AnimationState_Draw(VileFire, VileFireAnim, o.X + o.Rect.X + (o.Rect.Width div 2) - 32, o.Y + o.Rect.Y + o.Rect.Height - 128, TMirrorType.None);
+            r_AnimationState_Draw(VileFire, VileFireAnim, o.X + o.Rect.X + (o.Rect.Width div 2) - 32, o.Y + o.Rect.Y + o.Rect.Height - 128, 0, TMirrorType.None, False);
 
       // Не в области рисования не ресуем:
       //FIXME!
@@ -435,7 +435,7 @@ implementation
           dy := MONSTER_ANIMTABLE[MonsterType].AnimDeltaRight[MonsterAnim].Y;
         end;
 
-        r_AnimationState_Draw(monFrames[MonsterType, MonsterAnim, GameDirection], DirAnim[MonsterAnim, GameDirection], fX + dx, fY + dy, m);
+        r_AnimationState_Draw(monFrames[MonsterType, MonsterAnim, GameDirection], DirAnim[MonsterAnim, GameDirection], fX + dx, fY + dy, 0, m, False);
       end;
 
       if g_debug_Frames then
index 650aa225c859749b644559a233aa04cb755fbbc0..da9f8da41dc7cffeb415b1545e25a184ac7bee8e 100644 (file)
@@ -360,7 +360,7 @@ begin
       if p.FKeys[KEY_DOWN].Pressed then ID := PunchFrames[R_BERSERK in p.FRulez, 2]
       else if p.FKeys[KEY_UP].Pressed then ID := PunchFrames[R_BERSERK in p.FRulez, 1]
       else ID := PunchFrames[R_BERSERK in p.FRulez, 0];
-      r_AnimationState_Draw(ID, p.PunchAnim, fX + IfThen(p.Direction = TDirection.D_LEFT, 15 - p.Obj.Rect.X, p.Obj.Rect.X - 15), fY + fSlope + p.Obj.Rect.Y - 11, Mirror);
+      r_AnimationState_Draw(ID, p.PunchAnim, fX + IfThen(p.Direction = TDirection.D_LEFT, 15 - p.Obj.Rect.X, p.Obj.Rect.X - 15), fY + fSlope + p.Obj.Rect.Y - 11, 0, Mirror, False);
     end;
 
     if (p.FMegaRulez[MR_INVUL] > gTime) and ((gPlayerDrawn <> p) or (p.SpawnInvul >= gTime)) then
index c4fe391680359245ceb2fa49000a899ed6e60774..e9877305a0da1fbae544c81ff6762330ce3c2243 100644 (file)
@@ -321,7 +321,9 @@ begin
       FlagAnimState,
       X + IfThen(pm.Direction = TDirection.D_LEFT, fp.X - 1, 2 * FLAG_BASEPOINT.X - fp.X + 1) - FLAG_BASEPOINT.X,
       Y + fp.Y - FLAG_BASEPOINT.Y + 1,
+      0,
       Mirror,
+      False,
       p,
       IfThen(pm.Direction = TDirection.D_RIGHT, fa, -fa)
     );
@@ -363,15 +365,13 @@ begin
 // Модель:
   if (pm.Direction = TDirection.D_LEFT) and (Models[pm.id].Frames[TDirection.D_LEFT, pm.CurrentAnimation].base <> 0) then
   begin
-    pm.AnimState.Alpha := Alpha; // !!!
     FramesID := Models[pm.id].Frames[TDirection.D_LEFT, pm.CurrentAnimation].base;
-    r_AnimationState_Draw(FramesID, pm.AnimState, X, Y, TMirrorType.None);
+    r_AnimationState_Draw(FramesID, pm.AnimState, X, Y, Alpha, TMirrorType.None, False);
   end
   else
   begin
-    pm.AnimState.Alpha := Alpha; // !!!
     FramesID := Models[pm.id].Frames[TDirection.D_RIGHT, pm.CurrentAnimation].base;
-    r_AnimationState_Draw(FramesID, pm.AnimState, X, Y, Mirror);
+    r_AnimationState_Draw(FramesID, pm.AnimState, X, Y, Alpha, Mirror, False);
   end;
 
 // Маска модели:
@@ -379,15 +379,13 @@ begin
 
   if (pm.Direction = TDirection.D_LEFT) and (Models[pm.id].Frames[TDirection.D_LEFT, pm.CurrentAnimation].mask <> 0) then
   begin
-    pm.AnimState.Alpha := Alpha; // !!!
     FramesID := Models[pm.id].Frames[TDirection.D_LEFT, pm.CurrentAnimation].mask;
-    r_AnimationState_Draw(FramesID, pm.AnimState, X, Y, TMirrorType.None);
+    r_AnimationState_Draw(FramesID, pm.AnimState, X, Y, Alpha, TMirrorType.None, False);
   end
   else
   begin
-    pm.AnimState.Alpha := Alpha; // !!!
     FramesID := Models[pm.id].Frames[TDirection.D_RIGHT, pm.CurrentAnimation].mask;
-    r_AnimationState_Draw(FramesID, pm.AnimState, X, Y, Mirror);
+    r_AnimationState_Draw(FramesID, pm.AnimState, X, Y, Alpha, Mirror, False);
   end;
 
   e_Colors.R := 255;
index 648ff507201165d6cdcd9ad20b5017dbd61b7b6b..fb5e612f1c63e144ce5d9ed0f2ca33edca16ff51 100644 (file)
@@ -147,9 +147,9 @@ implementation
           if Animation <> nil then
           begin
             if Shots[i].ShotType in [WEAPON_BARON_FIRE, WEAPON_MANCUB_FIRE, WEAPON_SKEL_FIRE] then
-              r_AnimationState_DrawEx(ShotFrames[Shots[i].ShotType], Animation, fX, fY, TMirrorType.None, p, a)
+              r_AnimationState_DrawEx(ShotFrames[Shots[i].ShotType], Animation, fX, fY, 0, TMirrorType.None, False, p, a)
             else
-              r_AnimationState_Draw(ShotFrames[Shots[i].ShotType], Animation, fX, fY, TMirrorType.None);
+              r_AnimationState_Draw(ShotFrames[Shots[i].ShotType], Animation, fX, fY, 0, TMirrorType.None, False);
           end
           else if ShotTexture[Shots[i].ShotType] <> 0 then
           begin