fOdeTerrain.pas 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. unit fOdeTerrain;
  2. interface
  3. uses
  4. Winapi.Windows,
  5. System.SysUtils,
  6. System.UITypes,
  7. System.Classes,
  8. Vcl.Graphics,
  9. Vcl.Controls,
  10. Vcl.Forms,
  11. Vcl.Dialogs,
  12. Vcl.ExtCtrls,
  13. Vcl.StdCtrls,
  14. Vcl.Imaging.Jpeg,
  15. GLS.VectorTypes,
  16. GLS.Scene,
  17. GLS.TerrainRenderer,
  18. GLS.Objects,
  19. GLS.HeightData,
  20. GLS.Keyboard,
  21. GLS.Cadencer,
  22. GLS.Texture,
  23. GLS.HUDObjects,
  24. GLS.BitmapFont,
  25. GLS.SkyDome,
  26. GLS.SceneViewer,
  27. GLS.VectorGeometry,
  28. GLS.LensFlare,
  29. Physics.ODEManager,
  30. GLS.Navigator,
  31. GLS.GeomObjects,
  32. GLS.Color,
  33. GLS.Material,
  34. GLS.Coordinates,
  35. GLS.BaseClasses,
  36. GLS.State,
  37. GLS.Utils;
  38. type
  39. TFormOdeTerrain = class(TForm)
  40. GLSceneViewer1: TGLSceneViewer;
  41. GLBitmapHDS1: TGLBitmapHDS;
  42. GLScene1: TGLScene;
  43. GLCamera1: TGLCamera;
  44. TerrainRenderer1: TGLTerrainRenderer;
  45. Timer1: TTimer;
  46. GLCadencer1: TGLCadencer;
  47. GLMaterialLibrary1: TGLMaterialLibrary;
  48. BitmapFont1: TGLBitmapFont;
  49. HUDText1: TGLHUDText;
  50. SkyDome1: TGLSkyDome;
  51. SPMoon: TGLSprite;
  52. SPSun: TGLSprite;
  53. GLLensFlare: TGLLensFlare;
  54. GLDummyCube1: TGLDummyCube;
  55. GLODEManager1: TGLODEManager;
  56. GLNavigator1: TGLNavigator;
  57. ODEDrop: TGLDummyCube;
  58. GLUserInterface1: TGLUserInterface;
  59. ODEObjects: TGLDummyCube;
  60. GLLightSource1: TGLLightSource;
  61. ODERenderPoint: TGLRenderPoint;
  62. procedure Timer1Timer(Sender: TObject);
  63. procedure GLCadencer1Progress(Sender: TObject; const deltaTime,
  64. newTime: Double);
  65. procedure FormCreate(Sender: TObject);
  66. procedure FormKeyPress(Sender: TObject; var Key: Char);
  67. procedure GLSceneViewer1BeforeRender(Sender: TObject);
  68. public
  69. procedure DropODEObject(anElementClass : TGLODEElementClass);
  70. end;
  71. var
  72. FormOdeTerrain: TFormOdeTerrain;
  73. implementation
  74. {$R *.DFM}
  75. procedure TFormOdeTerrain.FormCreate(Sender: TObject);
  76. begin
  77. SetGLSceneMediaDir();
  78. // Set up the visuals
  79. GLBitmapHDS1.MaxPoolSize:=8*1024*1024;
  80. GLBitmapHDS1.Picture.LoadFromFile('terrain.bmp');
  81. GLMaterialLibrary1.Materials[0].Material.Texture.Image.LoadFromFile('snow512.jpg');
  82. GLMaterialLibrary1.Materials[1].Material.Texture.Image.LoadFromFile('detailmap.jpg');
  83. SPMoon.Material.Texture.Image.LoadFromFile('moon.bmp');
  84. SPSun.Material.Texture.Image.LoadFromFile('flare1.bmp');
  85. TerrainRenderer1.TilesPerTexture:=256/TerrainRenderer1.TileSize;
  86. BitmapFont1.Glyphs.LoadFromFile('darkgold_font.bmp');
  87. GLSceneViewer1.Buffer.BackgroundColor:=clWhite;
  88. GLNavigator1.TurnHorizontal(90);
  89. GLUserInterface1.MouseLookActivate;
  90. end;
  91. procedure TFormOdeTerrain.GLCadencer1Progress(Sender: TObject; const deltaTime,
  92. newTime: Double);
  93. var
  94. speed, interpolated_height : Single;
  95. begin
  96. // handle keypresses
  97. if IsKeyDown(VK_SHIFT) then
  98. speed:=50*deltaTime
  99. else speed:=10*deltaTime;
  100. with GLCamera1.Position do begin
  101. if IsKeyDown(VK_UP) then
  102. GLNavigator1.MoveForward(speed);
  103. if IsKeyDown(VK_DOWN) then
  104. GLNavigator1.MoveForward(-speed);
  105. if IsKeyDown(VK_LEFT) then
  106. GLNavigator1.StrafeHorizontal(-speed);
  107. if IsKeyDown(VK_RIGHT) then
  108. GLNavigator1.StrafeHorizontal(speed);
  109. if IsKeyDown(VK_PRIOR) then
  110. GLNavigator1.StrafeVertical(speed);
  111. if IsKeyDown(VK_NEXT) then
  112. GLNavigator1.StrafeVertical(-speed);
  113. if IsKeyDown(VK_ESCAPE) then Close;
  114. interpolated_height:=TerrainRenderer1.InterpolatedHeight(AsVector);
  115. if Z<interpolated_height+5 then
  116. Z:=interpolated_height+5;
  117. end;
  118. GLODEManager1.Step(deltaTime);
  119. GLUserInterface1.MouseUpdate;
  120. GLUserInterface1.MouseLook;
  121. end;
  122. procedure TFormOdeTerrain.Timer1Timer(Sender: TObject);
  123. begin
  124. HUDText1.Text:=Format('%.1f FPS - %d',
  125. [GLSceneViewer1.FramesPerSecond, TerrainRenderer1.LastTriangleCount]);
  126. GLSceneViewer1.ResetPerformanceMonitor;
  127. end;
  128. procedure TFormOdeTerrain.FormKeyPress(Sender: TObject; var Key: Char);
  129. begin
  130. case Key of
  131. 'w', 'W':
  132. with GLMaterialLibrary1.Materials[0].Material do
  133. begin
  134. if PolygonMode = pmLines then
  135. PolygonMode := pmFill
  136. else
  137. PolygonMode := pmLines;
  138. end;
  139. '+':
  140. if GLCamera1.DepthOfView < 2000 then
  141. begin
  142. GLCamera1.DepthOfView := GLCamera1.DepthOfView * 1.2;
  143. with GLSceneViewer1.Buffer.FogEnvironment do
  144. begin
  145. FogEnd := FogEnd * 1.2;
  146. FogStart := FogStart * 1.2;
  147. end;
  148. end;
  149. '-':
  150. if GLCamera1.DepthOfView > 300 then
  151. begin
  152. GLCamera1.DepthOfView := GLCamera1.DepthOfView / 1.2;
  153. with GLSceneViewer1.Buffer.FogEnvironment do
  154. begin
  155. FogEnd := FogEnd / 1.2;
  156. FogStart := FogStart / 1.2;
  157. end;
  158. end;
  159. '*':
  160. with TerrainRenderer1 do
  161. if CLODPrecision > 20 then
  162. CLODPrecision := Round(CLODPrecision * 0.8);
  163. '/':
  164. with TerrainRenderer1 do
  165. if CLODPrecision < 1000 then
  166. CLODPrecision := Round(CLODPrecision * 1.2);
  167. '8':
  168. with TerrainRenderer1 do
  169. if QualityDistance > 40 then
  170. QualityDistance := Round(QualityDistance * 0.8);
  171. '9':
  172. with TerrainRenderer1 do
  173. if QualityDistance < 1000 then
  174. QualityDistance := Round(QualityDistance * 1.2);
  175. 'n', 'N':
  176. with SkyDome1 do
  177. if Stars.Count = 0 then
  178. begin
  179. // turn on 'night' mode
  180. Bands[1].StopColor.AsWinColor := RGB(0, 0, 16);
  181. Bands[1].StartColor.AsWinColor := RGB(0, 0, 8);
  182. Bands[0].StopColor.AsWinColor := RGB(0, 0, 8);
  183. Bands[0].StartColor.AsWinColor := RGB(0, 0, 0);
  184. with Stars do
  185. begin
  186. AddRandomStars(700, clWhite, True); // many white stars
  187. AddRandomStars(100, RGB(255, 200, 200), True); // some redish ones
  188. AddRandomStars(100, RGB(200, 200, 255), True); // some blueish ones
  189. AddRandomStars(100, RGB(255, 255, 200), True);
  190. // some yellowish ones
  191. end;
  192. GLSceneViewer1.Buffer.BackgroundColor := clBlack;
  193. with GLSceneViewer1.Buffer.FogEnvironment do
  194. begin
  195. FogColor.AsWinColor := clBlack;
  196. FogStart := -FogStart; // Fog is used to make things darker
  197. end;
  198. SPMoon.Visible := True;
  199. SPSun.Visible := False;
  200. GLLensFlare.Visible := False;
  201. end;
  202. 'd', 'D':
  203. with SkyDome1 do
  204. if Stars.Count > 0 then
  205. begin
  206. // turn on 'day' mode
  207. Bands[1].StopColor.Color := clrNavy;
  208. Bands[1].StartColor.Color := clrBlue;
  209. Bands[0].StopColor.Color := clrBlue;
  210. Bands[0].StartColor.Color := clrWhite;
  211. Stars.Clear;
  212. GLSceneViewer1.Buffer.BackgroundColor := clWhite;
  213. with GLSceneViewer1.Buffer.FogEnvironment do
  214. begin
  215. FogColor.AsWinColor := clWhite;
  216. FogStart := -FogStart;
  217. end;
  218. GLSceneViewer1.Buffer.FogEnvironment.FogStart := 0;
  219. SPMoon.Visible := False;
  220. SPSun.Visible := True;
  221. end;
  222. 't':
  223. with SkyDome1 do
  224. begin
  225. if sdoTwinkle in Options then
  226. Options := Options - [sdoTwinkle]
  227. else
  228. Options := Options + [sdoTwinkle];
  229. end;
  230. 'l':
  231. with GLLensFlare do
  232. Visible := (not Visible) and SPSun.Visible;
  233. '1':
  234. DropODEObject(TGLODEElementSphere);
  235. '2':
  236. DropODEObject(TGLODEElementBox);
  237. '3':
  238. DropODEObject(TGLODEElementCapsule);
  239. '4':
  240. DropODEObject(TGLODEElementCylinder);
  241. // '5' : DropODEObject(TGLODEElementCone); CONE is currently unsupported
  242. end;
  243. Key := #0;
  244. end;
  245. procedure TFormOdeTerrain.GLSceneViewer1BeforeRender(Sender: TObject);
  246. begin
  247. GLLensFlare.PreRender(Sender as TGLSceneBuffer);
  248. end;
  249. procedure TFormOdeTerrain.DropODEObject(anElementClass : TGLODEElementClass);
  250. var
  251. dummy : TGLBaseSceneObject;
  252. dyn : TGLODEDynamic;
  253. begin
  254. dummy:=ODEObjects.AddNewChild(TGLDummyCube);
  255. dummy.Position.AsVector:=ODEDrop.AbsolutePosition;
  256. dyn:=TGLODEDynamic.Create(dummy.Behaviours);
  257. dyn.AddNewElement(anElementClass); // mrqzzz : AddNewElement must come *before* setting manager!
  258. dyn.Manager:=GLODEManager1;
  259. end;
  260. end.