fCulling.pas 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. unit fCulling;
  2. interface
  3. uses
  4. Winapi.OpenGL,
  5. System.SysUtils,
  6. System.Classes,
  7. Vcl.Graphics,
  8. Vcl.Controls,
  9. Vcl.Forms,
  10. Vcl.Dialogs,
  11. Vcl.ExtCtrls,
  12. Vcl.StdCtrls,
  13. Vcl.Imaging.Jpeg,
  14. GLS.Scene,
  15. GLS.Objects,
  16. GLS.Cadencer,
  17. GLS.VectorFileObjects,
  18. GLS.SceneViewer,
  19. GLS.Texture,
  20. GLS.Material,
  21. GLS.Coordinates,
  22. GLS.BaseClasses,
  23. GLS.RenderContextInfo,
  24. GLS.FileMD2;
  25. type
  26. TFormCulling = class(TForm)
  27. Viewer: TGLSceneViewer;
  28. GLScene: TGLScene;
  29. GLCadencer: TGLCadencer;
  30. GLCamera1: TGLCamera;
  31. GLLightSource1: TGLLightSource;
  32. DCTarget: TGLDummyCube;
  33. Timer1: TTimer;
  34. DCSpheres: TGLDummyCube;
  35. DCActors: TGLDummyCube;
  36. ACReference: TGLActor;
  37. GLMaterialLibrary: TGLMaterialLibrary;
  38. Panel2: TPanel;
  39. Label1: TLabel;
  40. RBNone: TRadioButton;
  41. RBObject: TRadioButton;
  42. RBHierarchical: TRadioButton;
  43. Label2: TLabel;
  44. RBActors: TRadioButton;
  45. RBSpheres: TRadioButton;
  46. procedure GLCadencerProgress(Sender: TObject; const deltaTime,
  47. newTime: Double);
  48. procedure Timer1Timer(Sender: TObject);
  49. procedure FormCreate(Sender: TObject);
  50. procedure RBNoneClick(Sender: TObject);
  51. procedure RBSpheresClick(Sender: TObject);
  52. private
  53. public
  54. end;
  55. var
  56. FormCulling: TFormCulling;
  57. implementation
  58. {$R *.DFM}
  59. procedure TFormCulling.FormCreate(Sender: TObject);
  60. var
  61. i, j : Integer;
  62. newSphere : TGLSphere;
  63. newActor : TGLActor;
  64. MediaPath : String;
  65. begin
  66. MediaPath := ExtractFilePath(ParamStr(0));
  67. I := Pos(UpperCase('Demos'), UpperCase(MediaPath));
  68. if (I <> 0) then
  69. begin
  70. Delete(MediaPath, I+5, Length(MediaPath)-(I+5));
  71. MediaPath := MediaPath+'Media\';
  72. SetCurrentDir(MediaPath);
  73. end;
  74. // Spheres are used as standalone, high-polycount objects
  75. // that are highly T&L friendly
  76. for i:=-4 to 4 do for j:=-4 to 4 do begin
  77. newSphere:=(DCSpheres.AddNewChild(TGLSphere) as TGLSphere);
  78. newSphere.Position.SetPoint(i*5, 0, j*5);
  79. newSphere.Slices:=32;
  80. newSphere.Stacks:=32;
  81. end;
  82. // Actors are used as standalone, med-polycount objects
  83. // that aren't T&L friendly (all geometry must be sent to
  84. // the hardware at each frame)
  85. GLMaterialLibrary.Materials[0].Material.Texture.Image.LoadFromFile('waste.jpg');
  86. ACReference.LoadFromFile('waste.md2');
  87. for i:=-3 to 3 do for j:=-3 to 3 do begin
  88. newActor:=(DCActors.AddNewChild(TGLActor) as TGLActor);
  89. newActor.Assign(ACReference);
  90. newActor.Position.SetPoint(i*10, 0, j*10);
  91. newActor.CurrentFrame:=(i+2)+(j+2)*5;
  92. end;
  93. ACReference.Visible:=False;
  94. end;
  95. procedure TFormCulling.RBSpheresClick(Sender: TObject);
  96. begin
  97. DCSpheres.Visible:=RBSpheres.Checked;
  98. DCActors.Visible:=RBActors.Checked;
  99. end;
  100. procedure TFormCulling.GLCadencerProgress(Sender: TObject; const deltaTime,
  101. newTime: Double);
  102. begin
  103. Viewer.Invalidate;
  104. end;
  105. procedure TFormCulling.Timer1Timer(Sender: TObject);
  106. begin
  107. Caption:=Format('Culling - %.1f FPS', [Viewer.FramesPerSecond]);
  108. Viewer.ResetPerformanceMonitor;
  109. end;
  110. procedure TFormCulling.RBNoneClick(Sender: TObject);
  111. begin
  112. if RBObject.Checked then
  113. GLScene.VisibilityCulling:=vcObjectBased
  114. else if RBHierarchical.Checked then
  115. GLScene.VisibilityCulling:=vcHierarchical
  116. else GLScene.VisibilityCulling:=vcNone;
  117. end;
  118. end.