
Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Тихомиров Ю. Программирование трёхмерной графики / Files / Texture / TextureView
.cpp// TextureView.cpp : implementation of the COpenGLView class
//
#include "stdafx.h"
#include "Texture.h"
#include "TextureDoc.h"
#include "TextureView.h"
#include "TextureDlg.h"
#include <gl\glaux.h>
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define PI 3.14159265358979323846
const int MAXPALCOLORS = 256;
typedef struct _CGLRGBTRIPLE {
BYTE rgbRed;
BYTE rgbGreen;
BYTE rgbBlue;
} CGLRGBTRIPLE;
extern CSettings set;
float c[6][4][4][3] = {
{
{{ 1.0, 1.0, -1.0},{ 0.0, 1.0, -1.0},{ 0.0, 0.0, -1.0},{ 1.0, 0.0,-1.0},},
{{ 0.0, 1.0, -1.0},{-1.0, 1.0, -1.0},{-1.0, 0.0, -1.0},{ 0.0, 0.0,-1.0},},
{{ 0.0, 0.0, -1.0},{-1.0, 0.0, -1.0},{-1.0, -1.0, -1.0},{ 0.0,-1.0,-1.0},},
{{ 1.0, 0.0, -1.0},{ 0.0, 0.0, -1.0},{ 0.0, -1.0, -1.0},{ 1.0,-1.0,-1.0},},},
{
{{ 1.0, 1.0, 1.0},{ 1.0, 1.0, 0.0},{ 1.0, 0.0, 0.0},{ 1.0, 0.0, 1.0}, },
{{ 1.0, 1.0, 0.0},{ 1.0, 1.0, -1.0},{ 1.0, 0.0, -1.0},{ 1.0, 0.0, 0.0},},
{{ 1.0, 0.0, -1.0},{ 1.0, -1.0, -1.0},{ 1.0, -1.0, 0.0},{ 1.0, 0.0, 0.0},},
{{ 1.0, 0.0, 0.0},{ 1.0, -1.0, 0.0},{ 1.0, -1.0, 1.0},{ 1.0, 0.0, 1.0},},},
{
{{-1.0, 1.0, 1.0},{ 0.0, 1.0, 1.0},{ 0.0, 0.0, 1.0},{-1.0, 0.0, 1.0},},
{{ 0.0, 1.0, 1.0},{ 1.0, 1.0, 1.0},{ 1.0, 0.0, 1.0},{ 0.0, 0.0, 1.0},},
{{ 1.0, 0.0, 1.0},{ 1.0, -1.0, 1.0},{ 0.0, -1.0, 1.0},{ 0.0, 0.0, 1.0 },},
{{ 0.0, -1.0, 1.0},{-1.0, -1.0, 1.0},{-1.0, 0.0, 1.0},{ 0.0, 0.0, 1.0},},},
{
{{-1.0, 1.0, -1.0},{-1.0, 1.0, 0.0},{-1.0, 0.0, 0.0},{-1.0, 0.0, -1.0},},
{{-1.0, 1.0, 0.0},{-1.0, 1.0, 1.0},{-1.0, 0.0, 1.0},{-1.0, 0.0, 0.0},},
{{-1.0, 0.0, 1.0},{-1.0, -1.0, 1.0},{-1.0, -1.0, 0.0},{-1.0, 0.0, 0.0},},
{{-1.0, -1.0, 0.0},{-1.0, -1.0, -1.0},{-1.0, 0.0, -1.0},{-1.0, 0.0, 0.0},},},
{
{{-1.0, 1.0, 1.0},{-1.0, 1.0, 0.0},{ 0.0, 1.0, 0.0},{ 0.0, 1.0, 1.0},},
{{-1.0, 1.0, 0.0},{-1.0, 1.0, -1.0},{ 0.0, 1.0, -1.0},{ 0.0, 1.0, 0.0},},
{{ 0.0, 1.0, -1.0},{ 1.0, 1.0, -1.0},{ 1.0, 1.0, 0.0},{ 0.0, 1.0, 0.0},},
{{ 1.0, 1.0, 0.0},{ 1.0, 1.0, 1.0},{ 0.0, 1.0, 1.0},{ 0.0, 1.0, 0.0},},},
{
{{-1.0, -1.0, -1.0},{-1.0, -1.0, 0.0},{ 0.0, -1.0, 0.0},{ 0.0, -1.0, -1.0},},
{{-1.0, -1.0, 0.0},{-1.0, -1.0, 1.0},{ 0.0, -1.0, 1.0},{ 0.0, -1.0, 0.0},},
{{ 0.0, -1.0, 1.0},{ 1.0, -1.0, 1.0},{ 1.0, -1.0, 0.0},{ 0.0, -1.0, 0.0},},
{{ 1.0, -1.0, 0.0},{ 1.0, -1.0, -1.0},{ 0.0, -1.0, -1.0},{ 0.0, -1.0, 0.0},},}
};
float n[6][3] = {
{ 0.0, 0.0, -1.0},
{ 1.0, 0.0, 0.0},
{ 0.0, 0.0, 1.0},
{-1.0, 0.0, 0.0},
{ 0.0, 1.0, 0.0},
{ 0.0, -1.0, 0.0}
};
/////////////////////////////////////////////////////////////////////////////
// CTextureView
IMPLEMENT_DYNCREATE(CTextureView, COpenGLView)
CTextureView::CTextureView()
{
m_iHeight = 0 ;
m_iWidth = 0 ;
m_pBits = NULL ;
m_play = FALSE;
m_pDlg = NULL;
}
CTextureView::~CTextureView()
{
CleanUp();
}
void CTextureView::CleanUp()
{
// Проверяем, загружел ли уже образ
if(m_pBits){
// Очищаем предыдущий образ
free(m_pBits);
m_pBits = NULL ;
m_iHeight = 0 ;
m_iWidth = 0 ;
m_play = FALSE;
}
}
BEGIN_MESSAGE_MAP(CTextureView, COpenGLView)
//{{AFX_MSG_MAP(CTextureView)
ON_WM_SIZE()
ON_COMMAND(ID_OPEN_BMP, OnOpenBmp)
ON_COMMAND(ID_CUST, OnCustomize)
ON_COMMAND(ID_CLDR, OnCylinder)
ON_COMMAND(ID_CONE, OnCone)
ON_COMMAND(ID_CUBE, OnCube)
ON_COMMAND(ID_PLATE, OnPlate)
ON_COMMAND(ID_SPHERE, OnSphere)
ON_COMMAND(ID_PRMD, OnPyramid)
ON_UPDATE_COMMAND_UI(ID_PLATE, OnUpdatePlate)
ON_UPDATE_COMMAND_UI(ID_CLDR, OnUpdateCylinder)
ON_UPDATE_COMMAND_UI(ID_CONE, OnUpdateCone)
ON_UPDATE_COMMAND_UI(ID_CUBE, OnUpdateCube)
ON_UPDATE_COMMAND_UI(ID_SPHERE, OnUpdateSphere)
ON_UPDATE_COMMAND_UI(ID_PRMD, OnUpdatePyramid)
ON_WM_TIMER()
ON_COMMAND(ID_PLAY, OnPlay)
ON_UPDATE_COMMAND_UI(ID_PLAY, OnUpdatePlay)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTextureView diagnostics
#ifdef _DEBUG
void CTextureView::AssertValid() const
{
CView::AssertValid();
}
void CTextureView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CTextureDoc* CTextureView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTextureDoc)));
return (CTextureDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CTextureView drawing
void CTextureView::OnInitialUpdate()
{
COpenGLView::OnInitialUpdate();
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
m_quadObj = gluNewQuadric();
CTextureDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// Задаем цвет фона используемый по умолчанию
CDibGL aDib;
::glClearColor(1.0f, 0.96f, 0.866f, 1.0f);
BOOL bResult = aDib.Load(AfxGetInstanceHandle(), IDB_BRICK);//RUSSIAN
if(bResult){
m_iWidth = aDib.GetWidth();
m_iHeight = aDib.GetHeight();
Translate(aDib);
TexMapScalePow2();
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D,
0,
3,
m_iWidth, m_iHeight,
0,
GL_RGB,
GL_UNSIGNED_BYTE,
m_pBits);
ChangeSettings();
glColor3f(0.0f, 1.0f, 0.0f);
gluQuadricTexture(m_quadObj, GL_TRUE);
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_FLAT);
}
m_radius1 = 1.0;
m_radius2 = 0.5;
m_angle1 = 90;
m_angle2 = 180;
m_slices = 26.0;
m_stacks = 10.0;
m_height = 12.0;
BuildList(1.0f);
m_Object = sphere;
}
void CTextureView::OnDraw(CDC* pDC)
{
CTextureDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
DrawScene();
}
/////////////////////////////////////////////////////////////////////////////
// CTextureView message handlers
void CTextureView::OnSize(UINT nType, int cx, int cy)
{
COpenGLView::OnSize(nType, cx, cy);
::glMatrixMode(GL_PROJECTION);
::glLoadIdentity();
::gluPerspective(55.0f, (GLdouble)cx/cy, 0.15f, 20.0f);
::glMatrixMode(GL_MODELVIEW);
}
void CTextureView::OnOpenBmp()
{
CDibGL aDib;
CString strFile;
CFileDialog dlg(TRUE,
NULL,
NULL,
OFN_FILEMUSTEXIST | OFN_HIDEREADONLY,
"Image files (*.DIB, *.BMP)|*.DIB;*.BMP|All files (*.*)|*.*||");
if(dlg.DoModal() == IDOK){
strFile = dlg.GetPathName();
AUX_RGBImageRec *pImage = auxDIBImageLoad(strFile);
m_iWidth = pImage->sizeX;
m_iHeight = pImage->sizeY;
m_pBits = pImage->data;
TexMapScalePow2();
gluBuild2DMipmaps(GL_TEXTURE_2D,
3,
m_iWidth, m_iHeight,
GL_RGB,
GL_UNSIGNED_BYTE,
m_pBits);
Invalidate(FALSE);
UpdateWindow();
}
}
void CTextureView::Translate(CDibGL& aDib)
{
int i, j;
int nBitsPerPix = aDib.GetBitsPerPixel() ;
void* pBits = aDib.GetBitsAddress();
int storageWidth = aDib.GetWidthBytes();
CGLRGBTRIPLE* pGLRGB =
(CGLRGBTRIPLE*)malloc(m_iWidth*m_iHeight*sizeof(CGLRGBTRIPLE));
CGLRGBTRIPLE* pDest = pGLRGB ;
switch(nBitsPerPix)
{
case 24:
{
RGBTRIPLE* pSrc = (RGBTRIPLE*) pBits ;
int widthDiff = storageWidth - m_iWidth*sizeof(RGBTRIPLE) ;
for(j = 0 ; j < m_iHeight ; j++)
{
for(i = 0 ; i < m_iWidth ; i++)
{
pDest->rgbRed = pSrc->rgbtRed ;
pDest->rgbGreen = pSrc->rgbtGreen ;
pDest->rgbBlue = pSrc->rgbtBlue ;
pDest++ ;
pSrc++ ;
}
pSrc = (RGBTRIPLE*)( (BYTE*)pSrc + widthDiff) ;
}
}
break ;
case 8:
{
BYTE* pSrc = (BYTE*) pBits ;
RGBQUAD* pClrTab = aDib.GetColorTabAddress();
aDib.GetColorTable(pClrTab, MAXPALCOLORS);
int widthDiff = storageWidth - m_iWidth ;
for(j = 0 ; j < m_iHeight ; j++)
{
for(i = 0 ; i < m_iWidth ; i++)
{
pDest->rgbRed = pClrTab[*pSrc].rgbRed ;
pDest->rgbGreen = pClrTab[*pSrc].rgbGreen ;
pDest->rgbBlue = pClrTab[*pSrc].rgbBlue ;
pDest++ ;
pSrc++ ;
}
pSrc += widthDiff ;
}
}
break ;
case 4:
{
BYTE* pSrc2 = (BYTE*) pBits ;
BYTE* pSrc;
BYTE bySrc ;
RGBQUAD* pClrTab = aDib.GetColorTabAddress();
aDib.GetColorTable(pClrTab, MAXPALCOLORS);
for(j = 0 ; j < m_iHeight ; j++)
{
int iPixelCount = 0 ;
pSrc = pSrc2 ;
for(i = 0 ; i < storageWidth ; i++)
{
bySrc = ((*pSrc) >> 4) & 15;
pDest->rgbRed = pClrTab[bySrc].rgbRed ;
pDest->rgbGreen = pClrTab[bySrc].rgbGreen ;
pDest->rgbBlue = pClrTab[bySrc].rgbBlue ;
pDest++ ;
iPixelCount++ ;
if (iPixelCount >= m_iWidth) break ;
bySrc = (*pSrc) & 15;
pDest->rgbRed = pClrTab[bySrc].rgbRed ;
pDest->rgbGreen = pClrTab[bySrc].rgbGreen ;
pDest->rgbBlue = pClrTab[bySrc].rgbBlue ;
pDest++ ;
pSrc++ ;
iPixelCount++ ;
if (iPixelCount >= m_iWidth) break ;
}
pSrc2 += storageWidth ;
}
}
break ;
default:
ASSERT(0) ;
}
m_pBits = (BYTE*)pGLRGB;
}
BOOL CTextureView::TexMapScalePow2()
{
GLint glMaxTexDim ;
double xPow2, yPow2;
int ixPow2, iyPow2;
int xSize2, ySize2;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &glMaxTexDim);
glMaxTexDim = min(256, glMaxTexDim);
if (m_iWidth <= glMaxTexDim)
xPow2 = log((double)m_iWidth) / log(2.0);
else
xPow2 = log((double)glMaxTexDim) / log(2.0);
if (m_iHeight <= glMaxTexDim)
yPow2 = log((double)m_iHeight) / log(2.0);
else
yPow2 = log((double)glMaxTexDim) / log(2.0);
ixPow2 = (int)xPow2;
iyPow2 = (int)yPow2;
if (xPow2 != (double)ixPow2)
ixPow2++;
if (yPow2 != (double)iyPow2)
iyPow2++;
xSize2 = 1 << ixPow2;
ySize2 = 1 << iyPow2;
BYTE *pData = (BYTE*)malloc(xSize2 * ySize2 * 3 * sizeof(BYTE));
if (!pData) return FALSE;
BOOL bRes = gluScaleImage(GL_RGB, m_iWidth, m_iHeight,
GL_UNSIGNED_BYTE, m_pBits,
xSize2, ySize2, GL_UNSIGNED_BYTE,
pData);
if(bRes){
OutputGlError("Ошибка выполнения команды gluScaleImage");
return FALSE;
}
free(m_pBits);
m_pBits = pData;
m_iWidth = xSize2 ;
m_iHeight = ySize2 ;
return TRUE ;
}
void CTextureView::OutputGlError(char* label)
{
GLenum errorno = glGetError() ;
if (errorno != GL_NO_ERROR)
TRACE("%s had error: #(%d) %s\r\n", label, errorno, gluErrorString(errorno)) ;
}
void CTextureView::OnCustomize()
{
if(m_pDlg == NULL){
CTextureDlg *m_pDlg = new CTextureDlg;
m_pDlg->Create(this);
}
}
void CTextureView::ChangeSettings()
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, set.wrap_s);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, set.wrap_t);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, set.minfilter);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, set.magfilter);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, set.envmode);
// Формирование S координат текстуры ...
if(set.s_gen){
glEnable(GL_TEXTURE_GEN_S);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, set.s_mode);
if(set.s_mode == GL_OBJECT_LINEAR)
glTexGendv(GL_S, GL_OBJECT_PLANE, set.s_coeffs);
else
if(set.s_mode == GL_EYE_LINEAR)
glTexGendv(GL_S, GL_EYE_PLANE, set.s_coeffs);
// Для GL_SPHERE_MAP коэффициенты не используются
}
else
glDisable(GL_TEXTURE_GEN_S);
// Формирование T координат текстуры ...
if(set.t_gen){
glEnable(GL_TEXTURE_GEN_T);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, set.t_mode);
if(set.t_mode == GL_OBJECT_LINEAR)
glTexGendv(GL_T, GL_OBJECT_PLANE, set.t_coeffs);
else
if(set.t_mode == GL_EYE_LINEAR)
glTexGendv(GL_T, GL_EYE_PLANE, set.t_coeffs);
// Для GL_SPHERE_MAP коэффициенты не используются
}
else
glDisable(GL_TEXTURE_GEN_T);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, set.hint);
BuildList(set.texcoord);
Invalidate(FALSE);
UpdateWindow();
}
void CTextureView::BuildPlate(GLdouble size){
::glNewList(plate, GL_COMPILE);
::glBegin(GL_QUADS);
glTexCoord2d(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0);
glTexCoord2d(size, 0.0f); glVertex3f( 1.0f, -1.0f, 0.0);
glTexCoord2d(size, size); glVertex3f( 1.0f, 1.0f, 0.0);
glTexCoord2d(0.0f, size); glVertex3f(-1.0f, 1.0f, 0.0);
::glEnd();
::glEndList();
}
void CTextureView::BuildCube(GLdouble size)
{
glNewList(cube, GL_COMPILE);
glBegin(GL_QUAD_STRIP);
glTexCoord2d(0.0f, size); glVertex3f(-1.0f, 1.0f, 1.0f);// 1
glTexCoord2d(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);// 2
glTexCoord2d(size, size); glVertex3f( 1.0f, 1.0f, 1.0f);// 3
glTexCoord2d(size, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);// 4
glTexCoord2d(0.0f, size); glVertex3f( 1.0f, 1.0f, -1.0f);// 5
glTexCoord2d(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);// 6
glTexCoord2d(size, size); glVertex3f(-1.0f, 1.0f, -1.0f);// 7
glTexCoord2d(size, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);// 8
glTexCoord2d(0.0f, size); glVertex3f(-1.0f, 1.0f, 1.0f);// 9
glTexCoord2d(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);// 10
glEnd();
glBegin(GL_QUADS);
glTexCoord2d(size, 0.0f); glVertex3f(-0.5f, 0.5f, 0.5f);
glTexCoord2d(size, size); glVertex3f( 0.5f, 0.5f, 0.5f);
glTexCoord2d(0.0f, size); glVertex3f( 0.5f, 0.5f, -0.5f);
glTexCoord2d(0.0f, 0.0f); glVertex3f(-0.5f, 0.5f, -0.5f);
glEnd();
glBegin(GL_QUADS);
glTexCoord2d(size, 0.0f); glVertex3f(-0.5f, -0.5f, 0.5f);
glTexCoord2d(size, size); glVertex3f( 0.5f, -0.5f, 0.5f);
glTexCoord2d(0.0f, size); glVertex3f( 0.5f, -0.5f, -0.5f);
glTexCoord2d(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, -0.5f);
glEnd();
glEndList();
}
void CTextureView::BuildCone(GLdouble size)
{
glNewList(cone, GL_COMPILE);
gluCylinder(m_quadObj, m_radius1, 0.0, size,
m_slices, m_stacks);
glEndList();
}
void CTextureView::BuildCylinder(GLdouble size)
{
glNewList(cylinder, GL_COMPILE);
gluCylinder(m_quadObj, m_radius1, m_radius1, size,
m_slices, m_stacks);
glEndList();
}
void CTextureView::BuildSphere(GLdouble size)
{
glNewList(sphere, GL_COMPILE);
gluSphere(m_quadObj, m_radius1, m_slices, m_stacks);
glEndList();
}
void CTextureView::BuildList(GLdouble size)
{
BuildPlate(size);
BuildSphere(size);
BuildCube(size);
BuildCylinder(size);
BuildCone(size);
BuildPyramid(size);
}
void CTextureView::OnPyramid()
{
m_Object = pyramid;
Invalidate(FALSE);
UpdateWindow();
}
void CTextureView::OnCylinder()
{
m_Object = cylinder;
Invalidate(FALSE);
UpdateWindow();
}
void CTextureView::OnCone()
{
m_Object = cone;
Invalidate(FALSE);
UpdateWindow();
}
void CTextureView::OnCube()
{
m_Object = cube;
Invalidate(FALSE);
UpdateWindow();
}
void CTextureView::OnPlate()
{
m_Object = plate;
Invalidate(FALSE);
UpdateWindow();
}
void CTextureView::OnSphere()
{
m_Object = sphere;
Invalidate(FALSE);
UpdateWindow();
}
void CTextureView::OnUpdatePyramid(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_Object == pyramid);
}
void CTextureView::OnUpdatePlate(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_Object == plate);
}
void CTextureView::OnUpdateCylinder(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_Object == cylinder);
}
void CTextureView::OnUpdateCone(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_Object == cone);
}
void CTextureView::OnUpdateCube(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_Object == cube);
}
void CTextureView::OnUpdateSphere(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_Object == sphere);
}
void CTextureView::OnTimer(UINT nIDEvent)
{
DrawScene();
COpenGLView::OnTimer(nIDEvent);
}
void CTextureView::OnPlay()
{
m_play = m_play ? FALSE : TRUE;
if (m_play)
SetTimer(1, 15, NULL);
else
KillTimer(1);
}
void CTextureView::OnUpdatePlay(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_play);
}
void CTextureView::DrawScene()
{
static GLfloat xRotate = -45.0f;
static GLfloat yRotate = 0.0f;
static GLfloat zRotate = 0.0f;
// Здесь размещается код рисования
::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
::glPushMatrix();
::glTranslatef(0.0f, 0.0f, -4.0f);
::glRotatef(xRotate, 1.0f, 0.0f, 0.0f);
::glRotatef(yRotate, 0.0f, 1.0f, 0.0f);
::glRotatef(zRotate, 0.0f, 0.0f, 1.0f);
::glColor3f(1.0f, 0.96f, 0.866f);
::glMatrixMode(GL_MODELVIEW);
::glCallList(m_Object);
::glPopMatrix();
::glFinish();
::SwapBuffers(::wglGetCurrentDC());
if(m_play){
xRotate += 1.0f;
yRotate += 10.0f;
zRotate += 5.0f;
}
}
void CTextureView::BuildPyramid(GLdouble size)
{
glNewList(pyramid, GL_COMPILE);
glBegin(GL_POLYGON); // лицевая
glTexCoord2d(size, 0.0); glVertex3d(1.0f, -1.0f, 1.0f);
glTexCoord2d(size/2.0, size); glVertex3d(0.0, 1.0f, 0.0);
glTexCoord2d(0.0, 0.0); glVertex3d(-1.0f, -1.0f, 1.0f);
glEnd();
glBegin(GL_POLYGON); // обратная
glTexCoord2d(size, 0.0); glVertex3d(-1.0f, -1.0f, -1.0f);
glTexCoord2d(size/2.0, size); glVertex3d(0.0, 1.0f, 0.0);
glTexCoord2d(0.0, 0.0); glVertex3d(1.0f, -1.0f, -1.0f);
glEnd();
glBegin(GL_POLYGON); // левая
glTexCoord2d(size, 0.0); glVertex3d(-1.0f, -1.0f, 1.0f);
glTexCoord2d(size/2.0, size); glVertex3d(0.0, 1.0f, 0.0);
glTexCoord2d(0.0, 0.0); glVertex3d(-1.0f, -1.0f, -1.0f);
glEnd();
glBegin(GL_POLYGON); // правая
glTexCoord2d(size, 0.0); glVertex3d(1.0f, -1.0f, -1.0f);
glTexCoord2d(size/2.0, size); glVertex3d(0.0, 1.0f, 0.0);
glTexCoord2d(0.0, 0.0); glVertex3d(1.0f, -1.0f, 1.0f);
glEnd();
glEndList();
}
Соседние файлы в папке Texture