| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- unit fMultiProxyD;
- interface
- uses
- Winapi.OpenGL,
- System.SysUtils,
- System.Classes,
- System.Math,
- Vcl.Graphics,
- Vcl.Controls,
- Vcl.Forms,
- Vcl.Dialogs,
- Vcl.ExtCtrls,
- Vcl.StdCtrls,
- GLS.Cadencer,
- GLS.Scene,
- GLScene.VectorTypes,
- GLS.Objects,
- GLS.Particles,
- GLS.SceneViewer,
- GLS.Color,
- GLS.MultiProxy,
- GLS.Texture,
- GLS.Coordinates,
- GLS.BaseClasses,
- GLScene.VectorGeometry;
- type
- TFormMultiProxy = class(TForm)
- GLScene: TGLScene;
- GLSceneViewer1: TGLSceneViewer;
- GLCamera: TGLCamera;
- DCTarget: TGLDummyCube;
- DCReferences: TGLDummyCube;
- GLLightSource1: TGLLightSource;
- GLParticles: TGLParticles;
- SPHighRes: TGLSphere;
- SPMedRes: TGLSphere;
- SPLowRes: TGLSphere;
- GLCadencer: TGLCadencer;
- Timer1: TTimer;
- MPSphere: TGLMultiProxy;
- Panel1: TPanel;
- RBUseLODs: TRadioButton;
- RBHighRes: TRadioButton;
- CBColorize: TCheckBox;
- RBLowRes: TRadioButton;
- LabelFPS: TLabel;
- procedure FormCreate(Sender: TObject);
- procedure Timer1Timer(Sender: TObject);
- procedure MPSphereProgress(Sender: TObject;
- const deltaTime, newTime: Double);
- procedure RBUseLODsClick(Sender: TObject);
- public
- end;
- var
- FormMultiProxy: TFormMultiProxy;
- implementation
- {$R *.dfm}
- procedure TFormMultiProxy.FormCreate(Sender: TObject);
- var
- i: Integer;
- begin
- // adjust settings to their default
- RBUseLODsClick(Self);
- // replicate the multiproxy via a TGLParticles object
- for i := 0 to 35 do
- GLParticles.CreateParticle.TagFloat := DegToRad(i * 10);
- end;
- procedure TFormMultiProxy.MPSphereProgress(Sender: TObject;
- const deltaTime, newTime: Double);
- begin
- // this is invoked for each of our MultiProxys, it makes them loop an ellipse
- with (Sender as TGLBaseSceneObject) do
- begin
- Position.X := Sin(newTime + TagFloat) * 80 - 60;
- Position.Z := Cos(newTime + TagFloat) * 7;
- end;
- end;
- procedure TFormMultiProxy.RBUseLODsClick(Sender: TObject);
- begin
- // adjust LOD on/off (by adjusting base sphere's detail)
- if RBUseLODs.Checked then
- begin
- SPHighRes.Slices := 32;
- SPHighRes.Stacks := 32;
- SPMedRes.Slices := 16;
- SPMedRes.Stacks := 16;
- SPLowRes.Slices := 8;
- SPLowRes.Stacks := 8;
- end
- else if RBHighRes.Checked then
- begin
- SPHighRes.Slices := 32;
- SPHighRes.Stacks := 32;
- SPMedRes.Slices := 32;
- SPMedRes.Stacks := 32;
- SPLowRes.Slices := 32;
- SPLowRes.Stacks := 32;
- end
- else if RBLowRes.Checked then
- begin
- SPHighRes.Slices := 8;
- SPHighRes.Stacks := 8;
- SPMedRes.Slices := 8;
- SPMedRes.Stacks := 8;
- SPLowRes.Slices := 8;
- SPLowRes.Stacks := 8;
- end;
- // colorize the LODs, to make them clearly visible
- CBColorize.Enabled := RBUseLODs.Checked;
- if CBColorize.Checked and RBUseLODs.Checked then
- begin
- SPHighRes.Material.FrontProperties.Diffuse.Color := clrRed;
- SPMedRes.Material.FrontProperties.Diffuse.Color := clrBlue;
- SPLowRes.Material.FrontProperties.Diffuse.Color := clrYellow;
- end
- else
- begin
- SPHighRes.Material.FrontProperties.Diffuse.Color := clrGray80;
- SPMedRes.Material.FrontProperties.Diffuse.Color := clrGray80;
- SPLowRes.Material.FrontProperties.Diffuse.Color := clrGray80;
- end;
- end;
- procedure TFormMultiProxy.Timer1Timer(Sender: TObject);
- begin
- LabelFPS.Caption := Format('%.1f FPS', [GLSceneViewer1.FramesPerSecond]);
- GLSceneViewer1.ResetPerformanceMonitor;
- end;
- end.
|