Unit1.cpp 8.2 KB

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