1 (* Copyright (C) DooM 2D:Forever Developers
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *)
16 {$INCLUDE ../shared/a_modes.inc}
19 { This unit provides interface to load 24-bit and 32-bit uncompressed images
20 from Truevision Targa (TGA) graphic files, and create OpenGL textures
21 from it's data. }
23 interface
25 uses
29 type
38 var
43 function CreateTexture (var tex: GLTexture; Width, Height, aFormat: Word; pData: Pointer): Boolean;
45 // Standard set of images loading functions
46 function LoadTexture (Filename: String; var Texture: GLTexture; var pWidth, pHeight: Word; Fmt: PWord=nil): Boolean;
47 function LoadTextureEx (Filename: String; var Texture: GLTexture; fX, fY, fWidth, fHeight: Word; Fmt: PWord=nil): Boolean;
48 function LoadTextureMem (pData: Pointer; dataSize: LongInt; var Texture: GLTexture; var pWidth, pHeight: Word; Fmt: PWord=nil): Boolean;
49 function LoadTextureMemEx (pData: Pointer; dataSize: LongInt; var Texture: GLTexture; fX, fY, fWidth, fHeight: Word; Fmt: PWord=nil): Boolean;
51 // `img` must be valid!
52 function LoadTextureImg (var img: TImageData; var Texture: GLTexture; var pWidth, pHeight: Word; Fmt: PWord=nil): Boolean;
55 implementation
57 uses
62 begin
74 // This is auxiliary function that creates OpenGL texture from raw image data
75 function CreateTexture (var tex: GLTexture; Width, Height, aFormat: Word; pData: Pointer): Boolean;
76 var
81 begin
90 begin
97 //if (tex.glwidth <> tex.width) or (tex.glheight <> tex.height) then
98 // e_WriteLog(Format('NPOT: orig is %ux%u; gl is %ux%u; u=%f; v=%f', [Width, Height, tex.glwidth, tex.glheight, tex.u, tex.v]), MSG_NOTIFY);
101 begin
104 Exit;
112 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);
114 // texture blends with object background
116 // texture does NOT blend with object background
117 //glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
119 {
120 Select a filtering type.
121 BiLinear filtering produces very good results with little performance impact
123 GL_NEAREST - Basic texture (grainy looking texture)
124 GL_LINEAR - BiLinear filtering
125 GL_LINEAR_MIPMAP_NEAREST - Basic mipmapped texture
126 GL_LINEAR_MIPMAP_LINEAR - BiLinear Mipmapped texture
127 }
129 // for GL_TEXTURE_MAG_FILTER only first two can be used
131 // for GL_TEXTURE_MIN_FILTER all of the above can be used
134 // create empty texture
136 glTexImage2D(GL_TEXTURE_2D, 0, fmt, tex.glwidth, tex.glheight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);
138 (*
139 GetMem(buf, tex.glwidth*4*tex.glheight);
140 try
141 FillChar(buf^, tex.glwidth*4*tex.glheight, 255);
142 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, tex.glwidth, tex.glheight, fmt, GL_UNSIGNED_BYTE, buf);
143 if (tex.glheight = 128) and (tex.height = 80) then
144 begin
145 for f := 0 to tex.glheight-1 do
146 begin
147 for c := 0 to tex.glwidth-1 do
148 begin
149 buf[f*(tex.glwidth*4)+c*4+0] := 255;
150 buf[f*(tex.glwidth*4)+c*4+1] := 127;
151 buf[f*(tex.glwidth*4)+c*4+2] := 0;
152 end;
153 end;
154 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 82, tex.glwidth, {tex.glheight}1, fmt, GL_UNSIGNED_BYTE, buf);
155 end;
156 finally
157 FreeMem(buf);
158 end;
159 *)
162 //glTexSubImage2D(GL_TEXTURE_2D, 0, 0, tex.glheight-tex.height, Width, Height, fmt, GL_UNSIGNED_BYTE, pData);
169 // `img` must be valid!
170 function LoadTextureImg (var img: TImageData; var Texture: GLTexture; var pWidth, pHeight: Word; Fmt: PWord=nil): Boolean;
171 var
177 begin
184 begin
186 exit;
188 //ConvertImage(img, ifA8R8G8B8);
195 try
196 // it's slow, but i don't care for now
199 begin
201 begin
211 finally
217 function LoadTextureMem (pData: Pointer; dataSize: LongInt; var Texture: GLTexture; var pWidth, pHeight: Word; Fmt: PWord=nil): Boolean;
218 var
225 begin
233 begin
235 exit;
237 try
239 finally
245 function LoadTextureMemEx (pData: Pointer; dataSize: LongInt; var Texture: GLTexture; fX, fY, fWidth, fHeight: Word; Fmt: PWord=nil): Boolean;
246 var
253 begin
259 begin
261 exit;
263 try
265 begin
267 exit;
269 //ConvertImage(img, ifA8R8G8B8);
274 //writeln('fX=', fX, '; fY=', fY, '; fWidth=', fWidth, '; fHeight=', fHeight);
277 try
278 // it's slow, but i don't care for now
281 begin
283 begin
293 finally
296 finally
302 function LoadTexture (filename: AnsiString; var Texture: GLTexture; var pWidth, pHeight: Word; Fmt: PWord=nil): Boolean;
303 var
307 begin
314 try
316 except
320 begin
322 exit;
325 try
328 try
331 finally
334 finally
340 function LoadTextureEx (filename: AnsiString; var Texture: GLTexture; fX, fY, fWidth, fHeight: Word; Fmt: PWord=nil): Boolean;
341 var
345 begin
350 try
352 except
356 begin
358 exit;
361 try
364 try
367 finally
370 finally