123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- //---------------------------------------------------------------------------
- #include <vcl.h>
- #include <tchar.h>
- #pragma hdrstop
- #include "Unit1.h"
- //---------------------------------------------------------------------------
- #pragma package(smart_init)
- #pragma link "GLS.BaseClasses"
- #pragma link "GLS.BitmapFont"
- #pragma link "GLS.Cadencer"
- #pragma link "GLS.Coordinates"
- #pragma link "GLS.HeightData"
- #pragma link "GLS.HUDObjects"
- #pragma link "GLLensFlare"
- #pragma link "GLS.Material"
- #pragma link "GLS.Navigator"
- #pragma link "GLS.Objects"
- #pragma link "GLS.Scene"
- #pragma link "GLS.SkyDome"
- #pragma link "GLS.TerrainRenderer"
- #pragma link "GLS.SceneViewer"
- #pragma link "Physics.ODEManager"
- #pragma resource "*.dfm"
- TForm1 *Form1;
- //---------------------------------------------------------------------------
- __fastcall TForm1::TForm1(TComponent* Owner)
- : TForm(Owner)
- {
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::FormCreate(TObject *Sender)
- {
- SetGLSceneMediaDir();
- // Set up the visuals
- GLBitmapHDS1->MaxPoolSize = 8*1024*1024;
- GLBitmapHDS1->Picture->LoadFromFile("terrain.bmp");
- GLMaterialLibrary1->Materials->Items[0]->Material->Texture->Image->LoadFromFile("snow512.jpg");
- GLMaterialLibrary1->Materials->Items[1]->Material->Texture->Image->LoadFromFile("detailmap.jpg");
- SPMoon->Material->Texture->Image->LoadFromFile("moon.bmp");
- SPSun->Material->Texture->Image->LoadFromFile("flare1.bmp");
- TerrainRenderer1->TilesPerTexture = (float)256/TerrainRenderer1->TileSize;
- BitmapFont1->Glyphs->LoadFromFile("darkgold_font.bmp");
- GLSceneViewer1->Buffer->BackgroundColor = clWhite;
- GLNavigator1->TurnHorizontal(90);
- GLUserInterface1->MouseLookActivate();
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::GLCadencer1Progress(TObject *Sender, const double deltaTime,
- const double newTime)
- {
- float speed, interpolated_height;
- // handle keypresses
- if (IsKeyDown(VK_SHIFT))
- speed = 50*deltaTime;
- else
- speed = 10*deltaTime;
- if (IsKeyDown(VK_UP))
- GLNavigator1->MoveForward(speed);
- if (IsKeyDown(VK_DOWN))
- GLNavigator1->MoveForward(-speed);
- if (IsKeyDown(VK_LEFT))
- GLNavigator1->StrafeHorizontal(-speed);
- if (IsKeyDown(VK_RIGHT))
- GLNavigator1->StrafeHorizontal(speed);
- if (IsKeyDown(VK_PRIOR))
- GLNavigator1->StrafeVertical(speed);
- if (IsKeyDown(VK_NEXT))
- GLNavigator1->StrafeVertical(-speed);
- if (IsKeyDown(VK_ESCAPE))
- Close();
- interpolated_height =
- TerrainRenderer1->InterpolatedHeight(GLCamera1->Position->AsVector);
- if (GLCamera1->Position->Z < interpolated_height+5)
- GLCamera1->Position->Z = interpolated_height+5;
- GLODEManager1->Step(deltaTime);
- GLUserInterface1->MouseUpdate();
- GLUserInterface1->MouseLook();
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::Timer1Timer(TObject *Sender)
- {
- HUDText1->Text = Format("%.1f FPS - %d", ARRAYOFCONST
- ((GLSceneViewer1->FramesPerSecond(),
- TerrainRenderer1->LastTriangleCount)));
- GLSceneViewer1->ResetPerformanceMonitor();
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::FormKeyPress(TObject *Sender, System::WideChar &Key)
- {
- TGLMaterial *fp;
- TGLFogEnvironment *fe;
- TGLBaseSceneObject *dummy;
- TGLODEDynamic *dyn;
- TGLODEElementClass *anElementClass;
- TGLODEElementSphere *elSphere;
- TGLODEElementBox *elBox;
- TGLODEElementCapsule *elCapsule;
- TGLODEElementCylinder *elCylinder;
- dummy = ODEObjects->AddNewChild(__classid(TGLDummyCube));
- dummy->Position->AsVector = ODEDrop->AbsolutePosition;
- dyn = new TGLODEDynamic(dummy->Behaviours);
- switch (Key)
- {
- case 'w':
- case 'W':
- fp = GLMaterialLibrary1->Materials->Items[0]->Material;
- if(fp->PolygonMode == pmLines)
- fp->PolygonMode = pmFill;
- else
- fp->PolygonMode = pmLines;
- break;
- case '+':
- if(GLCamera1->DepthOfView < 2000)
- {
- GLCamera1->DepthOfView = GLCamera1->DepthOfView * 1.2;
- fe = GLSceneViewer1->Buffer->FogEnvironment;
- fe->FogEnd = fe->FogEnd * 1.2;
- fe->FogStart = fe->FogStart * 1.2;
- }
- break;
- case '-':
- if(GLCamera1->DepthOfView > 300)
- {
- GLCamera1->DepthOfView = GLCamera1->DepthOfView / 1.2;
- fe = GLSceneViewer1->Buffer->FogEnvironment;
- fe->FogEnd = fe->FogEnd / 1.2;
- fe->FogStart = fe->FogStart / 1.2;
- }
- break;
- case '*':
- if(TerrainRenderer1->CLODPrecision > 20)
- TerrainRenderer1->CLODPrecision =
- RoundInt(TerrainRenderer1->CLODPrecision * 0.8);
- break;
- case '/':
- if(TerrainRenderer1->CLODPrecision < 1000)
- TerrainRenderer1->CLODPrecision =
- RoundInt(TerrainRenderer1->CLODPrecision * 1.2);
- break;
- case '8':
- if(TerrainRenderer1->QualityDistance > 40)
- TerrainRenderer1->QualityDistance =
- RoundInt(TerrainRenderer1->QualityDistance * 0.8);
- break;
- case '9':
- if(TerrainRenderer1->QualityDistance < 1000)
- TerrainRenderer1->QualityDistance =
- RoundInt(TerrainRenderer1->QualityDistance * 1.2);
- break;
- case 'n':
- case 'N':
- if(SkyDome1->Stars->Count == 0)
- {
- // turn on 'night' mode
- SkyDome1->Bands->Items[1]->StopColor->AsWinColor = clNavy; //(Graphics::TColor) RGB(0, 0, 16);
- SkyDome1->Bands->Items[1]->StartColor->AsWinColor = clBlue; //(Graphics::TColor) RGB(0, 0, 8);
- SkyDome1->Bands->Items[0]->StopColor->AsWinColor = clBlue; //(Graphics::TColor) RGB(0, 0, 8);
- SkyDome1->Bands->Items[0]->StartColor->AsWinColor = clWhite; //(Graphics::TColor) RGB(0, 0, 0);
- SkyDome1->Stars->AddRandomStars(700, clWhite, True); // many white stars
- SkyDome1->Stars->AddRandomStars(100, (Graphics::TColor) RGB(255, 200, 200), True); // some redish ones
- SkyDome1->Stars->AddRandomStars(100, (Graphics::TColor) RGB(200, 200, 255), True); // some blueish ones
- SkyDome1->Stars->AddRandomStars(100, (Graphics::TColor) RGB(255, 255, 200), True); // some yellowish ones
- GLSceneViewer1->Buffer->BackgroundColor = Graphics::clBlack;
- fe = GLSceneViewer1->Buffer->FogEnvironment;
- fe->FogColor->AsWinColor = Graphics::clBlack;
- fe->FogStart = -fe->FogStart; // Fog is used to make things darker
- SPMoon->Visible = True;
- SPSun->Visible = False;
- GLLensFlare->Visible = False;
- }
- break;
- case 'd':
- case 'D':
- if(SkyDome1->Stars->Count > 0)
- {
- // turn on 'day' mode
- SkyDome1->Bands->Items[1]->StopColor->Color = clrNavy;
- SkyDome1->Bands->Items[1]->StartColor->Color = clrBlue;
- SkyDome1->Bands->Items[0]->StopColor->Color = clrBlue;
- SkyDome1->Bands->Items[0]->StartColor->Color = clrWhite;
- SkyDome1->Stars->Clear();
- GLSceneViewer1->Buffer->BackgroundColor = clWhite;
- fe = GLSceneViewer1->Buffer->FogEnvironment;
- fe->FogColor->AsWinColor = clWhite;
- fe->FogStart = -fe->FogStart;
- GLSceneViewer1->Buffer->FogEnvironment->FogStart = 0;
- SPMoon->Visible = False;
- SPSun->Visible = True;
- }
- break;
- case 't':
- if(SkyDome1->Options.Contains(sdoTwinkle))
- SkyDome1->Options = SkyDome1->Options << sdoTwinkle;
- else
- SkyDome1->Options = SkyDome1->Options >> sdoTwinkle;
- break;
- case 'l': GLLensFlare->Visible = (!GLLensFlare->Visible) && SPSun->Visible;
- break;
- case '1' :
- elSphere = (TGLODEElementSphere *) dyn->AddNewElement(__classid(TGLODEElementSphere));
- break;
- case '2' :
- elBox = (TGLODEElementBox *) dyn->AddNewElement(__classid(TGLODEElementBox));
- break;
- case '3' :
- elCapsule = (TGLODEElementCapsule *) dyn->AddNewElement(__classid(TGLODEElementCapsule));
- break;
- case '4' :
- elCylinder = (TGLODEElementCylinder *) dyn->AddNewElement(__classid(TGLODEElementCylinder));
- break;
- }
- dyn->Manager = GLODEManager1;
- Key = '\0';
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::GLSceneViewer1BeforeRender(TObject *Sender)
- {
- GLLensFlare->PreRender((TGLSceneBuffer *) Sender);
- }
- //---------------------------------------------------------------------------
|