| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- //---------------------------------------------------------------------------
- #include <vcl.h>
- #include <tchar.h>
- #pragma hdrstop
- #include "fFaceC.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;
- TFileName Path = GetCurrentAssetPath();
- SetCurrentDir(Path + "\\model");
- 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;
- TGLVector 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));
- }
- }
- //---------------------------------------------------------------------------
|