2
0

fMultiProxyD.pas 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. unit fMultiProxyD;
  2. interface
  3. uses
  4. Winapi.OpenGL,
  5. System.SysUtils,
  6. System.Classes,
  7. System.Math,
  8. Vcl.Graphics,
  9. Vcl.Controls,
  10. Vcl.Forms,
  11. Vcl.Dialogs,
  12. Vcl.ExtCtrls,
  13. Vcl.StdCtrls,
  14. GLS.Cadencer,
  15. GLS.Scene,
  16. GLScene.VectorTypes,
  17. GLS.Objects,
  18. GLS.Particles,
  19. GLS.SceneViewer,
  20. GLS.Color,
  21. GLS.MultiProxy,
  22. GLS.Texture,
  23. GLS.Coordinates,
  24. GLS.BaseClasses,
  25. GLScene.VectorGeometry;
  26. type
  27. TFormMultiProxy = class(TForm)
  28. GLScene: TGLScene;
  29. GLSceneViewer1: TGLSceneViewer;
  30. GLCamera: TGLCamera;
  31. DCTarget: TGLDummyCube;
  32. DCReferences: TGLDummyCube;
  33. GLLightSource1: TGLLightSource;
  34. GLParticles: TGLParticles;
  35. SPHighRes: TGLSphere;
  36. SPMedRes: TGLSphere;
  37. SPLowRes: TGLSphere;
  38. GLCadencer: TGLCadencer;
  39. Timer1: TTimer;
  40. MPSphere: TGLMultiProxy;
  41. Panel1: TPanel;
  42. RBUseLODs: TRadioButton;
  43. RBHighRes: TRadioButton;
  44. CBColorize: TCheckBox;
  45. RBLowRes: TRadioButton;
  46. LabelFPS: TLabel;
  47. procedure FormCreate(Sender: TObject);
  48. procedure Timer1Timer(Sender: TObject);
  49. procedure MPSphereProgress(Sender: TObject;
  50. const deltaTime, newTime: Double);
  51. procedure RBUseLODsClick(Sender: TObject);
  52. public
  53. end;
  54. var
  55. FormMultiProxy: TFormMultiProxy;
  56. implementation
  57. {$R *.dfm}
  58. procedure TFormMultiProxy.FormCreate(Sender: TObject);
  59. var
  60. i: Integer;
  61. begin
  62. // adjust settings to their default
  63. RBUseLODsClick(Self);
  64. // replicate the multiproxy via a TGLParticles object
  65. for i := 0 to 35 do
  66. GLParticles.CreateParticle.TagFloat := DegToRad(i * 10);
  67. end;
  68. procedure TFormMultiProxy.MPSphereProgress(Sender: TObject;
  69. const deltaTime, newTime: Double);
  70. begin
  71. // this is invoked for each of our MultiProxys, it makes them loop an ellipse
  72. with (Sender as TGLBaseSceneObject) do
  73. begin
  74. Position.X := Sin(newTime + TagFloat) * 80 - 60;
  75. Position.Z := Cos(newTime + TagFloat) * 7;
  76. end;
  77. end;
  78. procedure TFormMultiProxy.RBUseLODsClick(Sender: TObject);
  79. begin
  80. // adjust LOD on/off (by adjusting base sphere's detail)
  81. if RBUseLODs.Checked then
  82. begin
  83. SPHighRes.Slices := 32;
  84. SPHighRes.Stacks := 32;
  85. SPMedRes.Slices := 16;
  86. SPMedRes.Stacks := 16;
  87. SPLowRes.Slices := 8;
  88. SPLowRes.Stacks := 8;
  89. end
  90. else if RBHighRes.Checked then
  91. begin
  92. SPHighRes.Slices := 32;
  93. SPHighRes.Stacks := 32;
  94. SPMedRes.Slices := 32;
  95. SPMedRes.Stacks := 32;
  96. SPLowRes.Slices := 32;
  97. SPLowRes.Stacks := 32;
  98. end
  99. else if RBLowRes.Checked then
  100. begin
  101. SPHighRes.Slices := 8;
  102. SPHighRes.Stacks := 8;
  103. SPMedRes.Slices := 8;
  104. SPMedRes.Stacks := 8;
  105. SPLowRes.Slices := 8;
  106. SPLowRes.Stacks := 8;
  107. end;
  108. // colorize the LODs, to make them clearly visible
  109. CBColorize.Enabled := RBUseLODs.Checked;
  110. if CBColorize.Checked and RBUseLODs.Checked then
  111. begin
  112. SPHighRes.Material.FrontProperties.Diffuse.Color := clrRed;
  113. SPMedRes.Material.FrontProperties.Diffuse.Color := clrBlue;
  114. SPLowRes.Material.FrontProperties.Diffuse.Color := clrYellow;
  115. end
  116. else
  117. begin
  118. SPHighRes.Material.FrontProperties.Diffuse.Color := clrGray80;
  119. SPMedRes.Material.FrontProperties.Diffuse.Color := clrGray80;
  120. SPLowRes.Material.FrontProperties.Diffuse.Color := clrGray80;
  121. end;
  122. end;
  123. procedure TFormMultiProxy.Timer1Timer(Sender: TObject);
  124. begin
  125. LabelFPS.Caption := Format('%.1f FPS', [GLSceneViewer1.FramesPerSecond]);
  126. GLSceneViewer1.ResetPerformanceMonitor;
  127. end;
  128. end.