DEADSOFTWARE

render: hide gib textures within render
[d2df-sdl.git] / src / game / g_playermodel.pas
index ca4b6dc6c4fc92ae6e1ef9eab5f6171cc5c36cd4..820c7c5c52ad72bcfa0e5a49dfef8afb19e2381b 100644 (file)
@@ -85,15 +85,9 @@ type
     Level: Byte;
   end;
 
-  TGibSprite = record
-    ID: DWORD;
-    MaskID: DWORD;
-    Rect: TRectWH;
-    OnlyOne: Boolean;
-  end;
-
   TModelSoundArray = Array of TModelSound;
-  TGibsArray = Array of TGibSprite;
+
+  TGibsArray = Array of Integer;
 
   TPlayerModel = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF}
   private
@@ -141,9 +135,8 @@ function  g_PlayerModel_GetNames(): SSArray;
 function  g_PlayerModel_GetBlood(ModelName: String): TModelBlood;
 function  g_PlayerModel_Get(ModelName: String): TPlayerModel;
 function  g_PlayerModel_GetAnim(ModelName: String; AnimTyp: Byte; var _Anim, _Mask: TAnimation): Boolean;
-function  g_PlayerModel_GetGibs(ModelName: String; var Gibs: TGibsArray): Boolean;
-
-function g_PlayerModel_GetIndex (ModelName: String): Integer;
+function  g_PlayerModel_GetGibs (ModelID: Integer; var Gibs: TGibsArray): Boolean;
+function  g_PlayerModel_GetIndex (ModelName: String): Integer;
 
 (* --- private data --- *)
 
@@ -157,7 +150,6 @@ function g_PlayerModel_GetIndex (ModelName: String): Integer;
       FlagPoint:    TDFPoint;
       FlagAngle:    SmallInt;
       WeaponPoints: TWeaponPoints;
-      Gibs:         TGibsArray; // !!! move to render
       PainSounds:   TModelSoundArray;
       DieSounds:    TModelSoundArray;
       SlopSound:    Byte;
@@ -368,10 +360,10 @@ end;
 function g_PlayerModel_Load(FileName: string): Boolean;
 var
   ID: DWORD;
-  a, b, len, lenpd, lenpd2, aa, bb, f: Integer;
+  a, b, len, aa, bb, f: Integer;
   cc: TDirection;
   config: TConfig;
-  pData, pData2: Pointer;
+  pData: Pointer;
   WAD: TWADFile;
   s: string;
   prefix: string;
@@ -508,26 +500,6 @@ begin
     GibsMask := config.ReadStr('Gibs', 'mask', 'GIBSMASK');
     GibsOnce := config.ReadInt('Gibs', 'once', -1);
 
-    SetLength(Gibs, GibsCount); // !!! remove load
-    if (Gibs <> nil) and
-       (WAD.GetResource('TEXTURES/' + GibsResource, pData, lenpd)) and
-       (WAD.GetResource('TEXTURES/' + GibsMask, pData2, lenpd2)) then
-    begin
-      for a := 0 to High(Gibs) do
-        if e_CreateTextureMemEx(pData, lenpd, Gibs[a].ID, a*32, 0, 32, 32) and
-          e_CreateTextureMemEx(pData2, lenpd2, Gibs[a].MaskID, a*32, 0, 32, 32) then
-        begin
-          //Gibs[a].Rect := e_GetTextureSize2(Gibs[a].ID);
-          Gibs[a].Rect := g_PlayerModel_CalcGibSize(pData, lenpd, a*32, 0, 32, 32);
-          with Gibs[a].Rect do
-            if Height > 3 then Height := Height-1-Random(2);
-          Gibs[a].OnlyOne := GibsOnce = a + 1;
-        end;
-
-      FreeMem(pData);
-      FreeMem(pData2);
-    end;
-
     ok := True;
     for aa := WP_FIRST + 1 to WP_LAST do
       for bb := A_STAND to A_LAST do
@@ -693,44 +665,34 @@ begin
   Result := True;
 end;
 
-function g_PlayerModel_GetGibs(ModelName: string; var Gibs: TGibsArray): Boolean;
-var
-  a, i, b: Integer;
-  c: Boolean;
-begin
-  Result := False;
-
-  if PlayerModelsArray = nil then Exit;
-  if gGibsCount = 0 then Exit;
-
-  c := False;
-
-  SetLength(Gibs, gGibsCount);
+  function g_PlayerModel_GetGibs (ModelID: Integer; var Gibs: TGibsArray): Boolean;
+    var i, b: Integer; c: Boolean;
+  begin
+    Gibs := nil;
+    Result := False;
+    if (PlayerModelsArray = nil) or (gGibsCount = 0) then
+      Exit;
 
-  for a := 0 to High(PlayerModelsArray) do
-    if PlayerModelsArray[a].Name = ModelName then
+    c := False;
+    SetLength(Gibs, gGibsCount);
+    for i := 0 to High(Gibs) do
     begin
-      for i := 0 to High(Gibs) do
+      if c and (PlayerModelsArray[ModelID].GibsCount = 1) then
       begin
-        if c and (Length(PlayerModelsArray[a].Gibs) = 1) then
-        begin
-          SetLength(Gibs, i);
-          Break;
-        end;
-
-        repeat
-          b := Random(Length(PlayerModelsArray[a].Gibs));
-        until not (PlayerModelsArray[a].Gibs[b].OnlyOne and c);
+        SetLength(Gibs, i);
+        Break;
+      end;
 
-        Gibs[i] := PlayerModelsArray[a].Gibs[b];
+      repeat
+        b := Random(PlayerModelsArray[ModelID].GibsCount);
+      until not ((PlayerModelsArray[ModelID].GibsOnce = b + 1) and c);
 
-        if Gibs[i].OnlyOne then c := True;
-      end;
+      Gibs[i] := b;
 
-      Result := True;
-      Break;
+      c := PlayerModelsArray[ModelID].GibsOnce = b + 1;
     end;
-end;
+    Result := True;
+  end;
 
 function g_PlayerModel_GetNames(): SSArray;
 var