int tex_n,int level)
(
string temp,fname,fext; temp=str;
int npos,fpos,tex_i=0,ret=0;
// генерирует tex_n имен для текстур glGenTextures(tex_n, tex); while(npos>=0)
(
npos=temp.find(' ',0); // ищем пробел
fname=temp.substr(0,npos); // выделить имя файла fpos=fname.rfind('.'); // ищем точку с конца // выделение расширения файла fext=fname.substr(fpos+1); if(fext=="bmp") if(!loadbmp((char*)fname.c_str())) return 0; if(fext=="tga") if( ! loadtga((char*)fname.c_str())) return 0; temp.erase(0,npos+1);
// используем 24- или 32-битные текстуры if(bpp>=24)
(
glBindTexture(GL_TEXTURE_2D,tex[tex_i++]);
// способ интерполяции в случае,
// когда рисунок меньше исходного размера glTexParameteri(GL_TEXTURE_2D,
GL_TEXTURE_MIN_FILTER,GL_LINEAR);
// способ интерполяции в случае,
// когда рисунок большего размера glTexParameteri(GL_TEXTURE_2D,
GL_TEXTURE_MAG_FILTER,GL_LINEAR);
// повторение текстуры в направлении s glTexParameteri(GL_TEXTURE_2D,
GL_TEXTURE_WRAP_S,GL_REPEAT); // повторение текстуры в направлении t glTexParameteri(GL_TEXTURE_2D,
GL TEXTURE WRAP T,GL REPEAT);
// выбираем только цвет текстуры glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, (float)GL_REPLACE);
// устанавливаем изображение как текстуру glTexImage2D(GL_TEXTURE_2D,level, (bpp==24)? 3:4, width,height,0,(bpp==24)?GL_RGB:GL_RGBA, GL_UNSIGNED_BYTE,inddata) ; re t + +;
}
}
return ret; // число загруженных текстур }
// вывод изображения в буфер цвета // в текущую растровую позицию void IMAGE::tocolor()
{
switch(bpp)
{
case 1:
glBitmap(width,height,0,0,width, height,inddata) ; break;
case 8:// не забудьте настроить палитру в OpenGl glDrawPixels(width,height,GL_COLOR_INDEX, GL_UNSIGNED_BYTE,inddata);
break; case 24 :
glDrawPixels(width,height,GL_RGB,
GL_UNSIGNED_BYTE, inddata);
break; case 32:
glDrawPixels(width,height,GL_RGBA,
GL_UNSIGNED_BYTE,inddata);
break; default:;
}
}
// установка палитры изображения в OpenGl void IMAGE::glsetpal(int r,int g,int b,int a,
int start,int num)
{
if(num==0)num=sizepal; float* temp=new float[num];
if(r) // таблица преобразования красного канала {
for(int i=start,j=0;i<num+start;i++) temp[j++]=(float)pal[i*4]/255.0; glPixelMapfv(GL_PIXEL_MAP_I_TO_R,num,temp);
}
if(g) // таблица преобразования зеленого канала {
for(int i=start,j=0;i<num+start;i++) temp[j + +] =(float)pal[i*4+l]/255.0; glPixelMapfv(GL_PIXEL_MAP_I_TO_G,num,temp);
}
if(b) // таблица преобразования синего канала
{
for(int i=start,j =0;i<num+start;i + +) temp[j++]=(float)pal[i*4+2]/255.0; glPixelMapfv(GL_PIXEL_MAP_I_TO_B, num, temp);
}
if(a) // таблица преобразования альфа-канала
{
for(int i=start,j =0;i<num+start;i + +) temp[j++]=(float)pal[i*4+3]/255.0; glPixelMapfv(GL_PIXEL_MAP_I_TO_A,num,temp);
}
delete[]temp;
// вывод изображения в буфер трафарета void IMAGE::tostencil()
{
switch(bpp)
{
case 1:
glDrawPixels(width,height,
GL_STENCIL_INDEX,GL_BITMAP,inddata);
break;
case 8:
glDrawPixels(width,height,GL_STENCIL_INDEX, GL_UNSIGNED_BYTE,inddata);