📄 testglview.cpp
字号:
// TestGLView.cpp : implementation of the CTestGLView class
//
#include "stdafx.h"
#include "TestGL.h"
#include "TestGLDoc.h"
#include "gl/gl.h"
#include "gl/glu.h"
#include "GLEnabledView.h"
#include "TestGLView.h"
#include "OGLInfoDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// Vertices DataSets (convex polygons to tessellate)
// NOTE: the polygons will be automatically closed
GLdouble star[5][3]={
{0.2, 0.0, 0.0},
{0.5, 0.9, 0.0},
{0.8, 0.0, 0.0},
{0.0, 0.6, 0.0},
{1.0, 0.6, 0.0},
};
GLdouble Quad[4][3]={
{0.0, 0.0, 0.0},
{1.0, 0.0, 0.0},
{1.0, 1.0, 0.0},
{0.0, 1.0, 0.0},
};
GLdouble Triang[3][3]={
{0.3, 0.3, 0.0},
{0.7, 0.3, 0.0},
{0.5, 0.7, 0.0},
};
GLdouble Triang2[3][3]={
{0.5, 0.5, 0.0},
{1.5, 1.0, 0.0},
{1.5, 0.5, 0.0},
};
/////////////////////////////////////////////////////////////////////////////
// CTestGLView
IMPLEMENT_DYNCREATE(CTestGLView, CGLEnabledView)
BEGIN_MESSAGE_MAP(CTestGLView, CGLEnabledView)
//{{AFX_MSG_MAP(CTestGLView)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_COMMAND(ID_HELP_OGLINFO, OnHelpOglinfo)
ON_COMMAND(ID_TESSELATOR_FILL, OnTesselatorFill)
ON_UPDATE_COMMAND_UI(ID_TESSELATOR_FILL, OnUpdateTesselatorFill)
ON_COMMAND(ID_TESSELATOR_NEG, OnTesselatorNeg)
ON_UPDATE_COMMAND_UI(ID_TESSELATOR_NEG, OnUpdateTesselatorNeg)
ON_COMMAND(ID_TESSELATOR_NONZERO, OnTesselatorNonzero)
ON_UPDATE_COMMAND_UI(ID_TESSELATOR_NONZERO, OnUpdateTesselatorNonzero)
ON_COMMAND(ID_TESSELATOR_ODDRULE, OnTesselatorOddrule)
ON_UPDATE_COMMAND_UI(ID_TESSELATOR_ODDRULE, OnUpdateTesselatorOddrule)
ON_COMMAND(ID_TESSELATOR_POS, OnTesselatorPos)
ON_UPDATE_COMMAND_UI(ID_TESSELATOR_POS, OnUpdateTesselatorPos)
ON_COMMAND(ID_CHANGE_SCENE, OnChangeScene)
ON_COMMAND(ID_QUADRIC_FILL, OnQuadricFill)
ON_COMMAND(ID_QUADRIC_FLAT, OnQuadricFlat)
ON_COMMAND(ID_QUADRIC_INSIDE, OnQuadricInside)
ON_COMMAND(ID_QUADRIC_LINE, OnQuadricLine)
ON_COMMAND(ID_QUADRIC_NONE, OnQuadricNone)
ON_COMMAND(ID_QUADRIC_OUTSIDE, OnQuadricOutside)
ON_COMMAND(ID_QUADRIC_POINT, OnQuadricPoint)
ON_COMMAND(ID_QUADRIC_SILHOUETTE, OnQuadricSilhouette)
ON_COMMAND(ID_QUADRIC_SMOOTH, OnQuadricSmooth)
ON_COMMAND(ID_ENVIR_FLAT, OnEnvirFlat)
ON_COMMAND(ID_ENVIR_LIGHTING, OnEnvirLighting)
ON_COMMAND(ID_ENVIR_SMOOTH, OnEnvirSmooth)
ON_UPDATE_COMMAND_UI(ID_ENVIR_LIGHTING, OnUpdateEnvirLighting)
ON_UPDATE_COMMAND_UI(ID_QUADRIC_FILL, OnUpdateQuadricFill)
ON_UPDATE_COMMAND_UI(ID_QUADRIC_FLAT, OnUpdateQuadricFlat)
ON_UPDATE_COMMAND_UI(ID_QUADRIC_INSIDE, OnUpdateQuadricInside)
ON_UPDATE_COMMAND_UI(ID_QUADRIC_LINE, OnUpdateQuadricLine)
ON_UPDATE_COMMAND_UI(ID_QUADRIC_NONE, OnUpdateQuadricNone)
ON_UPDATE_COMMAND_UI(ID_QUADRIC_OUTSIDE, OnUpdateQuadricOutside)
ON_UPDATE_COMMAND_UI(ID_QUADRIC_POINT, OnUpdateQuadricPoint)
ON_UPDATE_COMMAND_UI(ID_QUADRIC_SILHOUETTE, OnUpdateQuadricSilhouette)
ON_UPDATE_COMMAND_UI(ID_QUADRIC_SMOOTH, OnUpdateQuadricSmooth)
ON_UPDATE_COMMAND_UI(ID_ENVIR_FLAT, OnUpdateEnvirFlat)
ON_UPDATE_COMMAND_UI(ID_ENVIR_SMOOTH, OnUpdateEnvirSmooth)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTestGLView construction/destruction
CTestGLView::CTestGLView():
X_Angle(0.0), Y_Angle(0.0),
TessWindRule(GLU_TESS_WINDING_ODD), TessFilling(TRUE),
sceneselect(0), quadricNormals(GLU_NONE),
quadricDwStyle(GLU_LINE), quadricOrientation(GLU_OUTSIDE)
{
// TODO: add construction code here
}
CTestGLView::~CTestGLView()
{
}
/////////////////////////////////////////////////////////////////////////////
// CTestGLView diagnostics
#ifdef _DEBUG
void CTestGLView::AssertValid() const
{
CGLEnabledView::AssertValid();
}
void CTestGLView::Dump(CDumpContext& dc) const
{
CGLEnabledView::Dump(dc);
}
CTestGLDoc* CTestGLView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTestGLDoc)));
return (CTestGLDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CTestGLView Overridables from CGLEnabledView
void CTestGLView::VideoMode(ColorsNumber & c, ZAccuracy & z, BOOL & dbuf)
{
// ask for 65355 colors...
c=THOUSANDS;
// ...16 bit Z-buffer...
z=NORMAL;
// ...double-buffering
dbuf=TRUE;
}
void CTestGLView::OnCreateGL()
{
// perform hidden line/surface removal (enable Z-Buffering)
glEnable(GL_DEPTH_TEST);
// set background color to black
glClearColor(0.f,0.f,0.f,1.0f );
// set clear Z-Buffer value
glClearDepth(1.0f);
// create and enable a white directional light
float color[]={1.f,1.f,1.f,1.f};// RGBA color spec
glLightfv(GL_LIGHT0,GL_DIFFUSE,color);
float ambient[]={.3f,.3f,.3f,1.f};// RGBA color spec
glLightfv(GL_LIGHT0,GL_AMBIENT,ambient);
float pos[]={1.f,1.f,1.f,0.f};
glLightfv(GL_LIGHT0,GL_POSITION,pos);
glEnable(GL_LIGHT0);
// prepare a bunch of line segments (carthesian axes arrows)
StartStockDListDef();
glBegin(GL_LINES);
// yellow x axis arrow
glColor3f(1.f,1.f,0.f);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(1.0f,0.0f,0.0f);
glVertex3f(1.0f,0.0f,0.0f);
glVertex3f(0.9f,0.1f,0.0f);
glVertex3f(1.0f,0.0f,0.0f);
glVertex3f(0.9f,-0.1f,0.0f);
// cyan y axis arrow
glColor3f(0.f,1.f,1.f);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glVertex3f(0.1f,0.9f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glVertex3f(-0.1f,0.9f,0.0f);
// magenta z axis arrow
glColor3f(1.f,0.f,1.f);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f,0.0f,1.0f);
glVertex3f(0.0f,0.0f,1.0f);
glVertex3f(0.0f,0.1f,0.9f);
glVertex3f(0.0f,0.0f,1.0f);
glVertex3f(0.0f,-0.1f,0.9f);
glEnd();
EndStockListDef();
// prepare a single display list (yet another cube)
anothercube.StartDef();// <- do not execute list immediately
glBegin(GL_QUADS);
glColor3f(0.4f,.2f,.7f);
glVertex3f(0.1f,0.1f,.1f);
glVertex3f(0.6f,.1f,.1f);
glVertex3f(0.6f,0.6f,.1f);
glVertex3f(0.1f,0.6f,.1f);
glColor3f(.8f,1.f,.2f);
glVertex3f(0.1f,0.1f,.6f);
glVertex3f(0.6f,.1f,.6f);
glVertex3f(0.6f,0.6f,.6f);
glVertex3f(0.1f,0.6f,.6f);
glEnd();
glBegin(GL_QUAD_STRIP);
glColor3f(0.4f,.2f,.7f);
glVertex3f(0.1f,0.1f,.1f);
glVertex3f(0.1f,0.1f,.6f);
glColor3f(.8f,1.f,.2f);
glVertex3f(0.6f,.1f,.1f);
glVertex3f(0.6f,.1f,.6f);
glColor3f(0.4f,.2f,.7f);
glVertex3f(0.6f,0.6f,.1f);
glVertex3f(0.6f,0.6f,.6f);
glColor3f(.8f,1.f,.2f);
glVertex3f(0.1f,0.6f,.1f);
glVertex3f(0.1f,0.6f,.6f);
glColor3f(0.4f,.2f,.7f);
glVertex3f(0.1f,0.1f,.1f);
glVertex3f(0.1f,0.1f,.6f);
glEnd();
anothercube.EndDef();
// prepare tesselator demo objects
BuildTessDispList();
// prepare quadric disp list
BuildQuadrDispList();
}
void CTestGLView::BuildTessDispList()
{
// create a display list for the convex polygons
CGLTesselator t;
tessPolygon.StartDef();
// set winding rule and filling
t.SetWindingRule(TessWindRule);
t.SetFilling(TessFilling);
// first polygon: a quadrilateral with a triangular hole
t.StartDef();
// define exterior
t.AddVertexArray(Quad,4);
// define hole
t.ContourSeparator();
t.AddVertexArray(Triang,3);
t.EndDef();
// move "the 3d cursor" right
glTranslatef(1.f,0.f,0.f);
// second polygon: a star (defined vertex per vertex)
t.StartDef();
for (int c=0;c<5;c++)
{
t.AddVertex(star[c]);
};
t.EndDef();
// move "the 3d cursor" right again
glTranslatef(1.f,0.f,0.f);
// third polygon: a quadrilateral and an intersecting triangle
// NOTE: the intersecting triangle has vertices in CCW order
// this has effect on positive and negative winding rule
t.StartDef();
t.AddVertexArray(Quad,4);
t.ContourSeparator();
t.AddVertexArray(Triang2,3);
t.EndDef();
// close disp list definition
tessPolygon.EndDef();
}
void CTestGLView::BuildQuadrDispList()
{
const int SECTIONS=16;
const double RADIUS=.5;
// construct a quadric object
CGLQuadric q(quadricDwStyle,quadricNormals,quadricOrientation);
// open disp list definition
quadric.StartDef();
// draw an azure sphere
glColor3f(.2f,.5f,.8f);
q.DrawSphere(RADIUS,SECTIONS,SECTIONS);
glTranslatef(1.2f, 0.0f, 0.0f);
// draw a maroon cylinder
glColor3f(.8f,.5f,.2f);
q.DrawCylinder(RADIUS,RADIUS,1.0,SECTIONS,2);
glTranslatef(-2.4f, 0.0f, 0.0f);
// draw a green disk
glColor3f(.5f,.8f,.2f);
q.DrawDisk(RADIUS-.3,RADIUS,SECTIONS,2);
// close disp list definition
quadric.EndDef();
}
void CTestGLView::OnDrawGL()
{
// the couple glPush - glPop is necessary because the entire
// scene is rotated of the given angle (which is absolute) at every redraw
glPushMatrix();
// rotate the objects of the given angle
glRotated(X_Angle,1.0,0.0,0.0);
glRotated(Y_Angle,0.0,1.0,0.0);
// this should be self explanatory
DrawStockDispLists();
switch(sceneselect)
{
case 0:// simple scene
// draw directly an RGB cube
glBegin(GL_QUAD_STRIP);
glColor3f(1.0f, 0.0f, 1.0f);
glVertex3f(-0.3f, 0.3f, 0.3f);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(-0.3f, -0.3f, 0.3f);
glColor3f(1.0f, 1.0f, 1.0f);
glVertex3f(0.3f, 0.3f, 0.3f);
glColor3f(1.0f, 1.0f, 0.0f);
glVertex3f(0.3f, -0.3f, 0.3f);
glColor3f(0.0f, 1.0f, 1.0f);
glVertex3f(0.3f, 0.3f, -0.3f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.3f, -0.3f, -0.3f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(-0.3f, 0.3f, -0.3f);
glColor3f(0.0f, 0.0f, 0.0f);
glVertex3f(-0.3f, -0.3f, -0.3f);
glColor3f(1.0f, 0.0f, 1.0f);
glVertex3f(-0.3f, 0.3f, 0.3f);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(-0.3f, -0.3f, 0.3f);
glEnd();
glBegin(GL_QUADS);
glColor3f(1.0f, 0.0f, 1.0f);
glVertex3f(-0.3f, 0.3f, 0.3f);
glColor3f(1.0f, 1.0f, 1.0f);
glVertex3f(0.3f, 0.3f, 0.3f);
glColor3f(0.0f, 1.0f, 1.0f);
glVertex3f(0.3f, 0.3f, -0.3f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(-0.3f, 0.3f, -0.3f);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(-0.3f, -0.3f, 0.3f);
glColor3f(1.0f, 1.0f, 0.0f);
glVertex3f(0.3f, -0.3f, 0.3f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.3f, -0.3f, -0.3f);
glColor3f(0.0f, 0.0f, 0.0f);
glVertex3f(-0.3f, -0.3f, -0.3f);
glEnd();
// execute previously prepared displ. list 2 times
// Note:All translations are relative (imagine to deal with a "3D cursor")
glTranslatef(-1.35f,-0.2f,-0.2f);
anothercube.Draw();
glTranslatef(2.f,0.f,0.f);
anothercube.Draw();
break;
case 1: // tesselators scene
// move left to almost center the tesselators display list
glTranslatef(-1.5f,0.f,0.1f);
// choose the color and draw
glColor3f(1.f,1.f,1.f);
tessPolygon.Draw();
break;
case 2: // quadric scene
quadric.Draw();
break;
};
glPopMatrix();
}
/////////////////////////////////////////////////////////////////////////////
// CTestGLView message handlers
void CTestGLView::OnLButtonDown(UINT nFlags, CPoint point)
{
// remember where we clicked
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -