📄 picturegl.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 + -