AsphyreEvents.pas
上传用户:ctlcnc
上传日期:2021-12-10
资源大小:4933k
文件大小:8k
源码类别:

2D图形编程

开发平台:

Delphi

  1. unit AsphyreEvents;
  2. //---------------------------------------------------------------------------
  3. // AsphyreEvents.pas                                    Modified: 20-Feb-2007
  4. // Event subscriber for Asphyre notifications                    Version 1.01
  5. //---------------------------------------------------------------------------
  6. // Important Notice:
  7. //
  8. // If you modify/use this code or one of its parts either in original or
  9. // modified form, you must comply with Mozilla Public License v1.1,
  10. // specifically section 3, "Distribution Obligations". Failure to do so will
  11. // result in the license breach, which will be resolved in the court.
  12. // Remember that violating author's rights is considered a serious crime in
  13. // many countries. Thank you!
  14. //
  15. // !! Please *read* Mozilla Public License 1.1 document located at:
  16. //  http://www.mozilla.org/MPL/
  17. //
  18. // If you require any clarifications about the license, feel free to contact
  19. // us or post your question on our forums at: http://www.afterwarp.net
  20. //---------------------------------------------------------------------------
  21. // The contents of this file are subject to the Mozilla Public License
  22. // Version 1.1 (the "License"); you may not use this file except in
  23. // compliance with the License. You may obtain a copy of the License at
  24. // http://www.mozilla.org/MPL/
  25. //
  26. // Software distributed under the License is distributed on an "AS IS"
  27. // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  28. // License for the specific language governing rights and limitations
  29. // under the License.
  30. //
  31. // The Original Code is AsphyreEvents.pas.
  32. //
  33. // The Initial Developer of the Original Code is M. Sc. Yuriy Kotsarenko.
  34. // Portions created by M. Sc. Yuriy Kotsarenko are Copyright (C) 2007,
  35. // Afterwarp Interactive. All Rights Reserved.
  36. //---------------------------------------------------------------------------
  37. interface
  38. //---------------------------------------------------------------------------
  39. type
  40.  TAsphyreEventCallback = procedure(Sender: TObject; EventParam: Pointer;
  41.   var Success: Boolean) of object;
  42. //---------------------------------------------------------------------------
  43.  PAsphyreEventItem = ^TAsphyreEventItem;
  44.  TAsphyreEventItem = record
  45.   Callback: TAsphyreEventCallback;
  46.   Referer : TObject;
  47.  end;
  48. //---------------------------------------------------------------------------
  49. type
  50.  TAsphyreEvent = class
  51.  private
  52.   EventItems: array of TAsphyreEventItem;
  53.   function GetCount(): Integer;
  54.   procedure Remove(Index: Integer);
  55.   function GetItem(Index: Integer): PAsphyreEventItem;
  56.  protected
  57.   function IndexOf(Callback: TAsphyreEventCallback): Integer;
  58.  public
  59.   property Count: Integer read GetCount;
  60.   property Items[Index: Integer]: PAsphyreEventItem read GetItem; default;
  61.   function Subscribe(Callback: TAsphyreEventCallback; Referer: TObject): Integer;
  62.   procedure Unsubscribe(Callback: TAsphyreEventCallback);
  63.   function Notify(Referer, Sender: TObject; EventParam: Pointer): Boolean;
  64.  end;
  65. //---------------------------------------------------------------------------
  66. // Declare the most common events.
  67. //---------------------------------------------------------------------------
  68. var
  69.  // DeviceCreate event occurs after the device has been created.
  70.  //  -> All static (managed) resources should be loaded here.
  71.  EventDeviceCreate: TAsphyreEvent = nil;
  72.  // DeviceDestroy occurs before the device is to be destroyed.
  73.  //  -> All static (managed) resources that were created in DeviceCreate
  74.  //     event should be freed here.
  75.  EventDeviceDestroy: TAsphyreEvent = nil;
  76.  // DeviceReset occurs when the device is placed in functional state or is
  77.  // recovered from lost state.
  78.  //  -> All dynamic resources that cannot survive device loss should be
  79.  //     created here.
  80.  EventDeviceReset: TAsphyreEvent = nil;
  81.  // DeviceLost occurs when the device loses its functional state or after it
  82.  // has been lost.
  83.  //  -> All dynamic resources created in DeviceReset event should be freed
  84.  //     here.
  85.  EventDeviceLost: TAsphyreEvent = nil;
  86.  // DeviceFault occurs when a fatal error has occured with the device and
  87.  // the execution can no longer continue. When this occurs, the application
  88.  // should show an error message and terminate.
  89.  EventDeviceFault: TAsphyreEvent = nil;
  90.  // BeginScene occurs after successful call to IDirect3DDevice9.BeginScene.
  91.  EventBeginScene: TAsphyreEvent = nil;
  92.  // EndScene occurs before the call to IDirect3DDevice9.EndScene.
  93.  EventEndScene: TAsphyreEvent = nil;
  94.  // EventSymbolResolve occurs before the symbol is resolved; that is, when
  95.  // an image is being created and loaded.
  96.  EventSymbolResolve: TAsphyreEvent = nil;
  97.  // EventResolveFailed occurs when the symbol resolution has failed; that is,
  98.  // when an image or font could not be created or loaded.
  99.  EventResolveFailed: TAsphyreEvent = nil;
  100. //---------------------------------------------------------------------------
  101. implementation
  102. //---------------------------------------------------------------------------
  103. function TAsphyreEvent.GetCount(): Integer;
  104. begin
  105.  Result:= Length(EventItems);
  106. end;
  107. //---------------------------------------------------------------------------
  108. function TAsphyreEvent.GetItem(Index: Integer): PAsphyreEventItem;
  109. begin
  110.  if (Index >= 0)and(Index < Length(EventItems)) then
  111.   Result:= @EventItems[Index] else Result:= nil;
  112. end;
  113. //---------------------------------------------------------------------------
  114. function TAsphyreEvent.IndexOf(Callback: TAsphyreEventCallback): Integer;
  115. var
  116.  i: Integer;
  117. begin
  118.  Result:= -1;
  119.  for i:= 0 to Length(EventItems) - 1 do
  120.   if (@EventItems[i].Callback = @Callback) then
  121.    begin
  122.     Result:= i;
  123.     Break;
  124.    end;
  125. end;
  126. //---------------------------------------------------------------------------
  127. function TAsphyreEvent.Subscribe(Callback: TAsphyreEventCallback;
  128.  Referer: TObject): Integer;
  129. var
  130.  Index: Integer;
  131. begin
  132.  Index:= IndexOf(Callback);
  133.  if (Index <> -1) then
  134.   begin
  135.    Result:= Index;
  136.    Exit;
  137.   end;
  138.  Index:= Length(EventItems);
  139.  SetLength(EventItems, Length(EventItems) + 1);
  140.  EventItems[Index].Callback:= Callback;
  141.  EventItems[Index].Referer := Referer;
  142.  Result:= Index;
  143. end;
  144. //---------------------------------------------------------------------------
  145. procedure TAsphyreEvent.Remove(Index: Integer);
  146. var
  147.  i: Integer;
  148. begin
  149.  if (Index < 0)or(Index >= Length(EventItems)) then Exit;
  150.  for i:= Index to Length(EventItems) - 2 do
  151.   EventItems[i]:= EventItems[i + 1];
  152.  SetLength(EventItems, Length(EventItems) - 1);
  153. end;
  154. //---------------------------------------------------------------------------
  155. procedure TAsphyreEvent.Unsubscribe(Callback: TAsphyreEventCallback);
  156. begin
  157.  Remove(IndexOf(Callback));
  158. end;
  159. //---------------------------------------------------------------------------
  160. function TAsphyreEvent.Notify(Referer, Sender: TObject;
  161.  EventParam: Pointer): Boolean;
  162. var
  163.  i: Integer;
  164. begin
  165.  Result:= True;
  166.  for i:= 0 to Length(EventItems) - 1 do
  167.   if (EventItems[i].Referer = Referer) then
  168.    begin
  169.     EventItems[i].Callback(Sender, EventParam, Result);
  170.     if (not Result) then Break;
  171.    end;
  172. end;
  173. //---------------------------------------------------------------------------
  174. initialization
  175.  EventDeviceCreate := TAsphyreEvent.Create();
  176.  EventDeviceDestroy:= TAsphyreEvent.Create();
  177.  EventDeviceReset  := TAsphyreEvent.Create();
  178.  EventDeviceLost   := TAsphyreEvent.Create();
  179.  EventDeviceFault  := TAsphyreEvent.Create();
  180.  EventBeginScene   := TAsphyreEvent.Create();
  181.  EventEndScene     := TAsphyreEvent.Create();
  182.  EventSymbolResolve:= TAsphyreEvent.Create();
  183.  EventResolveFailed:= TAsphyreEvent.Create();
  184. //---------------------------------------------------------------------------
  185. finalization
  186.  EventResolveFailed.Free();
  187.  EventSymbolResolve.Free();
  188.  EventEndScene.Free();
  189.  EventBeginScene.Free();
  190.  EventDeviceFault.Free();
  191.  EventDeviceLost.Free();
  192.  EventDeviceReset.Free();
  193.  EventDeviceDestroy.Free();
  194.  EventDeviceCreate.Free();
  195. //---------------------------------------------------------------------------
  196. end.