DEADSOFTWARE

render: separate animation drawing from game code
[d2df-sdl.git] / src / game / g_textures.pas
index b8ebfa0f563d55374148ba1d46bf9da1b866b17c..e95fc6d73312eea7fac07bfe042d510896fd9ded 100644 (file)
@@ -20,7 +20,7 @@ interface
 uses
   SysUtils, Classes,
   {$IFDEF USE_MEMPOOL}mempool,{$ENDIF}
-  r_graphics, MAPDEF, ImagingTypes, Imaging, ImagingUtility;
+  g_base, r_graphics, MAPDEF, ImagingTypes, Imaging, ImagingUtility;
 
 type
   TLevelTexture = record
@@ -53,9 +53,6 @@ type
     constructor Create (aframesID: LongWord; aloop: Boolean; aspeed: Byte);
     destructor  Destroy (); override;
 
-    procedure draw (x, y: Integer; mirror: TMirrorType);
-    procedure drawEx (x, y: Integer; mirror: TMirrorType; rpoint: TDFPoint; angle: SmallInt);
-
     procedure reset ();
     procedure update ();
     procedure enable ();
@@ -82,12 +79,14 @@ type
     property framesId: LongWord read mId;
     property width: Word read mWidth;
     property height: Word read mHeight;
+
+    property id: LongWord read mId;
   end;
 
 
-function g_Texture_CreateWAD (var ID: LongWord; const Resource: AnsiString): Boolean;
+function g_Texture_CreateWAD (var ID: LongWord; const Resource: AnsiString; filterHint: Boolean = False): Boolean;
 function g_Texture_CreateFile (var ID: LongWord; const FileName: AnsiString): Boolean;
-function g_Texture_CreateWADEx (const textureName, Resource: AnsiString): Boolean;
+function g_Texture_CreateWADEx (const textureName, Resource: AnsiString; filterHint: Boolean = False): Boolean;
 function g_Texture_CreateFileEx (const textureName, FileName: AnsiString): Boolean;
 function g_Texture_Get (const textureName: AnsiString; var ID: LongWord): Boolean;
 function g_Texture_GetSize (const textureName: AnsiString; var w, h: Integer): Boolean; overload;
@@ -112,13 +111,20 @@ procedure g_Frames_DeleteAll ();
 
 procedure DumpTextureNames ();
 
-function g_Texture_Light (): Integer;
+  type (* private state *)
+    TFrames = record
+      texturesID: array of LongWord;
+      name: AnsiString;
+      frameWidth, frameHeight: Word;
+      used: Boolean;
+    end;
 
+  var (* private state *)
+    framesArray: array of TFrames = nil;
 
 implementation
 
 uses
-  {$INCLUDE ../nogl/noGLuses.inc}
   g_game, e_log, g_basic, g_console, wadreader,
   g_language, utils, xstreams;
 
@@ -130,16 +136,8 @@ type
     used: Boolean;
   end;
 
-  TFrames = record
-    texturesID: array of LongWord;
-    name: AnsiString;
-    frameWidth, frameHeight: Word;
-    used: Boolean;
-  end;
-
 var
   texturesArray: array of _TTexture = nil;
-  framesArray: array of TFrames = nil;
 
 
 const
@@ -205,7 +203,7 @@ end;
 
 
 // ////////////////////////////////////////////////////////////////////////// //
-function g_Texture_CreateWAD (var ID: LongWord; const Resource: AnsiString): Boolean;
+function g_Texture_CreateWAD (var ID: LongWord; const Resource: AnsiString; filterHint: Boolean = False): Boolean;
 var
   WAD: TWADFile;
   FileName: AnsiString;
@@ -220,7 +218,7 @@ begin
 
   if WAD.GetResource(g_ExtractFilePathName(Resource), TextureData, ResourceLength) then
   begin
-    if e_CreateTextureMem(TextureData, ResourceLength, ID) then
+    if e_CreateTextureMem(TextureData, ResourceLength, ID, filterHint) then
       result := true;
     FreeMem(TextureData)
   end
@@ -244,7 +242,7 @@ begin
 end;
 
 
-function g_Texture_CreateWADEx (const textureName, Resource: AnsiString): Boolean;
+function g_Texture_CreateWADEx (const textureName, Resource: AnsiString; filterHint: Boolean = False): Boolean;
 var
   WAD: TWADFile;
   FileName: AnsiString;
@@ -261,7 +259,7 @@ begin
 
   if WAD.GetResource(g_ExtractFilePathName(Resource), TextureData, ResourceLength) then
   begin
-    result := e_CreateTextureMem(TextureData, ResourceLength, texturesArray[find_id].ID);
+    result := e_CreateTextureMem(TextureData, ResourceLength, texturesArray[find_id].ID, filterHint);
     if result then
     begin
       e_GetTextureSize(texturesArray[find_id].ID, @texturesArray[find_id].width, @texturesArray[find_id].height);
@@ -763,14 +761,6 @@ begin
 end;
 
 
-procedure TAnimation.draw (x, y: Integer; mirror: TMirrorType);
-begin
-  if (not mEnabled) then exit;
-  e_DrawAdv(framesArray[mId].TexturesID[mCurrentFrame], x, y, mAlpha, true, mBlending, 0, nil, mirror);
-  //e_DrawQuad(X, Y, X+FramesArray[ID].FrameWidth-1, Y+FramesArray[ID].FrameHeight-1, 0, 255, 0);
-end;
-
-
 procedure TAnimation.update ();
 begin
   if (not mEnabled) then exit;
@@ -836,13 +826,6 @@ procedure TAnimation.disable (); begin mEnabled := false; end;
 procedure TAnimation.enable (); begin mEnabled := true; end;
 
 
-procedure TAnimation.drawEx (x, y: Integer; mirror: TMirrorType; rpoint: TDFPoint; angle: SmallInt);
-begin
-  if (not mEnabled) then exit;
-  e_DrawAdv(framesArray[mId].TexturesID[mCurrentFrame], x, y, mAlpha, true, mBlending, angle, @rpoint, mirror);
-end;
-
-
 function TAnimation.totalFrames (): Integer; inline; begin result := Length(framesArray[mId].TexturesID); end;
 
 
@@ -910,66 +893,4 @@ begin
   mRevert := utils.readBool(st);
 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.