fImposter.pas 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. unit fImposter;
  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.StdCtrls,
  12. Vcl.ExtCtrls,
  13. GLS.Scene,
  14. GLS.Context,
  15. GLS.VectorTypes,
  16. GLS.GeomObjects,
  17. GLS.Objects,
  18. GLS.SceneViewer,
  19. GLS.VectorGeometry,
  20. GLS.Texture,
  21. GLS.Cadencer,
  22. GLS.Imposter,
  23. GLS.SkyDome,
  24. GLS.Coordinates,
  25. GLS.BaseClasses,
  26. GLS.RenderContextInfo;
  27. type
  28. TFormImposter = class(TForm)
  29. GLScene1: TGLScene;
  30. GLSceneViewer1: TGLSceneViewer;
  31. GLCamera1: TGLCamera;
  32. GLTeapot1: TGLTeapot;
  33. GLLightSource1: TGLLightSource;
  34. GLDirectOpenGL1: TGLDirectOpenGL;
  35. GLCadencer1: TGLCadencer;
  36. Timer1: TTimer;
  37. GLSkyDome1: TGLSkyDome;
  38. GLDummyCube1: TGLDummyCube;
  39. Panel1: TPanel;
  40. LabelTexSize: TLabel;
  41. CBShowTeapot: TCheckBox;
  42. CBShowImposter: TCheckBox;
  43. CBSampleSize: TComboBox;
  44. Label2: TLabel;
  45. LabelFPS: TLabel;
  46. procedure GLDirectOpenGL1Render(Sender: TObject;
  47. var rci: TGLRenderContextInfo);
  48. procedure GLCadencer1Progress(Sender: TObject;
  49. const deltaTime, newTime: Double);
  50. procedure FormCreate(Sender: TObject);
  51. procedure Timer1Timer(Sender: TObject);
  52. procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  53. X, Y: Integer);
  54. procedure CBSampleSizeChange(Sender: TObject);
  55. procedure CBShowImposterClick(Sender: TObject);
  56. procedure CBShowTeapotClick(Sender: TObject);
  57. private
  58. public
  59. impBuilder: TGLStaticImposterBuilder;
  60. renderPoint: TGLRenderPoint;
  61. mx, my: Integer;
  62. end;
  63. var
  64. FormImposter: TFormImposter;
  65. implementation
  66. {$R *.dfm}
  67. procedure TFormImposter.FormCreate(Sender: TObject);
  68. // var
  69. // x, y : Integer;
  70. begin
  71. renderPoint := TGLRenderPoint(GLDummyCube1.AddNewChild(TGLRenderPoint));
  72. impBuilder := TGLStaticImposterBuilder.Create(Self);
  73. impBuilder.SampleSize := 64;
  74. impBuilder.SamplingRatioBias := 1.3;
  75. impBuilder.Coronas.Items[0].Samples := 32;
  76. impBuilder.Coronas.Add(15, 24);
  77. impBuilder.Coronas.Add(30, 24);
  78. impBuilder.Coronas.Add(45, 16);
  79. impBuilder.Coronas.Add(60, 16);
  80. impBuilder.Coronas.Add(85, 16);
  81. impBuilder.renderPoint := renderPoint;
  82. impBuilder.RequestImposterFor(GLTeapot1);
  83. end;
  84. procedure TFormImposter.GLDirectOpenGL1Render(Sender: TObject;
  85. var rci: TGLRenderContextInfo);
  86. var
  87. camPos, pos: TGLVector;
  88. imp: TImposter;
  89. X, Y: Integer;
  90. begin
  91. imp := impBuilder.ImposterFor(GLTeapot1);
  92. if (imp = nil) or (imp.Texture.Handle = 0) then
  93. Exit;
  94. imp.BeginRender(rci);
  95. for X := -30 to 30 do
  96. for Y := -30 to 30 do
  97. begin
  98. MakePoint(pos, X * 5, 0, Y * 4);
  99. camPos := VectorSubtract(rci.cameraPosition, pos);
  100. imp.Render(rci, pos, camPos, 1);
  101. end;
  102. imp.EndRender(rci);
  103. end;
  104. procedure TFormImposter.GLCadencer1Progress(Sender: TObject;
  105. const deltaTime, newTime: Double);
  106. begin
  107. GLSceneViewer1.Invalidate;
  108. end;
  109. procedure TFormImposter.Timer1Timer(Sender: TObject);
  110. begin
  111. LabelFPS.Caption := GLSceneViewer1.FramesPerSecondText;
  112. if CBShowImposter.Checked then
  113. LabelFPS.Caption := LabelFPS.Caption + ' - 3721 imposters';
  114. GLSceneViewer1.ResetPerformanceMonitor;
  115. LabelTexSize.Caption := Format('%d x %d - %.1f%%', [impBuilder.TextureSize.X,
  116. impBuilder.TextureSize.Y, impBuilder.TextureFillRatio * 100]);
  117. end;
  118. procedure TFormImposter.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  119. X, Y: Integer);
  120. begin
  121. if ssLeft in Shift then
  122. begin
  123. GLCamera1.MoveAroundTarget(my - Y, mx - X);
  124. end;
  125. mx := X;
  126. my := Y;
  127. end;
  128. procedure TFormImposter.CBSampleSizeChange(Sender: TObject);
  129. var
  130. s: Integer;
  131. begin
  132. s := StrToInt(CBSampleSize.Text);
  133. if (GLSceneViewer1.Width >= s) and (GLSceneViewer1.Height >= s) then
  134. impBuilder.SampleSize := s
  135. else
  136. begin
  137. ShowMessage('Viewer is too small to allow rendering the imposter samples');
  138. end;
  139. end;
  140. procedure TFormImposter.CBShowImposterClick(Sender: TObject);
  141. begin
  142. GLDirectOpenGL1.Visible := CBShowImposter.Checked;
  143. end;
  144. procedure TFormImposter.CBShowTeapotClick(Sender: TObject);
  145. begin
  146. GLTeapot1.Visible := CBShowTeapot.Checked;
  147. end;
  148. end.