📄 textureview.cpp
字号:
// TextureView.cpp : CTextureView 类的实现
//
#include "stdafx.h"
#include "Texture.h"
#include "TextureDoc.h"
#include "TextureView.h"
#include "gl\gl.h"
#include "gl\glu.h"
#include "gl\glaux.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
/* Matrices */
GLfloat rot = 0.0f;
GLfloat ModelView[16];
GLfloat Projection[16];
GLfloat Viewport[4];
/* Sample geometry */
GLfloat quadV[][4] = {
{ -1.0f, 0.0f, -1.0f, 1.0f },
{ 1.0f, 0.0f, -1.0f, 1.0f },
{ 1.0f, 0.5f, -0.2f, 1.0f },
{ -1.0f, 0.5f, -0.2f, 1.0f },
};
GLfloat quadC[][3] = {
{ 1.0f, 0.0f, 0.0f },
{ 0.0f, 1.0f, 0.0f },
{ 0.0f, 0.0f, 1.0f },
{ 1.0f, 1.0f, 1.0f },
};
GLfloat quadT[][2] = {
{ 0.0f, 0.0f },
{ 0.0f, 1.0f },
{ 1.0f, 1.0f },
{ 1.0f, 0.0f },
};
/*********************************************************************
* Utility functions
*/
int texWidth = 128;
int texHeight = 128;
static void
setCheckedTexture(void)
{
int texSize;
void *textureBuf;
GLubyte *p;
int i,j;
/* malloc for rgba as worst case */
texSize = texWidth*texHeight*4;
textureBuf = malloc(texSize);
if (NULL == textureBuf) return;
p = (GLubyte *)textureBuf;
for (i=0; i < texWidth; i++) {
for (j=0; j < texHeight; j++) {
if ((i ^ j) & 8) {
p[0] = 0xff; p[1] = 0xff; p[2] = 0xff; p[3] = 0xff;
} else {
p[0] = 0x08; p[1] = 0x08; p[2] = 0x08; p[3] = 0xff;
}
p += 4;
}
}
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, texWidth, texHeight,
GL_RGBA, GL_UNSIGNED_BYTE, textureBuf);
free(textureBuf);
}
/* Perform one transform operation */
static void
Transform(GLfloat *matrix, GLfloat *in, GLfloat *out)
{
int ii;
for (ii=0; ii<4; ii++) {
out[ii] =
in[0] * matrix[0*4+ii] +
in[1] * matrix[1*4+ii] +
in[2] * matrix[2*4+ii] +
in[3] * matrix[3*4+ii];
}
}
/* Transform a vertex from object coordinates to window coordinates.
* Lighting is left as an exercise for the reader.
*/
static void
DoTransform(GLfloat *in, GLfloat *out)
{
GLfloat tmp[4];
GLfloat invW; /* 1/w */
/* Modelview xform */
Transform(ModelView, in, tmp);
/* Lighting calculation goes here! */
/* Projection xform */
Transform(Projection, tmp, out);
if (out[3] == 0.0f) /* do what? */
return;
invW = 1.0f / out[3];
/* Perspective divide */
out[0] *= invW;
out[1] *= invW;
out[2] *= invW;
/* Map to 0..1 range */
out[0] = out[0] * 0.5f + 0.5f;
out[1] = out[1] * 0.5f + 0.5f;
out[2] = out[2] * 0.5f + 0.5f;
/* Map to viewport */
out[0] = out[0] * Viewport[2] + Viewport[0];
out[1] = out[1] * Viewport[3] + Viewport[1];
/* Store inverted w for performance */
out[3] = invW;
}
/*********************************************************************
* Application code begins here
*/
/* For the sake of brevity, I'm use OpenGL to compute my matrices. */
void UpdateModelView(void)
{
glPushMatrix();
glLoadIdentity();
gluLookAt(0.0f, 1.0f, -4.0f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f);
glRotatef(rot, 0.0f, 1.0f, 0.0f);
/* Retrieve the matrix */
glGetFloatv(GL_MODELVIEW_MATRIX, ModelView);
glPopMatrix();
}
void InitMatrices(void)
{
/* Calculate projection matrix */
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluPerspective(45.0f, 1.0f, 1.0f, 100.0f);
/* Retrieve the matrix */
glGetFloatv(GL_PROJECTION_MATRIX, Projection);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
UpdateModelView();
}
// CTextureView
IMPLEMENT_DYNCREATE(CTextureView, CView)
BEGIN_MESSAGE_MAP(CTextureView, CView)
// 标准打印命令
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_SIZE()
END_MESSAGE_MAP()
// CTextureView 构造/销毁
CTextureView::CTextureView()
{
// TODO: 在此处添加构造代码
m_pDC = NULL;
}
CTextureView::~CTextureView()
{
}
BOOL CTextureView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或
// 样式
cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
return CView::PreCreateWindow(cs);
}
// CTextureView 绘制
void CTextureView::OnDraw(CDC* pDC)
{
CTextureDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: 在此处为本机数据添加绘制代码
GLfloat tmp[4];
int ii;
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glBegin(GL_QUADS);
for (ii = 0; ii < 4; ii++) {
/* Transform a vertex from object to window coordinates.
* 1/w is returned as tmp[3] for perspective-correcting
* the texture coordinates.
*/
DoTransform(quadV[ii], tmp);
/* Ideally the colors will be computed by the lighting equation,
* but I've hard-coded values for this example.
*/
glColor3fv(quadC[ii]);
/* Scale by 1/w (stored in tmp[3]) */
glTexCoord4f(quadT[ii][0] * tmp[3],
quadT[ii][1] * tmp[3], 0.0f, tmp[3]);
/* Note I am using Vertex3, not Vertex4, since we have already
* performed the perspective divide.
*/
glVertex3fv(tmp);
}
glEnd();
glFinish();
SwapBuffers(wglGetCurrentDC());
}
// CTextureView 打印
BOOL CTextureView::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默认准备
return DoPreparePrinting(pInfo);
}
void CTextureView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 打印前添加额外的初始化
}
void CTextureView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 打印后添加清除过程
}
// CTextureView 诊断
#ifdef _DEBUG
void CTextureView::AssertValid() const
{
CView::AssertValid();
}
void CTextureView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CTextureDoc* CTextureView::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTextureDoc)));
return (CTextureDoc*)m_pDocument;
}
#endif //_DEBUG
// CTextureView 消息处理程序
int CTextureView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
PIXELFORMATDESCRIPTOR pfd;
int n;
HGLRC hrc;
m_pDC = new CClientDC(this);
ASSERT(m_pDC != NULL);
if (!bSetupPixelFormat())
return 0;
n = ::GetPixelFormat(m_pDC->GetSafeHdc());
::DescribePixelFormat(m_pDC->GetSafeHdc(), n, sizeof(pfd), &pfd);
hrc = wglCreateContext(m_pDC->GetSafeHdc());
wglMakeCurrent(m_pDC->GetSafeHdc(), hrc);
glClearColor(0.2f, 0.2f, 0.6f, 1.0f);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
setCheckedTexture();
InitMatrices();
return 0;
}
void CTextureView::OnDestroy()
{
CView::OnDestroy();
// TODO: 在此添加消息处理程序代码
HGLRC hrc;
hrc = wglGetCurrentContext();
wglMakeCurrent(NULL, NULL);
if (hrc)
wglDeleteContext(hrc);
if (m_pDC)
delete m_pDC;
}
void CTextureView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: 在此添加消息处理程序代码
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f, (GLfloat) cx, 0.0f, (GLfloat) cy, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glViewport(0, 0, cx, cy);
Viewport[0] = Viewport[1] = 0.0f;
Viewport[2] = (GLfloat) cx;
Viewport[3] = (GLfloat) cy;
}
BOOL CTextureView::bSetupPixelFormat()
{
static PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
1, // version number
PFD_DRAW_TO_WINDOW | // support window
PFD_SUPPORT_OPENGL | // support OpenGL
PFD_DOUBLEBUFFER, // double buffered
PFD_TYPE_RGBA, // RGBA type
24, // 24-bit color depth
0, 0, 0, 0, 0, 0, // color bits ignored
0, // no alpha buffer
0, // shift bit ignored
0, // no accumulation buffer
0, 0, 0, 0, // accum bits ignored
32, // 32-bit z-buffer
0, // no stencil buffer
0, // no auxiliary buffer
PFD_MAIN_PLANE, // main layer
0, // reserved
0, 0, 0 // layer masks ignored
};
int pixelformat;
if ( (pixelformat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd)) == 0 )
{
MessageBox("ChoosePixelFormat failed");
return FALSE;
}
if (SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd) == FALSE)
{
MessageBox("SetPixelFormat failed");
return FALSE;
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -