| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- // ---------------------------------------------------------------------------
- #include <vcl.h>
- #pragma hdrstop
- #include "fShadowVolumesC.h"
- // ---------------------------------------------------------------------------
- #pragma package(smart_init)
- #pragma link "GLS.FileSMD"
- #pragma link "GLS.SimpleNavigation"
- #pragma resource "*.dfm"
- TForm1 *Form1;
- // ---------------------------------------------------------------------------
- __fastcall TForm1::TForm1(TComponent * Owner) : TForm(Owner) {
- const float cSpacing = 1, cRadius = 0.3;
- const int cNb = 1;
- int x, y, z;
- TGLSphere *sphere;
- TFileName Path = GetCurrentAssetPath();
- SetCurrentDir(Path + "\\modelext");
- // Dynamically construct an array of spheres, and make them shadow casters
- // Note that as the spheres are children of the shadowvolume component,
- // they are thus also shadow receivers. If they were created as child of
- // another object (not under the shadow volume), they would not receive
- // shadows (which can sometimes be interesting).
- for (x = -cNb; x <= cNb; x++)
- for (y = -cNb; y <= cNb; y++)
- for (z = -cNb; z <= cNb; z++)
- if ((x && y && z) != 0) {
- sphere = (TGLSphere*) DCSpheres->AddNewChild
- (__classid(TGLSphere));
- sphere->Position->SetPoint(x * cSpacing, y * cSpacing,
- z * cSpacing);
- sphere->Radius = cRadius;
- GLShadowVolume->Occluders->AddCaster(sphere, 0,
- scmParentVisible);
- }
- DCSpheres->MoveTo(GLShadowVolume);
- GLFreeForm->LoadFromFile("trinityrage.smd");
- GLFreeForm->BuildSilhouetteConnectivityData();
- GLShadowVolume->Occluders->AddCaster(GLFreeForm, 0, scmRecursivelyVisible);
- ScrollBar_ShadowResolutionChange(NULL);
- }
- // ---------------------------------------------------------------------------
- void __fastcall TForm1::GLCadencer1Progress(TObject * Sender,
- const double deltaTime, const double newTime) {
- DCLight2->TurnAngle = newTime * 45;
- DCLight3->RollAngle = newTime * 50;
- GLSceneViewer->Invalidate();
- }
- // ---------------------------------------------------------------------------
- void __fastcall TForm1::CBShowVolumesClick(TObject * Sender) {
- if (CBShowVolumes->Checked)
- GLShadowVolume->Options = GLShadowVolume->Options << svoShowVolumes;
- else
- GLShadowVolume->Options = GLShadowVolume->Options >> svoShowVolumes;
- }
- // ---------------------------------------------------------------------------
- void __fastcall TForm1::RBZFailClick(TObject * Sender) {
- // this event handles all the radio buttons
- if (RBDarkening->Checked)
- GLShadowVolume->Mode = svmDarkening;
- else if (RBNoShadows->Checked)
- GLShadowVolume->Mode = svmOff;
- else {
- GLShadowVolume->Mode = svmAccurate;
- if (RBZFail->Checked)
- GLShadowVolume->Capping = svcAlways;
- else
- GLShadowVolume->Capping = svcNever;
- }
- }
- // ---------------------------------------------------------------------------
- void __fastcall TForm1::GLSceneViewerMouseDown(TObject * Sender,
- TMouseButton Button, TShiftState Shift, int X, int Y) {
- mx = X;
- my = Y;
- }
- // ---------------------------------------------------------------------------
- void __fastcall TForm1::GLSceneViewerMouseMove(TObject * Sender,
- TShiftState Shift, int X, int Y) {
- if (Shift.Contains(ssLeft)) {
- GLCamera->MoveAroundTarget((float)(my - Y) * 0.5,
- (float)(mx - X) * 0.5);
- GLCadencer1->Progress();
- }
- else if (Shift.Contains(ssRight)) {
- DCLight1Turn->Turn((float)(mx - X) * 0.5);
- DCLight1Pitch->Pitch((float)(my - Y) * 0.5);
- GLLightSource1->TransformationChanged();
- GLCadencer1->Progress();
- }
- mx = X;
- my = Y;
- }
- // ---------------------------------------------------------------------------
- void __fastcall TForm1::Timer1Timer(TObject * Sender) {
- LabelFPS->Caption = GLSceneViewer->FramesPerSecondText(1);
- GLSceneViewer->ResetPerformanceMonitor();
- }
- // ---------------------------------------------------------------------------
- void __fastcall TForm1::FormResize(TObject * Sender) {
- GLCamera->SceneScale = GLSceneViewer->Width / 450;
- }
- // ---------------------------------------------------------------------------
- void __fastcall TForm1::CBMainLightClick(TObject * Sender) {
- GLLightSource1->Shining = CBMainLight->Checked;
- }
- // ---------------------------------------------------------------------------
- void __fastcall TForm1::CBBlueLightClick(TObject * Sender) {
- GLLightSource2->Shining = CBBlueLight->Checked;
- }
- // ---------------------------------------------------------------------------
- void __fastcall TForm1::CBRedLightClick(TObject * Sender) {
- GLLightSource3->Shining = CBRedLight->Checked;
- }
- // ---------------------------------------------------------------------------
- void __fastcall TForm1::ScrollBar_ShadowResolutionChange(TObject * Sender) {
- GLSphere_Shadow->Stacks = ScrollBar_ShadowResolution->Position;
- GLSphere_Shadow->Slices = ScrollBar_ShadowResolution->Position;
- GLShadowVolume->FlushSilhouetteCache();
- }
- // ---------------------------------------------------------------------------
- void __fastcall TForm1::Button_GenerateSilhouetteClick(TObject * Sender) {
- TGLSilhouetteParameters silhouetteParameters;
- TGLSilhouette *Silhouette;
- int i;
- TGLSceneObject *Target = GLBigSphere;
- silhouetteParameters.CappingRequired = false;
- SetVector(silhouetteParameters.SeenFrom,
- GLLines1->AbsoluteToLocal(GLCamera->AbsolutePosition));
- silhouetteParameters.Style = ssOmni;
- Silhouette = Target->GenerateSilhouette(silhouetteParameters);
- GLLines1->Nodes->Clear();
- for (i = 0; i <= Silhouette->Indices->Count - 1; i++)
- GLLines1->Nodes->AddNode
- (GLLines1->AbsoluteToLocal(Target->LocalToAbsolute
- (Silhouette->Vertices->Items[Silhouette->Indices->Items[i]])));
- delete Silhouette;
- }
- // ---------------------------------------------------------------------------
|