X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fengine%2Fe_texture.pas;h=58ae4cdb44369d4bc7a7af4f7c14501aa7e1d977;hb=9615ae96661aed9886424c75479d322f555627a6;hp=4db41dc091005e56b554d52f581c6fc822130758;hpb=94a927ca673a2d8af4b8449d434f3c70f38b11c1;p=d2df-sdl.git diff --git a/src/engine/e_texture.pas b/src/engine/e_texture.pas index 4db41dc..58ae4cd 100644 --- a/src/engine/e_texture.pas +++ b/src/engine/e_texture.pas @@ -1,9 +1,8 @@ -(* 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 - * 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 @@ -23,8 +22,8 @@ unit e_texture; interface uses - GL, GLExt, SysUtils, e_log, - ImagingTypes, Imaging, ImagingUtility; + {$INCLUDE ../nogl/noGLuses.inc} + SysUtils, e_log, ImagingTypes, Imaging, ImagingUtility; type GLTexture = record @@ -37,18 +36,17 @@ type 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 -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! -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 @@ -71,12 +69,13 @@ end; // 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; + TEXTUREFILTER: Integer; begin tex.width := Width; tex.height := Height; @@ -103,12 +102,13 @@ begin 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 - 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); @@ -125,6 +125,8 @@ begin 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 @@ -170,7 +172,7 @@ begin 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; @@ -185,7 +187,7 @@ 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); @@ -209,7 +211,7 @@ begin 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); @@ -217,7 +219,7 @@ begin 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; @@ -234,18 +236,18 @@ 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 - result := LoadTextureImg(img, Texture, pWidth, pHeight, Fmt); + result := LoadTextureImg(img, Texture, pWidth, pHeight, Fmt, filter); 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; @@ -260,13 +262,13 @@ 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 - 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); @@ -291,7 +293,7 @@ begin 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); @@ -302,7 +304,7 @@ begin 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; @@ -321,7 +323,7 @@ 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; @@ -330,7 +332,7 @@ begin 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; @@ -340,7 +342,7 @@ begin 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; @@ -357,7 +359,7 @@ 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; @@ -366,7 +368,7 @@ begin 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;