Скачиваний:
28
Добавлен:
02.05.2014
Размер:
18.34 Кб
Скачать
// 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