123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- //---------------------------------------------------------------------------
- #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 "GLGraph"
- #pragma link "GLObjects"
- #pragma link "GLScene"
- #pragma link "GLWin32Viewer"
- #pragma resource "*.dfm"
- TForm1 *Form1;
- //---------------------------------------------------------------------------
- __fastcall TForm1::TForm1(TComponent* Owner)
- : TForm(Owner)
- {
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::FormCreate(TObject *Sender)
- {
- Randomize;
- BoxScale = XYZVector;
- SphereRadius = 1;
- BoxMatrix = IdentityHmgMatrix;
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::CheckBox04Click(TObject *Sender)
- {
- GLCube1->Visible = CheckBox04->Checked;
- GLLines1->Visible = CheckBox05->Checked;
- GLXYZGrid1->Visible = CheckBox06->Checked;
- GLSphere1->Visible = CheckBox07->Checked;
- }
- //---------------------------------------------------------------------------
- // Generates random rotation for matrix. It remains a scale.
- Glvectorgeometry::TMatrix RandomRotation(Glvectorgeometry::TMatrix const &aMatrix)
- {
- TAffineVector aScale;
- Glvectorgeometry::TMatrix mat;
- int I;
- // Save scale.
- for (I = 0; I < 2; I++)
- aScale.V[I] = VectorLength(aMatrix.V[I]);
- mat.W = aMatrix.W;
- // Generate two not equal random vectors.
- while (VectorNorm(VectorSubtract(mat.X, mat.Y)) < 10e-6)
- {
- while (VectorNorm(mat.X) < 10e-6)
- mat.X = VectorMake(Random() * 2 - 1, Random() * 2 - 1, Random() * 2 - 1);
- while (VectorNorm(mat.Y) < 10e-6)
- mat.Y = VectorMake(Random() * 2 - 1, Random() * 2 - 1, Random() * 2 - 1);
- }
- // Calculate two perpendicular vectors.
- mat.Z = VectorCrossProduct(mat.X, mat.Y);
- mat.Y = VectorCrossProduct(mat.X, mat.Z);
- // Restore scale.
- for (I = 0; I < 2; I++)
- {
- NormalizeVector(mat.V[I]);
- ScaleVector(mat.V[I], aScale.V[I]);
- }
- return mat;
- }
- void __fastcall TForm1::Button4Click(TObject *Sender)
- {
- BoxMatrix = RandomRotation(BoxMatrix);
- Edit1Change(Sender);
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::Edit1Change(TObject *Sender)
- {
- const float EditorsScale = 0.1;
- bool Res1;
- if (!Form1->Visible)
- exit;
- GLLines3->Nodes->Clear();
- // Calc data.
- BoxMatrix.W.X = UpDown1->Position * EditorsScale;
- BoxMatrix.W.Y = UpDown2->Position * EditorsScale;
- BoxMatrix.W.Z = UpDown3->Position * EditorsScale;
- BoxMatrix.W.W = 1;
- BoxScale.X = UpDown4->Position * EditorsScale;
- BoxScale.Y = UpDown5->Position * EditorsScale;
- BoxScale.Z = UpDown6->Position * EditorsScale;
- SpherePos.X = UpDown7->Position * EditorsScale;
- SpherePos.Y = UpDown8->Position * EditorsScale;
- SpherePos.Z = UpDown9->Position * EditorsScale;
- SphereRadius = UpDown10->Position * EditorsScale;
- // dCollideSphereBox function !
- Res1 = IntersectSphereBox(VectorMake(SpherePos, 1), SphereRadius, BoxMatrix,
- BoxScale, &intersPoint, &ResNormal);
- if (Res1)
- {
- // Intersected.
- Label1->Caption = "Intersected";
- DCCamTarget->Position->SetPoint(intersPoint);
- // Draw normal
- GLLines3->Nodes->AddNode(intersPoint);
- GLLines3->Nodes->AddNode(VectorAdd(intersPoint, VectorScale(
- ResNormal, SphereRadius * 3)));
- }
- else
- {
- // Not intersected.
- Beep();
- Label1->Caption = "";
- }
- DCCamTarget->Visible = Res1;
- // Draw GLCube1 and GLSphere1.
- GLCube1->Matrix = BoxMatrix;
- GLCube1->CubeWidth = BoxScale.X;
- GLCube1->CubeHeight = BoxScale.Y;
- GLCube1->CubeDepth = BoxScale.Z;
- DCCube1->Matrix = GLCube1->Matrix;
- DCCube1->Scale->SetVector(BoxScale);
- GLSphere1->Position->SetPoint(SpherePos);
- GLSphere1->Radius = SphereRadius;
- GLSphere2->Position->SetPoint(SpherePos);
- GLSphere2->Radius = SphereRadius;
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::Button3Click(TObject *Sender)
- {
- Edit1Change(Sender);
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::ViewerMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
- int X, int Y)
- {
- Viewer->SetFocus();
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::GLCadencerProgress(TObject *Sender, const double deltaTime,
- const double newTime)
- {
- if (Form1->Active)
- Viewer->Invalidate();
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::ViewerMouseMove(TObject *Sender, TShiftState Shift, int X,
- int Y)
- {
- if (Shift.Contains(ssLeft))
- GLCamera1->MoveAroundTarget(mdy - Y, mdx - X);
- mdx = X;
- mdy = Y;
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::FormMouseWheel(TObject *Sender, TShiftState Shift, int WheelDelta,
- TPoint &MousePos, bool &Handled)
- {
- if (Viewer->Focused())
- GLCamera1->AdjustDistanceToTarget(Power(1.02, WheelDelta / 120));
- }
- //---------------------------------------------------------------------------
|