123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- //---------------------------------------------------------------------------
- #include <vcl.h>
- #include <tchar.h>
- #pragma hdrstop
- #include "Unit1.h"
- //---------------------------------------------------------------------------
- #pragma package(smart_init)
- #pragma link "GLBaseClasses"
- #pragma link "GLCadencer"
- #pragma link "GLCoordinates"
- #pragma link "GLCrossPlatform"
- #pragma link "GLGeomObjects"
- #pragma link "GLObjects"
- #pragma link "GLScene"
- #pragma link "GLWin32Viewer"
- #pragma resource "*.dfm"
- TForm1 *Form1;
- //---------------------------------------------------------------------------
- __fastcall TForm1::TForm1(TComponent* Owner)
- : TForm(Owner)
- {
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::FormDestroy(TObject *Sender)
- {
- // Delete the queries
- TimerQuery->Free();
- OcclusionQuery->Free();
- bOcclusionQuery->Free();
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::GLCadencer1Progress(TObject *Sender, const double deltaTime,
- const double newTime)
- {
- // Move some of the scene objects around
- GLDummyCube1->Position->X = Sin(newTime);
- dcTestObjects->Turn(deltaTime * 50);
- dcTestObjects->Position->Z = 2 * Sin(newTime);
- GLDummyCube2->Position->X = - Sin(newTime);
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::GLSceneViewer1BeforeRender(TObject *Sender)
- {
- // Occlusion queries are supported by extensions with lower version of OpenGL.
- // To use them, you'd need to check if GL_NV_occlusion_query or GL_ARB_occlusion_query
- // extensions are present, and makes the appropriate calls to the functions/procedures
- // they provide.
- // in Delphi was: if (not TGLOcclusionQueryHandle.IsSupported) then
- if (!(GL_NV_occlusion_query || GL_ARB_occlusion_query))
- {
- MessageDlg("Requires hardware that supports occlusion queries to run",
- mtError, TMsgDlgButtons() << mbOK, 0);
- Close();
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::OGLBeginQueriesRender(TObject *Sender, TGLRenderContextInfo &rci)
- {
- // Generate the queries, if not already created
- if (!queriesCreated)
- {
- OcclusionQuery = new TGLOcclusionQueryHandle;
- bOcclusionQuery = new TGLBooleanOcclusionQueryHandle;
- TimerQuery = new TGLTimerQueryHandle;
- queriesCreated = true;
- }
- // Begin the timer + occlusion queries
- TimerQuery->BeginQuery();
- if (CheckBox1->Checked)
- bOcclusionQuery->BeginQuery();
- else
- OcclusionQuery->BeginQuery();
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::OGLEndQueriesRender(TObject *Sender, TGLRenderContextInfo &rci)
- {
- TGLQueryHandle *lQuery;
- // End the timer + occlusion queries
- if (CheckBox1->Checked)
- lQuery = bOcclusionQuery;
- else
- lQuery = OcclusionQuery;
- lQuery->EndQuery();
- TimerQuery->EndQuery();
- // Most of the frame rate is lost waiting for results to become available
- // + updating the captions every frame, but as this is a demo, we want to
- // see what is going on.
- while (! lQuery->IsResultAvailable()) ; // wait
- // would normally do something in this period before checking if
- // result is available
- samplesPassed = OcclusionQuery->PixelCount();
- while (! TimerQuery->IsResultAvailable()) ;// wait
- // would normally do something in this period before checking if
- // result is available
- timeTaken = TimerQuery->Time();
- // Use this line instead of the one above to use 64 bit timer, to allow
- // recording time periods more than a couple of seconds (requires Delphi 7+)
- // timeTaken := TimerQuery.QueryResultUInt64;
- switch (CheckBox1->Checked)
- {
- case true:
- Label3->Visible = ! lQuery->QueryResultBool(); break;
- case false:
- {
- Label3->Visible = (samplesPassed = 0);
- Label2->Caption = "Number of test pixels visible: " + IntToStr(samplesPassed);
- break;
- }
- default:
- ;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::Timer1Timer(TObject *Sender)
- {
- // Convert time taken from ns => ms & display
- if (timerQuerySupported)
- Label1->Caption = "Time taken: " + FloatToStr(timeTaken / 1000000) + " ms" ;
- else
- Label1->Caption = "Time query unavailable, requires hardware support";
- LabelFPS->Caption = GLSceneViewer1->FramesPerSecondText(0);
- GLSceneViewer1->ResetPerformanceMonitor();
- }
- //---------------------------------------------------------------------------
|