index 1f3f23885eaef05e98ac9303c6f89459a6e1b4b9..24ea1642e7aa37ec447a509ed4ce2c02627f7bbf 100644 (file)
anim: TAnimInfo;
end;
+ TConvProc = function (x: Integer): Integer;
+
procedure r_Textures_Initialize;
procedure r_Textures_Finalize;
function r_Textures_LoadStreamFromFile (const filename: AnsiString; w, h, count, cw: Integer; st: TGLTextureArray; rs: TRectArray; log: Boolean = True): Boolean;
- function r_Textures_LoadFontFromFile (const filename: AnsiString; constref f: TFontInfo; skipch: Integer; log: Boolean = true): TGLFont;
+ function r_Textures_LoadFontFromFile (const filename: AnsiString; constref f: TFontInfo; font2enc: TConvProc; log: Boolean = true): TGLFont;
implementation
uses
SysUtils, Classes,
+ r_common,
e_log, e_res, WADReader, Config,
+ g_console, // cvar declaration
Imaging, ImagingTypes, ImagingUtility
;
var
+ r_GL_MaxTexSize: WORD;
maxTileSize: Integer;
atl: array of TGLAtlas;
var i: Integer;
begin
for i := 0 to self.count - 1 do
- self.mTexture[i].Free;
- self.mTexture := nil;
+ r_Common_FreeAndNil(self.mTexture[i]);
+ SetLength(self.mTexture, 0);
inherited;
end;
(* --------- Init / Fin --------- *)
+ function IsPOT (v: LongWord): Boolean;
+ begin
+ result := (v <> 0) and ((v and (v - 1)) = 0)
+ end;
+
+ function NextPOT (v: LongWord): LongWord;
+ begin
+ DEC(v);
+ v := v or (v >> 1);
+ v := v or (v >> 2);
+ v := v or (v >> 4);
+ v := v or (v >> 8);
+ v := v or (v >> 16);
+ INC(v);
+ result := v;
+ end;
+
function r_Textures_GetMaxHardwareSize (): Integer;
var size: GLint = 0;
begin
- glGetIntegerv(GL_MAX_TEXTURE_SIZE, @size);
- if size < 64 then size := 64;
- //if size > 512 then size := 512;
- //size := 64; // !!!
+ if r_GL_MaxTexSize <= 0 then
+ begin
+ // auto, max possible reccomended by driver
+ glGetIntegerv(GL_MAX_TEXTURE_SIZE, @size);
+ if size < 1 then size := 64;
+ end
+ else
+ begin
+ // selected by user
+ if IsPOT(r_GL_MaxTexSize) then
+ size := r_GL_MaxTexSize
+ else
+ size := NextPOT(r_GL_MaxTexSize);
+ end;
result := size;
end;
procedure r_Textures_Initialize;
begin
maxTileSize := r_Textures_GetMaxHardwareSize();
+ e_LogWritefln('TEXTURE SIZE: %s', [maxTileSize]);
end;
procedure r_Textures_Finalize;
begin
glDeleteTextures(1, @atl[i].id);
atl[i].id := 0;
- atl[i].Free;
+ r_Common_FreeAndNil(atl[i]);
end;
- atl := nil;
end;
+ SetLength(atl, 0);
end;
function r_Textures_FixImageData (var img: TImageData): Boolean;
(* --------- TGLFont --------- *)
- function r_Textures_LoadFontFromFile (const filename: AnsiString; constref f: TFontInfo; skipch: Integer; log: Boolean = true): TGLFont;
- var i: Integer; st: TGLTextureArray; font: TGLFont; t: TGLTexture;
+ function r_Textures_LoadFontFromFile (const filename: AnsiString; constref f: TFontInfo; font2enc: TConvProc; log: Boolean = true): TGLFont;
+ var i, ch: Integer; st, stch: TGLTextureArray; font: TGLFont;
begin
- ASSERT(skipch >= 0);
result := nil;
SetLength(st, 256);
if r_Textures_LoadStreamFromFile(filename, f.w, f.h, 256, 16, st, nil, log) then
begin
- if skipch > 0 then
+ font := TGLFont.Create();
+ font.info := f;
+ font.ch := st;
+ if Assigned(font2enc) then
begin
+ SetLength(stch, 256);
for i := 0 to 255 do
begin
- t := st[i];
- st[i] := st[(i + skipch) mod 256];
- st[(i + skipch) mod 256] := t;
+ ch := font2enc(i);
+ ASSERT((ch >= 0) and (ch <= 255));
+ stch[ch] := st[i];
end;
+ font.ch := stch;
+ SetLength(st, 0);
end;
- font := TGLFont.Create();
- font.info := f;
- font.ch := st;
result := font;
end;
end;
result := self.info.kern;
end;
+initialization
+ conRegVar('r_gl_maxtexsize', @r_GL_MaxTexSize, '', '');
+ r_GL_MaxTexSize := 0; // default is automatic value
end.