123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- //---------------------------------------------------------------------------
- #include <vcl.h>
- #include <tchar.h>
- #pragma hdrstop
- #include "Unit1.h"
- //---------------------------------------------------------------------------
- #pragma package(smart_init)
- #pragma link "GLS.BaseClasses"
- #pragma link "GLS.Collision"
- #pragma link "GLS.Coordinates"
- #pragma link "GLS.Objects"
- #pragma link "GLS.Scene"
- #pragma link "GLS.SpaceText"
- #pragma link "GLS.VectorFileObjects"
- #pragma link "GLS.SceneViewer"
- #pragma link "GLS.File3DS"
- #pragma resource "*.dfm"
- TForm1 *Form1;
- // const int cbmFaces = 5;
- const String
- StringNames[] = {"Point","Sphere","Ellipsoid","Cube","Faces"};
- //---------------------------------------------------------------------------
- __fastcall TForm1::TForm1(TComponent* Owner)
- : TForm(Owner)
- {
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::FormCreate(TObject *Sender)
- {
- int i;
- SetGLSceneMediaDir();
- TeaPot1->LoadFromFile("TeaPot.3ds");
- TeaPot1->BuildOctree();
- TeaPot2->LoadFromFile("TeaPot.3ds");
- TeaPot2->BuildOctree();
- // rgObjectsClick(nil);
- //Fill StringGrid1 with current state of collisions
- for (i=0; i < cbmFaces; i++)
- {
- StringGrid1->Cells[0][i+1] = StringNames[i];
- StringGrid1->Cells[i+1][0] = StringNames[i];
- }
- //point
- StringGrid1->Cells[1][1] = "complete"; //Point-Point
- StringGrid1->Cells[1][2] = "complete"; //Sphere-Point
- StringGrid1->Cells[1][3] = "complete"; //Ellipsoid-Point
- StringGrid1->Cells[1][4] = "complete"; //Cube-Point
- StringGrid1->Cells[1][5] = "Cube-Point"; //Faces-Point
- //sphere
- StringGrid1->Cells[2][1] = "complete"; //Point-Sphere
- StringGrid1->Cells[2][2] = "complete"; //Sphere-Sphere
- StringGrid1->Cells[2][3] = "complete"; //Ellipsoid-Sphere
- StringGrid1->Cells[2][4] = "complete"; //Cube-Sphere
- StringGrid1->Cells[2][5] = "Cube-Sphere"; //Faces-Sphere
- //ellipsoid
- StringGrid1->Cells[3][1] ="complete"; //Point-Ellipsoid
- StringGrid1->Cells[3][2] ="complete"; //Sphere-Ellipsoid
- StringGrid1->Cells[3][3] ="incorrect"; //Ellipsoid-Ellipsoid
- StringGrid1->Cells[3][4] ="Cube-Sphere"; //Cube-Ellipsoid
- StringGrid1->Cells[3][5] ="Cube-Ellipsoid";//Faces-Ellipsoid
- //cube
- StringGrid1->Cells[4][1] ="complete"; //Point-Cube
- StringGrid1->Cells[4][2] ="complete"; //Sphere-Cube
- StringGrid1->Cells[4][3] ="Sphere-Cube"; //Ellipsoid-Cube
- StringGrid1->Cells[4][4] ="complete"; //Cube-Cube
- StringGrid1->Cells[4][5] ="experimental"; //Faces-Cube
- //Faces
- StringGrid1->Cells[5][1] ="Point-Cube"; //Point-Faces
- StringGrid1->Cells[5][2] ="Sphere-Cube"; //Sphere-Faces
- StringGrid1->Cells[5][3] ="Ellipsoid-Cube";//Ellipsoid-Faces
- StringGrid1->Cells[5][4] ="experimental"; //Cube-Faces
- StringGrid1->Cells[5][5] ="complete"; //Faces-Faces
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::cbCollisionModeClick(TObject *Sender)
- {
- ((TGLBCollision *)(TeaPot1->Behaviours->Items[0]))->BoundingMode =
- ((TCollisionBoundingMode)(cbCollisionMode->ItemIndex));
- ((TGLBCollision *)(TeaPot2->Behaviours->Items[0]))->BoundingMode =
- ((TCollisionBoundingMode)(cbCollisionMode->ItemIndex));
- ((TGLBCollision *)(Bar->Behaviours->Items[0]))->BoundingMode = cbmCube;
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::FormShow(TObject *Sender)
- {
- //initialize
- CurrSO = TeaPot1;
- cbCollisionModeClick(NULL);
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::Timer1Timer(TObject *Sender)
- {
- const TColor
- cColor[false][true] = {clLime, clRed};
- __int64 t;
- Timer1->Enabled = false;
- CollisionDetected = false;
- t = StartPrecisionTimer();
- Memo1->Lines->Clear();
- Memo1->Lines->BeginUpdate();
- CollisionManager1->CheckCollisions();
- Memo1->Lines->EndUpdate();
- LATime->Caption = Format("%.1f ms", ARRAYOFCONST ((StopPrecisionTimer(t)*1000)));
- Shape1->Brush->Color = *cColor[CollisionDetected];
- Timer1->Enabled = true;
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::CollisionManager1Collision(TObject *Sender, TGLBaseSceneObject *object1,
- TGLBaseSceneObject *object2)
- {
- if (Sender=CollisionManager1)
- {
- CollisionDetected = true;
- Memo1->Lines->Add(object1->Name+
- /*"("+StringNames[((TGLBCollision*)(object1->Behaviours->GetByClass(TGLBCollision))->BoundingMode)]+")"*/ +
- " - "+object2->Name
- /*+"("+StringNames[((TGLBCollision*)(object2->Behaviours->GetByClass(TGLBCollision))->BoundingMode)]+")"*/);
- }
- else
- Memo1->Lines->Add(object1->Name+
- /*"("+StringNames[((TGLBCollision*)(object1->Behaviours->GetByClass(TGLBCollision))->BoundingMode)]+")"*/ +
- " - "+object2->Name
- /*+"("+StringNames[((TGLBCollision*)(object2->Behaviours->GetByClass(TGLBCollision))->BoundingMode)]+") ** BB collision **"*/);
- ;
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::GLSceneViewer1MouseDown(TObject *Sender, TMouseButton Button,
- TShiftState Shift, int X, int Y)
- {
- TGLCustomSceneObject *pick;
- pick = (TGLCustomSceneObject *) GLSceneViewer1->Buffer->GetPickedObject(X, Y) ;
- if (pick)
- CurrSO = pick;
- // store mouse coordinates when a button went down
- mdx = X;
- mdy = Y;
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::GLSceneViewer1MouseMove(TObject *Sender, TShiftState Shift,
- int X, int Y)
- {
- int dx, dy;
- Gls::Vectorgeometry::TVector VX, VY;
- TGLCamera *Camera;
- Camera = GLSceneViewer1->Camera;
- // calculate delta since last move or last mousedown
- dx = mdx - X;
- dy = mdy - Y;
- mdx = X;
- mdy = Y;
- if (Shift.Contains(ssLeft))
- {
- if (Shift.Contains(ssShift))
- // left button with shift rotates the object
- // (rotation happens around camera's axis)
- Camera->RotateObject(CurrSO, dy, dx);
- else
- // left button without shift changes camera angle
- // (we're moving around the parent and target dummycube)
- Camera->MoveAroundTarget(dy, dx);
- }
- else
- if (Shift.Contains(ssRight))
- {
- //Moving the objects
- //Description:
- //1. via VectorPerpendicular we create a vector that is 90° to camera view and points to Y (Up)
- // this is Y-direction of moving
- //2. now using VectorCrossProduct we create the vector that is 90° to camera view and to the other
- // vector (VY), this is X-direction of moving
- VY = VectorMake(VectorPerpendicular(YVector, VectorNormalize(GLCamera2->Position->AsAffineVector)));
- VX = VectorCrossProduct(VY, VectorNormalize(GLCamera2->Position->AsVector));
- NormalizeVector(VY);
- NormalizeVector(VX);
- CurrSO->Position->Translate(VectorCombine(VX, VY,
- -dx * 0.132 * Camera->DistanceToTarget() / Camera->FocalLength,
- dy * 0.132 * Camera->DistanceToTarget() / Camera->FocalLength));
- }
- }
- //---------------------------------------------------------------------------
|