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

📄 myopengl.cpp

📁 本站以C语言和Java语言、嵌入式开发、算法实现为主
💻 CPP
字号:
// MyOpenGL.cpp: implementation of the CMyOpenGL class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#include "MyOpenGL.h"

#include "vuAllocArray.h"
#include "vuImageFactory.h"
#include "vuTime.h"
#include "vrGeometry.h"
#include "vrMode.h"
#include "vrTextureFactory.h"
#include "vsgs.h"
#include <GL/glu.h>
#include "vpObserver.h"
#include "vpApp.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
FONTS *begin,*end;

CMyOpenGL::CMyOpenGL()
{
  
}

CMyOpenGL::~CMyOpenGL()
{
}

 
 /*void CMyOpenGL::notify(vsChannel::Event, const vsChannel *,
		vsTraversalCull *) {}*/

 
 void CMyOpenGL:: mydraw()
 {

	 //创建字体
	 static bool bFirst1=true;
	 if(bFirst1){
		 BuildFont();
		 bFirst1=false;
	 }

    //glDisable( GL_DEPTH_TEST );
	GLint frontFace;
	glGetIntegerv(GL_FRONT_FACE, &frontFace);
	GLboolean lightFlag = glIsEnabled(GL_LIGHTING);
	if (lightFlag == GL_TRUE) {
		glDisable(GL_LIGHTING);
	}
	
	glMatrixMode(GL_PROJECTION);
	glPushMatrix();
	glLoadIdentity();
	int w=1,h=1;
	gluOrtho2D(0, w, 0, h);
	glScaled(0.025,0.025,0.025);
	glTranslatef(0, 30, 0);
	
	glMatrixMode(GL_MODELVIEW);
	glPushMatrix();
	glLoadIdentity();
    glColor3ub( 255,  0,  0 ); 
    glPrint("vega prime中主页阿所里肯德基发");										// 绘制字符串
    glPopMatrix();
	 if (lightFlag == GL_TRUE) {
		 glEnable(GL_LIGHTING); // Turn Lighting on
	 }
	 if (frontFace == GL_CCW) {
		 glFrontFace(GL_CCW);
	 } else {
		 glFrontFace(GL_CW);
	 }


  
	glEnable( GL_DEPTH_TEST );
 }
 void CMyOpenGL::notify(vsChannel::Event e, const vsChannel *channel,
 		vrDrawContext *context) 
 {
	 if(e!=vsChannel::EVENT_POST_DRAW)
		 return;


			 
	   	 vrStateMgr *stateMgr = context->getStateMgr();
         stateMgr->pushAll(context, true);
		 
         
		 mydraw();
		 
		 stateMgr->popAll(context);

	}

int CMyOpenGL::configure()
{     
	
	  vpChannel *m_chan = vpChannel::find("myChannel");
	  ASSERT(m_chan);
	  m_chan->addSubscriber(vpChannel::EVENT_POST_DRAW, this);
	  return vsgu::SUCCESS;

}

 

GLvoid CMyOpenGL::BuildFont(GLvoid)
{
   newFont = CreateFont(	-24,									// 字体的高度
							0,										// 字体的宽度
							0,										// 旋转的角度
							0,										// 定位角度
							FW_BOLD,								// 字体的粗细
							FALSE,									// 斜体?
							FALSE,									// 下划线?
							FALSE,									// 删除线?
							GB2312_CHARSET,							// 字符集
							OUT_TT_PRECIS,							// 输出精度
							CLIP_DEFAULT_PRECIS,					// 裁减精度
							ANTIALIASED_QUALITY,					// 输出质量
							FF_DONTCARE|DEFAULT_PITCH,				// 间距和字体族
							"宋体");								// 字体名称

	oldFont = (HFONT)SelectObject(*(*vpWindow::begin())->getDisplayContext(), newFont);		// 选进设备描述表
	end = begin = NULL;												// 初始化指针
}


GLvoid CMyOpenGL::glPrint(const char *fmt, ...)					// Custom GL "Print" Routine
{
	char		text[256];											// 保存格式化后的字符串
	DWORD		dwChar[256];										// 保存转换后的字符串
	GLfloat		width=0;											// 保存绘制出的字符串x方向总宽度
	va_list		ap;													// 指向参数列表的指针
	int			length = 0;											// 用以保存整个字符串长度

	if (fmt == NULL)												// 没有可输出的字符?
		return;														// 返回

	va_start(ap, fmt);												// 遍历字符串,查找变量
		vsprintf(text, fmt, ap);									// 将变量转换为显示的数字
	va_end(ap);														// 结果保存在text内

	FONTS *pfont;
	for (size_t i=0; i<strlen((char *)text); i++)					// 循环字符串,转换汉字
	{
		if (IsDBCSLeadByte(text[i]))								// 如果是汉字
		{
			dwChar[length] = (DWORD)((text[i] << 8) | (BYTE)text[i+1]);	// 两个字节组合成一个DWORD并存储
			i++;													// 跳过一字节
		}
		else
		{
			dwChar[length] = text[i];								// 存储其它字符
		}

		for (pfont=begin; pfont!=NULL; pfont=pfont->next)			// 在链表中搜索字符
		{
			if (pfont->val == dwChar[length])						// 在链表中存在
				break;												// 不再搜索字符
		}

		if (pfont == NULL)											// 如果在链表中不存在
		{
			pfont = AddFont(dwChar[length]);						// 添加字体到链表中去
		}
		width += pfont->gmf.gmfCellIncX;							// 计算绘制出的字符串的宽度
		length++;													// 转化后的字符串长度
	}

	glPushAttrib(GL_LIST_BIT);										// 显示表状态入栈
	//glTranslatef(-width/2, 0.0f, 0.0f);								// 使字符串置中
	for (int k=0; k<length; k++)									// 遍历字符串
	{
		for (pfont=begin; pfont!=NULL; pfont=pfont->next)			// 查找字符
		{
			if (pfont->val == dwChar[k])							// 找到字符
			{
				glCallList(pfont->listName);						// 绘制出字符
				break;												// 停止查找字符
			}
		}
	}
	glPopAttrib();													// 显示表状态出栈
}

FONTS* CMyOpenGL::AddFont(DWORD dwChar)										// 在链表里添加字体
{
	if (begin == NULL)												// 如果链表里没有内容
		begin = end = new FONTS;
	else															// 增加链表元素
	{
		end->next = new FONTS;
		end = end->next;
	}
	end->next = NULL;												// 链表的结尾
	end->val  = dwChar;												// 保存字体值
	end->listName = glGenLists(1);									// 建立字体
	wglUseFontOutlines(*(*vpWindow::begin())->getDisplayContext(), dwChar, 1, end->listName, 0.0f, 0.1f, WGL_FONT_POLYGONS, &end->gmf);

	return end;														// 返回最后一个字体的指针
} 

 

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -