index 13f3a7dcff89fad8933ddd52e6393a8a0ee23a55..6f239e4df78266d2ca749f9588727224a1004b7f 100644 (file)
--- a/src/game/g_textures.pas
+++ b/src/game/g_textures.pas
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*)
-{$MODE DELPHI}
+{$INCLUDE ../shared/a_modes.inc}
unit g_textures;
interface
uses
- e_graphics, BinEditor, ImagingTypes, Imaging, ImagingUtility;
+ SysUtils, Classes,
+ mempool,
+ e_graphics, MAPDEF, ImagingTypes, Imaging, ImagingUtility;
Type
TLevelTexture = record
TLevelTextureArray = Array of TLevelTexture;
- TAnimation = class(TObject)
+ TAnimation = class(TPoolObject)
private
ID: DWORD;
FAlpha: Byte;
constructor Create(FramesID: DWORD; Loop: Boolean; Speed: Byte);
destructor Destroy(); override;
procedure Draw(X, Y: Integer; Mirror: TMirrorType);
- procedure DrawEx(X, Y: Integer; Mirror: TMirrorType; RPoint: TPoint;
+ procedure DrawEx(X, Y: Integer; Mirror: TMirrorType; RPoint: TDFPoint;
Angle: SmallInt);
procedure Reset();
procedure Update();
procedure Enable();
procedure Disable();
procedure Revert(r: Boolean);
- procedure SaveState(Var Mem: TBinMemoryWriter);
- procedure LoadState(Var Mem: TBinMemoryReader);
+ procedure SaveState(st: TStream);
+ procedure LoadState(st: TStream);
function TotalFrames(): Integer;
property Played: Boolean read FPlayed;
function g_Texture_CreateWAD(var ID: DWORD; Resource: String): Boolean;
function g_Texture_CreateFile(var ID: DWORD; FileName: String): Boolean;
-function g_Texture_CreateWADEx(TextureName: ShortString; Resource: String): Boolean;
+function g_Texture_CreateWADEx(TextureName: ShortString; Resource: String; altrsrc: AnsiString=''): Boolean;
function g_Texture_CreateFileEx(TextureName: ShortString; FileName: String): Boolean;
function g_Texture_Get(TextureName: ShortString; var ID: DWORD): Boolean;
procedure g_Texture_Delete(TextureName: ShortString);
FWidth, FHeight, FCount: Word; BackAnimation: Boolean = False): Boolean;
function g_Frames_CreateMemory(ID: PDWORD; Name: ShortString; pData: Pointer; dataSize: LongInt;
FWidth, FHeight, FCount: Word; BackAnimation: Boolean = False): Boolean;
+function g_Frames_Dup(NewName, OldName: ShortString): Boolean;
//function g_Frames_CreateRevert(ID: PDWORD; Name: ShortString; Frames: string): Boolean;
-function g_Frames_Get(var ID: DWORD; FramesName: ShortString): Boolean;
-function g_Frames_GetTexture(var ID: DWORD; FramesName: ShortString; Frame: Word): Boolean;
+function g_Frames_Get(out ID: DWORD; FramesName: ShortString): Boolean;
+function g_Frames_GetTexture(out ID: DWORD; FramesName: ShortString; Frame: Word): Boolean;
function g_Frames_Exists(FramesName: String): Boolean;
procedure g_Frames_DeleteByName(FramesName: ShortString);
procedure g_Frames_DeleteByID(ID: DWORD);
procedure DumpTextureNames();
+function g_Texture_Light(): Integer;
+
implementation
uses
- g_game, e_log, g_basic, SysUtils, g_console, wadreader,
- g_language;
+ g_game, e_log, g_basic, g_console, wadreader,
+ g_language, GL, utils, xstreams;
type
_TTexture = record
end
else
begin
- e_WriteLog(Format('Error loading texture %s', [Resource]), MSG_WARNING);
+ e_WriteLog(Format('Error loading texture %s', [Resource]), TMsgType.Warning);
//e_WriteLog(Format('WAD Reader error: %s', [WAD.GetLastErrorStr]), MSG_WARNING);
end;
WAD.Free();
Result := True;
if not e_CreateTexture(FileName, ID) then
begin
- e_WriteLog(Format('Error loading texture %s', [FileName]), MSG_WARNING);
+ e_WriteLog(Format('Error loading texture %s', [FileName]), TMsgType.Warning);
Result := False;
end;
end;
-function g_Texture_CreateWADEx(TextureName: ShortString; Resource: String): Boolean;
+function texture_CreateWADExInternal (TextureName: ShortString; Resource: String; showmsg: Boolean): Boolean;
var
WAD: TWADFile;
FileName: String;
if WAD.GetResource(g_ExtractFilePathName(Resource), TextureData, ResourceLength) then
begin
- Result := e_CreateTextureMem(TextureData, ResourceLength, TexturesArray[find_id].ID);
- if Result then
+ result := e_CreateTextureMem(TextureData, ResourceLength, TexturesArray[find_id].ID);
+ if result then
begin
- e_GetTextureSize(TexturesArray[find_id].ID, @TexturesArray[find_id].Width,
- @TexturesArray[find_id].Height);
+ e_GetTextureSize(TexturesArray[find_id].ID, @TexturesArray[find_id].Width, @TexturesArray[find_id].Height);
TexturesArray[find_id].Name := LowerCase(TextureName);
end
else
+ begin
FreeMem(TextureData);
+ end;
end
else
begin
- e_WriteLog(Format('Error loading texture %s', [Resource]), MSG_WARNING);
+ if showmsg then
+ begin
+ e_WriteLog(Format('Error loading texture %s', [Resource]), TMsgType.Warning);
+ end;
//e_WriteLog(Format('WAD Reader error: %s', [WAD.GetLastErrorStr]), MSG_WARNING);
- Result := False;
+ result := false;
end;
WAD.Free();
end;
+function g_Texture_CreateWADEx(TextureName: ShortString; Resource: String; altrsrc: AnsiString=''): Boolean;
+begin
+ if (Length(altrsrc) > 0) then
+ begin
+ result := texture_CreateWADExInternal(TextureName, altrsrc, false);
+ if result then exit;
+ end;
+ result := texture_CreateWADExInternal(TextureName, Resource, true);
+end;
+
function g_Texture_CreateFileEx(TextureName: ShortString; FileName: String): Boolean;
var
find_id: DWORD;
e_GetTextureSize(TexturesArray[find_id].ID, @TexturesArray[find_id].Width,
@TexturesArray[find_id].Height);
end
- else e_WriteLog(Format('Error loading texture %s', [FileName]), MSG_WARNING);
+ else e_WriteLog(Format('Error loading texture %s', [FileName]), TMsgType.Warning);
end;
function g_Texture_Get(TextureName: ShortString; var ID: DWORD): Boolean;
if not e_CreateTextureMemEx(pData, dataSize, FramesArray[find_id].TexturesID[a],
a*FWidth, 0, FWidth, FHeight) then
begin
- FreeMem(pData);
+ //!!!FreeMem(pData);
Exit;
end;
begin
Result := False;
+ // models without "advanced" animations asks for "nothing" like this; don't spam log
+ if (Length(Resource) > 0) and ((Resource[Length(Resource)] = '/') or (Resource[Length(Resource)] = '\')) then exit;
+
FileName := g_ExtractWadName(Resource);
WAD := TWADFile.Create();
if not WAD.GetResource(g_ExtractFilePathName(Resource), TextureData, ResourceLength) then
begin
WAD.Free();
- e_WriteLog(Format('Error loading texture %s', [Resource]), MSG_WARNING);
+ e_WriteLog(Format('Error loading texture %s', [Resource]), TMsgType.Warning);
//e_WriteLog(Format('WAD Reader error: %s', [WAD.GetLastErrorStr]), MSG_WARNING);
Exit;
end;
Result := True;
end;}
+function g_Frames_Dup(NewName, OldName: ShortString): Boolean;
+var
+ find_id, b: DWORD;
+ a, c: Integer;
+begin
+ Result := False;
+
+ if not g_Frames_Get(b, OldName) then Exit;
+
+ find_id := FindFrame();
+
+ FramesArray[find_id].Name := LowerCase(NewName);
+ FramesArray[find_id].FrameWidth := FramesArray[b].FrameWidth;
+ FramesArray[find_id].FrameHeight := FramesArray[b].FrameHeight;
+
+ c := High(FramesArray[b].TexturesID);
+ SetLength(FramesArray[find_id].TexturesID, c+1);
+
+ for a := 0 to c do
+ FramesArray[find_id].TexturesID[a] := FramesArray[b].TexturesID[a];
+
+ Result := True;
+end;
+
procedure g_Frames_DeleteByName(FramesName: ShortString);
var
a: DWORD;
FramesArray := nil;
end;
-function g_Frames_Get(var ID: DWORD; FramesName: ShortString): Boolean;
+function g_Frames_Get(out ID: DWORD; FramesName: ShortString): Boolean;
var
a: DWORD;
begin
g_FatalError(Format(_lc[I_GAME_ERROR_FRAMES], [FramesName]));
end;
-function g_Frames_GetTexture(var ID: DWORD; FramesName: ShortString; Frame: Word): Boolean;
+function g_Frames_GetTexture(out ID: DWORD; FramesName: ShortString; Frame: Word): Boolean;
var
a: DWORD;
begin
var
i: Integer;
begin
- e_WriteLog('BEGIN Textures:', MSG_NOTIFY);
+ e_WriteLog('BEGIN Textures:', TMsgType.Notify);
for i := 0 to High(TexturesArray) do
- e_WriteLog(' '+IntToStr(i)+'. '+TexturesArray[i].Name, MSG_NOTIFY);
- e_WriteLog('END Textures.', MSG_NOTIFY);
+ e_WriteLog(' '+IntToStr(i)+'. '+TexturesArray[i].Name, TMsgType.Notify);
+ e_WriteLog('END Textures.', TMsgType.Notify);
- e_WriteLog('BEGIN Frames:', MSG_NOTIFY);
+ e_WriteLog('BEGIN Frames:', TMsgType.Notify);
for i := 0 to High(FramesArray) do
- e_WriteLog(' '+IntToStr(i)+'. '+FramesArray[i].Name, MSG_NOTIFY);
- e_WriteLog('END Frames.', MSG_NOTIFY);
+ e_WriteLog(' '+IntToStr(i)+'. '+FramesArray[i].Name, TMsgType.Notify);
+ e_WriteLog('END Frames.', TMsgType.Notify);
end;
{ TAnimation }
FEnabled := True;
end;
-procedure TAnimation.DrawEx(X, Y: Integer; Mirror: TMirrorType; RPoint: TPoint;
+procedure TAnimation.DrawEx(X, Y: Integer; Mirror: TMirrorType; RPoint: TDFPoint;
Angle: SmallInt);
begin
if not FEnabled then
Reset();
end;
-procedure TAnimation.SaveState(Var Mem: TBinMemoryWriter);
+procedure TAnimation.SaveState (st: TStream);
+begin
+ if (st = nil) then exit;
+
+ utils.writeSign(st, 'ANIM');
+ utils.writeInt(st, Byte(0)); // version
+ // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
+ utils.writeInt(st, Byte(FCounter));
+ // Òåêóùèé êàäð
+ utils.writeInt(st, LongInt(FCurrentFrame));
+ // Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì
+ utils.writeBool(st, FPlayed);
+ // Alpha-êàíàë âñåé òåêñòóðû
+ utils.writeInt(st, Byte(FAlpha));
+ // Ðàçìûòèå òåêñòóðû
+ utils.writeInt(st, Byte(FBlending));
+ // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
+ utils.writeInt(st, Byte(FSpeed));
+ // Çàöèêëåíà ëè àíèìàöèÿ
+ utils.writeBool(st, FLoop);
+ // Âêëþ÷åíà ëè
+ utils.writeBool(st, FEnabled);
+ // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
+ utils.writeInt(st, Byte(FMinLength));
+ // Îáðàòíûé ëè ïîðÿäîê êàäðîâ
+ utils.writeBool(st, FRevert);
+end;
+
+procedure TAnimation.LoadState (st: TStream);
+begin
+ if (st = nil) then exit;
+
+ if not utils.checkSign(st, 'ANIM') then raise XStreamError.Create('animation chunk expected');
+ if (utils.readByte(st) <> 0) then raise XStreamError.Create('invalid animation chunk version');
+ // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
+ FCounter := utils.readByte(st);
+ // Òåêóùèé êàäð
+ FCurrentFrame := utils.readLongInt(st);
+ // Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì
+ FPlayed := utils.readBool(st);
+ // Alpha-êàíàë âñåé òåêñòóðû
+ FAlpha := utils.readByte(st);
+ // Ðàçìûòèå òåêñòóðû
+ FBlending := utils.readBool(st);
+ // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
+ FSpeed := utils.readByte(st);
+ // Çàöèêëåíà ëè àíèìàöèÿ
+ FLoop := utils.readBool(st);
+ // Âêëþ÷åíà ëè
+ FEnabled := utils.readBool(st);
+ // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
+ FMinLength := utils.readByte(st);
+ // Îáðàòíûé ëè ïîðÿäîê êàäðîâ
+ FRevert := utils.readBool(st);
+end;
+
+
var
- sig: DWORD;
-begin
- if Mem = nil then
- Exit;
+ ltexid: GLuint = 0;
-// Ñèãíàòóðà àíèìàöèè:
- sig := ANIM_SIGNATURE; // 'ANIM'
- Mem.WriteDWORD(sig);
-// Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè:
- Mem.WriteByte(FCounter);
-// Òåêóùèé êàäð:
- Mem.WriteInt(FCurrentFrame);
-// Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì:
- Mem.WriteBoolean(FPlayed);
-// Alpha-êàíàë âñåé òåêñòóðû:
- Mem.WriteByte(FAlpha);
-// Ðàçìûòèå òåêñòóðû:
- Mem.WriteBoolean(FBlending);
-// Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè:
- Mem.WriteByte(FSpeed);
-// Çàöèêëåíà ëè àíèìàöèÿ:
- Mem.WriteBoolean(FLoop);
-// Âêëþ÷åíà ëè:
- Mem.WriteBoolean(FEnabled);
-// Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ:
- Mem.WriteByte(FMinLength);
-// Îáðàòíûé ëè ïîðÿäîê êàäðîâ:
- Mem.WriteBoolean(FRevert);
-end;
-
-procedure TAnimation.LoadState(Var Mem: TBinMemoryReader);
+function g_Texture_Light(): Integer;
+const
+ Radius: Integer = 128;
var
- sig: DWORD;
+ tex, tpp: PByte;
+ x, y, a: Integer;
+ dist: Double;
begin
- if Mem = nil then
- Exit;
-
-// Ñèãíàòóðà àíèìàöèè:
- Mem.ReadDWORD(sig);
- if sig <> ANIM_SIGNATURE then // 'ANIM'
+ if ltexid = 0 then
begin
- raise EBinSizeError.Create('TAnimation.LoadState: Wrong Animation Signature');
+ GetMem(tex, (Radius*2)*(Radius*2)*4);
+ tpp := tex;
+ for y := 0 to Radius*2-1 do
+ begin
+ for x := 0 to Radius*2-1 do
+ begin
+ dist := 1.0-sqrt((x-Radius)*(x-Radius)+(y-Radius)*(y-Radius))/Radius;
+ if (dist < 0) then
+ begin
+ tpp^ := 0; Inc(tpp);
+ tpp^ := 0; Inc(tpp);
+ tpp^ := 0; Inc(tpp);
+ tpp^ := 0; Inc(tpp);
+ end
+ else
+ begin
+ //tc.setPixel(x, y, Color(cast(int)(dist*255), cast(int)(dist*255), cast(int)(dist*255)));
+ if (dist > 0.5) then dist := 0.5;
+ a := round(dist*255);
+ if (a < 0) then a := 0 else if (a > 255) then a := 255;
+ tpp^ := 255; Inc(tpp);
+ tpp^ := 255; Inc(tpp);
+ tpp^ := 255; Inc(tpp);
+ tpp^ := Byte(a); Inc(tpp);
+ end;
+ end;
+ end;
+
+ glGenTextures(1, @ltexid);
+ //if (tid == 0) assert(0, "VGL: can't create screen texture");
+
+ glBindTexture(GL_TEXTURE_2D, ltexid);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ //GLfloat[4] bclr = 0.0;
+ //glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, bclr.ptr);
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Radius*2, Radius*2, 0, GL_RGBA{gltt}, GL_UNSIGNED_BYTE, tex);
end;
-// Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè:
- Mem.ReadByte(FCounter);
-// Òåêóùèé êàäð:
- Mem.ReadInt(FCurrentFrame);
-// Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì:
- Mem.ReadBoolean(FPlayed);
-// Alpha-êàíàë âñåé òåêñòóðû:
- Mem.ReadByte(FAlpha);
-// Ðàçìûòèå òåêñòóðû:
- Mem.ReadBoolean(FBlending);
-// Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè:
- Mem.ReadByte(FSpeed);
-// Çàöèêëåíà ëè àíèìàöèÿ:
- Mem.ReadBoolean(FLoop);
-// Âêëþ÷åíà ëè:
- Mem.ReadBoolean(FEnabled);
-// Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ:
- Mem.ReadByte(FMinLength);
-// Îáðàòíûé ëè ïîðÿäîê êàäðîâ:
- Mem.ReadBoolean(FRevert);
+
+ result := ltexid;
end;
end.