//--------------------------------------------------------------------------- #include #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- HGLRC hGLRC; HDC hDC; __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { hDC = GetDC(Handle); int PixelFormat; PIXELFORMATDESCRIPTOR pfd = {sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, 24, 0,0,0,0,0,0, 0,0, 0,0,0,0,0, 32, 0, 0, PFD_MAIN_PLANE, 0, 0,0,}; PixelFormat = ChoosePixelFormat (hDC, &pfd); if (SetPixelFormat (hDC, PixelFormat, &pfd) == FALSE) Application->Terminate (); hGLRC = wglCreateContext(hDC); if(hGLRC == NULL) Application->Terminate (); if(wglMakeCurrent(hDC, hGLRC) == false) Application->Terminate (); glEnable (GL_DEPTH_TEST); glViewport (0, 0, Width, Height); glShadeModel (GL_SMOOTH); glClearColor (0.0, 0.0, 0.0, 1.0); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective (90, GLdouble(Width/Height), 1.0, 100.0); glMatrixMode (GL_MODELVIEW); glLoadIdentity (); gluLookAt (0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0); Application->OnIdle = AppIdle; X = 0; Y = -3; Yaw = 0; Pitch = 0; IsWire = true; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormResize(TObject *Sender) { glViewport (0, 0, Width, Height); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective (90, GLdouble(Width/Height), 1.0, 100.0); glMatrixMode (GL_MODELVIEW); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { if (hGLRC) { wglMakeCurrent(NULL, NULL); wglDeleteContext(hGLRC); hGLRC = NULL; } if (hDC) { ReleaseDC(Handle, hDC); hDC = NULL; } } //--------------------------------------------------------------------------- void __fastcall TForm1::AppIdle(TObject *Sender, bool &Done) { Done = true; // Начало обработки мыши TPoint* temp; temp = new TPoint; ::GetCursorPos (temp); Yaw += (180 * (temp->x - Screen->Width/2) / Screen->Width); Pitch += (180 * (temp->y - Screen->Height/2) / Screen->Height); ::SetCursorPos (Screen->Width/2, Screen->Height/2); // Конец обработки мыши glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity (); gluLookAt (0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0); glRotatef (Pitch, 1, 0, 0); glRotatef (Yaw, 0, 0, 1); glTranslatef (-X, -Y, 0.0f); if (IsWire) glBegin (GL_LINE_STRIP); else glBegin (GL_QUADS); { // Нижняя стенка glColor3f (1, 0, 0); glVertex3f (-1, -1, -1); glColor3f (0, 1, 0); glVertex3f (-1, 1, -1); glColor3f (0, 0, 1); glVertex3f (1, 1, -1); glColor3f (1, 1, 0); glVertex3f (1, -1, -1); } glEnd (); if (IsWire) glBegin (GL_LINE_STRIP); else glBegin (GL_QUADS); { // Верхняя стенка glColor3f (1, 0, 0); glVertex3f (-1, -1, 1); glColor3f (0, 1, 0); glVertex3f (-1, 1, 1); glColor3f (0, 0, 1); glVertex3f (1, 1, 1); glColor3f (1, 1, 0); glVertex3f (1, -1, 1); } glEnd (); if (IsWire) glBegin (GL_LINE_STRIP); else glBegin (GL_QUADS); { // Правая стенка glColor3f (1, 0, 0); glVertex3f (1, -1, -1); glColor3f (0, 1, 0); glVertex3f (1, 1, -1); glColor3f (0, 0, 1); glVertex3f (1, 1, 1); glColor3f (1, 1, 0); glVertex3f (1, -1, 1); } glEnd (); if (IsWire) glBegin (GL_LINE_STRIP); else glBegin (GL_QUADS); { // Левая стенка glColor3f (1, 0, 0); glVertex3f (-1, -1, -1); glColor3f (0, 1, 0); glVertex3f (-1, 1, -1); glColor3f (0, 0, 1); glVertex3f (-1, 1, 1); glColor3f (1, 1, 0); glVertex3f (-1, -1, 1); } glEnd (); if (IsWire) glBegin (GL_LINE_STRIP); else glBegin (GL_QUADS); { // Передняя стенка glColor3f (1, 0, 0); glVertex3f (-1, 1, -1); glColor3f (0, 1, 0); glVertex3f (1, 1, -1); glColor3f (0, 0, 1); glVertex3f (1, 1, 1); glColor3f (1, 1, 0); glVertex3f (-1, 1, 1); } glEnd (); if (IsWire) glBegin (GL_LINE_STRIP); else glBegin (GL_QUADS); { // Задяя стенка glColor3f (1, 0, 0); glVertex3f (-1, -1, -1); glColor3f (0, 1, 0); glVertex3f (1, -1, -1); glColor3f (0, 0, 1); glVertex3f (1, -1, 1); glColor3f (1, 1, 0); glVertex3f (-1, -1, 1); } glEnd (); glFlush (); SwapBuffers(hDC); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { float FSIN = sin (Yaw*M_PI/180.0f); float FCOS = cos (Yaw*M_PI/180.0f); if (Key == VK_ESCAPE) Application->Terminate (); else if (Key == VK_LEFT) Yaw -= 3; else if (Key == VK_RIGHT) Yaw += 3; else if (Key == VK_UP) {X += 0.05 * FSIN; Y += 0.05 * FCOS;} else if (Key == VK_DOWN) {X -= 0.05 * FSIN; Y -= 0.05 * FCOS;} else if (Key == 'A') {X -= 0.05 * FCOS; Y += 0.05 * FSIN;} else if (Key == 'D') {X += 0.05 * FCOS; Y -= 0.05 * FSIN;} else if (Key == 'W') {X += 0.05 * FSIN; Y += 0.05 * FCOS;} else if (Key == 'S') {X -= 0.05 * FSIN; Y -= 0.05 * FCOS;} else if (Key == VK_SPACE) IsWire = !IsWire; } //---------------------------------------------------------------------------