/
ArtemSls
/
O3DM
Обзор
Документация
Войти
/
ArtemSls
/
O3DM
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
patch
Lab9/fMirrorAndWater.cpp
170 строк
7 KB
ArtemSls
upload files
24 янв 2025, 03:40
24 янв 2025, 03:40
d202144
Код
Авторство
О чём код?
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "fMirrorAndWater.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "GLS.SceneViewer" #pragma link "GLS.BaseClasses" #pragma link "GLS.Cadencer" #pragma link "GLS.Scene" #pragma link "GLS.Material" #pragma link "GLS.Coordinates" #pragma link "GLS.Objects" #pragma link "GLS.Mirror" #pragma link "GLS.GeomObjects" #pragma link "GLS.Extrusion" #pragma link "GLS.MultiPolygon" #pragma link "GLS.Graph" #pragma link "GLS.WaterPlane" #pragma link "GLS.SimpleNavigation" #pragma link "GLSL.UserShader" #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { GLWaterPlane1->Mask->LoadFromFile("../../Assets/basinMask.bmp"); GLHeightField1->Material->Texture->Image->LoadFromFile("../../Assets/clover.jpg"); TGLTexture *t = GLMaterialLibrary1->Materials->Items[0]->Material->Texture; t->ImageClassName = __classid(TGLCubeMapImage)->ClassName(); TGLCubeMapImage *img = (TGLCubeMapImage *)t->Image; img->Picture[CmtPZ]->LoadFromFile("../../Assets/cm_back.jpg"); img->Picture[CmtPX]->LoadFromFile("../../Assets/cm_left.jpg"); img->Picture[CmtNX]->LoadFromFile("../../Assets/cm_right.jpg"); img->Picture[CmtPY]->LoadFromFile("../../Assets/cm_top.jpg"); img->Picture[CmtNY]->LoadFromFile("../../Assets/cm_bottom.jpg"); img->Picture[CmtNZ]->LoadFromFile("../../Assets/cm_front.jpg"); GLMaterialLibrary1->Materials->Items[1] = GLMaterialLibrary1->Materials->Items[0]; GLMaterialLibrary1->Materials->Items[1]->Shader = GLUserShader1; GLMaterialLibrary1->Materials->Items[0]->Material->Texture->MappingMode = tmmCubeMapNormal; } //--------------------------------------------------------------------------- void __fastcall TForm1::GLSceneViewer1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { mx = X; my = Y; if(Shift.Contains(ssRight)) { TGLVector ip; GLSceneViewer1->Buffer->ScreenVectorIntersectWithPlaneXZ(VectorMake(X, GLSceneViewer1->Height - Y, 0, 0), GLWaterPlane1->Position->Y, ip); GLWaterPlane1->CreateRippleAtWorldPos(ip); } } //--------------------------------------------------------------------------- void __fastcall TForm1::GLSceneViewer1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if (Shift.Contains(ssLeft)) { GLCamera1->MoveAroundTarget(my - Y, mx - X); TGLMaterial *m = GLMaterialLibrary1->LibMaterialByName("LibMaterial1")->Material; m->FrontProperties->Diffuse->Alpha = 0.3 + 0.5 * sqrt(1 - GLCamera1->Position->Y / GLCamera1->DistanceToTarget()); } 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::Timer1Timer(TObject *Sender) { Form1->Caption = "Lab9 Mirror reflection and water surface Slesarev - " + GLSceneViewer1->FramesPerSecondText(); } //--------------------------------------------------------------------------- void __fastcall TForm1::CheckBox1Click(TObject *Sender) { if(CheckBox1->Checked) GLMirror1->MirrorOptions << moOpaque; else GLMirror1->MirrorOptions >> moOpaque; } //--------------------------------------------------------------------------- void __fastcall TForm1::CheckBox2Click(TObject *Sender) { if(CheckBox2->Checked) GLMirror1->MirrorOptions << moUseStencil; else GLMirror1->MirrorOptions >> moUseStencil; } //--------------------------------------------------------------------------- void __fastcall TForm1::CheckBox3Click(TObject *Sender) { if(CheckBox3->Checked) GLMirror1->MirrorOptions << moClearZBuffer; else GLMirror1->MirrorOptions >> moClearZBuffer; } //--------------------------------------------------------------------------- void __fastcall TForm1::CheckBox4Click(TObject *Sender) { if(CheckBox4->Checked) GLMirror1->MirrorOptions << moMirrorPlaneClip; else GLMirror1->MirrorOptions >> moMirrorPlaneClip; } //--------------------------------------------------------------------------- void __fastcall TForm1::GLCadencer1Progress(TObject *Sender, const double DeltaTime, const double NewTime) { GLSceneViewer1->Invalidate(); } //--------------------------------------------------------------------------- void __fastcall TForm1::RadioButton1Click(TObject *Sender) { GLDummyCube1->Visible = false; GLDummyCube3->Visible = false; CheckBox1->Visible = false; CheckBox2->Visible = false; CheckBox3->Visible = false; CheckBox4->Visible = false; GLSceneViewer1->Buffer->FaceCulling = true; if (RadioButton1->Checked) { GLDummyCube1->Visible = true; GLCamera1->TargetObject = GLDummyCube1; CheckBox1->Visible = true; CheckBox2->Visible = true; CheckBox3->Visible = true; CheckBox4->Visible = true; } if (RadioButton2->Checked) { GLDummyCube3->Visible = true; GLCamera1->TargetObject = GLDummyCube3; GLSceneViewer1->Buffer->FaceCulling = false; } } //--------------------------------------------------------------------------- void __fastcall TForm1::GLUserShader1DoApply(TObject *Sender, TGLRenderContextInfo &rci) { int cubeMapMode; cubeMapMode = GL_REFLECTION_MAP_ARB; rci.GLStates->SetGLState(stBlend); glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, cubeMapMode); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, cubeMapMode); glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, cubeMapMode); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } //--------------------------------------------------------------------------- void __fastcall TForm1::GLUserShader1DoUnApply(TObject *Sender, int Pass, TGLRenderContextInfo &rci, bool &Continue) { rci.GLStates->UnSetGLState(stBlend); } //--------------------------------------------------------------------------- void __fastcall TForm1::GLHeightField1GetHeight2(TObject *Sender, const float x, const float y, float &z, TGLColorVector &Color, TTexPoint &TexPoint) { z = 0.5 - (GLWaterPlane1->Mask->Bitmap->Canvas->Pixels[Int(x + 64)][Int(y + 64)] & 0xFF) / 255; } //---------------------------------------------------------------------------