DEADSOFTWARE

game: remove unneded render imports
[d2df-sdl.git] / src / game / g_playermodel.pas
index 393e07d6fa7f426cfad03d5b3f83f82033ed89bf..142401547a3c6b77d9d01bacd8b1bb13f2b74fde 100644 (file)
@@ -18,9 +18,7 @@ unit g_playermodel;
 
 interface
 
-uses
-  MAPDEF, g_textures, g_base, g_basic, g_weapons, r_graphics, utils, g_gfx,
-  ImagingTypes, Imaging, ImagingUtility;
+  uses MAPDEF, g_textures, g_base, g_basic, g_weapons, utils, g_gfx;
 
 const
   A_STAND      = 0;
@@ -80,27 +78,14 @@ type
     R, G, B, Kind: Byte;
   end;
 
-  TModelInfo = record
-    Name:        String;
-    Author:      String;
-    Description: String;
-    HaveWeapon:  Boolean;
-  end;
-
   TModelSound = record
     ID:    DWORD;
     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
@@ -145,22 +130,23 @@ procedure g_PlayerModel_LoadAll;
 procedure g_PlayerModel_FreeData();
 function  g_PlayerModel_Load(FileName: String): Boolean;
 function  g_PlayerModel_GetNames(): SSArray;
-function  g_PlayerModel_GetInfo(ModelName: String): TModelInfo;
 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_GetGibs (ModelID: Integer; var Gibs: TGibsArray): Boolean;
+function  g_PlayerModel_GetIndex (ModelName: String): Integer;
 
 (* --- private data --- *)
 
   type
     TPlayerModelInfo = record
-      Info:         TModelInfo;
+      Name:         String;
+      Author:       String;
+      Description:  String;
+      HaveWeapon:   Boolean;
       ModelSpeed:   Array [A_STAND..A_PAIN] of Byte;
       FlagPoint:    TDFPoint;
       FlagAngle:    SmallInt;
       WeaponPoints: TWeaponPoints;
-      Gibs:         TGibsArray; // !!! move to render
       PainSounds:   TModelSoundArray;
       DieSounds:    TModelSoundArray;
       SlopSound:    Byte;
@@ -180,7 +166,7 @@ function  g_PlayerModel_GetGibs(ModelName: String; var Gibs: TGibsArray): Boolea
 implementation
 
 uses
-  g_sound, g_console, SysUtils, g_player, CONFIG, r_textures, r_animations,
+  g_sound, g_console, SysUtils, g_player, CONFIG,
   e_sound, g_options, g_map, Math, e_log, wadreader;
 
 const
@@ -202,6 +188,20 @@ const
   WeapNames: Array [WP_FIRST + 1..WP_LAST] of String =
              ('csaw', 'hgun', 'sg', 'ssg', 'mgun', 'rkt', 'plz', 'bfg', 'spl', 'flm');
 
+  function g_PlayerModel_GetIndex (ModelName: String): Integer;
+    var i: Integer;
+  begin
+    Result := -1;
+    if PlayerModelsArray <> nil then
+    begin
+      i := 0;
+      while (i < Length(PlayerModelsArray)) and (PlayerModelsArray[i].Name <> ModelName) do
+        Inc(i);
+      if i < Length(PlayerModelsArray) then
+        Result := i
+    end
+  end;
+
 function GetPoint(var str: String; var point: TDFPoint): Boolean;
 var
   a, x, y: Integer;
@@ -295,72 +295,13 @@ end;
     end;
   end;
 
-function g_PlayerModel_CalcGibSize (pData: Pointer; dataSize, x, y, w, h: Integer): TRectWH;
-  var i, j: Integer; done: Boolean; img: TImageData;
-
-  function IsVoid (i, j: Integer): Boolean;
-  begin
-    result := Byte((PByte(img.bits) + (y+j)*img.width*4 + (x+i)*4 + 3)^) = 0
-  end;
-
-begin
-  InitImage(img);
-  assert(LoadImageFromMemory(pData, dataSize, img));
-
-  (* trace x from right to left *)
-  done := false; i := 0;
-  while not done and (i < w) do
-  begin
-    j := 0;
-    while (j < h) and IsVoid(i, j) do inc(j);
-    done := (j < h) and (IsVoid(i, j) = false);
-    result.x := i;
-    inc(i);
-  end;
-
-  (* trace y from up to down *)
-  done := false; j := 0;
-  while not done and (j < h) do
-  begin
-    i := 0;
-    while (i < w) and IsVoid(i, j) do inc(i);
-    done := (i < w) and (IsVoid(i, j) = false);
-    result.y := j;
-    inc(j);
-  end;
-  
-  (* trace x from right to left *)
-  done := false; i := w - 1;
-  while not done and (i >= 0) do
-  begin
-    j := 0;
-    while (j < h) and IsVoid(i, j) do inc(j);
-    done := (j < h) and (IsVoid(i, j) = false);
-    result.width := i - result.x + 1;
-    dec(i);
-  end;
-
-  (* trace y from down to up *)
-  done := false; j := h - 1;
-  while not done and (j >= 0) do
-  begin
-    i := 0;
-    while (i < w) and IsVoid(i, j) do inc(i);
-    done := (i < w) and (IsVoid(i, j) = false);
-    result.height := j - result.y + 1;
-    dec(j);
-  end;
-
-  FreeImage(img);
-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;
@@ -401,13 +342,9 @@ begin
 
   prefix := FileName+':TEXTURES\';
 
-  with PlayerModelsArray[ID].Info do
-  begin
-    Name := s;
-    Author := config.ReadStr('Model', 'author', '');
-    Description := config.ReadStr('Model', 'description', '');
-  end;
-
+  PlayerModelsArray[ID].Name := s;
+  PlayerModelsArray[ID].Author := config.ReadStr('Model', 'author', '');
+  PlayerModelsArray[ID].Description := config.ReadStr('Model', 'description', '');
   PlayerModelsArray[ID].FileName := FileName;
   with PlayerModelsArray[ID] do
   begin
@@ -501,26 +438,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
@@ -614,7 +531,7 @@ begin
         end;
     {if ok then g_Console_Add(Info.Name+' weapon points ok')
     else g_Console_Add(Info.Name+' weapon points fail');}
-    Info.HaveWeapon := ok;
+    PlayerModelsArray[ID].HaveWeapon := ok;
 
     s := config.ReadStr('Model', 'flag_point', '');
     if not GetPoint(s, FlagPoint) then
@@ -629,7 +546,7 @@ begin
   Result := True;
 end;
 
-function g_PlayerModel_Get(ModelName: String): TPlayerModel;
+function g_PlayerModel_Get (ModelName: String): TPlayerModel;
   var a: Integer;
 begin
   Result := nil;
@@ -638,7 +555,7 @@ begin
 
   for a := 0 to High(PlayerModelsArray) do
   begin
-    if AnsiLowerCase(PlayerModelsArray[a].Info.Name) = AnsiLowerCase(ModelName) then
+    if AnsiLowerCase(PlayerModelsArray[a].Name) = AnsiLowerCase(ModelName) then
     begin
       Result := TPlayerModel.Create;
 
@@ -652,77 +569,34 @@ begin
   end;
 end;
 
-function g_PlayerModel_GetAnim(ModelName: string; AnimTyp: Byte; var _Anim, _Mask: TAnimation): Boolean;
-var
-  a: Integer;
-  c: Boolean;
-  ID: DWORD;
-begin
-  Result := False;
+  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;
 
-  if PlayerModelsArray = nil then Exit;
-  for a := 0 to High(PlayerModelsArray) do
-    if PlayerModelsArray[a].Info.Name = ModelName then
-      with PlayerModelsArray[a] do
+    c := False;
+    SetLength(Gibs, gGibsCount);
+    for i := 0 to High(Gibs) do
+    begin
+      if c and (PlayerModelsArray[ModelID].GibsCount = 1) then
       begin
-        if AnimTyp in [A_STAND, A_WALK] then c := True else c := False;
-
-        if not g_Frames_Get(ID, Info.Name+'_RIGHTANIM'+IntToStr(AnimTyp)) then
-          if not g_Frames_Get(ID, Info.Name+'_LEFTANIM'+IntToStr(AnimTyp)) then Exit;
-
-        _Anim := TAnimation.Create(ID, c, ModelSpeed[AnimTyp]);
-        _Anim.Speed := ModelSpeed[AnimTyp];
-
-        if not g_Frames_Get(ID, Info.Name+'_RIGHTANIM'+IntToStr(AnimTyp)+'_MASK') then
-          if not g_Frames_Get(ID, Info.Name+'_LEFTANIM'+IntToStr(AnimTyp)+'_MASK') then Exit;
-
-        _Mask := TAnimation.Create(ID, c, ModelSpeed[AnimTyp]);
-        _Mask.Speed := ModelSpeed[AnimTyp];
-
+        SetLength(Gibs, i);
         Break;
       end;
 
-  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);
-
-  for a := 0 to High(PlayerModelsArray) do
-    if PlayerModelsArray[a].Info.Name = ModelName then
-    begin
-      for i := 0 to High(Gibs) do
-      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);
+      repeat
+        b := Random(PlayerModelsArray[ModelID].GibsCount);
+      until not ((PlayerModelsArray[ModelID].GibsOnce = b + 1) and c);
 
-        Gibs[i] := PlayerModelsArray[a].Gibs[b];
+      Gibs[i] := b;
 
-        if Gibs[i].OnlyOne then c := True;
-      end;
-
-      Result := True;
-      Break;
+      c := PlayerModelsArray[ModelID].GibsOnce = b + 1;
     end;
-end;
+    Result := True;
+  end;
 
 function g_PlayerModel_GetNames(): SSArray;
 var
@@ -735,25 +609,10 @@ begin
   for i := 0 to High(PlayerModelsArray) do
   begin
     SetLength(Result, Length(Result)+1);
-    Result[High(Result)] := PlayerModelsArray[i].Info.Name;
+    Result[High(Result)] := PlayerModelsArray[i].Name;
   end;
 end;
 
-function g_PlayerModel_GetInfo(ModelName: string): TModelInfo;
-var
-  a: Integer;
-begin
-  FillChar(Result, SizeOf(Result), 0);
-  if PlayerModelsArray = nil then Exit;
-
-  for a := 0 to High(PlayerModelsArray) do
-    if PlayerModelsArray[a].Info.Name = ModelName then
-    begin
-      Result := PlayerModelsArray[a].Info;
-      Break;
-    end;
-end;
-
 function g_PlayerModel_GetBlood(ModelName: string): TModelBlood;
 var
   a: Integer;
@@ -765,7 +624,7 @@ begin
   if PlayerModelsArray = nil then Exit;
 
   for a := 0 to High(PlayerModelsArray) do
-    if PlayerModelsArray[a].Info.Name = ModelName then
+    if PlayerModelsArray[a].Name = ModelName then
     begin
       Result := PlayerModelsArray[a].Blood;
       Break;
@@ -905,7 +764,7 @@ end;
 
   function TPlayerModel.GetName (): String;
   begin
-    Result := PlayerModelsArray[FID].Info.Name
+    Result := PlayerModelsArray[FID].Name
   end;
 
   procedure TPlayerModel.Update;