X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_textures.pas;h=8a215c0e157c2e5ca995b23b81a3ab5c4cb9a05c;hb=16f3b052ce6fc16344961a11ab066795f7df7711;hp=ae951fc94258fd3f930fa18e2355a4c7a08155fd;hpb=d35d7fbbe94755b41c7a05fdbf527b827c4a3bf5;p=d2df-sdl.git diff --git a/src/game/g_textures.pas b/src/game/g_textures.pas index ae951fc..8a215c0 100644 --- a/src/game/g_textures.pas +++ b/src/game/g_textures.pas @@ -20,7 +20,7 @@ interface uses SysUtils, Classes, {$IFDEF USE_MEMPOOL}mempool,{$ENDIF} - g_base, r_graphics, MAPDEF, ImagingTypes, Imaging, ImagingUtility; + g_base, MAPDEF; type TLevelTexture = record @@ -31,10 +31,8 @@ type TLevelTextureArray = array of TLevelTexture; - TAnimationState = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF} + TAnimState = record private - mAlpha: Byte; - mBlending: Boolean; mCounter: Byte; // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè mSpeed: Byte; // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè mCurrentFrame: Integer; // Òåêóùèé êàäð (íà÷èíàÿ ñ 0) @@ -48,7 +46,7 @@ type public constructor Create (aloop: Boolean; aspeed: Byte; len: Integer); - destructor Destroy (); override; + procedure Invalidate; procedure reset (); procedure update (); @@ -56,10 +54,12 @@ type procedure disable (); procedure revert (r: Boolean); - procedure saveState (st: TStream); - procedure loadState (st: TStream); + procedure saveState (st: TStream; mAlpha: Byte; mBlending: Boolean); + procedure loadState (st: TStream; out mAlpha: Byte; out mBlending: Boolean); function totalFrames (): Integer; inline; + function IsInvalid (): Boolean; + function IsValid (): Boolean; public property played: Boolean read mPlayed; @@ -71,19 +71,19 @@ type property currentFrame: Integer read mCurrentFrame write mCurrentFrame; property currentCounter: Byte read mCounter write mCounter; property counter: Byte read mCounter; - property blending: Boolean read mBlending write mBlending; - property alpha: Byte read mAlpha write mAlpha; property length: Integer read mLength; end; implementation uses - g_game, e_log, g_basic, g_console, wadreader, r_animations, + g_game, e_log, g_basic, g_console, wadreader, g_language, utils, xstreams; -constructor TAnimationState.Create (aloop: Boolean; aspeed: Byte; len: Integer); +constructor TAnimState.Create (aloop: Boolean; aspeed: Byte; len: Integer); begin + Self := Default(TAnimState); + assert(len >= 0); mLength := len; @@ -92,16 +92,15 @@ begin mSpeed := aspeed; mEnabled := true; mCurrentFrame := 0; - mAlpha := 0; mPlayed := false; end; -destructor TAnimationState.Destroy; +procedure TAnimState.Invalidate; begin - inherited; + Self := Default(TAnimState); end; -procedure TAnimationState.update; +procedure TAnimState.update; begin if (not mEnabled) then exit; @@ -109,11 +108,8 @@ begin if (mCounter >= mSpeed) then begin - // Îæèäàíèå ìåæäó êàäðàìè çàêîí÷èëîñü - // Îáðàòíûé ïîðÿäîê êàäðîâ? if mRevert then begin - // Äîøëè äî êîíöà àíèìàöèè. Âîçìîæíî, æäåì åùå if (mCurrentFrame = 0) then begin if (mLength * mSpeed + mCounter < mMinLength) then exit; @@ -122,7 +118,6 @@ begin mCurrentFrame -= 1; mPlayed := (mCurrentFrame < 0); - // Ïîâòîðÿòü ëè àíèìàöèþ ïî êðóãó? if mPlayed then begin if mLoop then @@ -135,8 +130,6 @@ begin end else begin - // Ïðÿìîé ïîðÿäîê êàäðîâ - // Äîøëè äî êîíöà àíèìàöèè. Âîçìîæíî, æäåì åùå if (mCurrentFrame = mLength - 1) then begin if (mLength * mSpeed + mCounter < mMinLength) then exit; @@ -145,7 +138,6 @@ begin mCurrentFrame += 1; mPlayed := (mCurrentFrame > mLength - 1); - // Ïîâòîðÿòü ëè àíèìàöèþ ïî êðóãó? if mPlayed then begin if mLoop then mCurrentFrame := 0 else mCurrentFrame -= 1; @@ -156,7 +148,7 @@ begin end; end; -procedure TAnimationState.reset; +procedure TAnimState.reset; begin if mRevert then mCurrentFrame := mLength - 1 @@ -166,82 +158,73 @@ begin mPlayed := false end; -procedure TAnimationState.disable; +procedure TAnimState.disable; begin mEnabled := false end; -procedure TAnimationState.enable; +procedure TAnimState.enable; begin mEnabled := true end; -procedure TAnimationState.revert (r: Boolean); +procedure TAnimState.revert (r: Boolean); begin mRevert := r; reset end; -function TAnimationState.totalFrames (): Integer; inline; +function TAnimState.totalFrames (): Integer; inline; begin result := mLength end; -procedure TAnimationState.saveState (st: TStream); +function TAnimState.IsInvalid (): Boolean; +begin + result := mLength <= 0 +end; + +function TAnimState.IsValid (): Boolean; +begin + result := mLength > 0 +end; + +procedure TAnimState.saveState (st: TStream; mAlpha: Byte; mBlending: Boolean); begin if (st = nil) then exit; utils.writeSign(st, 'ANIM'); utils.writeInt(st, Byte(0)); // version - // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè utils.writeInt(st, Byte(mCounter)); - // Òåêóùèé êàäð utils.writeInt(st, LongInt(mCurrentFrame)); - // Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì utils.writeBool(st, mPlayed); - // Alpha-êàíàë âñåé òåêñòóðû utils.writeInt(st, Byte(mAlpha)); - // Ðàçìûòèå òåêñòóðû utils.writeInt(st, Byte(mBlending)); - // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè utils.writeInt(st, Byte(mSpeed)); - // Çàöèêëåíà ëè àíèìàöèÿ utils.writeBool(st, mLoop); - // Âêëþ÷åíà ëè utils.writeBool(st, mEnabled); - // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ utils.writeInt(st, Byte(mMinLength)); - // Îáðàòíûé ëè ïîðÿäîê êàäðîâ utils.writeBool(st, mRevert); end; -procedure TAnimationState.loadState (st: TStream); +procedure TAnimState.loadState (st: TStream; out mAlpha: Byte; out mBlending: Boolean); 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'); - // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè mCounter := utils.readByte(st); - // Òåêóùèé êàäð mCurrentFrame := utils.readLongInt(st); - // Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì mPlayed := utils.readBool(st); - // Alpha-êàíàë âñåé òåêñòóðû mAlpha := utils.readByte(st); - // Ðàçìûòèå òåêñòóðû mBlending := utils.readBool(st); - // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè mSpeed := utils.readByte(st); - // Çàöèêëåíà ëè àíèìàöèÿ mLoop := utils.readBool(st); - // Âêëþ÷åíà ëè mEnabled := utils.readBool(st); - // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ mMinLength := utils.readByte(st); - // Îáðàòíûé ëè ïîðÿäîê êàäðîâ mRevert := utils.readBool(st); end; + end.