X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_textures.pas;h=93d8c63d056e93ad0fc5fef015b1b637173b6ad6;hb=c98b33270a7b8f65385b754ff17f5f2338fa39e2;hp=fba31e47a6c3ce8bee637f07cc4bf5dcce966124;hpb=ac201b02f10ef558087d50f6b03b4519ab567558;p=d2df-sdl.git diff --git a/src/game/g_textures.pas b/src/game/g_textures.pas index fba31e4..93d8c63 100644 --- a/src/game/g_textures.pas +++ b/src/game/g_textures.pas @@ -1,10 +1,25 @@ +(* Copyright (C) DooM 2D:Forever Developers + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *) {$MODE DELPHI} unit g_textures; interface uses - e_graphics, BinEditor; + e_graphics, BinEditor, ImagingTypes, Imaging, ImagingUtility; Type TLevelTexture = record @@ -75,11 +90,13 @@ function g_Texture_Get(TextureName: ShortString; var ID: DWORD): Boolean; procedure g_Texture_Delete(TextureName: ShortString); procedure g_Texture_DeleteAll(); +function g_CreateFramesImg (ia: TDynImageDataArray; ID: PDWORD; Name: ShortString; BackAnimation: Boolean = False): Boolean; + function g_Frames_CreateWAD(ID: PDWORD; Name: ShortString; Resource: String; FWidth, FHeight, FCount: Word; BackAnimation: Boolean = False): Boolean; 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; +function g_Frames_CreateMemory(ID: PDWORD; Name: ShortString; pData: Pointer; dataSize: LongInt; FWidth, FHeight, FCount: Word; BackAnimation: Boolean = False): Boolean; //function g_Frames_CreateRevert(ID: PDWORD; Name: ShortString; Frames: string): Boolean; function g_Frames_Get(var ID: DWORD; FramesName: ShortString): Boolean; @@ -145,21 +162,19 @@ end; function g_Texture_CreateWAD(var ID: DWORD; Resource: String): Boolean; var WAD: TWADFile; - FileName, - SectionName, - ResourceName: String; + FileName: String; TextureData: Pointer; ResourceLength: Integer; begin Result := False; - g_ProcessResourceStr(Resource, FileName, SectionName, ResourceName); + FileName := g_ExtractWadName(Resource); WAD := TWADFile.Create; WAD.ReadFile(FileName); - if WAD.GetResource(SectionName, ResourceName, TextureData, ResourceLength) then + if WAD.GetResource(g_ExtractFilePathName(Resource), TextureData, ResourceLength) then begin - if e_CreateTextureMem(TextureData, ID) then + if e_CreateTextureMem(TextureData, ResourceLength, ID) then Result := True else FreeMem(TextureData); @@ -185,23 +200,21 @@ end; function g_Texture_CreateWADEx(TextureName: ShortString; Resource: String): Boolean; var WAD: TWADFile; - FileName, - SectionName, - ResourceName: String; + FileName: String; TextureData: Pointer; find_id: DWORD; ResourceLength: Integer; begin - g_ProcessResourceStr(Resource, FileName, SectionName, ResourceName); + FileName := g_ExtractWadName(Resource); find_id := FindTexture(); WAD := TWADFile.Create; WAD.ReadFile(FileName); - if WAD.GetResource(SectionName, ResourceName, TextureData, ResourceLength) then + if WAD.GetResource(g_ExtractFilePathName(Resource), TextureData, ResourceLength) then begin - Result := e_CreateTextureMem(TextureData, TexturesArray[find_id].ID); + Result := e_CreateTextureMem(TextureData, ResourceLength, TexturesArray[find_id].ID); if Result then begin e_GetTextureSize(TexturesArray[find_id].ID, @TexturesArray[find_id].Width, @@ -350,7 +363,7 @@ begin Result := True; end; -function CreateFramesMem(pData: Pointer; ID: PDWORD; Name: ShortString; +function CreateFramesMem(pData: Pointer; dataSize: LongInt; ID: PDWORD; Name: ShortString; FWidth, FHeight, FCount: Word; BackAnimation: Boolean = False): Boolean; var find_id: DWORD; @@ -366,10 +379,10 @@ begin else SetLength(FramesArray[find_id].TexturesID, FCount); for a := 0 to FCount-1 do - if not e_CreateTextureMemEx(pData, FramesArray[find_id].TexturesID[a], + if not e_CreateTextureMemEx(pData, dataSize, FramesArray[find_id].TexturesID[a], a*FWidth, 0, FWidth, FHeight) then begin - FreeMem(pData); + //!!!FreeMem(pData); Exit; end; @@ -389,24 +402,69 @@ begin Result := True; end; +function g_CreateFramesImg (ia: TDynImageDataArray; ID: PDWORD; Name: ShortString; BackAnimation: Boolean = False): Boolean; +var + find_id: DWORD; + a, FCount: Integer; +begin + result := false; + find_id := FindFrame(); + + FCount := length(ia); + + //e_WriteLog(Format('+++ creating %d frames [%s]', [FCount, Name]), MSG_NOTIFY); + + if FCount < 1 then exit; + if FCount <= 2 then BackAnimation := False; + if BackAnimation then + SetLength(FramesArray[find_id].TexturesID, FCount+FCount-2) + else + SetLength(FramesArray[find_id].TexturesID, FCount); + + //e_WriteLog(Format('+++ creating %d frames, %dx%d', [FCount, ia[0].width, ia[0].height]), MSG_NOTIFY); + + for a := 0 to FCount-1 do + begin + if not e_CreateTextureImg(ia[a], FramesArray[find_id].TexturesID[a]) then exit; + //e_WriteLog(Format('+++ frame %d, %dx%d', [a, ia[a].width, ia[a].height]), MSG_NOTIFY); + end; + + if BackAnimation then + begin + for a := 1 to FCount-2 do + begin + FramesArray[find_id].TexturesID[FCount+FCount-2-a] := FramesArray[find_id].TexturesID[a]; + end; + end; + + FramesArray[find_id].FrameWidth := ia[0].width; + FramesArray[find_id].FrameHeight := ia[0].height; + if Name <> '' then + FramesArray[find_id].Name := LowerCase(Name) + else + FramesArray[find_id].Name := ''; + + if ID <> nil then ID^ := find_id; + + result := true; +end; + function g_Frames_CreateWAD(ID: PDWORD; Name: ShortString; Resource: string; FWidth, FHeight, FCount: Word; BackAnimation: Boolean = False): Boolean; var WAD: TWADFile; - FileName, - SectionName, - ResourceName: string; + FileName: string; TextureData: Pointer; ResourceLength: Integer; begin Result := False; - g_ProcessResourceStr(Resource, FileName, SectionName, ResourceName); + FileName := g_ExtractWadName(Resource); WAD := TWADFile.Create(); WAD.ReadFile(FileName); - if not WAD.GetResource(SectionName, ResourceName, TextureData, ResourceLength) then + if not WAD.GetResource(g_ExtractFilePathName(Resource), TextureData, ResourceLength) then begin WAD.Free(); e_WriteLog(Format('Error loading texture %s', [Resource]), MSG_WARNING); @@ -414,7 +472,7 @@ begin Exit; end; - if not CreateFramesMem(TextureData, ID, Name, FWidth, FHeight, FCount, BackAnimation) then + if not CreateFramesMem(TextureData, ResourceLength, ID, Name, FWidth, FHeight, FCount, BackAnimation) then begin WAD.Free(); Exit; @@ -425,10 +483,10 @@ begin Result := True; end; -function g_Frames_CreateMemory(ID: PDWORD; Name: ShortString; pData: Pointer; +function g_Frames_CreateMemory(ID: PDWORD; Name: ShortString; pData: Pointer; dataSize: LongInt; FWidth, FHeight, FCount: Word; BackAnimation: Boolean = False): Boolean; begin - Result := CreateFramesMem(pData, ID, Name, FWidth, FHeight, FCount, BackAnimation); + Result := CreateFramesMem(pData, dataSize, ID, Name, FWidth, FHeight, FCount, BackAnimation); end; {function g_Frames_CreateRevert(ID: PDWORD; Name: ShortString; Frames: string): Boolean;