Каркас Windows-приложения. Особенности нового каркаса. Перемещение в пространстве (с текстурированными стенами), страница 10

glTexImage2D (GL_TEXTURE_2D, 0, 3, p->sizeX, p->sizeY, 0,

GL_RGB, GL_UNSIGNED_BYTE, p->data);

glBindTexture (GL_TEXTURE_2D, pTexture[2]); // Create MipMapped Texture

glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,

GL_LINEAR_MIPMAP_NEAREST);

gluBuild2DMipmaps (GL_TEXTURE_2D, 3, p->sizeX, p->sizeY,

GL_RGB, GL_UNSIGNED_BYTE, p->data);

if (p->data)

free(p->data);

free(p);

return true;

}

bool Init ()

{

::GetCurrentDirectory (MAX_PATH-1, curDir);

if (pFile == 0)

{

pFile = strcpy (new TCHAR[MAX_PATH], curDir);

pFile = gInfo.bFull ? strcat (pFile, "/Data/Fly.bmp") : FileDlg (true);

}

if (!LoadTexture (pFile, texture))

return false;

glClearColor (0, 0, 0, 0.5f);// Black Background

glShadeModel (GL_SMOOTH); // Enable Smooth Shading

glEnable (GL_DEPTH_TEST); // Enables Depth Testing

glClearDepth (1);       // Depth Buffer Setup

glDepthFunc (GL_LEQUAL);  // The Type Of Depth Testing To Do

glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

glEnable (GL_LIGHT0);

glLightfv (GL_LIGHT0, GL_AMBIENT, ambient);  // Setup The Ambient Light

glLightfv (GL_LIGHT0, GL_DIFFUSE, diffuse);  // Setup The Diffuse Light

glLightfv (GL_LIGHT0, GL_POSITION,position); // Position The Light

glEnable (GL_TEXTURE_2D); // Enable Texture Mapping

return true;

}

Изменения в функции Draw связаны с тем, что мы включили свет — теперь надо учитывать нормали.

void Draw ()

{

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  // Clear Screen And Depth Buffer

glLoadIdentity();

glTranslatef (0, 0, z);     // Move Into The Screen 5 Units

glRotatef (angleX, 1, 0, 0);

glRotatef (angleY, 0, 1, 0);

glBindTexture (GL_TEXTURE_2D, texture[filter]);

glBegin (GL_QUADS);

glNormal3f (0, 0, 1);   // Front Face

glTexCoord2f (0, 0); glVertex3f (-1, -1,  1);

glTexCoord2f (1, 0); glVertex3f ( 1, -1,  1);

glTexCoord2f (1, 1); glVertex3f ( 1,  1,  1);

glTexCoord2f (0, 1); glVertex3f (-1,  1,  1);

glNormal3f ( 0, 0,-1);  // Back Face

glTexCoord2f (1, 0); glVertex3f (-1, -1, -1);

glTexCoord2f (1, 1); glVertex3f (-1,  1, -1);

glTexCoord2f (0, 1); glVertex3f ( 1,  1, -1);

glTexCoord2f (0, 0); glVertex3f ( 1, -1, -1);

glNormal3f ( 0, 1, 0);  // Top Face

glTexCoord2f (0, 1); glVertex3f (-1,  1, -1);

glTexCoord2f (0, 0); glVertex3f (-1,  1,  1);

glTexCoord2f (1, 0); glVertex3f ( 1,  1,  1);

glTexCoord2f (1, 1); glVertex3f ( 1,  1, -1);

glNormal3f ( 0,-1, 0);  // Bottom Face

glTexCoord2f (1, 1); glVertex3f (-1, -1, -1);

glTexCoord2f (0, 1); glVertex3f ( 1, -1, -1);

glTexCoord2f (0, 0); glVertex3f ( 1, -1,  1);

glTexCoord2f (1, 0); glVertex3f (-1, -1,  1);

glNormal3f ( 1, 0, 0);  // Right face

glTexCoord2f (1, 0); glVertex3f ( 1, -1, -1);

glTexCoord2f (1, 1); glVertex3f ( 1,  1, -1);

glTexCoord2f (0, 1); glVertex3f ( 1,  1,  1);

glTexCoord2f (0, 0); glVertex3f ( 1, -1,  1);

glNormal3f (-1, 0, 0);  // Left Face

glTexCoord2f (0, 0); glVertex3f (-1, -1, -1);

glTexCoord2f (1, 0); glVertex3f (-1, -1,  1);

glTexCoord2f (1, 1); glVertex3f (-1,  1,  1);

glTexCoord2f (0, 1); glVertex3f (-1,  1, -1);

glEnd();

angleX += xspeed;  angleY += yspeed;

}

Изменения в Update связаны с введением управлений: клавиша F изменяет способ фильтрации, клавиша L включает и выключает свет, а клавиши управления курсором влияют на скорость вращения.

void Update (DWORD ms)

{

if (gInfo.keys[VK_ESCAPE])

{

gInfo.bQuit = true;

PostMessage (gInfo.hWnd, WM_QUIT, 0, 0);

}

if (gInfo.keys[VK_F1])

PostMessage (gInfo.hWnd, WM_TOGGLEFULLSCREEN, 0, 0);

if (gInfo.keys['L'] && !lp)

{

lp = true;

light = !light;

if (!light)

glDisable(GL_LIGHTING);

else

glEnable(GL_LIGHTING);

return;

}

if (!gInfo.keys['L'])

lp = false;

if (gInfo.keys['F'] && !fp)

{

fp = true;

filter = (filter + 1) % 3;

gInfo.title =

filter == 0 ? "Nearest Filtered Texture" :

filter == 1 ? "Linear Filtered Texture" :

"MipMapped Filtered Texture";

SetWindowText (gInfo.hWnd, gInfo.title);

return;