index acac0c61d3b8a87cc78bc9598d65d834ef6817c2..8a215c0e157c2e5ca995b23b81a3ab5c4cb9a05c 100644 (file)
--- a/src/game/g_textures.pas
+++ b/src/game/g_textures.pas
uses
SysUtils, Classes,
{$IFDEF USE_MEMPOOL}mempool,{$ENDIF}
uses
SysUtils, Classes,
{$IFDEF USE_MEMPOOL}mempool,{$ENDIF}
- g_base, r_graphics, MAPDEF, ImagingTypes, Imaging, ImagingUtility;
+ g_base, MAPDEF;
type
TLevelTexture = record
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;
end;
TLevelTextureArray = array of TLevelTexture;
- TAnimationState = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF}
+ TAnimState = record
private
private
- mAlpha: Byte;
- mBlending: Boolean;
mCounter: Byte; // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
mSpeed: Byte; // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
mCurrentFrame: Integer; // Òåêóùèé êàäð (íà÷èíàÿ ñ 0)
mCounter: Byte; // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
mSpeed: Byte; // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
mCurrentFrame: Integer; // Òåêóùèé êàäð (íà÷èíàÿ ñ 0)
public
constructor Create (aloop: Boolean; aspeed: Byte; len: Integer);
public
constructor Create (aloop: Boolean; aspeed: Byte; len: Integer);
- destructor Destroy (); override;
+ procedure Invalidate;
procedure reset ();
procedure update ();
procedure reset ();
procedure update ();
procedure disable ();
procedure revert (r: Boolean);
procedure disable ();
procedure revert (r: Boolean);
- procedure saveState (st: TStream);
- procedure loadState (st: TStream);
-
-// function totalFrames (): Integer; inline;
-
- public
- property played: Boolean read mPlayed;
- property enabled: Boolean read mEnabled;
- property isReverse: Boolean read mRevert;
- property loop: Boolean read mLoop write mLoop;
- property speed: Byte read mSpeed write mSpeed;
- property minLength: Byte read mMinLength write mMinLength;
- 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;
- end;
-
- TAnimation = 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; // Ñìåíà êàäðîâ îáðàòíàÿ?
-
- public
- constructor Create (aframesID: LongWord; aloop: Boolean; aspeed: Byte);
- destructor Destroy (); override;
-
- procedure reset ();
- procedure update ();
- procedure enable ();
- 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 totalFrames (): Integer; inline;
+ function IsInvalid (): Boolean;
+ function IsValid (): Boolean;
public
property played: Boolean read mPlayed;
public
property played: Boolean read mPlayed;
property currentFrame: Integer read mCurrentFrame write mCurrentFrame;
property currentCounter: Byte read mCounter write mCounter;
property counter: Byte read mCounter;
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
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;
g_language, utils, xstreams;
-
-
-
-constructor TAnimationState.Create (aloop: Boolean; aspeed: Byte; len: Integer);
+constructor TAnimState.Create (aloop: Boolean; aspeed: Byte; len: Integer);
begin
begin
+ Self := Default(TAnimState);
+
assert(len >= 0);
mLength := len;
assert(len >= 0);
mLength := len;
mSpeed := aspeed;
mEnabled := true;
mCurrentFrame := 0;
mSpeed := aspeed;
mEnabled := true;
mCurrentFrame := 0;
- mAlpha := 0;
mPlayed := false;
end;
mPlayed := false;
end;
-destructor TAnimationState.Destroy;
+procedure TAnimState.Invalidate;
begin
begin
- inherited;
+ Self := Default(TAnimState);
end;
end;
-procedure TAnimationState.update;
+procedure TAnimState.update;
begin
if (not mEnabled) then exit;
begin
if (not mEnabled) then exit;
if (mCounter >= mSpeed) then
begin
if (mCounter >= mSpeed) then
begin
- // Îæèäàíèå ìåæäó êàäðàìè çàêîí÷èëîñü
- // Îáðàòíûé ïîðÿäîê êàäðîâ?
if mRevert then
begin
if mRevert then
begin
- // Äîøëè äî êîíöà àíèìàöèè. Âîçìîæíî, æäåì åùå
if (mCurrentFrame = 0) then
begin
if (mLength * mSpeed + mCounter < mMinLength) then exit;
if (mCurrentFrame = 0) then
begin
if (mLength * mSpeed + mCounter < mMinLength) then exit;
mCurrentFrame -= 1;
mPlayed := (mCurrentFrame < 0);
mCurrentFrame -= 1;
mPlayed := (mCurrentFrame < 0);
- // Ïîâòîðÿòü ëè àíèìàöèþ ïî êðóãó?
if mPlayed then
begin
if mLoop then
if mPlayed then
begin
if mLoop then
end
else
begin
end
else
begin
- // Ïðÿìîé ïîðÿäîê êàäðîâ
- // Äîøëè äî êîíöà àíèìàöèè. Âîçìîæíî, æäåì åùå
if (mCurrentFrame = mLength - 1) then
begin
if (mLength * mSpeed + mCounter < mMinLength) then exit;
if (mCurrentFrame = mLength - 1) then
begin
if (mLength * mSpeed + mCounter < mMinLength) then exit;
mCurrentFrame += 1;
mPlayed := (mCurrentFrame > mLength - 1);
mCurrentFrame += 1;
mPlayed := (mCurrentFrame > mLength - 1);
- // Ïîâòîðÿòü ëè àíèìàöèþ ïî êðóãó?
if mPlayed then
begin
if mLoop then mCurrentFrame := 0 else mCurrentFrame -= 1;
if mPlayed then
begin
if mLoop then mCurrentFrame := 0 else mCurrentFrame -= 1;
end;
end;
end;
end;
-procedure TAnimationState.reset;
+procedure TAnimState.reset;
begin
if mRevert then
mCurrentFrame := mLength - 1
begin
if mRevert then
mCurrentFrame := mLength - 1
mPlayed := false
end;
mPlayed := false
end;
-procedure TAnimationState.disable;
+procedure TAnimState.disable;
begin
mEnabled := false
end;
begin
mEnabled := false
end;
-procedure TAnimationState.enable;
+procedure TAnimState.enable;
begin
mEnabled := true
end;
begin
mEnabled := true
end;
-procedure TAnimationState.revert (r: Boolean);
+procedure TAnimState.revert (r: Boolean);
begin
mRevert := r;
reset
end;
begin
mRevert := r;
reset
end;
-procedure TAnimationState.saveState (st: TStream);
-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);
-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;
-
-
-
-
-
-
-constructor TAnimation.Create (aframesID: LongWord; aloop: Boolean; aspeed: Byte);
+function TAnimState.totalFrames (): Integer; inline;
begin
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;
- 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 ();
-begin
- inherited;
-end;
-
-
-procedure TAnimation.update ();
-begin
- if (not mEnabled) then exit;
-
- mCounter += 1;
-
- if (mCounter >= mSpeed) then
- begin
- // Îæèäàíèå ìåæäó êàäðàìè çàêîí÷èëîñü
- // Îáðàòíûé ïîðÿäîê êàäðîâ?
- if mRevert then
- begin
- // Äîøëè äî êîíöà àíèìàöèè. Âîçìîæíî, æäåì åùå
- if (mCurrentFrame = 0) then
- begin
- if (Length(framesArray[mId].TexturesID)*mSpeed+mCounter < mMinLength) then exit;
- end;
-
- mCurrentFrame -= 1;
- mPlayed := (mCurrentFrame < 0);
-
- // Ïîâòîðÿòü ëè àíèìàöèþ ïî êðóãó?
- if mPlayed then
- begin
- if mLoop then mCurrentFrame := High(framesArray[mId].TexturesID) else mCurrentFrame += 1;
- end;
-
- mCounter := 0;
- end
- else
- begin
- // Ïðÿìîé ïîðÿäîê êàäðîâ
- // Äîøëè äî êîíöà àíèìàöèè. Âîçìîæíî, æäåì åùå
- if (mCurrentFrame = High(framesArray[mId].TexturesID)) then
- begin
- if (Length(framesArray[mId].TexturesID)*mSpeed+mCounter < mMinLength) then exit;
- end;
-
- mCurrentFrame += 1;
- mPlayed := (mCurrentFrame > High(framesArray[mId].TexturesID));
-
- // Ïîâòîðÿòü ëè àíèìàöèþ ïî êðóãó?
- if mPlayed then
- begin
- if mLoop then mCurrentFrame := 0 else mCurrentFrame -= 1;
- end;
-
- mCounter := 0;
- end;
- end;
+ result := mLength
end;
end;
-
-procedure TAnimation.reset ();
+function TAnimState.IsInvalid (): Boolean;
begin
begin
- if mRevert then mCurrentFrame := High(framesArray[mId].TexturesID) else mCurrentFrame := 0;
- mCounter := 0;
- mPlayed := false;
+ result := mLength <= 0
end;
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 TAnimation.revert (r: Boolean);
+function TAnimState.IsValid (): Boolean;
begin
begin
- mRevert := r;
- reset();
+ result := mLength > 0
end;
end;
-
-procedure TAnimation.saveState (st: TStream);
+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
begin
if (st = nil) then exit;
utils.writeSign(st, 'ANIM');
utils.writeInt(st, Byte(0)); // version
- // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
utils.writeInt(st, Byte(mCounter));
utils.writeInt(st, Byte(mCounter));
- // Òåêóùèé êàäð
utils.writeInt(st, LongInt(mCurrentFrame));
utils.writeInt(st, LongInt(mCurrentFrame));
- // Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì
utils.writeBool(st, mPlayed);
utils.writeBool(st, mPlayed);
- // Alpha-êàíàë âñåé òåêñòóðû
utils.writeInt(st, Byte(mAlpha));
utils.writeInt(st, Byte(mAlpha));
- // Ðàçìûòèå òåêñòóðû
utils.writeInt(st, Byte(mBlending));
utils.writeInt(st, Byte(mBlending));
- // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
utils.writeInt(st, Byte(mSpeed));
utils.writeInt(st, Byte(mSpeed));
- // Çàöèêëåíà ëè àíèìàöèÿ
utils.writeBool(st, mLoop);
utils.writeBool(st, mLoop);
- // Âêëþ÷åíà ëè
utils.writeBool(st, mEnabled);
utils.writeBool(st, mEnabled);
- // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
utils.writeInt(st, Byte(mMinLength));
utils.writeInt(st, Byte(mMinLength));
- // Îáðàòíûé ëè ïîðÿäîê êàäðîâ
utils.writeBool(st, mRevert);
end;
utils.writeBool(st, mRevert);
end;
-procedure TAnimation.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');
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);
mCounter := utils.readByte(st);
- // Òåêóùèé êàäð
mCurrentFrame := utils.readLongInt(st);
mCurrentFrame := utils.readLongInt(st);
- // Ïðîèãðàíà ëè àíèìàöèÿ öåëèêîì
mPlayed := utils.readBool(st);
mPlayed := utils.readBool(st);
- // Alpha-êàíàë âñåé òåêñòóðû
mAlpha := utils.readByte(st);
mAlpha := utils.readByte(st);
- // Ðàçìûòèå òåêñòóðû
mBlending := utils.readBool(st);
mBlending := utils.readBool(st);
- // Âðåìÿ îæèäàíèÿ ìåæäó êàäðàìè
mSpeed := utils.readByte(st);
mSpeed := utils.readByte(st);
- // Çàöèêëåíà ëè àíèìàöèÿ
mLoop := utils.readBool(st);
mLoop := utils.readBool(st);
- // Âêëþ÷åíà ëè
mEnabled := utils.readBool(st);
mEnabled := utils.readBool(st);
- // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
mMinLength := utils.readByte(st);
mMinLength := utils.readByte(st);
- // Îáðàòíûé ëè ïîðÿäîê êàäðîâ
mRevert := utils.readBool(st);
end;
mRevert := utils.readBool(st);
end;
+
end.
end.