X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_textures.pas;h=f129b9e219d9ff88a224951a8bbddba784fff022;hb=56ec1dee6d63a32353f94eac7e87d6a42b801a25;hp=36ab6bdba1dc4250ef33fe7d2b8dfaa7585d4243;hpb=f855d3d16f4a7dcbbe7dffd3cfa5dfd3b9909458;p=d2df-sdl.git diff --git a/src/game/g_textures.pas b/src/game/g_textures.pas index 36ab6bd..f129b9e 100644 --- a/src/game/g_textures.pas +++ b/src/game/g_textures.pas @@ -19,7 +19,9 @@ unit g_textures; interface uses - e_graphics, BinEditor, ImagingTypes, Imaging, ImagingUtility; + SysUtils, Classes, + {$IFDEF USE_MEMPOOL}mempool,{$ENDIF} + e_graphics, MAPDEF, ImagingTypes, Imaging, ImagingUtility; Type TLevelTexture = record @@ -35,7 +37,7 @@ Type TLevelTextureArray = Array of TLevelTexture; - TAnimation = class(TObject) + TAnimation = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF} private ID: DWORD; FAlpha: Byte; @@ -55,15 +57,15 @@ Type 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; @@ -84,7 +86,7 @@ Type 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); @@ -114,8 +116,8 @@ function g_Texture_Light(): Integer; implementation uses - g_game, e_log, g_basic, SysUtils, g_console, wadreader, - g_language, GL; + g_game, e_log, g_basic, g_console, wadreader, + g_language, GL, utils, xstreams; type _TTexture = record @@ -184,7 +186,7 @@ begin 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(); @@ -195,12 +197,12 @@ begin 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; @@ -217,25 +219,39 @@ begin 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; @@ -249,7 +265,7 @@ begin 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; @@ -462,6 +478,9 @@ var 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(); @@ -470,7 +489,7 @@ begin 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; @@ -666,15 +685,15 @@ procedure DumpTextureNames(); 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 } @@ -782,7 +801,7 @@ begin 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 @@ -803,71 +822,60 @@ begin Reset(); end; -procedure TAnimation.SaveState(Var Mem: TBinMemoryWriter); -var - sig: DWORD; -begin - if Mem = nil then - Exit; - -// Ñèãíàòóðà àíèìàöèè: - 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); -var - sig: DWORD; -begin - if Mem = nil then - Exit; - -// Ñèãíàòóðà àíèìàöèè: - Mem.ReadDWORD(sig); - if sig <> ANIM_SIGNATURE then // 'ANIM' - begin - raise EBinSizeError.Create('TAnimation.LoadState: Wrong Animation Signature'); - 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); +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;