I am doing a mini project on solar system using openGL.I am trying to create two windows ,the first one shows my name,college name and other details and the second one will show the solar system.My second screen is working perfectly fine ,but i am not able to print any text on my first screen.Below is the code,can anyone check my code and tell me where's the error.
#include<GL/glut.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
static int m=0,M=0,v=0,V=0,E=0,e=0,r=0,R=0,j=0,J=0,s=0,S=0,U=0,u=0,n=0,N=0,X=0,z=0,B=0,b=0,c=0;
static GLint axis=2;
int isMainScreen=1;
GLfloat diffuseMaterial[4]={0.5,0.5,0.5,1.0};
/*initialize material property,light soure,lighting model,and depth buffer*/
void drawString1(float x, float y, float z, char * string) {
char * c;
glRasterPos3f(x, y, z);
for (c = string; * c != '\0'; c++) {
glutBitmapCharacter(GLUT_BITMAP_9_BY_15, * c);
}
}
void myinit(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
GLfloat mat_specular[]={1.0,1.0,1.0,1.0};
GLfloat light_position[]={1.0,1.0,1.0,0.0};
glMaterialfv(GL_FRONT,GL_DIFFUSE,diffuseMaterial);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialf(GL_FRONT,GL_SHININESS,25.0);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
glColorMaterial(GL_FRONT,GL_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
}
void display(void)
{
GLfloat position[]={0.0,0.0,1.5,1.0};
glColor3f(1.0,0.5,0.0);
glPushMatrix();
glRotatef((GLfloat)z,1.0,1.0,1.0);
glLightfv(GL_LIGHT0,GL_POSITION,position);
glDisable(GL_LIGHTING);
glutSolidSphere(0.8,40,16); /*draw sun*/
glPopMatrix();
glPushMatrix();
glLightfv(GL_LIGHT0,GL_POSITION,position);
glDisable(GL_LIGHTING);
glEnable(GL_LIGHTING);
glColor3f(1.5,0.5,0.0);
glutSolidTorus(0.2,0.9,6,20);
glPopMatrix();
glPushMatrix();
glRotatef((GLfloat)M,0.0,1.0,0.0);
glTranslatef(1.5,0.0,0.0);
glRotatef((GLfloat)m,0.0,1.0,0.0);
glColor3f(1.0,0.0,0.0);
glutSolidSphere(0.2,20,8); /*draw smaller planet mercury*/
glPopMatrix();
glPushMatrix();
glRotatef((GLfloat)V,0.0,1.0,0.0);
glTranslatef(2.0,0.0,1.0);
glRotatef((GLfloat)v,0.0,1.0,0.0);
glColor3f(7.5,9.5,1.0);
glutSolidSphere(0.2,20,8); /*draw smaller plant venus*/
glPopMatrix();
glPushMatrix();
glRotatef((GLfloat)E,0.0,1.0,0.0);
glTranslatef(3.5,0.0,0.0);
glRotatef((GLfloat)e,0.0,1.0,0.0);
glColor3f(0.1,6.5,2.0);
glutSolidSphere(0.2,20,8); /*draw smaller plant earth*/
glRotatef((GLfloat)X,0.0,1.0,0.0);
glTranslatef(0.3,0.2,0.0);
glColor3f(4.3,3.5,8.0);
glutSolidSphere(0.1,20,14); /*draw moon*/
glPopMatrix();
glPushMatrix();
glRotatef((GLfloat)R,0.0,1.0,0.0);
glTranslatef(5.0,0.0,3.0);
glRotatef((GLfloat)r,0.0,1.0,0.0);
glColor3f(1.0,0.2,0.0);
glutSolidSphere(0.2,20,8); /*draw smaller planet mars*/
glPopMatrix();
glPushMatrix();
glRotatef((GLfloat)J,0.0,1.0,0.0);
glTranslatef(-2.5,0.0,1.0);
glRotatef((GLfloat)j,0.0,1.0,0.0);
glColor3f(0.9,0.7,0.3);
glutSolidSphere(0.2,20,8);/*draw smaller planet Jupiter*/
glPopMatrix();
glPushMatrix();
glRotatef((GLfloat)S,0.0,1.0,0.0);
glTranslatef(-5.0,0.0,0.0);
gluLookAt(0.0,10.0,2.0,1.0,0.0,0.0,0.0,0.0,1.0);
glRotatef((GLfloat)s,0.0,0.0,5.0);
glColor3f(4.5,0.5,0.0);
glutSolidSphere(0.5,20,16); /*draw smaller plant Saturn*/
int i=0;
glBegin(GL_QUAD_STRIP);
for(i=0;i<=360;i++)
{
glVertex3f(sin(i*3.1416/180)*0.5,cos(i*3.1416/180)*0.5,0);
glVertex3f(sin(i*3.1416/180)*0.7,cos(i*3.1416/180)*0.7,0);
}
glEnd();
glPopMatrix();
glPushMatrix();
glRotatef ((GLfloat) U, 0.0, 1.0,0.0);
glTranslatef (-6.5, 0.0, 0.0);
gluLookAt (10.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 10.0, 1.0);
glRotatef((GLfloat) u, 0.0, 0.0, 5.0);
glColor3f( 1.2, 0.6,0.2);
glutSolidSphere (0.5, 20, 16); /* draw smaller planet Uranus*/
glBegin(GL_QUAD_STRIP);
for(i=0; i<=360; i++)
{
glVertex3f(sin(i*3.1416/180)*0.5,cos(i*3.1416/180)*0.5, 0);
glVertex3f(sin(i*3.1416/180)*0.7, cos(i*3.1416/180)*0.7,0);
}
glEnd();
glPopMatrix();
glPushMatrix();
glRotatef ((GLfloat) N,0.0, 1.0, 0.0);
glTranslatef (-8.0, 0.0, 0.0);
glRotatef ((GLfloat) n, 0.0, 1.0, 0.0);
glColor3f(1.0, 2.0, 0.0);
glutSolidSphere(0.4, 20, 8);
glPopMatrix();/* draw smaller planet Neptune */
glPushMatrix();
glRotatef ((GLfloat) c, 6.0, -14.0,-6.0);
glTranslatef (5.0,3.0,-1.0);
glScalef(0.60,0.0,2.5);
glColor3f (7.5, 9.5, 2.0);
glutSolidSphere (0.2, 12, 6);
glPopMatrix();/*draw comet*/
//to put the stars as a background
glPushMatrix();
glTranslatef(0.0,-2.0,0.0);
gluLookAt(0.0,10.0,0.0,1.0,0.0,0.0,0.0,0.0,3.0);
glRotatef((GLfloat)b,0.0,0.0,0.0);
glScalef(200.0,0.0,0.0);
glColor3f(4.3,3.5,1.0);
glutSolidSphere(0.04,20,8);
glPopMatrix();
glPushMatrix();
glTranslatef(0.0,2.0,0.0);
gluLookAt(0.0,10.0,2.0,1.0,0.0,0.0,0.0,0.0,1.0);
glRotatef((GLfloat)b,0.0,0.0,0.0);
glScalef(200.0,0.0,0.0);
glColor3f(4.3,3.5,1.0);
glutSolidSphere(0.04,20,8);
glPopMatrix();
glPushMatrix();
glTranslatef(8.7,9.0,0.0);
gluLookAt(0.0,10.0,2.0,1.0,0.0,0.0,0.0,0.0,1.0);
glRotatef((GLfloat)b,1.0,7.0,5.0);
glColor3f(4.3,3.5,1.0);
glutSolidSphere(0.04,20,8);
glPopMatrix();
glutSwapBuffers();
}
void reshape(int w,int h)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,(GLfloat)w/(GLfloat)h,1.0,20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
}
void keyboard(unsigned char key,int x,int y)
{
printf("%d", key);
switch(key)
{
case 'z':
z=(z+50)%360;
glutPostRedisplay();
break;
case 'm':
m=(m+3)%360;
glutPostRedisplay();
break;
case 'M':
M=(M+12)%360;
glutPostRedisplay();
break;
case 'v':
v=(v+2)%360;
glutPostRedisplay();
break;
case 'V':
V=(V+10)%360;
glutPostRedisplay();
break;
case 'e':
e=(e+5)%360;
glutPostRedisplay();
break;
case 'E':
E=(E+8)%360;
glutPostRedisplay();
break;
case 'r':
r=(r+6)%360;
glutPostRedisplay();
break;
case 'R':
R=(R+6)%360;
glutPostRedisplay();
break;
case 'j':
j=(j+10)%360;
glutPostRedisplay();
break;
case 'J':
J=(J+4)%360;
glutPostRedisplay();
break;
case 's':
s=(s+9)%360;
glutPostRedisplay();
break;
case 'S':
S=(S+3)%360;
glutPostRedisplay();
break;
case 'u':
u=(u+8)%360;
glutPostRedisplay();
break;
case 'U':
U=(U+2)%360;
glutPostRedisplay();
break;
case 'n':
n=(n+7)%360;
glutPostRedisplay();
break;
case 'N':
N=(N+1)%360;
glutPostRedisplay();
break;
case 'b':
b=(b+10)%360;
glutPostRedisplay();
break;
case 'c':
c=(c+1)%360;
b=(b+10)%360;
glutPostRedisplay();
break;
case 'X':
X=(X+5)%360;
glutPostRedisplay();
break;
case 'a':
z=(z+50)%360;
b=(b+10)%360;
m=(m+3)%360;
v=(v+2)%360;
e=(e+5)%360;
r=(r+6)%360;
j=(j+10)%360;
s=(s+9)%360;
u=(u+8)%360;
n=(n+7)%360;
c=(c+1)%360;
glutPostRedisplay();
break;
case 'A':
z=(z+50)%360;
b=(b+10)%360;
M=(M+12)%360;
V=(V+10)%360;
E=(E+8)%360;
R=(R+6)%360;
J=(J+4)%360;
S=(S+3)%360;
U=(U+2)%360;
N=(N+1)%360;
c=(c+1)%360;
glutPostRedisplay();
break;
case 'B':
z=(z+50)%360;
b=(b+10)%360;
c=(c+1)%360;
m=(m+3)%360;
M=(M+12)%360;
v=(v+2)%360;
V=(V+10)%360;
e=(e+5)%360;
E=(E+8)%360;
r=(r+6)%360;
R=(R+6)%360;
j=(j+10)%360;
J=(J+4)%360;
s=(s+9)%360;
S=(S+3)%360;
u=(u+8)%360;
U=(U+2)%360;
n=(n+7)%360;
N=(N+1)%360;
glutPostRedisplay();
break;
case 13:
isMainScreen = 0;
break;
case 27:
exit(0);
break;
default:
break;
}
}
void frontscreen(void)
{
glColor3f(0.0,0.0,1.0);
drawString1(0.5,0.5,0.0,"MVJ College of Engineering");
glColor3f(0.7,0,1);
drawString1(120,400,0.0,"DEPARTMENT OF COMPUTER SCIENCE AND ENGINEERING");
glColor3f(1,0.5,0);
drawString1(210.0, 300.0,0.0,"A MINI PROJECT ON");
glColor3f(1,0,0);
drawString1(220,270,0.0,"PROJECT TITLE");
glColor3f(1,0.5,0);
drawString1(20,50,0.0,"BY:");
glColor3f(0.5,0,0.5);
drawString1(10,40,0.0,"NAME FIRST (USN)");
drawString1(10,34,0.0,"NAME SECOND (USN)");
glColor3f(1,0.5,0);
drawString1(68,50,0.0,"GUIDES:");
glColor3f(0.5,0.2,0.2);
drawString1(63,40,0.0,"GUIDE NAME FIRST");
drawString1(63,34,0.0,"GUIDE NAME SECOND");
glColor3f(1,0.1,1);
drawString1(32,10,0.0,"PRESS ENTER TO START");
glFlush();
glutPostRedisplay();
}
void mouse(int btn ,int state,int x,int y)
{
if(btn==GLUT_LEFT_BUTTON && state==GLUT_DOWN)
{
z=(z+50)%360;
b=(b+10)%360;
c=(c+1)%360;
m=(m+3)%360;M=(M+12)%360;
v=(v+2)%360;V=(V+10)%360;
e=(e+5)%360;E=(E+8)%360;
r=(r+6)%360;R=(R+6)%360;
j=(j+10)%360;J=(J+4)%360;
s=(s+9)%360;S=(S+3)%360;
u=(u+8)%360;U=(U+2)%360;
n=(n+7)%360;N=(N+1)%360;
glutPostRedisplay();
}
if(btn==GLUT_MIDDLE_BUTTON && state==GLUT_DOWN)
{
z=(z+50)%360;
b=(b+10)%360;
c=(c+1)%360;
m=(m+3)%360;M=(M+12)%360;
v=(v-2)%360;V=(V-10)%360;
e=(e+5)%360;E=(E+8)%360;
r=(r-6)%360;R=(R-6)%360;
j=(j+10)%360;J=(J+4)%360;
s=(s-9)%360;S=(S-3)%360;
u=(u+8)%360;U=(U+2)%360;
n=(n-7)%360;N=(N-1)%360;
glutPostRedisplay();
}
if(btn==GLUT_RIGHT_BUTTON && state==GLUT_DOWN)
{
z=(z-50)%360;
b=(b-10)%360;
c=(c+1)%360;
m=(m-3)%360;M=(M-12)%360;
v=(v-2)%360;V=(V-10)%360;
e=(e-5)%360;E=(E-8)%360;
r=(r-6)%360;R=(R-6)%360;
j=(j-10)%360;J=(J-4)%360;
s=(s-9)%360;S=(S-3)%360;
u=(u-8)%360;U=(U-2)%360;
n=(n-7)%360;N=(N-1)%360;
glutPostRedisplay();
}
}
void mydisplay() {
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
if (isMainScreen) {
frontscreen();
} else {
display();
}
}
int main(int argc,char **argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(1024, 600);
glutInitWindowPosition(100,100);
glutCreateWindow("planets amidst stars");
myinit();
glutDisplayFunc(mydisplay);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
//glutKeyboardFunc(myKeyboardFunc);
glutMouseFunc(mouse);
glEnable(GL_DEPTH_TEST);
glutMainLoop();
return 0;
}
Can someone correct the error?
As you specified in glutInitDisplayMode
, you are using double buffering (GLUT_DOUBLE
):
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
This causes that you have to call glutSwapBuffers
to swaps the buffers of the current window at the end of the rendering (glFlush
is not sufficient).
Further, I recommend to setup an orthographic projection, which maps the viewspace 1:1 to window coordinates.
Use glOrtho
for this and use glMatrixMode
to switch between the projection matrix stack and the modelview matrix stack.
Change the code in the function frontscreen
like this:
double vp_width = 1024.0; // update by reshape
double vp_height = 600.0; // update by reshape
void frontscreen(void)
{
glMatrixMode( GL_PROJECTION );
glPushMatrix();
glLoadIdentity();
glOrtho( 0, vp_width, vp_height, 0.0, -1.0, 1.0 );
glMatrixMode( GL_MODELVIEW );
glPushMatrix();
glLoadIdentity();
.....
glMatrixMode( GL_PROJECTION );
glPopMatrix();
glMatrixMode( GL_MODELVIEW );
glPopMatrix();
glutSwapBuffers(); // <----- glutSwapBuffers insted of glFlush
glutPostRedisplay();
}