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

2D图形编程

开发平台:

Delphi

  1. unit MainFm;
  2. //---------------------------------------------------------------------------
  3. interface
  4. //---------------------------------------------------------------------------
  5. uses
  6.   Windows, SysUtils, Classes, Controls, Forms, Dialogs, StdCtrls, ExtCtrls,
  7.   AsphyreDevices, AsphyreTimer, AsphyrePalettes, AsphyreFonts;
  8. //---------------------------------------------------------------------------
  9. type
  10.   TMainForm = class(TForm)
  11.     PrimaryPanel: TPanel;
  12.     Label1: TLabel;
  13.     AuxiliaryPanel: TPanel;
  14.     Label2: TLabel;
  15.     procedure FormDestroy(Sender: TObject);
  16.     procedure FormCreate(Sender: TObject);
  17.   private
  18.     { Private declarations }
  19.     Ticks: Integer;
  20.     Chain: array[0..3] of Integer;
  21.     DrawIndex: Integer;
  22.     MixIndex : Integer;
  23.     Palette  : TAsphyrePalette;
  24.     DrawTicks: Integer;
  25.     procedure SetupDevice(Sender: TAsphyreDevice; Tag: TObject;
  26.      var Config: TScreenConfig);
  27.     procedure OnDeviceCreate(Sender: TObject; EventParam: Pointer;
  28.      var Success: Boolean);
  29.     procedure OnDeviceReset(Sender: TObject; EventParam: Pointer;
  30.      var Success: Boolean);
  31.     procedure OnResolveFailed(Sender: TObject; EventParam: Pointer;
  32.      var Success: Boolean);
  33.     procedure TimerEvent(Sender: TObject);
  34.     procedure ProcessEvent(Sender: TObject);
  35.     procedure RenderPrimary(Sender: TAsphyreDevice; Tag: TObject);
  36.     procedure RenderSecondary(Sender: TAsphyreDevice; Tag: TObject);
  37.     procedure DrawMotion(Sender: TAsphyreDevice; Tag: TObject);
  38.     procedure MixDrawings(Sender: TAsphyreDevice; Tag: TObject);
  39.   public
  40.     { Public declarations }
  41.   end;
  42. //---------------------------------------------------------------------------
  43. var
  44.   MainForm: TMainForm;
  45. //---------------------------------------------------------------------------
  46. implementation
  47. uses
  48.  AsphyreTypes, AsphyreEffects, MediaImages, MediaFonts, AsphyreEvents,
  49.  AsphyreSystemFonts;
  50. {$R *.dfm}
  51. //---------------------------------------------------------------------------
  52. const
  53.  OrigPx: TPoint4px = (
  54.   (x:   0 + 4; y: 0 + 4),
  55.   (x: 256 - 1; y: 0 + 3),
  56.   (x: 256 - 3; y: 256 - 1),
  57.   (x:   0 + 1; y: 256 - 4));
  58. //---------------------------------------------------------------------------
  59. procedure TMainForm.FormCreate(Sender: TObject);
  60. begin
  61.  Palette:= TAsphyrePalette.Create();
  62.  Palette.Add($FF9100FF, 0.0);
  63.  Palette.Add($FF617BFF, 0.25);
  64.  Palette.Add($FFFF6F00, 0.5);
  65.  Palette.Add($FFFFB700, 0.75);
  66.  Palette.Add($FFFFFFFF, 1.0);
  67.  // retreive image and font descriptions
  68.  ImageGroups.ParseLink('/media.xml');
  69.  FontGroups.ParseLink('/media.xml');
  70.  // configure Asphyre device(s)
  71.  Devices.Count:= 1;
  72.  if (not Devices.Initialize(SetupDevice, Self)) then
  73.   begin
  74.    MessageDlg('Failed to initialize Asphyre device', mtError, [mbOk], 0);
  75.    Close();
  76.    Exit;
  77.   end;
  78.  // configure Asphyre timer
  79.  Timer.Enabled  := True;
  80.  Timer.OnTimer  := TimerEvent;
  81.  Timer.OnProcess:= ProcessEvent;
  82.  Timer.MaxFPS   := 4000;
  83.  DrawIndex:= 0;
  84.  MixIndex := 0;
  85. end;
  86. //---------------------------------------------------------------------------
  87. procedure TMainForm.FormDestroy(Sender: TObject);
  88. begin
  89.  Devices.Finalize();
  90.  Palette.Free();
  91. end;
  92. //---------------------------------------------------------------------------
  93. procedure TMainForm.SetupDevice(Sender: TAsphyreDevice; Tag: TObject;
  94.  var Config: TScreenConfig);
  95. begin
  96.  // configure Asphyre device
  97.  Config.Width   := 256;
  98.  Config.Height  := 256;
  99.  Config.Windowed:= True;
  100.  Config.WindowHandle:= Self.Handle;
  101.  Config.HardwareTL  := False;
  102.  EventDeviceCreate.Subscribe(OnDeviceCreate, Sender);
  103.  EventDeviceReset.Subscribe(OnDeviceReset, Sender);
  104.  EventResolveFailed.Subscribe(OnResolveFailed, Sender);
  105. end;
  106. //---------------------------------------------------------------------------
  107. procedure TMainForm.OnDeviceCreate(Sender: TObject; EventParam: Pointer;
  108.  var Success: Boolean);
  109. begin
  110.  // Here we create all static resources.
  111.  if (Sender is TAsphyreDevice) then
  112.    TAsphyreDevice(Sender).SysFonts.CreateFont('s/tahoma', 'tahoma', 14, False,
  113.     fwtBold);
  114. end;
  115. //---------------------------------------------------------------------------
  116. procedure TMainForm.OnDeviceReset(Sender: TObject; EventParam: Pointer;
  117.  var Success: Boolean);
  118. const
  119.  ChainNames: array[0..3] of string = ('draw-1',
  120.   'draw-2', 'mix-1', 'mix-2');
  121. var
  122.  i: Integer;
  123. begin
  124.  // Here we create all dynamic resources, which need to be recreated each
  125.  // time the device is reset.
  126.  if (Sender is TAsphyreDevice) then
  127.   with Sender as TAsphyreDevice do
  128.    begin
  129.     for i:= 0 to High(ChainNames) do
  130.      Chain[i]:=  Images.ResolveImage(ChainNames[i]);
  131.    end;
  132. end;
  133. //---------------------------------------------------------------------------
  134. procedure TMainForm.OnResolveFailed(Sender: TObject; EventParam: Pointer;
  135.  var Success: Boolean);
  136. begin
  137.  Timer.Enabled:= False;
  138.  MessageDlg('Failed to resolve symbol ' + PChar(EventParam), mtError,
  139.   [mbOk], 0);
  140.  Close();
  141. end;
  142. //---------------------------------------------------------------------------
  143. procedure TMainForm.TimerEvent(Sender: TObject);
  144. begin
  145.  Devices[0].RenderTo(Chain[DrawIndex xor 1], DrawMotion, Self, $000000, 1.0, 0);
  146.  Devices[0].RenderTo(Chain[2 + (MixIndex xor 1)], MixDrawings, Self);
  147.  if (DrawTicks and $03 = 0) then
  148.   Devices[0].Render(PrimaryPanel.Handle, RenderPrimary, Self, $000080);
  149.  Devices[0].Render(AuxiliaryPanel.Handle, RenderSecondary, Self, $000000);
  150.  DrawIndex:= DrawIndex xor 1;
  151.  MixIndex := MixIndex xor 1;
  152.  Timer.Process();
  153.  Inc(DrawTicks);
  154.  Caption:= 'Targets''n''Panels, FPS: ' + IntToStr(Timer.FrameRate);
  155. end;
  156. //---------------------------------------------------------------------------
  157. procedure TMainForm.ProcessEvent(Sender: TObject);
  158. begin
  159.  Inc(Ticks);
  160. end;
  161. //---------------------------------------------------------------------------
  162. procedure TMainForm.RenderPrimary(Sender: TAsphyreDevice; Tag: TObject);
  163. begin
  164.  with Sender.Canvas do
  165.   begin
  166.    // Draw some random primitives.
  167.    FillQuad(pBounds4(2, 2, 50, 50), cColor4($FF00FF00, $FFFF0000, $FF0000FF,
  168.     $FFFFFFFF), fxuNoBlend);
  169.    FillQuad(pBounds4(54, 2, 50, 50), cColor4($FF000000, $FFFF00FF, $FFFFFF00,
  170.     $FF00FFFF), fxuNoBlend);
  171.    FillQuadEx(pBounds4(2, 54, 50, 50), cColor4($FF00FF00, $FFFF0000, $FF0000FF,
  172.     $FFFFFFFF), fxuNoBlend);
  173.    FillQuadEx(pBounds4(54, 54, 50, 50), cColor4($FF000000, $FFFF00FF,
  174.     $FFFFFF00, $FF00FFFF), fxuNoBlend);
  175.    FillArc(150, 150, 80, 70, Pi / 8, (Pi / 4) + Pi, 24, cColor4($FF00FF00,
  176.     $FFFF0000, $FF0000FF, $FFFFFFFF), fxuNoBlend);
  177.    // Draw the "motion" scene with alpha-channel on top of everything.
  178.    UseImage(Sender.Images[Chain[DrawIndex]], pFlip4(pBounds4(0.0, 0.0, 1.0,
  179.     1.0)));
  180.    TexMap(pBounds4(0, 0, 256, 256), clWhite4, fxuBlend);
  181.   end;
  182.  Sender.SysFonts.Font['s/tahoma'].TextOut('System Font!', 4, 230, $FFFFFFFF);
  183.  Sender.SysFonts.Font['s/tahoma'].TextOut('Unicode string :-)', 4, 210,
  184.   $FF9745FF);
  185. end;
  186. //---------------------------------------------------------------------------
  187. procedure TMainForm.RenderSecondary(Sender: TAsphyreDevice; Tag: TObject);
  188. begin
  189.  with Sender.Canvas do
  190.   begin
  191.    // Just render the "mixed" scene on the second panel.
  192.    UseImage(Sender.Images[Chain[2 + MixIndex]], TexFull4);
  193.    TexMap(pBounds4(0, 0, 256, 256), clWhite4, fxuBlend);
  194.    with Sender.Fonts.Font['x/warmachine'] do
  195.     begin
  196.      Options.Kerning:= -6;
  197.      TextOut('Future is here!', -2, 230, $FFFFFFFF);
  198.     end;
  199.   end;
  200.  with Sender.Fonts.Font['x/acidreamer'] do
  201.   begin
  202.    Options.Kerning:= -8;
  203.    TextOut('Some weird fonts can also be displayed', 0, 100, cColor2($FF7E00FF,
  204.     $FFFFFFFF));
  205.   end;
  206.  with Sender.Fonts.Font['x/smallpaulo'] do
  207.   begin
  208.    Options.Kerning:= 1;
  209.    TextOut('This very tiny font has no antialiasing!', 4, 30, $FFFFFFFF);
  210.   end;
  211. end;
  212. //---------------------------------------------------------------------------
  213. procedure TMainForm.DrawMotion(Sender: TAsphyreDevice; Tag: TObject);
  214. var
  215.  Theta, RibbonLength: Real;
  216. begin
  217.  // Draw some motion - moving ribbons and two soldiers moving from separate
  218.  // directions.
  219.  with Sender.Canvas do
  220.   begin
  221.    Theta:= (Ticks mod 200) * Pi / 100;
  222.    RibbonLength:= (1.0 + Sin(Ticks / 50.0)) * Pi * 2 / 3 + (Pi / 3);
  223.    FillRibbon(128, 128 - 32, 16.0, 24.0, 48.0, 32.0, Theta, Theta +
  224.     RibbonLength, 24, Palette, fxuBlend or fxfDiffuse);
  225.    Theta:= (-Ticks mod 100) * Pi / 50;
  226.    RibbonLength:= (1.0 + Cos(Ticks / 37.0)) * Pi * 2 / 3 + (Pi / 3);
  227.    FillRibbon(128, 128 + 32, 24.0, 16.0, 32.0, 48.0, Theta, Theta +
  228.     RibbonLength, 24, Palette, fxuAdd or fxfDiffuse);
  229.    Sender.SysFonts.Font['s/tahoma'].TextOut('Welcome!', -32 + (Ticks mod 288),
  230.     180, $FFFFFFFF);
  231.   end;
  232. end;
  233. //---------------------------------------------------------------------------
  234. procedure TMainForm.MixDrawings(Sender: TAsphyreDevice; Tag: TObject);
  235. begin
  236.  with Sender.Canvas do
  237.   begin
  238.    // Copy previous scene, englarged and slightly rotated.
  239.    UseImage(Sender.Images[Chain[2 + MixIndex]], OrigPx);
  240.    TexMap(pBounds4(0, 0, 256, 256), clWhite4, fxuNoBlend);
  241.    // Darken the area slightly, to avoid color mess :)
  242.    // Replace color parameter to $FFF0F0F0 to reduce the effect.
  243.    FillRect(0, 0, 256, 256, $FFF8F8F8, fxuMultiply);
  244.    // Add the "motion scene" on our working surface. 
  245.    UseImage(Sender.Images[Chain[DrawIndex]], TexFull4);
  246.    TexMap(pBounds4(0, 0, 256, 256), cAlpha4(32), fxuAdd or fxfDiffuse);
  247.   end;
  248. end;
  249. //---------------------------------------------------------------------------
  250. end.