/
MikeLight
/
Lab
Обзор
Документация
Войти
/
MikeLight
/
Lab
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
lab12/fActorms3d.cpp
347 строк
11 KB
MikeLight
upload files
18 дек 2025, 14:17
18 дек 2025, 14:17
750f7e7
Код
Авторство
О чём код?
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "fActorms3d.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "GLS.BaseClasses" #pragma link "GLS.BitmapFont" #pragma link "GLS.Cadencer" #pragma link "GLS.Coordinates" #pragma link "GLS.HeightData" #pragma link "GLS.HUDObjects" #pragma link "GLS.Material" #pragma link "GLS.Objects" #pragma link "GLS.Scene" #pragma link "GLS.SceneViewer" #pragma link "GLS.TerrainRenderer" #pragma link "GLS.VectorFileObjects" #pragma link "GLS.WindowsFont" #pragma link "GLS.FileMD2" #pragma link "GLS.File3DS" #pragma link "GLS.SpacePartition" #pragma resource "*.dfm" TForm1 *Form1; double cForce = 250.0; bool flag = false; float random(void) { return (float)(rand() & 0x1FFF) / (float)0x1FFF; } //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { SetCurrentDir("..\\..\\Assets"); Randomize(); SpacePartition1 = new TGLQuadtreeSpacePartition(); SpacePartition1->LeafThreshold = 50; SpacePartition1->MaxTreeDepth = 10; SpacePartition1->GrowGravy = 0.01; GLMatLib->AddTextureMaterial("Terrain", "text.jpg"); GLMatLib->AddTextureMaterial("Terrain2", "detailmap.jpg"); GLMatLib->AddTextureMaterial("Terrain", "text.jpg")->Texture2Name = "Terrain2"; GLBitmapHDS1->MaxPoolSize = 8 * 1024 * 1024; GLBitmapHDS1->Picture->LoadFromFile("terrain.bmp"); Terrain->Direction->SetVector(0.0, 1.0, 0.0); Terrain->Material->LibMaterialName = "Terrain"; Terrain->TilesPerTexture = 256 / Terrain->TileSize; Terrain->Scale->SetVector(1.0, 1.0, 0.02); moMushroom->AutoScaling->SetPoint(0.1, 0.1, 0.1); moMushroom->LoadFromFile("Mushroom.3ds"); moMushroom->Direction->SetVector(0.0, 1.0, 0.0); moMushroom->BuildOctree(); Player->Position->SetPoint(0.0, 7.0, 0.0); GLMatLib->AddTextureMaterial("Actor", "waste.jpg"); GLActor1->LoadFromFile("Waste.md2"); GLActor1->Direction->SetVector(0.0, 1.0, 0.0); GLActor1->Up->SetVector(1.0, 0.0, 0.0); GLActor1->Scale->SetVector(0.05, 0.05, 0.05); GLActor1->Material->LibMaterialName = "Actor"; GLActor1->Animations->LoadFromFile("Quake2Animations.aaf"); GLActor1->AnimationMode = aamLoop; GLActor1->SwitchToAnimation("stand"); GLActor1->FrameInterpolation = afpLinear; GetOrCreateDCEDynamic(Player)->OnCollision = PlayerBehaviours0Collision; CreateMushRooms(); Help->Text = "Mouse Drag - Look\n\r\ A,W,S,D - movement\n\r\ SPACE - Jump\n\r\ 1 - Add one ball\n\r\ 2 - Delete balls\n\r\ SHIFT - Squat"; } //--------------------------------------------------------------------------- void TForm1::HandleAnimation() { String anim; if (VectorNorm(GetOrCreateDCEDynamic(Player)->Speed) > 0.1) { anim = "run"; flag = true; } else { anim = "stand"; flag = false; } if (IsKeyDown(VK_SPACE) && !Jumped && !IsKeyDown(VK_SHIFT)) { GetOrCreateDCEDynamic(Player)->Jump(1.0, 20.0); Jumped = true; } if (Jumped==true) { if (!GetOrCreateDCEDynamic(Player)->InGround) anim = "jump"; else Jumped = false; } if (IsKeyDown(VK_SHIFT)) { anim = "crstnd"; } if (anim == "jump") GLActor1->Interval = 500; else GLActor1->Interval = 100; if (IsKeyDown(VK_SHIFT) && flag) { anim = "crwalk"; if (anim == "crwalk") { GLActor1->Interval = 300; cForce = 10.0; } } else { if (Jumped == false) { GLActor1->Interval = 100; cForce = 250.0; } } if (GLActor1->CurrentAnimation() != anim) GLActor1->SwitchToAnimation(anim); } //--------------------------------------------------------------------------- void TForm1::HandleKeys() { TAffineVector Force; Force = NullVector; if (IsKeyDown(VK_ESCAPE)) Close(); if (IsKeyDown('w') || IsKeyDown('W') || IsKeyDown(VK_UP)) { GLActor1->RollAngle = 0; Force.Z = cForce; } if (IsKeyDown('s') || IsKeyDown('S') || IsKeyDown(VK_DOWN)) { GLActor1->RollAngle = 180; Force.Z = -cForce; } if (IsKeyDown('a') || IsKeyDown('A') || IsKeyDown(VK_LEFT)) { GLActor1->RollAngle = 90; Force.X = cForce; } if (IsKeyDown('d') || IsKeyDown('D') || IsKeyDown(VK_RIGHT)) { GLActor1->RollAngle = -90; Force.X = -cForce; } if ((IsKeyDown('w') || IsKeyDown('W') || IsKeyDown(VK_UP)) && (IsKeyDown('a') || IsKeyDown('A') || IsKeyDown(VK_LEFT))) { GLActor1->RollAngle = 45; } if ((IsKeyDown('w') || IsKeyDown('W') || IsKeyDown(VK_UP)) && (IsKeyDown('d') || IsKeyDown('D') || IsKeyDown(VK_RIGHT))) { GLActor1->RollAngle = -45; } if ((IsKeyDown('s') || IsKeyDown('S') || IsKeyDown(VK_DOWN)) && (IsKeyDown('a') || IsKeyDown('A') || IsKeyDown(VK_LEFT))) { GLActor1->RollAngle = 135; } if ((IsKeyDown('s') || IsKeyDown('S') || IsKeyDown(VK_DOWN)) && (IsKeyDown('d') || IsKeyDown('D') || IsKeyDown(VK_RIGHT))) { GLActor1->RollAngle = -135; } GetOrCreateDCEDynamic(Player)->ApplyAccel(Force); } //--------------------------------------------------------------------------- void __fastcall TForm1::GLSceneViewer1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { my = Y; mx = X; } //--------------------------------------------------------------------------- void __fastcall TForm1::GLSceneViewer1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if (Shift.Contains(ssLeft)) { GLCamera1->MoveAroundTarget(my - Y, 0); Player->Turn(-(mx - X)); } mx = X; my = Y; } //--------------------------------------------------------------------------- void __fastcall TForm1::GLSceneViewer1MouseWheel(TObject *Sender, TShiftState Shift, int WheelDelta, TPoint &MousePos, bool &Handled) { GLCamera1->AdjustDistanceToTarget(Power(1.1, -WheelDelta / 120)); } //--------------------------------------------------------------------------- void __fastcall TForm1::GLCadencer1Progress(TObject *Sender, const double DeltaTime, const double NewTime) { GLSceneViewer1->Invalidate(); HandleKeys(); HandleAnimation(); Help->ModulateColor->Alpha = Help->ModulateColor->Alpha - (DeltaTime * 0.05); if (Help->ModulateColor->Alpha < 0.25) Help->ModulateColor->Alpha = 0.25; HelpShadow->ModulateColor->Alpha = Help->ModulateColor->Alpha; HelpShadow->Text = Help->Text; } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { Form1->Caption = "Lab12 Actorms3d - " + GLSceneViewer1->FramesPerSecondText(); GLSceneViewer1->ResetPerformanceMonitor(); } //--------------------------------------------------------------------------- void __fastcall TForm1::PlayerBehaviours0Collision(TObject *Sender, TGLBaseSceneObject *ObjectCollided, const TDCECollision &CollisionInfo) { TAffineVector v; if (ObjectCollided->Tag == 1) { v = AffineVectorMake(VectorSubtract(ObjectCollided->AbsolutePosition, Player->AbsolutePosition)); NormalizeVector(v); ScaleVector(v, 400.0); GetOrCreateDCEDynamic(ObjectCollided)->StopAbsAccel(); GetOrCreateDCEDynamic(ObjectCollided)->ApplyAbsAccel(v); } } //--------------------------------------------------------------------------- void __fastcall TForm1::GLDirectOpenGL1Render(TObject *Sender, TGLRenderContextInfo &rci) { for (int i = 0; i < Mushrooms->Count - 1; i++) { Mushrooms->Children[i]->Visible = false; } SpacePartition1->QueryFrustum(rci.Rcci.Frustum); for (int i = 0; i < SpacePartition1->QueryResult->Count - 1; i++) { if (TGLSceneObj *leafsobj = dynamic_cast<TGLSceneObj*>(SpacePartition1->QueryResult->Items[i])) { leafsobj->Obj->Visible = true; } } int i; TAffineVector p, n; rci.GLStates->PointSize = 5.0; glColor3f(0.0, 1.0, 0.0); for (i = 0; i < Debug_Tri.High; i++) { glColor3f(0.0, 0.0, 0.0); glBegin(GL_LINE_STRIP); glVertex3f(Debug_Tri[i].p1.X, Debug_Tri[i].p1.Y, Debug_Tri[i].p1.Z); glVertex3f(Debug_Tri[i].p2.X, Debug_Tri[i].p2.Y, Debug_Tri[i].p2.Z); glVertex3f(Debug_Tri[i].p3.X, Debug_Tri[i].p3.Y, Debug_Tri[i].p3.Z); glEnd; CalcPlaneNormal(Debug_Tri[i].p1, Debug_Tri[i].p2, Debug_Tri[i].p3, n); ScaleVector(n, 0.25); p.X = (Debug_Tri[i].p1.X + Debug_Tri[i].p2.X + Debug_Tri[i].p3.X) / 3.0; p.Y = (Debug_Tri[i].p1.Y + Debug_Tri[i].p2.Y + Debug_Tri[i].p3.Y) / 3.0; p.Z = (Debug_Tri[i].p1.Z + Debug_Tri[i].p2.Z + Debug_Tri[i].p3.Z) / 3.0; glColor3f(0.0, 0.0, 1.0); glBegin(GL_LINE_STRIP); glVertex3f(p.X, p.Y, p.Z); glVertex3f(p.X + n.X, p.Y + n.Y, p.Z + n.Z); glEnd; glBegin(GL_POINTS); glVertex3f(p.X + n.X, p.Y + n.Y, p.Z + n.Z); glEnd; } Debug_Tri.Length = 0.0; } //--------------------------------------------------------------------------- void TForm1::CreateMushRooms() { const int crange = 10; for (int i = -crange; i < crange; i++) { for (int j = -crange; j < crange; j++) { TGLFreeFormProxy *proxy = (TGLFreeFormProxy *)(Mushrooms->AddNewChild(__classid(TGLFreeFormProxy))); proxy->MasterObject = moMushroom; proxy->ProxyOptions = proxy->ProxyOptions << pooObjects; proxy->Position->X = i * 25 + rand() % 70 * 5; proxy->Position->Z = j * 25 + rand() % 70 * 5; proxy->Position->Y = Terrain->InterpolatedHeight(proxy->Position->AsVector) + 1.5; GetOrCreateDCEStatic(proxy)->Manager = GLDCEManager1; GetOrCreateDCEStatic(proxy)->BounceFactor = 0.75; GetOrCreateDCEStatic(proxy)->Friction = 1; GetOrCreateDCEStatic(proxy)->Shape = csFreeform; proxy->TransformationChanged(); TGLSceneObj *obj = new TGLSceneObj(SpacePartition1, proxy); } } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { SpacePartition1->Free(); } //--------------------------------------------------------------------------- void TForm1::AddBall() { TGLSphere *Ball; float S; float pX,pY,pZ; float cR,cG,cB; Ball = (TGLSphere *)(Balls->AddNewChild(__classid(TGLSphere))); Ball->Tag = 1; Ball->Radius = 1.0; S = (float)(100.0 + random(900.0))/ 500.0; Ball->Scale->SetVector(S, S, S); pX = Player->Position->X + 20 - random(40.0); pY = 4 + random(40.0); pZ = Player->Position->Z + 20 - random(40.0); Ball->Position->SetPoint(pX, pY, pZ); cR = (float)(100.0 + random(900.0))/1000; cG = (float)(100.0 + random(900.0))/1000; cB = (float)(100.0 + random(900.0))/1000; Ball->Material->FrontProperties->Diffuse->SetColor(cR, cG, cB); GetOrCreateDCEDynamic(Ball)->Manager = GLDCEManager1; GetOrCreateDCEDynamic(Ball)->BounceFactor = 0.75; GetOrCreateDCEDynamic(Ball)->Friction = 0.1; GetOrCreateDCEDynamic(Ball)->SlideOrBounce = csbBounce; GetOrCreateDCEDynamic(Ball)->Size->Assign(Ball->Scale); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if (IsKeyDown(49)) { AddBall(); } if (IsKeyDown(50)) { Balls->DeleteChildren(); } } //---------------------------------------------------------------------------