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

2D图形编程

开发平台:

Delphi

  1. unit MainFm;
  2. //---------------------------------------------------------------------------
  3. interface
  4. //---------------------------------------------------------------------------
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, AsphyreDevices, AsphyreScene, AsphyreBasicShaders, Vectors3,
  8.   Direct3D9, AsphyreSuperEllipsoid, AsphyreMinimalShader, AsphyreImages,
  9.   Matrices4, CookTorranceFx;
  10. //---------------------------------------------------------------------------
  11. type
  12.   TMainForm = class(TForm)
  13.     procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  14.     procedure FormDestroy(Sender: TObject);
  15.     procedure FormCreate(Sender: TObject);
  16.   private
  17.     { Private declarations }
  18.     GameTicks: Integer;
  19.     procedure ConfigureDevice(Sender: TAsphyreDevice; Tag: TObject;
  20.      var Config: TScreenConfig);
  21.     procedure TimerEvent(Sender: TObject);
  22.     procedure ProcessEvent(Sender: TObject);
  23.     procedure RenderPrimary(Sender: TAsphyreDevice; Tag: TObject);
  24.   public
  25.     { Public declarations }
  26.   end;
  27. //---------------------------------------------------------------------------
  28. var
  29.   MainForm: TMainForm;
  30. //---------------------------------------------------------------------------
  31. implementation
  32. uses
  33.  AsphyreTimer, AsphyreSystemFonts, AsphyrePhysics, ExampleObjects, MediaImages,
  34.  AsphyreShaderFX, AsphyreMeshes;
  35. {$R *.dfm}
  36. //---------------------------------------------------------------------------
  37. const
  38.  Colors: array[0..6] of Cardinal = ($FF34FF00, $FFFF0000, $FF0000FF, $FFFF00FF,
  39.   $FFFFFF00, $FF00FFFF, $FF808080);
  40. //---------------------------------------------------------------------------
  41. procedure TMainForm.FormCreate(Sender: TObject);
  42. var
  43.  Floor : TExampleBox;
  44.  Box   : TExampleBox;
  45.  Sphere: TNewtonCustomSphere;
  46.  i: Integer;
  47. begin
  48.  ImageGroups.ParseLink('/images.xml');
  49.  if (not Devices.Initialize(ConfigureDevice, Self)) then
  50.   begin
  51.    MessageDlg('Failed to initialize Asphyre device.', mtError, [mbOk], 0);
  52.    Close();
  53.    Exit;
  54.   end;
  55.  DefDevice.SysFonts.CreateFont('s/tahoma', 'tahoma', 9, False, fwtBold,
  56.   fqtClearType, fctAnsi);
  57.  // Create the default shader for illuminating the physical objects
  58.  Shader:= TCookTorranceFx.Create(DefDevice);
  59.  if (not Shader.LoadFromFile('CookTorrance.fx')) then
  60.   begin
  61.    Devices.Finalize();
  62.    ShowMessage('Failed to load shader effect!');
  63.    Close();
  64.    Exit;
  65.   end;
  66.  // Create meshes that will be used to render physical objects
  67.  MeshBox:= TAsphyreSuperEllipsoid.Create(DefDevice);
  68.  TAsphyreSuperEllipsoid(MeshBox).Generate(64, 0.1, 0.1);
  69.  MeshSphere:= TAsphyreSuperEllipsoid.Create(DefDevice);
  70.  TAsphyreSuperEllipsoid(MeshSphere).Generate(32, 1.0, 1.0);
  71.  // Create physical world
  72.  CreateNewtonWorld(Vector3(100.0, 100.0, 100.0));
  73.  // The floor is stationary phsyical object that cannot be moved.
  74.  Floor:= TExampleBox.Create(NewtonObjects, Vector3(50.0, 1.0, 50.0));
  75.  Floor.Color:= $FF707070;
  76.  Floor.Specular:= 0.0;
  77.  // Create some boxes and spheres to fall down on the floor.
  78.  for i:= 0 to 7 do
  79.   begin
  80.    Box:= TExampleBox.Create(NewtonObjects, Vector3(2.0, 2.0, 2.0));
  81.    Box.Position:= Vector3(0.0, 4.0 + (i * 3.0), 0.0);
  82.    Box.Mass := 10.0;
  83.    Box.Omega:= Vector3(Random(15), Random(15), Random(15));
  84.    Box.Color:= Colors[i mod 7];
  85.    Box.Specular:= 1.0;
  86.   end;
  87.  for i:= 0 to 7 do
  88.   begin
  89.    Sphere:= TExampleSphere.Create(NewtonObjects, 1.0);
  90.    Sphere.Position:= Vector3(0.0, 15.0 + (i * 2.0), 0.0);
  91.    Sphere.Mass := 10.0;
  92.    Sphere.Omega:= Vector3(Random(15), Random(15), Random(15));
  93.    Sphere.Color:= Colors[i mod 7];
  94.   end;
  95.  Timer.Enabled  := True;
  96.  Timer.OnTimer  := TimerEvent;
  97.  Timer.OnProcess:= ProcessEvent;
  98.  Timer.MaxFPS   := 4000;
  99. end;
  100. //---------------------------------------------------------------------------
  101. procedure TMainForm.FormDestroy(Sender: TObject);
  102. begin
  103.  MeshSphere.Free();
  104.  MeshBox.Free();
  105.  Shader.Free();
  106.  Devices.Finalize();
  107.  NewtonObjects.RemoveAll();
  108.  DestroyNewtonWorld();
  109. end;
  110. procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
  111.   Shift: TShiftState);
  112. begin
  113.  if (Key = VK_ESCAPE) then Close();
  114. end;
  115. //---------------------------------------------------------------------------
  116. procedure TMainForm.ConfigureDevice(Sender: TAsphyreDevice; Tag: TObject;
  117.  var Config: TScreenConfig);
  118. begin
  119.  Config.WindowHandle:= Self.Handle;
  120.  Config.HardwareTL  := True;
  121.  Config.DepthStencil:= dsDepthOnly;
  122.  Config.Width   := ClientWidth;
  123.  Config.Height  := ClientHeight;
  124.  Config.Windowed:= False;
  125.  Config.VSync   := False;
  126.  Config.BitDepth:= bd24bit;
  127.  Config.MultiSamples:= 8;
  128. end;
  129. //---------------------------------------------------------------------------
  130. procedure TMainForm.TimerEvent(Sender: TObject);
  131. begin
  132.  // Reset vertex and face drawing count.
  133.  ResetDrawInfo();
  134.  DefDevice.Render(RenderPrimary, Self, $000000, 1.0, 0);
  135.  UpdateNewtonWorld(Timer.Latency);
  136.  Timer.Process();
  137. end;
  138. //---------------------------------------------------------------------------
  139. procedure TMainForm.ProcessEvent(Sender: TObject);
  140. begin
  141.  NewtonObjects.Update();
  142.  Inc(GameTicks);
  143. end;
  144. //---------------------------------------------------------------------------
  145. procedure TMainForm.RenderPrimary(Sender: TAsphyreDevice; Tag: TObject);
  146. begin
  147.  with DefDevice.Dev9 do
  148.   begin
  149.    SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
  150.    SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
  151.   end;
  152.  // Configure the viewing camera so it rotates around the world.
  153.  ViewMtx.LoadIdentity();
  154.  Viewmtx.RotateY(GameTicks / 100.0);
  155.  ViewMtx.LookAt(Vector3(5.0, 15.0,
  156.   -15.0), ZeroVec3, AxisYVec3);
  157.  // The projection matrix is used to project the scene on 2D screen.
  158.  ProjMtx.LoadIdentity();
  159.  ProjMtx.PerspectiveFovY(Pi / 4.0, 640.0 / 480.0, 1.0, 1000.0);
  160.  // Configure some relevant shader parameters.
  161.  Shader.LightDir:= Vector3(1.0, -1.0, -1.0);
  162.  Shader.ShaderMode:= semQuality;
  163.  Shader.UpdateTech();
  164.  // Begin shading the 3D scene.
  165.  Shader.BeginAll();
  166.  // Render all physical objects.
  167.  NewtonObjects.Draw();
  168.  // Finish shading the scene.
  169.  Shader.EndAll();
  170.  // Output frame-rate information.
  171.  with Sender.SysFonts.Font['s/tahoma'] do
  172.   begin
  173.    TextOut('FPS: ' + IntToStr(Timer.FrameRate), 4, 4, $FFC7FF57);
  174.    TextOut('Drawing ' + IntToStr(TotalFacesNo) + ' faces and ' +
  175.     IntToStr(TotalVerticesNo) + ' vertices.', 4, 24, $FFD6B7FF);
  176.    case Sender.Params.MultiSampleType of
  177.     D3DMULTISAMPLE_NONE,
  178.     D3DMULTISAMPLE_NONMASKABLE:
  179.      TextOut('No multisampling support.', 4, 44, $FFE7E8A9);
  180.     D3DMULTISAMPLE_2_SAMPLES..D3DMULTISAMPLE_16_SAMPLES:
  181.      TextOut(IntToStr(Integer(Sender.Params.MultiSampleType)) +
  182.       'x multisampling used.', 4, 44, $FFE7E8A9);
  183.    end;
  184.   end;
  185. end;
  186. //---------------------------------------------------------------------------
  187. end.