Unit1.cpp 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #include <tchar.h>
  4. #pragma hdrstop
  5. #include "Unit1.h"
  6. //---------------------------------------------------------------------------
  7. #pragma package(smart_init)
  8. #pragma link "GLBaseClasses"
  9. #pragma link "GLBitmapFont"
  10. #pragma link "GLCadencer"
  11. #pragma link "GLCoordinates"
  12. #pragma link "GLCrossPlatform"
  13. #pragma link "GLHeightData"
  14. #pragma link "GLHUDObjects"
  15. #pragma link "GLLensFlare"
  16. #pragma link "GLMaterial"
  17. #pragma link "GLNavigator"
  18. #pragma link "GLObjects"
  19. #pragma link "GLODECustomColliders"
  20. #pragma link "GLODEManager"
  21. #pragma link "GLScene"
  22. #pragma link "GLSkydome"
  23. #pragma link "GLTerrainRenderer"
  24. #pragma link "GLWin32Viewer"
  25. #pragma resource "*.dfm"
  26. TForm1 *Form1;
  27. //---------------------------------------------------------------------------
  28. __fastcall TForm1::TForm1(TComponent* Owner)
  29. : TForm(Owner)
  30. {
  31. }
  32. //---------------------------------------------------------------------------
  33. void __fastcall TForm1::FormCreate(TObject *Sender)
  34. {
  35. SetGLSceneMediaDir();
  36. // Set up the visuals
  37. GLBitmapHDS1->MaxPoolSize = 8*1024*1024;
  38. GLBitmapHDS1->Picture->LoadFromFile("terrain.bmp");
  39. GLMaterialLibrary1->Materials->Items[0]->Material->Texture->Image->LoadFromFile("snow512.jpg");
  40. GLMaterialLibrary1->Materials->Items[1]->Material->Texture->Image->LoadFromFile("detailmap.jpg");
  41. SPMoon->Material->Texture->Image->LoadFromFile("moon.bmp");
  42. SPSun->Material->Texture->Image->LoadFromFile("flare1.bmp");
  43. TerrainRenderer1->TilesPerTexture = (float)256/TerrainRenderer1->TileSize;
  44. BitmapFont1->Glyphs->LoadFromFile("darkgold_font.bmp");
  45. GLSceneViewer1->Buffer->BackgroundColor = clWhite;
  46. GLNavigator1->TurnHorizontal(90);
  47. GLUserInterface1->MouseLookActivate();
  48. }
  49. //---------------------------------------------------------------------------
  50. void __fastcall TForm1::GLCadencer1Progress(TObject *Sender, const double deltaTime,
  51. const double newTime)
  52. {
  53. float speed, interpolated_height;
  54. // handle keypresses
  55. if (IsKeyDown(VK_SHIFT))
  56. speed = 50*deltaTime;
  57. else
  58. speed = 10*deltaTime;
  59. if (IsKeyDown(VK_UP))
  60. GLNavigator1->MoveForward(speed);
  61. if (IsKeyDown(VK_DOWN))
  62. GLNavigator1->MoveForward(-speed);
  63. if (IsKeyDown(VK_LEFT))
  64. GLNavigator1->StrafeHorizontal(-speed);
  65. if (IsKeyDown(VK_RIGHT))
  66. GLNavigator1->StrafeHorizontal(speed);
  67. if (IsKeyDown(VK_PRIOR))
  68. GLNavigator1->StrafeVertical(speed);
  69. if (IsKeyDown(VK_NEXT))
  70. GLNavigator1->StrafeVertical(-speed);
  71. if (IsKeyDown(VK_ESCAPE))
  72. Close();
  73. interpolated_height =
  74. TerrainRenderer1->InterpolatedHeight(GLCamera1->Position->AsVector);
  75. if (GLCamera1->Position->Z < interpolated_height+5)
  76. GLCamera1->Position->Z = interpolated_height+5;
  77. GLODEManager1->Step(deltaTime);
  78. GLUserInterface1->MouseUpdate();
  79. GLUserInterface1->MouseLook();
  80. }
  81. //---------------------------------------------------------------------------
  82. void __fastcall TForm1::Timer1Timer(TObject *Sender)
  83. {
  84. HUDText1->Text = Format("%.1f FPS - %d", ARRAYOFCONST
  85. ((GLSceneViewer1->FramesPerSecond(),
  86. TerrainRenderer1->LastTriangleCount)));
  87. GLSceneViewer1->ResetPerformanceMonitor();
  88. }
  89. //---------------------------------------------------------------------------
  90. void __fastcall TForm1::FormKeyPress(TObject *Sender, System::WideChar &Key)
  91. {
  92. TGLMaterial *fp;
  93. TGLFogEnvironment *fe;
  94. TGLBaseSceneObject *dummy;
  95. TGLODEDynamic *dyn;
  96. TODEElementClass *anElementClass;
  97. TODEElementSphere *elSphere;
  98. TODEElementBox *elBox;
  99. TODEElementCapsule *elCapsule;
  100. TODEElementCylinder *elCylinder;
  101. dummy = ODEObjects->AddNewChild(__classid(TGLDummyCube));
  102. dummy->Position->AsVector = ODEDrop->AbsolutePosition;
  103. dyn = new TGLODEDynamic(dummy->Behaviours);
  104. switch (Key)
  105. {
  106. case 'w':
  107. case 'W':
  108. fp = GLMaterialLibrary1->Materials->Items[0]->Material;
  109. if(fp->PolygonMode == pmLines)
  110. fp->PolygonMode = pmFill;
  111. else
  112. fp->PolygonMode = pmLines;
  113. break;
  114. case '+':
  115. if(GLCamera1->DepthOfView < 2000)
  116. {
  117. GLCamera1->DepthOfView = GLCamera1->DepthOfView * 1.2;
  118. fe = GLSceneViewer1->Buffer->FogEnvironment;
  119. fe->FogEnd = fe->FogEnd * 1.2;
  120. fe->FogStart = fe->FogStart * 1.2;
  121. }
  122. break;
  123. case '-':
  124. if(GLCamera1->DepthOfView > 300)
  125. {
  126. GLCamera1->DepthOfView = GLCamera1->DepthOfView / 1.2;
  127. fe = GLSceneViewer1->Buffer->FogEnvironment;
  128. fe->FogEnd = fe->FogEnd / 1.2;
  129. fe->FogStart = fe->FogStart / 1.2;
  130. }
  131. break;
  132. case '*':
  133. if(TerrainRenderer1->CLODPrecision > 20)
  134. TerrainRenderer1->CLODPrecision =
  135. Round(TerrainRenderer1->CLODPrecision * 0.8);
  136. break;
  137. case '/':
  138. if(TerrainRenderer1->CLODPrecision < 1000)
  139. TerrainRenderer1->CLODPrecision =
  140. Round(TerrainRenderer1->CLODPrecision * 1.2);
  141. break;
  142. case '8':
  143. if(TerrainRenderer1->QualityDistance > 40)
  144. TerrainRenderer1->QualityDistance =
  145. Round(TerrainRenderer1->QualityDistance * 0.8);
  146. break;
  147. case '9':
  148. if(TerrainRenderer1->QualityDistance < 1000)
  149. TerrainRenderer1->QualityDistance =
  150. Round(TerrainRenderer1->QualityDistance * 1.2);
  151. break;
  152. case 'n':
  153. case 'N':
  154. if(SkyDome1->Stars->Count == 0)
  155. {
  156. // turn on 'night' mode
  157. SkyDome1->Bands->Items[1]->StopColor->AsWinColor = clNavy; //(Graphics::TColor) RGB(0, 0, 16);
  158. SkyDome1->Bands->Items[1]->StartColor->AsWinColor = clBlue; //(Graphics::TColor) RGB(0, 0, 8);
  159. SkyDome1->Bands->Items[0]->StopColor->AsWinColor = clBlue; //(Graphics::TColor) RGB(0, 0, 8);
  160. SkyDome1->Bands->Items[0]->StartColor->AsWinColor = clWhite; //(Graphics::TColor) RGB(0, 0, 0);
  161. SkyDome1->Stars->AddRandomStars(700, clWhite, True); // many white stars
  162. SkyDome1->Stars->AddRandomStars(100, (Graphics::TColor) RGB(255, 200, 200), True); // some redish ones
  163. SkyDome1->Stars->AddRandomStars(100, (Graphics::TColor) RGB(200, 200, 255), True); // some blueish ones
  164. SkyDome1->Stars->AddRandomStars(100, (Graphics::TColor) RGB(255, 255, 200), True); // some yellowish ones
  165. GLSceneViewer1->Buffer->BackgroundColor = Graphics::clBlack;
  166. fe = GLSceneViewer1->Buffer->FogEnvironment;
  167. fe->FogColor->AsWinColor = Graphics::clBlack;
  168. fe->FogStart = -fe->FogStart; // Fog is used to make things darker
  169. SPMoon->Visible = True;
  170. SPSun->Visible = False;
  171. GLLensFlare->Visible = False;
  172. }
  173. break;
  174. case 'd':
  175. case 'D':
  176. if(SkyDome1->Stars->Count > 0)
  177. {
  178. // turn on 'day' mode
  179. SkyDome1->Bands->Items[1]->StopColor->Color = clrNavy;
  180. SkyDome1->Bands->Items[1]->StartColor->Color = clrBlue;
  181. SkyDome1->Bands->Items[0]->StopColor->Color = clrBlue;
  182. SkyDome1->Bands->Items[0]->StartColor->Color = clrWhite;
  183. SkyDome1->Stars->Clear();
  184. GLSceneViewer1->Buffer->BackgroundColor = clWhite;
  185. fe = GLSceneViewer1->Buffer->FogEnvironment;
  186. fe->FogColor->AsWinColor = clWhite;
  187. fe->FogStart = -fe->FogStart;
  188. GLSceneViewer1->Buffer->FogEnvironment->FogStart = 0;
  189. SPMoon->Visible = False;
  190. SPSun->Visible = True;
  191. }
  192. break;
  193. case 't':
  194. if(SkyDome1->Options.Contains(sdoTwinkle))
  195. SkyDome1->Options = SkyDome1->Options << sdoTwinkle;
  196. else
  197. SkyDome1->Options = SkyDome1->Options >> sdoTwinkle;
  198. break;
  199. case 'l': GLLensFlare->Visible = (!GLLensFlare->Visible) && SPSun->Visible;
  200. break;
  201. case '1' :
  202. elSphere = (TODEElementSphere *) dyn->AddNewElement(__classid(TODEElementSphere));
  203. break;
  204. case '2' :
  205. elBox = (TODEElementBox *) dyn->AddNewElement(__classid(TODEElementBox));
  206. break;
  207. case '3' :
  208. elCapsule = (TODEElementCapsule *) dyn->AddNewElement(__classid(TODEElementCapsule));
  209. break;
  210. case '4' :
  211. elCylinder = (TODEElementCylinder *) dyn->AddNewElement(__classid(TODEElementCylinder));
  212. break;
  213. }
  214. dyn->Manager = GLODEManager1;
  215. Key = '\0';
  216. }
  217. //---------------------------------------------------------------------------
  218. void __fastcall TForm1::GLSceneViewer1BeforeRender(TObject *Sender)
  219. {
  220. GLLensFlare->PreRender((TGLSceneBuffer *) Sender);
  221. }
  222. //---------------------------------------------------------------------------