X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_textures.pas;h=07ef3be06bfddebd2f592181cef2132b1352cd50;hb=94a927ca673a2d8af4b8449d434f3c70f38b11c1;hp=21b33aecdee7dc7046f82726119b9949a62f58e9;hpb=7292fe409145dfcbb2776e34bb64d56e32985b9d;p=d2df-sdl.git diff --git a/src/game/g_textures.pas b/src/game/g_textures.pas index 21b33ae..07ef3be 100644 --- a/src/game/g_textures.pas +++ b/src/game/g_textures.pas @@ -13,13 +13,15 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *) -{$INCLUDE g_amodes.inc} +{$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 @@ -35,7 +37,7 @@ Type TLevelTextureArray = Array of TLevelTexture; - TAnimation = class(TObject) + TAnimation = class(TPoolObject) 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); @@ -98,9 +100,10 @@ function g_Frames_CreateFile(ID: PDWORD; Name: ShortString; FileName: String; 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); @@ -113,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 @@ -199,7 +202,7 @@ begin 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; @@ -216,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]), MSG_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; @@ -461,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(); @@ -514,6 +534,30 @@ begin 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; @@ -572,7 +616,7 @@ begin 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 @@ -595,7 +639,7 @@ 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 @@ -757,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 @@ -778,76 +822,65 @@ 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; var - ltexid: Integer = 0; + ltexid: GLuint = 0; function g_Texture_Light(): Integer; const