index 4db41dc091005e56b554d52f581c6fc822130758..58ae4cdb44369d4bc7a7af4f7c14501aa7e1d977 100644 (file)
--- a/src/engine/e_texture.pas
+++ b/src/engine/e_texture.pas
-(* Copyright (C) DooM 2D:Forever Developers
+(* Copyright (C) Doom 2D: Forever Developers
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
+ * the Free Software Foundation, version 3 of the License ONLY.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
interface
uses
interface
uses
- GL, GLExt, SysUtils, e_log,
- ImagingTypes, Imaging, ImagingUtility;
+ {$INCLUDE ../nogl/noGLuses.inc}
+ SysUtils, e_log, ImagingTypes, Imaging, ImagingUtility;
type
GLTexture = record
type
GLTexture = record
var
e_DummyTextures: Boolean = False;
var
e_DummyTextures: Boolean = False;
- TEXTUREFILTER: Integer = GL_NEAREST;
-function CreateTexture (var tex: GLTexture; Width, Height, aFormat: Word; pData: Pointer): Boolean;
+function CreateTexture (var tex: GLTexture; Width, Height, aFormat: Word; pData: Pointer; filter: Boolean = False): Boolean;
// Standard set of images loading functions
// Standard set of images loading functions
-function LoadTexture (Filename: String; var Texture: GLTexture; var pWidth, pHeight: Word; Fmt: PWord=nil): Boolean;
-function LoadTextureEx (Filename: String; var Texture: GLTexture; fX, fY, fWidth, fHeight: Word; Fmt: PWord=nil): Boolean;
-function LoadTextureMem (pData: Pointer; dataSize: LongInt; var Texture: GLTexture; var pWidth, pHeight: Word; Fmt: PWord=nil): Boolean;
-function LoadTextureMemEx (pData: Pointer; dataSize: LongInt; var Texture: GLTexture; fX, fY, fWidth, fHeight: Word; Fmt: PWord=nil): Boolean;
+function LoadTexture (Filename: String; var Texture: GLTexture; var pWidth, pHeight: Word; Fmt: PWord=nil; filter: Boolean = False): Boolean;
+function LoadTextureEx (Filename: String; var Texture: GLTexture; fX, fY, fWidth, fHeight: Word; Fmt: PWord=nil; filter: Boolean = False): Boolean;
+function LoadTextureMem (pData: Pointer; dataSize: LongInt; var Texture: GLTexture; var pWidth, pHeight: Word; Fmt: PWord=nil; filter: Boolean = False): Boolean;
+function LoadTextureMemEx (pData: Pointer; dataSize: LongInt; var Texture: GLTexture; fX, fY, fWidth, fHeight: Word; Fmt: PWord=nil; filter: Boolean = False): Boolean;
// `img` must be valid!
// `img` must be valid!
-function LoadTextureImg (var img: TImageData; var Texture: GLTexture; var pWidth, pHeight: Word; Fmt: PWord=nil): Boolean;
+function LoadTextureImg (var img: TImageData; var Texture: GLTexture; var pWidth, pHeight: Word; Fmt: PWord=nil; filter: Boolean = False): Boolean;
implementation
implementation
// This is auxiliary function that creates OpenGL texture from raw image data
// This is auxiliary function that creates OpenGL texture from raw image data
-function CreateTexture (var tex: GLTexture; Width, Height, aFormat: Word; pData: Pointer): Boolean;
+function CreateTexture (var tex: GLTexture; Width, Height, aFormat: Word; pData: Pointer; filter: Boolean = False): Boolean;
var
Texture: GLuint;
fmt: GLenum;
//buf: PByte;
//f, c: Integer;
var
Texture: GLuint;
fmt: GLenum;
//buf: PByte;
//f, c: Integer;
+ TEXTUREFILTER: Integer;
begin
tex.width := Width;
tex.height := Height;
begin
tex.width := Width;
tex.height := Height;
Exit;
end;
Exit;
end;
+ Texture := 0;
glGenTextures(1, @Texture);
tex.id := Texture;
glBindTexture(GL_TEXTURE_2D, Texture);
if (tex.glwidth <> tex.width) or (tex.glheight <> tex.height) then
glGenTextures(1, @Texture);
tex.id := Texture;
glBindTexture(GL_TEXTURE_2D, Texture);
if (tex.glwidth <> tex.width) or (tex.glheight <> tex.height) then
- e_WriteLog(Format('NPOT: %u is %ux%u; gl is %ux%u; u=%f; v=%f', [tex.id, Width, Height, tex.glwidth, tex.glheight, tex.u, tex.v]), MSG_NOTIFY);
+ e_WriteLog(Format('NPOT: %u is %ux%u; gl is %ux%u; u=%f; v=%f', [tex.id, Width, Height, tex.glwidth, tex.glheight, tex.u, tex.v]), TMsgType.Notify);
// texture blends with object background
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
// texture blends with object background
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
GL_LINEAR_MIPMAP_LINEAR - BiLinear Mipmapped texture
}
GL_LINEAR_MIPMAP_LINEAR - BiLinear Mipmapped texture
}
+ if filter then TEXTUREFILTER := GL_LINEAR else TEXTUREFILTER := GL_NEAREST;
+
// for GL_TEXTURE_MAG_FILTER only first two can be used
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, TEXTUREFILTER);
// for GL_TEXTURE_MIN_FILTER all of the above can be used
// for GL_TEXTURE_MAG_FILTER only first two can be used
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, TEXTUREFILTER);
// for GL_TEXTURE_MIN_FILTER all of the above can be used
end;
// `img` must be valid!
end;
// `img` must be valid!
-function LoadTextureImg (var img: TImageData; var Texture: GLTexture; var pWidth, pHeight: Word; Fmt: PWord=nil): Boolean;
+function LoadTextureImg (var img: TImageData; var Texture: GLTexture; var pWidth, pHeight: Word; Fmt: PWord=nil; filter: Boolean = False): Boolean;
var
image, ii: PByte;
width, height: Integer;
var
image, ii: PByte;
width, height: Integer;
if (img.width < 1) or (img.width > 32768) or (img.height < 1) or (img.height > 32768) then
begin
if (img.width < 1) or (img.width > 32768) or (img.height < 1) or (img.height > 32768) then
begin
- e_WriteLog('Error loading texture: invalid image dimensions', MSG_WARNING);
+ e_WriteLog('Error loading texture: invalid image dimensions', TMsgType.Warning);
exit;
end;
//ConvertImage(img, ifA8R8G8B8);
exit;
end;
//ConvertImage(img, ifA8R8G8B8);
ii^ := clr.a; Inc(ii);
end;
end;
ii^ := clr.a; Inc(ii);
end;
end;
- CreateTexture(Texture, width, height, GL_RGBA, image);
+ CreateTexture(Texture, width, height, GL_RGBA, image, filter);
result := true;
finally
FreeMem(image);
result := true;
finally
FreeMem(image);
end;
end;
-function LoadTextureMem (pData: Pointer; dataSize: LongInt; var Texture: GLTexture; var pWidth, pHeight: Word; Fmt: PWord=nil): Boolean;
+function LoadTextureMem (pData: Pointer; dataSize: LongInt; var Texture: GLTexture; var pWidth, pHeight: Word; Fmt: PWord=nil; filter: Boolean = False): Boolean;
var
//image, ii: PByte;
//width, height: Integer;
var
//image, ii: PByte;
//width, height: Integer;
InitImage(img);
if not LoadImageFromMemory(pData, dataSize, img) then
begin
InitImage(img);
if not LoadImageFromMemory(pData, dataSize, img) then
begin
- e_WriteLog('Error loading texture: unknown image format', MSG_WARNING);
+ e_WriteLog('Error loading texture: unknown image format', TMsgType.Warning);
exit;
end;
try
exit;
end;
try
- result := LoadTextureImg(img, Texture, pWidth, pHeight, Fmt);
+ result := LoadTextureImg(img, Texture, pWidth, pHeight, Fmt, filter);
finally
FreeImage(img);
end;
end;
finally
FreeImage(img);
end;
end;
-function LoadTextureMemEx (pData: Pointer; dataSize: LongInt; var Texture: GLTexture; fX, fY, fWidth, fHeight: Word; Fmt: PWord=nil): Boolean;
+function LoadTextureMemEx (pData: Pointer; dataSize: LongInt; var Texture: GLTexture; fX, fY, fWidth, fHeight: Word; Fmt: PWord=nil; filter: Boolean = False): Boolean;
var
image, ii: PByte;
//width, height: Integer;
var
image, ii: PByte;
//width, height: Integer;
InitImage(img);
if not LoadImageFromMemory(pData, dataSize, img) then
begin
InitImage(img);
if not LoadImageFromMemory(pData, dataSize, img) then
begin
- e_WriteLog('Error loading texture: unknown image format', MSG_WARNING);
+ e_WriteLog('Error loading texture: unknown image format', TMsgType.Warning);
exit;
end;
try
if (img.width < 1) or (img.width > 32768) or (img.height < 1) or (img.height > 32768) then
begin
exit;
end;
try
if (img.width < 1) or (img.width > 32768) or (img.height < 1) or (img.height > 32768) then
begin
- e_WriteLog('Error loading texture: invalid image dimensions', MSG_WARNING);
+ e_WriteLog('Error loading texture: invalid image dimensions', TMsgType.Warning);
exit;
end;
//ConvertImage(img, ifA8R8G8B8);
exit;
end;
//ConvertImage(img, ifA8R8G8B8);
ii^ := clr.a; Inc(ii);
end;
end;
ii^ := clr.a; Inc(ii);
end;
end;
- CreateTexture(Texture, fWidth, fHeight, GL_RGBA, image);
+ CreateTexture(Texture, fWidth, fHeight, GL_RGBA, image, filter);
result := true;
finally
FreeMem(image);
result := true;
finally
FreeMem(image);
end;
end;
-function LoadTexture (filename: AnsiString; var Texture: GLTexture; var pWidth, pHeight: Word; Fmt: PWord=nil): Boolean;
+function LoadTexture (filename: AnsiString; var Texture: GLTexture; var pWidth, pHeight: Word; Fmt: PWord=nil; filter: Boolean = False): Boolean;
var
fs: TStream;
img: Pointer;
var
fs: TStream;
img: Pointer;
end;
if fs = nil then
begin
end;
if fs = nil then
begin
- e_WriteLog('Texture "'+filename+'" not found', MSG_WARNING);
+ e_WriteLog('Texture "'+filename+'" not found', TMsgType.Warning);
exit;
end;
exit;
end;
GetMem(img, imageSize);
try
fs.readBuffer(img^, imageSize);
GetMem(img, imageSize);
try
fs.readBuffer(img^, imageSize);
- result := LoadTextureMem(img, imageSize, Texture, pWidth, pHeight, Fmt);
+ result := LoadTextureMem(img, imageSize, Texture, pWidth, pHeight, Fmt, filter);
finally
FreeMem(img);
end;
finally
FreeMem(img);
end;
end;
end;
-function LoadTextureEx (filename: AnsiString; var Texture: GLTexture; fX, fY, fWidth, fHeight: Word; Fmt: PWord=nil): Boolean;
+function LoadTextureEx (filename: AnsiString; var Texture: GLTexture; fX, fY, fWidth, fHeight: Word; Fmt: PWord=nil; filter: Boolean = False): Boolean;
var
fs: TStream;
img: Pointer;
var
fs: TStream;
img: Pointer;
end;
if fs = nil then
begin
end;
if fs = nil then
begin
- e_WriteLog('Texture "'+filename+'" not found', MSG_WARNING);
+ e_WriteLog('Texture "'+filename+'" not found', TMsgType.Warning);
exit;
end;
exit;
end;
GetMem(img, imageSize);
try
fs.readBuffer(img^, imageSize);
GetMem(img, imageSize);
try
fs.readBuffer(img^, imageSize);
- result := LoadTextureMemEx(img, imageSize, Texture, fX, fY, fWidth, fHeight, Fmt);
+ result := LoadTextureMemEx(img, imageSize, Texture, fX, fY, fWidth, fHeight, Fmt, filter);
finally
FreeMem(img);
end;
finally
FreeMem(img);
end;