fOdeTerrainD.pas 8.2 KB

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