2
// This unit is part of the GLScene Engine https://github.com/glscene
5
Time based events mannager using the Cadencer
6
can be useful to make animations with GlScene
9
07/01/10 - DaStr - Added TGLTimeEventsMGR.Reset()
11
25/11/09 - DanB - Changed TTimeEvent.Name from ShortString to String
12
11/10/07 - DaStr - TTimeEvent.SetEnabled now updates StartTime to
13
Cadencers's current time.
14
(Thanks Lukasz Sokol) (BugTracker ID = 1811141)
15
28/03/07 - DaStr - Cosmetic fix for FPC compatibility
16
29/01/07 - DaStr - Moved registration to GLSceneRegister.pas
17
07/02/02 - EG - Added Notification, DoEvent, ElapsedTime and changed Event type
26
GLCadencer, GLBaseClasses;
35
TGLTimeEventsMGR = class(TGLUpdateAbleComponent)
38
FCadencer : TGLCadencer;
40
FFreeEventOnEnd : boolean;
41
FEvents : TTimeEvents;
44
{ Déclarations protégées }
45
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
47
procedure SetCadencer(const val : TGLCadencer);
48
procedure SetEvents(const val : TTimeEvents);
52
constructor Create(aOwner : TComponent); override;
53
destructor Destroy; override;
55
procedure DoProgress(const progressTime : TProgressTimes); override;
59
{ Déclarations publiées }
60
property Cadencer : TGLCadencer read FCadencer write SetCadencer;
61
property Enabled : boolean read FEnabled write FEnabled default True;
62
property FreeEventOnEnd : boolean read FFreeEventOnEnd write FFreeEventOnEnd default False;
63
property Events : TTimeEvents read FEvents write SetEvents;
68
TTimeEvents = class (TCollection)
72
function GetOwner: TPersistent; override;
73
procedure SetItems(index : Integer; const val : TTimeEvent);
74
function GetItems(index : Integer) : TTimeEvent;
78
constructor Create(AOwner : TComponent);
80
function Add: TTimeEvent;
81
function FindItemID(ID: Integer): TTimeEvent;
82
function EventByName(name:String): TTimeEvent;
84
property Items[index : Integer] : TTimeEvent read GetItems write SetItems; default;
87
TTimeEventType = (etOneShot, etContinuous, etPeriodic);
88
TTimeEventProc = procedure (event : TTimeEvent) of object;
92
TTimeEvent = class (TCollectionItem)
96
FStartTime, FEndTime, FElapsedTime : Double;
98
FEventType: TTimeEventType;
99
FOnEvent:TTimeEventProc;
102
FTickCount : Cardinal;
103
procedure SetEnabled(const Value: Boolean);
107
function GetDisplayName : String; override;
108
procedure SetName(val : String);
110
procedure DoEvent(const curTime : Double);
114
constructor Create(Collection : TCollection); override;
115
destructor Destroy; override;
117
// Number of times the event was triggered since activation
118
property TickCount : Cardinal read FTickCount;
119
// Elapsed time since the event was activated
120
property ElapsedTime : Double read FElapsedTime;
124
property Name : String read FName write SetName;
125
property StartTime : Double read FStartTime write FStartTime;
126
property EndTime : Double read FEndTime write FEndTime;
127
property Period : Double read FPeriod write FPeriod;
128
property EventType : TTimeEventType read FEventType write FEventType default etOneShot;
129
property OnEvent : TTimeEventProc read FOnEvent write FOnEvent;
130
property Enabled : Boolean read FEnabled write SetEnabled default True;
137
// ------------------ TGLTimeEventsMGR ------------------
142
constructor TGLTimeEventsMGR.Create(aOwner : TComponent);
146
FFreeEventOnEnd:=False;
147
FEvents:=TTimeEvents.Create(self);
152
destructor TGLTimeEventsMGR.Destroy;
161
procedure TGLTimeEventsMGR.Notification(AComponent: TComponent; Operation: TOperation);
163
if (Operation=opRemove) and (AComponent=Cadencer) then
170
procedure TGLTimeEventsMGR.SetCadencer(const val : TGLCadencer);
172
if FCadencer<>val then begin
173
if Assigned(FCadencer) then
174
FCadencer.UnSubscribe(Self);
176
if Assigned(FCadencer) then
177
FCadencer.Subscribe(Self);
184
procedure TGLTimeEventsMGR.SetEvents(const val : TTimeEvents);
191
procedure TGLTimeEventsMGR.DoProgress(const progressTime : TProgressTimes);
195
if not Enabled then Exit;
198
with progressTime do while i<=Events.Count-1 do with Events.Items[i] do begin
199
if Enabled and Assigned(FOnEvent) then begin
202
if (newTime>=StartTime) and (TickCount=0) then
205
if (newTime>=StartTime) and ((newTime<=EndTime) or (EndTime<=0)) then
208
if (newTime>=StartTime+TickCount*Period) and ((newTime<=EndTime) or (EndTime<=0)) then
214
if FreeEventOnEnd and
215
( ((EventType<>etOneShot) and (newTime>EndTime) and (EndTime>=0)) or
216
((EventType=etOneShot) and (TickCount>0)) ) then
219
// if we delete current event, the next will have same index
220
// so increment only if we don't delete
228
procedure TGLTimeEventsMGR.Reset;
232
if FEvents.Count <> 0 then
233
for I := 0 to FEvents.Count - 1 do
234
FEvents[I].FTickCount := 0;
239
// ------------------ TTimeEvents ------------------
244
constructor TTimeEvents.Create(AOwner : TComponent);
247
inherited Create(TTimeEvent);
252
function TTimeEvents.GetOwner: TPersistent;
259
procedure TTimeEvents.SetItems(index : Integer; const val : TTimeEvent);
261
inherited Items[index]:=val;
266
function TTimeEvents.GetItems(index : Integer) : TTimeEvent;
268
Result:=TTimeEvent(inherited Items[index]);
273
function TTimeEvents.Add : TTimeEvent;
275
Result:=(inherited Add) as TTimeEvent;
280
function TTimeEvents.FindItemID(ID: Integer): TTimeEvent;
282
Result:=(inherited FindItemID(ID)) as TTimeEvent;
287
function TTimeEvents.EventByName(name:String): TTimeEvent;
291
while (i<Count) and (Items[i].FName<>name) do inc(i);
293
if i=Count then result:=nil else result:=Items[i];
300
// ------------------ TTimeEvent ------------------
305
constructor TTimeEvent.Create(Collection : TCollection);
307
inherited Create(Collection);
308
FEventType:=etOneShot;
309
FName:=Format('Event%d', [index]); // give a default name different for each event
315
destructor TTimeEvent.Destroy;
322
function TTimeEvent.GetDisplayName : String;
326
Result:=Name+Format(' (OneShot ST=%g)',[StartTime]);
328
Result:=Name+Format(' (Continuous ST=%g ET=%g)',[StartTime,EndTime]);
330
Result:=Name+Format(' (Periodic ST=%g ET=%g P=%g)',[StartTime,EndTime,Period]);
336
procedure TTimeEvent.SetName(val : String);
342
with self.Collection as TTimeEvents do // we mustn't have 2 events with the same name (for EventByName)
343
for i:=0 to Count-1 do
344
if Items[i].FName = val then Ok := False;
346
if Ok and (val<>'') then FName:=val;
351
procedure TTimeEvent.DoEvent(const curTime : Double);
353
if Assigned(FOnEvent) then begin
354
FElapsedTime:=curTime-StartTime;
362
procedure TTimeEvent.SetEnabled(const Value: Boolean);
365
FStartTime := ((GetOwner as TTimeEvents).Owner as TGLTimeEventsMGR).Cadencer.CurrentTime;