X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_textures.pas;h=e95fc6d73312eea7fac07bfe042d510896fd9ded;hb=d5d513b459869550bc0623d910eb97c706fab07d;hp=26a06f9a2a89067c31cd9df5574ea03481ed446d;hpb=972b9c8afd00ac4117edd481183e0f39af6d272b;p=d2df-sdl.git diff --git a/src/game/g_textures.pas b/src/game/g_textures.pas index 26a06f9..e95fc6d 100644 --- a/src/game/g_textures.pas +++ b/src/game/g_textures.pas @@ -2,8 +2,7 @@ * * 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. + * the Free Software Foundation, version 3 of the License ONLY. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -21,7 +20,7 @@ interface uses SysUtils, Classes, {$IFDEF USE_MEMPOOL}mempool,{$ENDIF} - e_graphics, MAPDEF, ImagingTypes, Imaging, ImagingUtility; + g_base, r_graphics, MAPDEF, ImagingTypes, Imaging, ImagingUtility; type TLevelTexture = record @@ -54,9 +53,6 @@ type constructor Create (aframesID: LongWord; aloop: Boolean; aspeed: Byte); destructor Destroy (); override; - procedure draw (x, y: Integer; mirror: TMirrorType); - procedure drawEx (x, y: Integer; mirror: TMirrorType; rpoint: TDFPoint; angle: SmallInt); - procedure reset (); procedure update (); procedure enable (); @@ -83,12 +79,14 @@ type property framesId: LongWord read mId; property width: Word read mWidth; property height: Word read mHeight; + + property id: LongWord read mId; end; -function g_Texture_CreateWAD (var ID: LongWord; const Resource: AnsiString): Boolean; +function g_Texture_CreateWAD (var ID: LongWord; const Resource: AnsiString; filterHint: Boolean = False): Boolean; function g_Texture_CreateFile (var ID: LongWord; const FileName: AnsiString): Boolean; -function g_Texture_CreateWADEx (const textureName, Resource: AnsiString): Boolean; +function g_Texture_CreateWADEx (const textureName, Resource: AnsiString; filterHint: Boolean = False): Boolean; function g_Texture_CreateFileEx (const textureName, FileName: AnsiString): Boolean; function g_Texture_Get (const textureName: AnsiString; var ID: LongWord): Boolean; function g_Texture_GetSize (const textureName: AnsiString; var w, h: Integer): Boolean; overload; @@ -113,14 +111,22 @@ procedure g_Frames_DeleteAll (); procedure DumpTextureNames (); -function g_Texture_Light (): Integer; + type (* private state *) + TFrames = record + texturesID: array of LongWord; + name: AnsiString; + frameWidth, frameHeight: Word; + used: Boolean; + end; + var (* private state *) + framesArray: array of TFrames = nil; implementation uses g_game, e_log, g_basic, g_console, wadreader, - g_language, GL, utils, xstreams; + g_language, utils, xstreams; type _TTexture = record @@ -130,16 +136,8 @@ type used: Boolean; end; - TFrames = record - texturesID: array of LongWord; - name: AnsiString; - frameWidth, frameHeight: Word; - used: Boolean; - end; - var texturesArray: array of _TTexture = nil; - framesArray: array of TFrames = nil; const @@ -205,7 +203,7 @@ end; // ////////////////////////////////////////////////////////////////////////// // -function g_Texture_CreateWAD (var ID: LongWord; const Resource: AnsiString): Boolean; +function g_Texture_CreateWAD (var ID: LongWord; const Resource: AnsiString; filterHint: Boolean = False): Boolean; var WAD: TWADFile; FileName: AnsiString; @@ -220,14 +218,9 @@ begin if WAD.GetResource(g_ExtractFilePathName(Resource), TextureData, ResourceLength) then begin - if e_CreateTextureMem(TextureData, ResourceLength, ID) then - begin + if e_CreateTextureMem(TextureData, ResourceLength, ID, filterHint) then result := true; - end - else - begin - FreeMem(TextureData); - end; + FreeMem(TextureData) end else begin @@ -249,7 +242,7 @@ begin end; -function g_Texture_CreateWADEx (const textureName, Resource: AnsiString): Boolean; +function g_Texture_CreateWADEx (const textureName, Resource: AnsiString; filterHint: Boolean = False): Boolean; var WAD: TWADFile; FileName: AnsiString; @@ -266,17 +259,14 @@ begin if WAD.GetResource(g_ExtractFilePathName(Resource), TextureData, ResourceLength) then begin - result := e_CreateTextureMem(TextureData, ResourceLength, texturesArray[find_id].ID); + result := e_CreateTextureMem(TextureData, ResourceLength, texturesArray[find_id].ID, filterHint); if result then begin e_GetTextureSize(texturesArray[find_id].ID, @texturesArray[find_id].width, @texturesArray[find_id].height); texturesArray[find_id].used := true; texturesArray[find_id].Name := textureName; - end - else - begin - FreeMem(TextureData); end; + FreeMem(TextureData) end else begin @@ -541,10 +531,12 @@ begin if not CreateFramesMem(TextureData, ResourceLength, ID, Name, mWidth, mHeight, mCount, BackAnimation) then begin + FreeMem(TextureData); WAD.Free(); exit; end; + FreeMem(TextureData); WAD.Free(); result := true; @@ -743,7 +735,13 @@ end; constructor TAnimation.Create (aframesID: LongWord; aloop: Boolean; aspeed: Byte); begin - if (aframesID >= Length(framesArray)) then raise Exception.Create('trying to create inexisting frame: something is very wrong here'); + if (aframesID >= Length(framesArray)) then + begin + //raise Exception.Create('trying to create inexisting frame: something is very wrong here'); + e_LogWritefln('trying to create inexisting frame %u of %u: something is very wrong here', [aframesID, LongWord(Length(framesArray))], TMsgType.Warning); + aframesID := 0; + if (Length(framesArray) = 0) then raise Exception.Create('trying to create inexisting frame: something is very wrong here'); + end; mId := aframesID; mMinLength := 0; mLoop := aloop; @@ -763,14 +761,6 @@ begin end; -procedure TAnimation.draw (x, y: Integer; mirror: TMirrorType); -begin - if (not mEnabled) then exit; - e_DrawAdv(framesArray[mId].TexturesID[mCurrentFrame], x, y, mAlpha, true, mBlending, 0, nil, mirror); - //e_DrawQuad(X, Y, X+FramesArray[ID].FrameWidth-1, Y+FramesArray[ID].FrameHeight-1, 0, 255, 0); -end; - - procedure TAnimation.update (); begin if (not mEnabled) then exit; @@ -836,13 +826,6 @@ procedure TAnimation.disable (); begin mEnabled := false; end; procedure TAnimation.enable (); begin mEnabled := true; end; -procedure TAnimation.drawEx (x, y: Integer; mirror: TMirrorType; rpoint: TDFPoint; angle: SmallInt); -begin - if (not mEnabled) then exit; - e_DrawAdv(framesArray[mId].TexturesID[mCurrentFrame], x, y, mAlpha, true, mBlending, angle, @rpoint, mirror); -end; - - function TAnimation.totalFrames (): Integer; inline; begin result := Length(framesArray[mId].TexturesID); end; @@ -910,66 +893,4 @@ begin mRevert := utils.readBool(st); end; - -// ////////////////////////////////////////////////////////////////////////// // -var - ltexid: GLuint = 0; - -function g_Texture_Light (): Integer; -const - Radius: Integer = 128; -var - tex, tpp: PByte; - x, y, a: Integer; - dist: Double; -begin - if ltexid = 0 then - begin - 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; - - result := ltexid; -end; - - end.