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

📄 picturegl.cpp

📁 是3D游戏一书中所讲的游戏引擎fly3D 包括fly3D引擎的源码及应用此引擎开发出来的游戏实例 有fly3D引擎的教程,易于step by step跟学
💻 CPP
字号:
#include "../Fly3D.h"

textcacheGL::textcacheGL()
{
	tex=0;
}

textcacheGL::~textcacheGL()
{
	reset();
}

void textcacheGL::reset()
{
	int i;
	for( i=0;i<npic;i++ )
		free_tex(i);
	if (tex)
		{
		glDeleteTextures(npic,tex);
		delete tex;
		}
	tex=0;
	npic=0;
}

void textcacheGL::init(int np,picture **pic)
{
	reset();
	
	if (np)
		{
		npic=np;
		tex=new unsigned[npic];
		glGenTextures(npic,tex);
		for( int i=0;i<npic;i++)
			if (pic[i]->buf)
				load_tex(i,pic[i]->sx,pic[i]->sy,pic[i]->bytespixel,pic[i]->buf[0]);
		memset(curpic,-1,sizeof(int)*MAX_TEXTURE_UNITS);
		}
}

void textcacheGL::load_tex(int pic,int sx,int sy,int bytespixel,unsigned char *buf)
{
	glBindTexture(GL_TEXTURE_2D,tex[pic]);
	if (bytespixel==4)
		glTexImage2D(GL_TEXTURE_2D,0,4,sx,sy,0,GL_RGBA,GL_UNSIGNED_BYTE,buf);
	else 
		glTexImage2D(GL_TEXTURE_2D,0,3,sx,sy,0,GL_RGB,GL_UNSIGNED_BYTE,buf);

	if (mipmap)
	{
		if (bytespixel==4)
			gluBuild2DMipmaps(GL_TEXTURE_2D,4,sx,sy,GL_RGBA,GL_UNSIGNED_BYTE,buf);
		else
			gluBuild2DMipmaps(GL_TEXTURE_2D,3,sx,sy,GL_RGB,GL_UNSIGNED_BYTE,buf);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,textfilter?GL_LINEAR_MIPMAP_LINEAR:GL_NEAREST);
	}
	else
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,textfilter?GL_LINEAR:GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,textfilter?GL_LINEAR:GL_NEAREST);
}

void textcacheGL::free_tex(int pic)
{
	glBindTexture(GL_TEXTURE_2D,tex[pic]);
	glTexImage2D(GL_TEXTURE_2D,0,3,0,0,0,GL_RGB,GL_UNSIGNED_BYTE,0);
}

int textcacheGL::add_picture(int sx,int sy,int bytespixel,unsigned char *buf)
{
	unsigned *tmp=new unsigned[npic+1];
	if (tex)
		{
		memcpy(tmp,tex,sizeof(unsigned)*npic);
		delete tex;
		}
	tex=tmp;
	
	glGenTextures(1,&tex[npic]);

	glBindTexture(GL_TEXTURE_2D,tex[npic]);
	if (bytespixel==4)
		glTexImage2D(GL_TEXTURE_2D,0,4,sx,sy,0,GL_RGBA,GL_UNSIGNED_BYTE,buf);
	else 
		glTexImage2D(GL_TEXTURE_2D,0,3,sx,sy,0,GL_RGB,GL_UNSIGNED_BYTE,buf);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,textfilter?GL_LINEAR:GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,textfilter?GL_LINEAR:GL_NEAREST);

	return npic++;
}

void textcacheGL::update_picture(int picnum,int sx,int sy,int bytespixel,unsigned char *buf)
{
	glBindTexture(GL_TEXTURE_2D,tex[picnum]);
	if (bytespixel==4)
		glTexImage2D(GL_TEXTURE_2D,0,4,sx,sy,0,GL_RGBA,GL_UNSIGNED_BYTE,buf);
	else 
		glTexImage2D(GL_TEXTURE_2D,0,3,sx,sy,0,GL_RGB,GL_UNSIGNED_BYTE,buf);
}

void textcacheGL::update_sub_picture(int picnum,int x,int y,int sx,int sy,int bytespixel,unsigned char *buf)
{
	glBindTexture(GL_TEXTURE_2D,tex[picnum]);
	if (bytespixel==4)
		glTexSubImage2D(GL_TEXTURE_2D,0,x,y,sx,sy,GL_RGBA,GL_UNSIGNED_BYTE,buf);
	else 
		glTexSubImage2D(GL_TEXTURE_2D,0,x,y,sx,sy,GL_RGB,GL_UNSIGNED_BYTE,buf);
}

⌨️ 快捷键说明

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