index d12a9a24e4ba74789cfbe74fbaa0713e4b0c376f..8190ea3df814d0b7300d2a6f85fe579681497825 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;
- TAnimation = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF}
+ TAnimationState = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF}
private
private
- mId: LongWord;
mAlpha: Byte;
mBlending: Boolean;
mCounter: Byte; // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
mAlpha: Byte;
mBlending: Boolean;
mCounter: Byte; // Ñ÷åò÷èê îæèäàíèÿ ìåæäó êàäðàìè
mLoop: Boolean; // Ïåðåõîäèòü íà ïåðâûé êàäð ïîñëå ïîñëåäíåãî?
mEnabled: Boolean; // Ðàáîòà ðàçðåøåíà?
mPlayed: Boolean; // Ïðîèãðàíà âñÿ õîòÿ áû ðàç?
mLoop: Boolean; // Ïåðåõîäèòü íà ïåðâûé êàäð ïîñëå ïîñëåäíåãî?
mEnabled: Boolean; // Ðàáîòà ðàçðåøåíà?
mPlayed: Boolean; // Ïðîèãðàíà âñÿ õîòÿ áû ðàç?
- mHeight: Word;
- mWidth: Word;
mMinLength: Byte; // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
mRevert: Boolean; // Ñìåíà êàäðîâ îáðàòíàÿ?
mMinLength: Byte; // Îæèäàíèå ïîñëå ïðîèãðûâàíèÿ
mRevert: Boolean; // Ñìåíà êàäðîâ îáðàòíàÿ?
+ mLength: Integer;
+
public
public
- constructor Create (aframesID: LongWord; aloop: Boolean; aspeed: Byte);
+ constructor Create (aloop: Boolean; aspeed: Byte; len: Integer);
destructor Destroy (); override;
procedure reset ();
destructor Destroy (); override;
procedure reset ();
property counter: Byte read mCounter;
property blending: Boolean read mBlending write mBlending;
property alpha: Byte read mAlpha write mAlpha;
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 TAnimation.Create (aframesID: LongWord; aloop: Boolean; aspeed: Byte);
+constructor TAnimationState.Create (aloop: Boolean; aspeed: Byte; len: Integer);
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;
+ assert(len >= 0);
+ mLength := len;
+
mMinLength := 0;
mLoop := aloop;
mSpeed := aspeed;
mEnabled := true;
mCurrentFrame := 0;
mMinLength := 0;
mLoop := aloop;
mSpeed := aspeed;
mEnabled := true;
mCurrentFrame := 0;
- mPlayed := false;
mAlpha := 0;
mAlpha := 0;
- mWidth := framesArray[mId].FrameWidth;
- mHeight := framesArray[mId].FrameHeight;
+ mPlayed := false;
end;
end;
-
-destructor TAnimation.Destroy ();
+destructor TAnimationState.Destroy;
begin
inherited;
end;
begin
inherited;
end;
-
-procedure TAnimation.update ();
+procedure TAnimationState.update;
begin
if (not mEnabled) then exit;
begin
if (not mEnabled) then exit;
// Äîøëè äî êîíöà àíèìàöèè. Âîçìîæíî, æäåì åùå
if (mCurrentFrame = 0) then
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;
end;
mCurrentFrame -= 1;
// Ïîâòîðÿòü ëè àíèìàöèþ ïî êðóãó?
if mPlayed then
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;
end;
mCounter := 0;
begin
// Ïðÿìîé ïîðÿäîê êàäðîâ
// Äîøëè äî êîíöà àíèìàöèè. Âîçìîæíî, æäåì åùå
begin
// Ïðÿìîé ïîðÿäîê êàäðîâ
// Äîøëè äî êîíöà àíèìàöèè. Âîçìîæíî, æäåì åùå
- if (mCurrentFrame = High(framesArray[mId].TexturesID)) then
+ if (mCurrentFrame = mLength - 1) then
begin
begin
- if (Length(framesArray[mId].TexturesID)*mSpeed+mCounter < mMinLength) then exit;
+ if (mLength * mSpeed + mCounter < mMinLength) then exit;
end;
mCurrentFrame += 1;
end;
mCurrentFrame += 1;
- mPlayed := (mCurrentFrame > High(framesArray[mId].TexturesID));
+ mPlayed := (mCurrentFrame > mLength - 1);
// Ïîâòîðÿòü ëè àíèìàöèþ ïî êðóãó?
if mPlayed then
// Ïîâòîðÿòü ëè àíèìàöèþ ïî êðóãó?
if mPlayed then
end;
end;
end;
end;
-
-procedure TAnimation.reset ();
+procedure TAnimationState.reset;
begin
begin
- if mRevert then mCurrentFrame := High(framesArray[mId].TexturesID) else mCurrentFrame := 0;
+ if mRevert then
+ mCurrentFrame := mLength - 1
+ else
+ mCurrentFrame := 0;
mCounter := 0;
mCounter := 0;
- mPlayed := false;
+ mPlayed := false
end;
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;
begin
mRevert := r;
- reset();
+ reset
end;
end;
+function TAnimationState.totalFrames (): Integer; inline;
+begin
+ result := mLength
+end;
-procedure TAnimation.saveState (st: TStream);
+procedure TAnimationState.saveState (st: TStream);
begin
if (st = nil) then exit;
begin
if (st = nil) then exit;
end;
end;
-procedure TAnimation.loadState (st: TStream);
+procedure TAnimationState.loadState (st: TStream);
begin
if (st = nil) then exit;
begin
if (st = nil) then exit;