/
MikeLight
/
Lab
Обзор
Документация
Войти
/
MikeLight
/
Lab
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
lab10/Collisions/fFaceVsFace.cpp
157 строк
6 KB
MikeLight
upload files
25 ноя 2025, 23:05
25 ноя 2025, 23:05
046237c
Код
Авторство
О чём код?
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "fFaceVsFace.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.SceneViewer" #pragma link "GLS.SpaceText" #pragma link "GLS.VectorFileObjects" #pragma link "GLS.File3DS" #pragma resource "*.dfm" TForm1 *Form1; const String StringNames[] = {"Point", "Sphere", "Ellipsoid", "Cube", "Faces"}; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { int i; SetCurrentDir("..\\..\\Assets"); TeaPot1->LoadFromFile("TeaPot.3ds"); TeaPot1->BuildOctree(); TeaPot2->LoadFromFile("TeaPot.3ds"); TeaPot2->BuildOctree(); for (i = 0; i < cbmFaces; i++) { StringGrid1->Cells[0][i + 1] = StringNames[i]; StringGrid1->Cells[i + 1][0] = StringNames[i]; } StringGrid1->Cells[1][1] = "complete"; StringGrid1->Cells[1][2] = "complete"; StringGrid1->Cells[1][3] = "complete"; StringGrid1->Cells[1][4] = "complete"; StringGrid1->Cells[1][5] = "Cube-Point"; StringGrid1->Cells[2][1] = "complete"; StringGrid1->Cells[2][2] = "complete"; StringGrid1->Cells[2][3] = "complete"; StringGrid1->Cells[2][4] = "complete"; StringGrid1->Cells[2][5] = "Cube-Sphere"; StringGrid1->Cells[3][1] = "complete"; StringGrid1->Cells[3][2] = "complete"; StringGrid1->Cells[3][3] = "incorrect"; StringGrid1->Cells[3][4] = "Cube-Sphere"; StringGrid1->Cells[3][5] = "Cube-Ellipsoid"; StringGrid1->Cells[4][1] = "complete"; StringGrid1->Cells[4][2] = "complete"; StringGrid1->Cells[4][3] = "Sphere-Cube"; StringGrid1->Cells[4][4] = "complete"; StringGrid1->Cells[4][5] = "experimental"; StringGrid1->Cells[5][1] = "Point-Cube"; StringGrid1->Cells[5][2] = "Sphere-Cube"; StringGrid1->Cells[5][3] = "Ellipsoid-Cube"; StringGrid1->Cells[5][4] = "experimental"; StringGrid1->Cells[5][5] = "complete"; } //--------------------------------------------------------------------------- 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::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) { CurrSO = TeaPot1; cbCollisionModeClick(NULL); } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { __int64 t; Timer1->Enabled = false; CollisionDetected = false; t = StartPrecisionTimer(); Memo1->Lines->Clear(); Memo1->Lines->BeginUpdate(); CollisionManager1->CheckCollisions(); Memo1->Lines->EndUpdate(); LATime->Caption = FloatToStr((StopPrecisionTimer(t) * 1000)) + " ms"; if (CollisionDetected) { Shape1->Brush->Color = clRed; } else { Shape1->Brush->Color = clLime; } Timer1->Enabled = true; } //--------------------------------------------------------------------------- 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; mx = X; my = Y; } //--------------------------------------------------------------------------- void __fastcall TForm1::GLSceneViewer1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { int dx, dy; TGLVector VX, VY; TGLCamera* Camera; Camera = GLSceneViewer1->Camera; dx = mx - X; dy = my - Y; mx = X; my = Y; if (Shift.Contains(ssLeft)) { if (Shift.Contains(ssShift)) Camera->RotateObject(CurrSO, dy, dx); else Camera->MoveAroundTarget(dy, dx); } else if (Shift.Contains(ssRight)) { 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)); } } //--------------------------------------------------------------------------- void __fastcall TForm1::GLSceneViewer1MouseWheel(TObject *Sender, TShiftState Shift, int WheelDelta, TPoint &MousePos, bool &Handled) { TGLCamera* Camera = GLSceneViewer1->Camera; Camera->AdjustDistanceToTarget(Power(1.1, -WheelDelta / 120)); } //---------------------------------------------------------------------------