//--------------------------------------------------------------------------- #include #include #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "GLS.BaseClasses" #pragma link "GLS.Cadencer" #pragma link "GLS.Coordinates" #pragma link "GLS.Objects" #pragma link "Physics.ODEManager" #pragma link "GLS.Scene" #pragma link "GLS.Utils" #pragma link "GLS.SimpleNavigation" #pragma link "GLS.SceneViewer" #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { // Initialize default values from the one of DesignTime; TrackBarMotionSpeed->Position = RoundInt(GetOrCreateOdeStatic(ConveyorBelt1)->Surface->Motion1); Friction->Text = FloatToStr(GetOrCreateOdeStatic(ConveyorBelt1)->Surface->Mu); FDirX->Text = "0"; FDirY->Text = "0"; FDirZ->Text = "1"; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormShow(TObject *Sender) { GLCadencer1->Enabled = true; } //--------------------------------------------------------------------------- void __fastcall TForm1::GLCadencer1Progress(TObject *Sender, const double deltaTime, const double newTime) { GLODEManager1->Step(deltaTime); } //--------------------------------------------------------------------------- void __fastcall TForm1::GLODEManager1Collision(TObject *Sender, TObject *Object1, TObject *Object2, TdContact &Contact, bool &HandleCollision) { if (Object2 = GetOrCreateOdeStatic(ConveyorBelt1)) { Contact.fdir1[0] = FDirectionVector.X; // x Contact.fdir1[1] = FDirectionVector.Y; // y Contact.fdir1[2] = FDirectionVector.Z; // z Contact.fdir1[3] = FDirectionVector.W; // not used } } //--------------------------------------------------------------------------- void __fastcall TForm1::TrackBarMotionSpeedChange(TObject *Sender) { TGLODEStatic *AODEStatic; AODEStatic = (TGLODEStatic*)(ConveyorBelt1->Behaviours->Items[0]); AODEStatic->Surface->Motion1 = TrackBarMotionSpeed->Position; } //--------------------------------------------------------------------------- void __fastcall TForm1::FrictionChange(TObject *Sender) { TGLODEStatic *AODEStatic; AODEStatic = (TGLODEStatic*)(ConveyorBelt1->Behaviours->Items[0]); AODEStatic->Surface->Mu = Gls::Utils::StrToFloatDef(Friction->Text, GetOrCreateOdeStatic(ConveyorBelt1)->Surface->Mu); FrictionFeedback->Caption = Format("µs = %.2f", ARRAYOFCONST((GetOrCreateOdeStatic(ConveyorBelt1)->Surface->Mu))); } //--------------------------------------------------------------------------- void __fastcall TForm1::AddODECubeClick(TObject *Sender) { TGLCube *ACube; TGLODEDynamic *AODEDynamic; TGLODEElementBox *AODEElementBox; // Create a new GLScene cube and add it to the current GLScene1 ACube = (TGLCube *)(SpawnPoint->AddNewChild(__classid(TGLCube))); ACube->Parent = GLScene1->Objects; ACube->Position->Assign(SpawnPoint->Position); ACube->Material->FrontProperties->Diffuse->RandomColor(); // Add ODE Dynamic behaviour on it AODEDynamic = new TGLODEDynamic(ACube->Behaviours); AODEDynamic->Manager = GLODEManager1; // Set µs value to 1 (default=1000), just uses the one from the conveyor AODEDynamic->Surface->Mu = 1; // Finally create physical data in this behaviour AODEElementBox = (TGLODEElementBox *) AODEDynamic->AddNewElement(__classid(TGLODEElementBox)); if (AODEElementBox) { AODEElementBox->BoxWidth = ACube->CubeWidth; AODEElementBox->BoxHeight = ACube->CubeHeight; AODEElementBox->BoxDepth = ACube->CubeDepth; } // The new camera target is the last added cube GLCamera1->TargetObject = ACube; // The spawn position is increased SpawnPoint->Position->Y = SpawnPoint->Position->Y + 1; } //---------------------------------------------------------------------------