⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testglview.cpp

📁 如何在自己的ActiveX控件中集成OpenGL功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -