index ce71ebc727d7e96b0001e0a44a512ba1b9269846..1f3f23885eaef05e98ac9303c6f89459a6e1b4b9 100644 (file)
{$ELSE}
GL, GLEXT,
{$ENDIF}
{$ELSE}
GL, GLEXT,
{$ENDIF}
- g_base, // TRectHW
+ g_base, g_animations, // TRectHW, TAnimInfo
utils,
utils,
- r_atlas
+ r_atlas, r_fonts
;
type
;
type
TGLMultiTexture = class
private
mTexture: array of TGLTexture;
TGLMultiTexture = class
private
mTexture: array of TGLTexture;
- mBackanim: Boolean;
public
destructor Destroy; override;
public
destructor Destroy; override;
property width: Integer read GetWidth;
property height: Integer read GetHeight;
property count: Integer read GetCount;
property width: Integer read GetWidth;
property height: Integer read GetHeight;
property count: Integer read GetCount;
- property backAnim: Boolean read mBackanim; (* this property must be located at TAnimState? *)
end;
TGLTextureArray = array of TGLTexture;
TRectArray = array of TRectWH;
end;
TGLTextureArray = array of TGLTexture;
TRectArray = array of TRectWH;
+ TGLFont = class sealed (TFont)
+ private
+ info: TFontInfo;
+ ch: TGLTextureArray;
+
+ public
+ destructor Destroy; override;
+ function GetChar (c: AnsiChar): TGLTexture;
+ function GetWidth (c: AnsiChar): Integer;
+ function GetMaxWidth (): Integer;
+ function GetMaxHeight (): Integer;
+ function GetSpace (): Integer;
+ end;
+
+ TAnimTextInfo = record
+ name: AnsiString;
+ w, h: Integer;
+ anim: TAnimInfo;
+ end;
+
procedure r_Textures_Initialize;
procedure r_Textures_Finalize;
function r_Textures_LoadFromFile (const filename: AnsiString; log: Boolean = True): TGLTexture;
function r_Textures_LoadMultiFromFile (const filename: AnsiString; log: Boolean = True): TGLMultiTexture;
procedure r_Textures_Initialize;
procedure r_Textures_Finalize;
function r_Textures_LoadFromFile (const filename: AnsiString; log: Boolean = True): TGLTexture;
function r_Textures_LoadMultiFromFile (const filename: AnsiString; log: Boolean = True): TGLMultiTexture;
- function r_Textures_LoadMultiFromFileAndInfo (const filename: AnsiString; w, h, count: Integer; backanim: Boolean; log: Boolean = True): TGLMultiTexture;
- function r_Textures_LoadStreamFromFile (const filename: AnsiString; w, h, count: Integer; st: TGLTextureArray; rs: TRectArray; log: Boolean = True): Boolean;
+ function r_Textures_LoadMultiFromFileAndInfo (const filename: AnsiString; w, h, count: Integer; log: Boolean = True): TGLMultiTexture;
+ function r_Textures_LoadMultiTextFromFile (const filename: AnsiString; var txt: TAnimTextInfo; log: Boolean = True): TGLMultiTexture;
+
+ 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;
implementation
implementation
function r_Textures_LoadFromImage (var img: TImageData): TGLTexture;
var t: TGLTexture; n: TGLAtlasNode; c: TDynImageDataArray; cw, ch, i, j: LongInt;
begin
function r_Textures_LoadFromImage (var img: TImageData): TGLTexture;
var t: TGLTexture; n: TGLAtlasNode; c: TDynImageDataArray; cw, ch, i, j: LongInt;
begin
- // e_logwritefln('r_Textures_CreateFromImage: w=%s h=%s', [img.width, img.height]);
result := nil;
if SplitImage(img, c, maxTileSize, maxTileSize, cw, ch, False) then
begin
result := nil;
if SplitImage(img, c, maxTileSize, maxTileSize, cw, ch, False) then
begin
end
end;
end
end;
- function r_Textures_LoadMultiFromImageAndInfo (var img: TImageData; w, h, c: Integer; b: Boolean): TGLMultiTexture;
+ function r_Textures_LoadMultiFromImageAndInfo (var img: TImageData; w, h, c: Integer): TGLMultiTexture;
var t: TImageData; a: array of TGLTexture; i: Integer; m: TGLMultiTexture;
begin
ASSERT(w >= 0);
var t: TImageData; a: array of TGLTexture; i: Integer; m: TGLMultiTexture;
begin
ASSERT(w >= 0);
end;
m := TGLMultiTexture.Create();
m.mTexture := a;
end;
m := TGLMultiTexture.Create();
m.mTexture := a;
- m.mBackanim := b;
ASSERT(m.mTexture <> nil);
result := m;
end;
ASSERT(m.mTexture <> nil);
result := m;
end;
- function r_Textures_LoadMultiFromDataAndInfo (data: Pointer; size: LongInt; w, h, c: Integer; b: Boolean): TGLMultiTexture;
+ function r_Textures_LoadMultiFromDataAndInfo (data: Pointer; size: LongInt; w, h, c: Integer): TGLMultiTexture;
var img: TImageData;
begin
ASSERT(w > 0);
var img: TImageData;
begin
ASSERT(w > 0);
try
if LoadImageFromMemory(data, size, img) then
if r_Textures_FixImageData(img) then
try
if LoadImageFromMemory(data, size, img) then
if r_Textures_FixImageData(img) then
- result := r_Textures_LoadMultiFromImageAndInfo(img, w, h, c, b)
+ result := r_Textures_LoadMultiFromImageAndInfo(img, w, h, c)
except
end;
FreeImage(img);
end;
end;
except
end;
FreeImage(img);
end;
end;
- function r_Textures_LoadMultiFromWad (wad: TWADFile): TGLMultiTexture;
- var data: Pointer; size: LongInt; TexRes: AnsiString; w, h, c: Integer; b: Boolean; cfg: TConfig; img: TImageData;
+ function r_Textures_LoadTextFromMemory (data: Pointer; size: LongInt; var txt: TAnimTextInfo): Boolean;
+ var cfg: TConfig;
+ begin
+ result := false;
+ if data <> nil then
+ begin
+ cfg := TConfig.CreateMem(data, size);
+ if cfg <> nil then
+ begin
+ txt.name := cfg.ReadStr('', 'resource', '');
+ txt.w := MAX(0, cfg.ReadInt('', 'framewidth', 0));
+ txt.h := MAX(0, cfg.ReadInt('', 'frameheight', 0));
+ txt.anim.loop := true;
+ txt.anim.delay := MAX(0, cfg.ReadInt('', 'waitcount', 0));
+ txt.anim.frames := MAX(0, cfg.ReadInt('', 'framecount', 0));
+ txt.anim.back := cfg.ReadBool('', 'backanim', false);
+ cfg.Free;
+ result := (txt.name <> '') and (txt.w > 0) and (txt.h > 0) and (txt.anim.delay > 0) and (txt.anim.frames > 0);
+ end;
+ end;
+ end;
+
+ function r_Textures_LoadMultiFromWad (wad: TWADFile; var txt: TAnimTextInfo): TGLMultiTexture;
+ var data: Pointer; size: LongInt; img: TImageData;
begin
ASSERT(wad <> nil);
result := nil;
if wad.GetResource('TEXT/ANIM', data, size) then
begin
begin
ASSERT(wad <> nil);
result := nil;
if wad.GetResource('TEXT/ANIM', data, size) then
begin
- cfg := TConfig.CreateMem(data, size);
- FreeMem(data);
- if cfg <> nil then
+ if r_Textures_LoadTextFromMemory(data, size, txt) then
begin
begin
- TexRes := cfg.ReadStr('', 'resource', '');
- w := cfg.ReadInt('', 'framewidth', 0);
- h := cfg.ReadInt('', 'frameheight', 0);
- c := cfg.ReadInt('', 'framecount', 0);
- b := cfg.ReadBool('', 'backanim', false);
- if (TexRes <> '') and (w > 0) and (h > 0) and (c > 0) then
+ FreeMem(data);
+ if wad.GetResource('TEXTURES/' + txt.name, data, size) then
begin
begin
- if wad.GetResource('TEXTURES/' + TexRes, data, size) then
- begin
- InitImage(img);
- try
- if LoadImageFromMemory(data, size, img) then
- if r_Textures_FixImageData(img) then
- result := r_Textures_LoadMultiFromImageAndInfo(img, w, h, c, b)
- finally
- FreeMem(data);
- end;
- FreeImage(img);
- end
+ InitImage(img);
+ try
+ if LoadImageFromMemory(data, size, img) then
+ if r_Textures_FixImageData(img) then
+ result := r_Textures_LoadMultiFromImageAndInfo(img, txt.w, txt.h, txt.anim.frames);
+ finally
+ FreeMem(data);
+ end;
+ FreeImage(img);
end;
end;
- cfg.Free;
end
end
+ else
+ FreeMem(data);
end;
end;
end;
end;
- function r_Textures_LoadMultiFromMemory (data: Pointer; size: LongInt): TGLMultiTexture;
+ function r_Textures_LoadMultiFromMemory (data: Pointer; size: LongInt; var txt: TAnimTextInfo): TGLMultiTexture;
var wad: TWADFile; t: TGLTexture; m: TGLMultiTexture;
begin
result := nil;
var wad: TWADFile; t: TGLTexture; m: TGLMultiTexture;
begin
result := nil;
m := TGLMultiTexture.Create();
SetLength(m.mTexture, 1);
m.mTexture[0] := t;
m := TGLMultiTexture.Create();
SetLength(m.mTexture, 1);
m.mTexture[0] := t;
- m.mBackanim := false;
+ txt.name := '';
+ txt.w := m.width;
+ txt.h := m.height;
+ txt.anim.loop := true;
+ txt.anim.delay := 1;
+ txt.anim.frames := 1;
+ txt.anim.back := false;
result := m;
end
else if IsWadData(data, size) then
result := m;
end
else if IsWadData(data, size) then
wad := TWADFile.Create();
if wad.ReadMemory(data, size) then
begin
wad := TWADFile.Create();
if wad.ReadMemory(data, size) then
begin
- result := r_Textures_LoadMultiFromWad(wad);
+ result := r_Textures_LoadMultiFromWad(wad, txt);
wad.Free;
end
end
end
end;
wad.Free;
end
end
end
end;
- function r_Textures_LoadMultiFromFile (const filename: AnsiString; log: Boolean = True): TGLMultiTexture;
- var wad: TWADFile; wadName, resName: AnsiString; data: Pointer; size: Integer; t: TGLTexture;
+ function r_Textures_LoadMultiTextFromFile (const filename: AnsiString; var txt: TAnimTextInfo; log: Boolean = True): TGLMultiTexture;
+ var wad: TWADFile; wadName, resName: AnsiString; data: Pointer; size: Integer;
begin
result := nil;
wadName := g_ExtractWadName(filename);
begin
result := nil;
wadName := g_ExtractWadName(filename);
resName := g_ExtractFilePathName(filename);
if wad.GetResource(resName, data, size, log) then
begin
resName := g_ExtractFilePathName(filename);
if wad.GetResource(resName, data, size, log) then
begin
- result := r_Textures_LoadMultiFromMemory(data, size);
+ result := r_Textures_LoadMultiFromMemory(data, size, txt);
FreeMem(data);
end;
wad.Free
end
end;
FreeMem(data);
end;
wad.Free
end
end;
- function r_Textures_LoadMultiFromFileAndInfo (const filename: AnsiString; w, h, count: Integer; backanim: Boolean; log: Boolean = True): TGLMultiTexture;
+ function r_Textures_LoadMultiFromFile (const filename: AnsiString; log: Boolean = True): TGLMultiTexture;
+ var txt: TAnimTextInfo;
+ begin
+ result := r_Textures_LoadMultiTextFromFile(filename, txt, log);
+ end;
+
+ function r_Textures_LoadMultiFromFileAndInfo (const filename: AnsiString; w, h, count: Integer; log: Boolean = True): TGLMultiTexture;
var wad: TWADFile; wadName, resName: AnsiString; data: Pointer; size: Integer;
begin
ASSERT(w > 0);
var wad: TWADFile; wadName, resName: AnsiString; data: Pointer; size: Integer;
begin
ASSERT(w > 0);
resName := g_ExtractFilePathName(filename);
if wad.GetResource(resName, data, size, log) then
begin
resName := g_ExtractFilePathName(filename);
if wad.GetResource(resName, data, size, log) then
begin
- result := r_Textures_LoadMultiFromDataAndInfo(data, size, w, h, count, backanim);
+ result := r_Textures_LoadMultiFromDataAndInfo(data, size, w, h, count);
FreeMem(data);
end;
wad.Free
FreeMem(data);
end;
wad.Free
end;
end;
end;
end;
- function r_Textures_LoadStreamFromImage (var img: TImageData; w, h, c: Integer; st: TGLTextureArray; rs: TRectArray): Boolean;
- var i: Integer; t: TImageData;
+ function r_Textures_LoadStreamFromImage (var img: TImageData; w, h, c, cw: Integer; st: TGLTextureArray; rs: TRectArray): Boolean;
+ var i, x, y: Integer; t: TImageData;
begin
ASSERT(w >= 0);
ASSERT(h >= 0);
ASSERT(c >= 1);
begin
ASSERT(w >= 0);
ASSERT(h >= 0);
ASSERT(c >= 1);
+ ASSERT(cw >= 1);
ASSERT((st <> nil) and (Length(st) >= c));
ASSERT((rs = nil) or (Length(rs) >= c));
result := true;
for i := 0 to c - 1 do
begin
ASSERT((st <> nil) and (Length(st) >= c));
ASSERT((rs = nil) or (Length(rs) >= c));
result := true;
for i := 0 to c - 1 do
begin
+ x := i mod cw;
+ y := i div cw;
InitImage(t);
st[i] := nil;
if NewImage(w, h, img.Format, t) then
begin
InitImage(t);
st[i] := nil;
if NewImage(w, h, img.Format, t) then
begin
- if CopyRect(img, w * i, 0, w, h, t, 0, 0) then
+ if CopyRect(img, x * w, y * h, w, h, t, 0, 0) then
begin
if rs <> nil then
rs[i] := r_Textures_GetRect(t);
begin
if rs <> nil then
rs[i] := r_Textures_GetRect(t);
end;
end;
end;
end;
- function r_Textures_LoadStreamFromMemory (data: Pointer; size: LongInt; w, h, c: Integer; st: TGLTextureArray; rs: TRectArray): Boolean;
+ function r_Textures_LoadStreamFromMemory (data: Pointer; size: LongInt; w, h, c, cw: Integer; st: TGLTextureArray; rs: TRectArray): Boolean;
var img: TImageData;
begin
ASSERT(w >= 0);
ASSERT(h >= 0);
ASSERT(c >= 1);
var img: TImageData;
begin
ASSERT(w >= 0);
ASSERT(h >= 0);
ASSERT(c >= 1);
+ ASSERT(cw >= 1);
ASSERT((st <> nil) and (Length(st) >= c));
ASSERT((rs = nil) or (Length(rs) >= c));
result := false;
ASSERT((st <> nil) and (Length(st) >= c));
ASSERT((rs = nil) or (Length(rs) >= c));
result := false;
InitImage(img);
try
if LoadImageFromMemory(data, size, img) then
InitImage(img);
try
if LoadImageFromMemory(data, size, img) then
+ begin
if r_Textures_FixImageData(img) then
if r_Textures_FixImageData(img) then
- result := r_Textures_LoadStreamFromImage(img, w, h, c, st, rs)
+ begin
+ result := r_Textures_LoadStreamFromImage(img, w, h, c, cw, st, rs)
+ end;
+ end;
except
end;
FreeImage(img);
end;
end;
except
end;
FreeImage(img);
end;
end;
- function r_Textures_LoadStreamFromFile (const filename: AnsiString; w, h, count: Integer; st: TGLTextureArray; rs: TRectArray; log: Boolean = True): Boolean;
+ function r_Textures_LoadStreamFromFile (const filename: AnsiString; w, h, count, cw: Integer; st: TGLTextureArray; rs: TRectArray; log: Boolean = True): Boolean;
var wad: TWADFile; wadName, resName: AnsiString; data: Pointer; size: Integer;
begin
ASSERT(w > 0);
ASSERT(h > 0);
ASSERT(count >= 1);
var wad: TWADFile; wadName, resName: AnsiString; data: Pointer; size: Integer;
begin
ASSERT(w > 0);
ASSERT(h > 0);
ASSERT(count >= 1);
+ ASSERT(cw >= 1);
ASSERT((st <> nil) and (Length(st) >= count));
ASSERT((rs = nil) or (Length(rs) >= count));
result := false;
ASSERT((st <> nil) and (Length(st) >= count));
ASSERT((rs = nil) or (Length(rs) >= count));
result := false;
resName := g_ExtractFilePathName(filename);
if wad.GetResource(resName, data, size, log) then
begin
resName := g_ExtractFilePathName(filename);
if wad.GetResource(resName, data, size, log) then
begin
- result := r_Textures_LoadStreamFromMemory(data, size, w, h, count, st, rs);
+ result := r_Textures_LoadStreamFromMemory(data, size, w, h, count, cw, st, rs);
FreeMem(data);
end;
wad.Free
FreeMem(data);
end;
wad.Free
- end
+ end;
+ end;
+
+ (* --------- 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;
+ 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
+ begin
+ for i := 0 to 255 do
+ begin
+ t := st[i];
+ st[i] := st[(i + skipch) mod 256];
+ st[(i + skipch) mod 256] := t;
+ end;
+ end;
+ font := TGLFont.Create();
+ font.info := f;
+ font.ch := st;
+ result := font;
+ end;
+ end;
+
+ destructor TGLFont.Destroy;
+ var i: Integer;
+ begin
+ if self.ch <> nil then
+ for i := 0 to High(self.ch) do
+ self.ch[i].Free;
+ self.ch := nil;
+ end;
+
+ function TGLFont.GetChar (c: AnsiChar): TGLTexture;
+ begin
+ result := self.ch[ORD(c)];
+ end;
+
+ function TGLFont.GetWidth (c: AnsiChar): Integer;
+ begin
+ result := self.info.ch[c].w;
+ if result = 0 then
+ result := self.info.w;
+ if self.info.kern < 0 then
+ result := result + self.info.kern;
+ end;
+
+ function TGLFont.GetMaxWidth (): Integer;
+ begin
+ result := self.info.w;
+ if self.info.kern < 0 then
+ result := result + self.info.kern;
+ end;
+
+ function TGLFont.GetMaxHeight (): Integer;
+ begin
+ result := self.info.h;
+ end;
+
+ function TGLFont.GetSpace (): Integer;
+ begin
+ result := self.info.kern;
end;
end.
end;
end.