DEADSOFTWARE

no more old mapreader: use textmap reader both for text and for binary maps
[d2df-sdl.git] / src / game / g_textures.pas
index 93d8c63d056e93ad0fc5fef015b1b637173b6ad6..02098004a6432c4d64385e6d6f208c1380e2a569 100644 (file)
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *)
-{$MODE DELPHI}
+{$INCLUDE ../shared/a_modes.inc}
 unit g_textures;
 
 interface
 
 uses
-  e_graphics, BinEditor, ImagingTypes, Imaging, ImagingUtility;
+  e_graphics, MAPDEF, BinEditor, ImagingTypes, Imaging, ImagingUtility;
 
 Type
   TLevelTexture = record
@@ -55,7 +55,7 @@ Type
     constructor Create(FramesID: DWORD; Loop: Boolean; Speed: Byte);
     destructor  Destroy(); override;
     procedure   Draw(X, Y: Integer; Mirror: TMirrorType);
-    procedure   DrawEx(X, Y: Integer; Mirror: TMirrorType; RPoint: TPoint;
+    procedure   DrawEx(X, Y: Integer; Mirror: TMirrorType; RPoint: TDFPoint;
                        Angle: SmallInt);
     procedure   Reset();
     procedure   Update();
@@ -98,9 +98,10 @@ function g_Frames_CreateFile(ID: PDWORD; Name: ShortString; FileName: String;
                              FWidth, FHeight, FCount: Word; BackAnimation: Boolean = False): Boolean;
 function g_Frames_CreateMemory(ID: PDWORD; Name: ShortString; pData: Pointer; dataSize: LongInt;
                                FWidth, FHeight, FCount: Word; BackAnimation: Boolean = False): Boolean;
+function g_Frames_Dup(NewName, OldName: ShortString): Boolean;
 //function g_Frames_CreateRevert(ID: PDWORD; Name: ShortString; Frames: string): Boolean;
-function g_Frames_Get(var ID: DWORD; FramesName: ShortString): Boolean;
-function g_Frames_GetTexture(var ID: DWORD; FramesName: ShortString; Frame: Word): Boolean;
+function g_Frames_Get(out ID: DWORD; FramesName: ShortString): Boolean;
+function g_Frames_GetTexture(out ID: DWORD; FramesName: ShortString; Frame: Word): Boolean;
 function g_Frames_Exists(FramesName: String): Boolean;
 procedure g_Frames_DeleteByName(FramesName: ShortString);
 procedure g_Frames_DeleteByID(ID: DWORD);
@@ -108,11 +109,13 @@ procedure g_Frames_DeleteAll();
 
 procedure DumpTextureNames();
 
+function g_Texture_Light(): Integer;
+
 implementation
 
 uses
   g_game, e_log, g_basic, SysUtils, g_console, wadreader,
-  g_language;
+  g_language, GL;
 
 type
   _TTexture = record
@@ -459,6 +462,9 @@ var
 begin
   Result := False;
 
+  // models without "advanced" animations asks for "nothing" like this; don't spam log
+  if (Length(Resource) > 0) and ((Resource[Length(Resource)] = '/') or (Resource[Length(Resource)] = '\')) then exit;
+
   FileName := g_ExtractWadName(Resource);
 
   WAD := TWADFile.Create();
@@ -512,6 +518,30 @@ begin
  Result := True;
 end;}
 
+function g_Frames_Dup(NewName, OldName: ShortString): Boolean;
+var
+  find_id, b: DWORD;
+  a, c: Integer;
+begin
+  Result := False;
+
+  if not g_Frames_Get(b, OldName) then Exit;
+
+  find_id := FindFrame();
+
+  FramesArray[find_id].Name := LowerCase(NewName);
+  FramesArray[find_id].FrameWidth := FramesArray[b].FrameWidth;
+  FramesArray[find_id].FrameHeight := FramesArray[b].FrameHeight;
+
+  c := High(FramesArray[b].TexturesID);
+  SetLength(FramesArray[find_id].TexturesID, c+1);
+
+  for a := 0 to c do
+    FramesArray[find_id].TexturesID[a] := FramesArray[b].TexturesID[a];
+
+  Result := True;
+end;
+
 procedure g_Frames_DeleteByName(FramesName: ShortString);
 var
   a: DWORD;
@@ -570,7 +600,7 @@ begin
   FramesArray := nil;
 end;
 
-function g_Frames_Get(var ID: DWORD; FramesName: ShortString): Boolean;
+function g_Frames_Get(out ID: DWORD; FramesName: ShortString): Boolean;
 var
   a: DWORD;
 begin
@@ -593,7 +623,7 @@ begin
     g_FatalError(Format(_lc[I_GAME_ERROR_FRAMES], [FramesName]));
 end;
 
-function g_Frames_GetTexture(var ID: DWORD; FramesName: ShortString; Frame: Word): Boolean;
+function g_Frames_GetTexture(out ID: DWORD; FramesName: ShortString; Frame: Word): Boolean;
 var
   a: DWORD;
 begin
@@ -755,7 +785,7 @@ begin
   FEnabled := True;
 end;
 
-procedure TAnimation.DrawEx(X, Y: Integer; Mirror: TMirrorType; RPoint: TPoint;
+procedure TAnimation.DrawEx(X, Y: Integer; Mirror: TMirrorType; RPoint: TDFPoint;
                             Angle: SmallInt);
 begin
   if not FEnabled then
@@ -843,4 +873,64 @@ begin
   Mem.ReadBoolean(FRevert);
 end;
 
+
+var
+  ltexid: GLuint = 0;
+
+function g_Texture_Light(): Integer;
+const
+  Radius: Integer = 128;
+var
+  tex, tpp: PByte;
+  x, y, a: Integer;
+  dist: Double;
+begin
+  if ltexid = 0 then
+  begin
+    GetMem(tex, (Radius*2)*(Radius*2)*4);
+    tpp := tex;
+    for y := 0 to Radius*2-1 do
+    begin
+      for x := 0 to Radius*2-1 do
+      begin
+        dist := 1.0-sqrt((x-Radius)*(x-Radius)+(y-Radius)*(y-Radius))/Radius;
+        if (dist < 0) then
+        begin
+          tpp^ := 0; Inc(tpp);
+          tpp^ := 0; Inc(tpp);
+          tpp^ := 0; Inc(tpp);
+          tpp^ := 0; Inc(tpp);
+        end
+        else
+        begin
+          //tc.setPixel(x, y, Color(cast(int)(dist*255), cast(int)(dist*255), cast(int)(dist*255)));
+          if (dist > 0.5) then dist := 0.5;
+          a := round(dist*255);
+          if (a < 0) then a := 0 else if (a > 255) then a := 255;
+          tpp^ := 255; Inc(tpp);
+          tpp^ := 255; Inc(tpp);
+          tpp^ := 255; Inc(tpp);
+          tpp^ := Byte(a); Inc(tpp);
+        end;
+      end;
+    end;
+
+    glGenTextures(1, @ltexid);
+    //if (tid == 0) assert(0, "VGL: can't create screen texture");
+
+    glBindTexture(GL_TEXTURE_2D, ltexid);
+    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+    //GLfloat[4] bclr = 0.0;
+    //glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, bclr.ptr);
+
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Radius*2, Radius*2, 0, GL_RGBA{gltt}, GL_UNSIGNED_BYTE, tex);
+  end;
+
+  result := ltexid;
+end;
+
 end.