-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathOffSetAnim.pas
132 lines (116 loc) · 3 KB
/
OffSetAnim.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
unit OffSetAnim;
{
OffSet Animation Unit for GLScene
---------------------------------
Author: RaveniX
Email: [email protected]
Version: 0.4
Updated: 15/06/04
Copyright: RaveniX, 2004.
}
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Dialogs, GLTexture, GLMaterial;
type
TAOffSet = record
x, y: Single;
end;
TOffSetAnim = class
private
OffSets: Array of TAOffSet;
ticker, qtick: double;
ScaleX, ScaleY: Single;
C, R: Integer;
Lib: TGLMaterialLibrary;
AnimReady: Boolean;
public
FPS: Integer;
Bind: Integer;
Mode: Integer;
CFrame: Integer;
procedure MakeAnim(TileWidth: Integer; TileHeight: Integer; sBind: Integer; src: TGLMaterialLibrary; FrameRate: Integer; pm: Integer);
procedure NextFrame;
procedure SetFrame(Frame: Integer);
procedure Tick(Time: Double);
Constructor Create;
Destructor Destroy; Override;
end;
const
apmNone = 111;
apmLoop = 112;
apmOnce = 113;
implementation
Constructor TOffSetAnim.Create;
begin
//initialise clock
qtick := ticker;
Animready := False;
end;
Destructor TOffSetAnim.Destroy;
begin
//
end;
procedure TOffSetAnim.Tick(Time: Double);
begin
ticker := Time;
if ticker-qtick > 1/fps then begin
qtick := ticker;
//
if (AnimReady = True) and (Mode <> apmNone) then NextFrame;
end;
end;
procedure TOffSetAnim.MakeAnim(TileWidth: Integer; TileHeight: Integer; sBind: Integer; src: TGLMaterialLibrary; FrameRate: Integer; pm: Integer);
var
i, i2, o: Integer;
x,y: Single;
begin
try
AnimReady := False;
FPS := FrameRate;
Bind := sBind;
Lib := (src as TGLMaterialLibrary);
C := Lib.Materials[Bind].Material.Texture.Image.Width div TileWidth;
R := Lib.Materials[Bind].Material.Texture.Image.Height div TileHeight;
ScaleX := 1/C;
ScaleY := 1/R;
x := 0;
y := ScaleY*R-1;
for i := 0 to R-1 do begin
for i2 := 0 to C-1 do begin
SetLength(OffSets, Length(OffSets)+1);
o := Length(OffSets)-1;
OffSets[o].x := x;
OffSets[o].y := y;
x := x + ScaleX;
end;
x:= 0;
y := y - ScaleY;
end;
Lib.Materials[Bind].TextureScale.x := ScaleX;
Lib.Materials[Bind].TextureScale.y := ScaleY;
Lib.Materials[Bind].TextureOffset.Y := ScaleY*R-1;
Mode := pm;
AnimReady := True;
except
SetLength(OffSets, 0);
ShowMessage('MakeAnim failed... Make sure your texture is Power of 2.');
end;
end;
procedure TOffSetAnim.NextFrame;
begin
lib.Materials[Bind].TextureOffset.x := OffSets[CFrame].x;
lib.Materials[Bind].TextureOffset.y := OffSets[CFrame].y;
if Mode = apmLoop then begin
if CFrame = Length(OffSets) then CFrame := 0 else Inc(CFrame);
end else begin
if CFrame <> Length(OffSets) then Inc(CFrame);
end;
end;
procedure TOffSetAnim.SetFrame(Frame: Integer);
begin
if (Frame >=0) and (Frame < Length(OffSets)) then begin
CFrame := Frame;
lib.Materials[Bind].TextureOffset.x := OffSets[CFrame].x;
lib.Materials[Bind].TextureOffset.y := OffSets[CFrame].y;
end;
end;
end.