Hi Sir,
Thanks for your replying.
I am posting the code below :
kindly see the code :
#include<GL/glut.h>
#include<GL/glu.h>
#include<GL/gl.h>
#include<time.h>
#include<math.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define ESCAPE 27
int window,click=0,limit=0;
float ytheta=0;
GLint texture[4];
int nval = 16,i;
GLfloat base[90][3], top[90][3];
struct timespec t;
struct Image
{
unsigned long sizeX;
unsigned long sizeY;
char *data;
GLuint *genID;
};
struct Image image1;
struct Image image2;
struct Image image3;
struct Image *image;
int ImageLoad(char *filename, struct Image *image)
{
FILE *file;
unsigned long size;
unsigned long i;
unsigned short int planes;
unsigned short int bpp;
char temp;
if ((file = fopen(filename, “rb”))==NULL)
{
printf("File Not Found : %s
",filename);
return 0;
}
fseek(file, 18, SEEK_CUR);
if ((i = fread(&image->sizeX, 4, 1, file)) != 1)
{
printf("Error reading width from %s.
", filename);
return 0;
}
printf("Width of %s: %lu
", filename, image->sizeX);
if ((i = fread(&image->sizeY, 4, 1, file)) != 1)
{
printf("Error reading height from %s.
", filename);
return 0;
}
printf("Height of %s: %lu
", filename, image->sizeY);
size = image->sizeX * image->sizeY * 3;
if ((fread(&planes, 2, 1, file)) != 1)
{
printf("Error reading planes from %s.
", filename);
return 0;
}
if (planes != 1) {
printf("Planes from %s is not 1: %u
", filename, planes);
return 0;
}
if ((i = fread(&bpp, 2, 1, file)) != 1) {
printf("Error reading bpp from %s.
", filename);
return 0;
}
if (bpp != 24) {
printf("Bpp from %s is not 24: %u
", filename, bpp);
return 0;
}
fseek(file, 24, SEEK_CUR);
image->data = (char *) malloc(size);
if (image->data == NULL) {
printf("Error allocating memory for color-corrected image data");
return 0;
}
if ((i = fread(image->data, size, 1, file)) != 1)
{
printf("Error reading image data from %s.
", filename);
return 0;
}
for (i=0;i<size;i+=3) {
temp = image->data[i];
image->data[i] = image->data[i+2];
image->data[i+2] = temp;
}
return 1;
}
void spin()
{
if(click==1)
{
ytheta+=5.0;
if(ytheta>=360.0)
ytheta=0;
limit++;
if(limit==9)
{
click=0;
limit=0;
}
}
glutSwapBuffers();
glutPostRedisplay();
}
void mouse (GLint btn, GLint state, GLint x, GLint y)
{
if (btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
click = 1;
}
else if (btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
{
click = 1 ;
}
}
void loadimage()
{
int wrap;
ImageLoad(“p1.bmp”, &image1);
ImageLoad(“pa1.bmp”, &image2);
ImageLoad(“pa3.bmp”, &image3);
glGenTextures(3,&image->genID);
glBindTexture(GL_TEXTURE_2D, &image->genID); // 2d texture (x and y size)
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // scale linearly when image bigger than texture
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // scale linearly when image smalled than texture
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,wrap ? GL_REPEAT : GL_CLAMP_TO_BORDER );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,wrap ? GL_REPEAT : GL_CLAMP_TO_BORDER );
glTexImage2D(GL_TEXTURE_2D, 0, 3, image->sizeX, image->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, image->data);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
}
void load (GLfloat a[][3], int n, GLfloat r, GLfloat offset, GLfloat zval)
{
GLfloat delta=2M_PI/(float)n, theta=0.0;
GLint i;
for (i=0;i<n;i++)
{
a[i][0]=rcos(theta+offset);
a[i][1]=r*sin(theta+offset);
a[i][2]=zval;
theta += delta;
}
}
void init()
{
glEnable(GL_TEXTURE_2D);
glClearColor(1.0,0.0,0.0,0.0);
glClearDepth(1.0);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-100.0,100.0,-100.0,100.0,-100.0,100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef (0.0,0.0,-20.0) ;
loadimage ();
}
void cylinder ()
{
GLfloat base[90][3], top[90][3];
int nval = 16,i;
load (base,nval,40.0,90.0,0.0) ;
load (top,nval,40.0,90.0,90.0) ;
//LoadGLTextures(image1,0);
//glBindTexture(GL_TEXTURE_2D, texture[0]);
glBegin (GL_QUADS) ;
for (i=0;i<nval;i+=2)
{
// glColor3f (0.01*i,0.5,0.5) ;
glColor3f(1.0,0.0,1.0);
glVertex3fv(base[i]);
glVertex3fv(base[(i+1)%nval]);
glVertex3fv(top[(i+1)%nval]);
glVertex3fv(top[i]);
}
glEnd () ;
glBegin (GL_QUADS) ;
for (i=1;i<nval;i+=2)
{
glTexCoord2f(0.0f, 0.0f);
glVertex3fv(base[i]);
glTexCoord2f(1.0f, 0.0f);
glVertex3fv(base[(i+1)%nval]);
glTexCoord2f(1.0f, 1.0f);
glVertex3fv(top[(i+1)%nval]);
glTexCoord2f(0.0f, 1.0f);
glVertex3fv(top[i]);
}
glEnd ();
glBegin(GL_POLYGON);
for(i=0;i<100;i++)
glVertex3f(top[i][0],top[i][1],90);
glEnd();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt (0.0,-80.0,30.0,0.0,0.0,0.0,0.0,-80.0,31.0) ;
glRotatef(ytheta,0,0,1);
glBindTexture ( GL_TEXTURE_2D, image1.genID);
cylinder();
glBindTexture ( GL_TEXTURE_2D, image3.genID);
cylinder();
glDisable(GL_BLEND);
glutPostRedisplay();
glutSwapBuffers();
}
void CreateMultiTexture()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glOrtho(-2,2,-2,2, -1,1 );
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_COLOR,GL_DST_COLOR);
glBlendColor(.5,.5,.5,.5);
for(i=1;i<nval;i+=2)
{
if(i==1||i==13)
{
glBindTexture ( GL_TEXTURE_2D, image1.genID);
glBegin(GL_QUADS);
glTexCoord2f(0,0);
glVertex3fv(base[i]);
glTexCoord2f(1,0);
glVertex3fv(base[(i+1)%nval]);
glTexCoord2f(1,1);
glVertex3fv(top[(i+1)%nval]);
glTexCoord2f(0,1);
glVertex3fv(top[i]);
glEnd();
}
if(i==5||i==17)
{
glBindTexture ( GL_TEXTURE_2D, image3.genID);
glBegin(GL_QUADS);
glTexCoord2f(0,0); glVertex2f(-1,-1);
glTexCoord2f(1,0); glVertex2f( 1,-1);
glTexCoord2f(1,1); glVertex2f( 1, 1);
glTexCoord2f(0,1); glVertex2f(-1, 1);
glEnd();
}
}
glDisable(GL_BLEND);
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glutSwapBuffers();
// glutDisplayFunc(display); // now that you have mixed texture, do real display
}
int main(int argc,char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,0);
glutCreateWindow(“Cylinder”);
glutDisplayFunc(display);
glutIdleFunc(spin);
glutMouseFunc(mouse);
init();
glutMainLoop();
}
This is giving segmentation fault.
How to eliminate that fault ?
Kindly requesting You to check the output.
i am Thankful for your reply.