X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_textures.pas;h=dcfbd1a045f2179aee421ad6b6c25ffeb96cf680;hb=4381a2b0eee192b093f0e9ec8748965b480fbc24;hp=d12a9a24e4ba74789cfbe74fbaa0713e4b0c376f;hpb=3baa32dc5c87bbf5d47c5446eeb1d5a7b44365a5;p=d2df-sdl.git diff --git a/src/game/g_textures.pas b/src/game/g_textures.pas index d12a9a2..dcfbd1a 100644 --- a/src/game/g_textures.pas +++ b/src/game/g_textures.pas @@ -20,37 +20,32 @@ interface uses SysUtils, Classes, {$IFDEF USE_MEMPOOL}mempool,{$ENDIF} - g_base, r_graphics, MAPDEF, ImagingTypes, Imaging, ImagingUtility; + g_base, MAPDEF; type TLevelTexture = record - textureName: AnsiString; - width, height: Word; - case anim: Boolean of - false: (textureID: LongWord); - true: (framesID: LongWord; framesCount: Byte; speed: Byte); + TextureName: AnsiString; // as stored in wad + FullName: AnsiString; // full path to texture // !!! merge it with TextureName + framesCount, speed: Byte; end; TLevelTextureArray = array of TLevelTexture; - TAnimation = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF} + TAnimationState = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF} private - mId: LongWord; - mAlpha: Byte; - mBlending: Boolean; mCounter: Byte; // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè mSpeed: Byte; // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè mCurrentFrame: Integer; // Òåêóùèé êàäð (íà÷èíàÿ ñ 0) mLoop: Boolean; // Ïåðåõîäèòü íà ïåðâûé êàäð ïîñëå ïîñëåäíåãî? mEnabled: Boolean; // Ðàáîòà ðàçðåøåíà? mPlayed: Boolean; // Ïðîèãðàíà âñÿ õîòÿ áû ðàç? - mHeight: Word; - mWidth: Word; mMinLength: Byte; // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ mRevert: Boolean; // Ñìåíà êàäðîâ îáðàòíàÿ? + mLength: Integer; + public - constructor Create (aframesID: LongWord; aloop: Boolean; aspeed: Byte); + constructor Create (aloop: Boolean; aspeed: Byte; len: Integer); destructor Destroy (); override; procedure reset (); @@ -59,8 +54,8 @@ 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; @@ -74,50 +69,34 @@ 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 framesId: LongWord read mId; - property width: Word read mWidth; - property height: Word read mHeight; - - property id: LongWord read mId; + 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 TAnimation.Create (aframesID: LongWord; aloop: Boolean; aspeed: Byte); +constructor TAnimationState.Create (aloop: Boolean; aspeed: Byte; len: Integer); begin - 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; + assert(len >= 0); + mLength := len; + mMinLength := 0; mLoop := aloop; mSpeed := aspeed; mEnabled := true; mCurrentFrame := 0; mPlayed := false; - mAlpha := 0; - mWidth := framesArray[mId].FrameWidth; - mHeight := framesArray[mId].FrameHeight; end; - -destructor TAnimation.Destroy (); +destructor TAnimationState.Destroy; begin inherited; end; - -procedure TAnimation.update (); +procedure TAnimationState.update; begin if (not mEnabled) then exit; @@ -132,7 +111,7 @@ begin // Äîøëè äî êîíöà àíèìàöèè. Âîçìîæíî, æäåì åùå if (mCurrentFrame = 0) then begin - if (Length(framesArray[mId].TexturesID)*mSpeed+mCounter < mMinLength) then exit; + if (mLength * mSpeed + mCounter < mMinLength) then exit; end; mCurrentFrame -= 1; @@ -141,7 +120,10 @@ begin // Ïîâòîðÿòü ëè àíèìàöèþ ïî êðóãó? if mPlayed then begin - if mLoop then mCurrentFrame := High(framesArray[mId].TexturesID) else mCurrentFrame += 1; + if mLoop then + mCurrentFrame := mLength - 1 + else + mCurrentFrame += 1 end; mCounter := 0; @@ -150,13 +132,13 @@ begin begin // Ïðÿìîé ïîðÿäîê êàäðîâ // Äîøëè äî êîíöà àíèìàöèè. Âîçìîæíî, æäåì åùå - if (mCurrentFrame = High(framesArray[mId].TexturesID)) then + if (mCurrentFrame = mLength - 1) then begin - if (Length(framesArray[mId].TexturesID)*mSpeed+mCounter < mMinLength) then exit; + if (mLength * mSpeed + mCounter < mMinLength) then exit; end; mCurrentFrame += 1; - mPlayed := (mCurrentFrame > High(framesArray[mId].TexturesID)); + mPlayed := (mCurrentFrame > mLength - 1); // Ïîâòîðÿòü ëè àíèìàöèþ ïî êðóãó? if mPlayed then @@ -169,30 +151,38 @@ begin end; end; - -procedure TAnimation.reset (); +procedure TAnimationState.reset; begin - if mRevert then mCurrentFrame := High(framesArray[mId].TexturesID) else mCurrentFrame := 0; + if mRevert then + mCurrentFrame := mLength - 1 + else + mCurrentFrame := 0; mCounter := 0; - mPlayed := false; + mPlayed := false end; +procedure TAnimationState.disable; +begin + mEnabled := false +end; -procedure TAnimation.disable (); begin mEnabled := false; end; -procedure TAnimation.enable (); begin mEnabled := true; end; - - -function TAnimation.totalFrames (): Integer; inline; begin result := Length(framesArray[mId].TexturesID); end; - +procedure TAnimationState.enable; +begin + mEnabled := true +end; -procedure TAnimation.revert (r: Boolean); +procedure TAnimationState.revert (r: Boolean); begin mRevert := r; - reset(); + reset end; +function TAnimationState.totalFrames (): Integer; inline; +begin + result := mLength +end; -procedure TAnimation.saveState (st: TStream); +procedure TAnimationState.saveState (st: TStream; mAlpha: Byte; mBlending: Boolean); begin if (st = nil) then exit; @@ -221,7 +211,7 @@ begin end; -procedure TAnimation.loadState (st: TStream); +procedure TAnimationState.loadState (st: TStream; out mAlpha: Byte; out mBlending: Boolean); begin if (st = nil) then exit;