College : Guru Nanak Dev Engineering College , Bidar University : Visvesvaraya Technological University , Belgaum USN : 3GN10CS022 as a Computer Graphics Mini Project IDE : Visual Studio 2012 Ultimate GLUT libraries used */ #include<windows.h> #include<gl/glut.h> #include<stdio.h> #define SIZEW 70.0 GLUquadricObj *theObj; GLfloat LightAmbient[]={0.5,0.5,0.5,1.0}; GLfloat LightDiffuse[]={1.0,1.0,1.0,1.0}; GLfloat LightPosition[]={0.0,0.0,2.0,1.0}; bool scr_stt=1; // Screen State bool light; // Lighting ON/OFF ( NEW ) bool gview; // Ortho by default int rshp,scrn,prtl,lght,mainmenu; int MAX_PARTICLES=1000; // Number Of Particles To Create float i,b,a,xrot,yrot; float g_slowdown = 2.0f; // Slow Down Particles float g_xspeed = 0.0f; // X Rotation Speed float g_yspeed = 0.0f; // Y Rotation Speed GLuint g_col = 0; // Current Color Selection typedef struct { // Create A Structure For Particle bool active; // Active (Yes/No) float life; // Particle Life float fade; // Fade Speed float r; // Red Value float g; // Green Value float b; // Blue Value float x; // X Position float y; // Y Position float z; // Z Position float xi; // X Direction float yi; // Y Direction float zi; // Z Direction float yg; // Y Gravity } particles; // Particles Structure particles g_particle[100000]; // Particle Array (Room For Particle Info) void init(void) // Initialize Lighting { glClearColor(0.0,0.0,0.0,0.0); theObj=gluNewQuadric(); glEnable(GL_LIGHTING); glEnable(GL_DEPTH_TEST); glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); // Setup The Amb ient Light glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); // Setup The Dif fuse Light glLightfv(GL_LIGHT1, GL_POSITION,LightPosition); // Position The Light glEnable(GL_LIGHT1); // Enable Light One glColorMaterial ( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE ); glEnable ( GL_COLOR_MATERIAL ); } void init1(void) // Initialize all Particles { int i; for (i=0 ; i<MAX_PARTICLES ; i++) { g_particle[i].active = true; // Make All The Particles Active g_particle[i].life = 1.0f; // Give All The Particles Full Life g_particle[i].fade = float(rand()%100)/1000.0f+0.003f; // Rando m Fade Speed g_particle[i].yg = -1.0f; // Set Vertical Pull Downward } } void display(void) { glTranslatef(0,xrot,0); glRotatef(0.12,0,b,0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //Rocket Construction glPushMatrix(); gluQuadricDrawStyle(theObj,GLU_FILL); glRotatef(90.0,1.0,0.0,0.0); gluCylinder(theObj,8.0,8.0,45.0,20,100); glPopMatrix(); glPushMatrix(); glTranslatef(0.0,10.0,0.0); glRotatef(90.0,1.0,0.0,0.0); gluCylinder(theObj,8.0,8.0,10.0,20,5); glPopMatrix(); glPushMatrix(); glTranslatef(0.0,17.0,0.0); glRotatef(90.0,1.0,0.0,0.0); gluCylinder(theObj,5.0,8.0,7.0,20,5); glPopMatrix(); glPushMatrix(); glTranslatef(0.0,55.0,0.0); glRotatef(90.0,1.0,0.0,0.0); gluCylinder(theObj,5.0,5.0,38.0,20,20); glPopMatrix(); glPushMatrix(); glTranslatef(0,55,0); glScaled(1,4.0,1); glutSolidSphere(5,30,30); glPopMatrix(); glPushMatrix(); glTranslatef(0.0,-45.0,0.0); glRotatef(90.0,1.0,0.0,0.0); gluCylinder(theObj,8.0,8.0,20.0,20,10); glPopMatrix(); glPushMatrix(); glTranslatef(0.0,-50.0,0.0); glRotatef(90.0,1.0,0.0,0.0); gluCylinder(theObj,0.0,4.9,21.0,20,20); glPopMatrix(); glPushMatrix(); glTranslatef(8.5,-43.0,0.0); glRotatef(90.0,1.0,0.0,0.0); gluCylinder(theObj,2.5,2.5,25.0,20,20); glPopMatrix(); glPushMatrix(); glTranslatef(8.5,-43.0,0.0); glScaled(1,4.0,1); glutSolidSphere(2.5,20,20); glPopMatrix(); glPushMatrix(); glTranslatef(8.5,-65.0,0.0); glRotatef(90.0,1.0,0.0,0.0); gluCylinder(theObj,0.0,2.5,5.0,20,20); glPopMatrix(); glPushMatrix(); glTranslatef(-8.5,-43.0,0.0); glRotatef(90.0,1.0,0.0,0.0); gluCylinder(theObj,2.5,2.5,25.0,20,20); glPopMatrix(); glPushMatrix(); glTranslatef(-8.5,-43.0,0.0); glScaled(1,4.0,1); glutSolidSphere(2.5,20,20); glPopMatrix(); glPushMatrix(); glTranslatef(-8.5,-65.0,0.0); glRotatef(90.0,1.0,0.0,0.0); gluCylinder(theObj,0.0,2.5,5.0,20,20); glPopMatrix(); glPushMatrix(); glTranslatef(0,-43.0,8.5); glRotatef(90.0,1.0,0.0,0.0); gluCylinder(theObj,2.5,2.5,25.0,20,20); glPopMatrix(); glPushMatrix(); glTranslatef(0,-43.0,8.5); glScaled(1,4.0,1); glutSolidSphere(2.5,20,20); glPopMatrix(); glPushMatrix(); glTranslatef(0.0,-65.0,8.5); glRotatef(90.0,1.0,0.0,0.0); gluCylinder(theObj,0.0,2.5,5.0,20,20); glPopMatrix(); glPushMatrix(); glTranslatef(0,-43.0,-8.5); glRotatef(90.0,1.0,0.0,0.0); gluCylinder(theObj,2.5,2.5,25.0,20,20); glPopMatrix(); glPushMatrix(); glTranslatef(0,-43.0,-8.5); glScaled(1,4.0,1); glutSolidSphere(2.5,20,20); glPopMatrix(); glPushMatrix(); glTranslatef(0,-65.0,-8.5); glRotatef(90.0,1.0,0.0,0.0); gluCylinder(theObj,0.0,2.5,5.0,20,20); glPopMatrix(); //Particle Engine int i; for (i=0 ; i<MAX_PARTICLES ; i++) // Loop Through All The Particles { if (g_particle[i].active) // If The Particle Is Active { float x=g_particle[i].x; // Grab Our Particle X Position float y=g_particle[i].y; // Grab Our Particle Y Position // Draw The Particle Using Our RGB Values, Fade The Part icle Based On It's Life if(g_particle[i].life>=0.3) glColor4f(1,1,0,g_particle[i].life); else glColor4f(1,0,0,g_particle[i].life); //Point source for each of the 5 thrusters glBegin(GL_POINTS); glVertex2f(x+0.5f,y+0.5f); glVertex2f(x+8.5f,y+0.5f); glVertex2f(x-8.5f,y+0.5f); glVertex3f(x+0.5f,y-0.5f,-8.5); glVertex3f(x+0.5f,y-0.5f,8.5); glEnd(); g_particle[i].x += g_particle[i].xi/(g_slowdown*1000);// Move On The X Axis By X Speed g_particle[i].y += g_particle[i].yi/(g_slowdown*1000);// Move On The Y Axis By Y Speed g_particle[i].yi += g_particle[i].yg; // Take Pull On Y Axis Into Account g_particle[i].life -= g_particle[i].fade; // Reduce Particles Life By 'Fade' if (g_particle[i].life < 0.0f) // If Particle Is Burned Out { g_particle[i].life = 1.0f; // Give It New Life g_particle[i].fade = float(rand()%100)/1000.0f+0 .003f; // Random Fade Value g_particle[i].x = 0.0f; // Center On X Axis g_particle[i].y = -70.0f; // Center On Y Axis g_particle[i].z = 0.0f; // Center On Z Axis g_particle[i].xi = g_xspeed+float((rand()%60)-32 .0f); // X Axis Speed And Direction g_particle[i].yi = g_yspeed+float((rand()%60)-30 .0f); // Y Axis Speed And Direction g_particle[i].zi = float((rand()%60)-30.0f);// Z Axis Speed And Direction } } } glColor3f(0.45,0.45,0.45); glutSwapBuffers(); } void arrow_keys ( int a_keys, int x, int y ) // Create Special Function (requir ed for arrow keys) { switch ( a_keys ) { case GLUT_KEY_UP: init1(); // When Up Arrow Is Pre ssed... xrot+=0.015f; MAX_PARTICLES+=1000; break; case GLUT_KEY_DOWN: xrot-=0.015f; // When Down Arrow Is Pressed... MAX_PARTICLES-=1000; break; case GLUT_KEY_RIGHT: b=b+1; break; case GLUT_KEY_LEFT: b=b-1; break; } } void reshape(int w,int h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(gview==0) { if(w<=h && w>0) glOrtho(-SIZEW,SIZEW,(GLdouble)-h/w*SIZEW,(GLdouble)h/w* SIZEW,0.0,2*SIZEW); else if(h>0) glOrtho((GLdouble)-w/h*SIZEW,(GLdouble)w/h*SIZEW,-SIZEW, SIZEW,0.0,2*SIZEW); } else gluPerspective(90, (float)w/(float)h, 10.0, 190.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0,0.0,-100); } void menu(int value) { switch(value) { case 1:gview=0; scr_stt==0?reshape(500,600):reshape(600,700); break; case 2:gview=1; scr_stt==0?reshape(500,600):reshape(600,700); break; case 3:glutReshapeWindow ( 500, 600 ); scr_stt=0; break; case 4:glutReshapeWindow ( 600, 700 ); scr_stt=1; break; case 5:MAX_PARTICLES=100; init1(); break; case 6:MAX_PARTICLES=1000; init1(); break; case 7:MAX_PARTICLES=10000; init1(); break; case 8:MAX_PARTICLES=20000; init1(); break; case 9:glEnable(GL_LIGHTING); break; case 10:glDisable(GL_LIGHTING); break; case 11:MessageBox(NULL,L"The Model of a Rocket\n\nMade in OpenGL using GLUT Libraries\n\nmade by :\n\tGaganpreet Singh Kapula\n\t(3GN10CS022)\n\tVikash Kumar Ray\n\t(3GN10CS088)",L"About",MB_OK | MB_ICONINFORMATION); break; case 12:MessageBox(NULL,L"Press \"UP arrow\" key to propel\nTap it for m ore speed and flame.\n\nUse RIGHT and LEFT arrow keys to rotate the rocket.",L"C ontrols",MB_OK | MB_ICONQUESTION); break; case 13: scr_stt=1; xrot=0.0; b=0; gview=0; glEnable(GL_LIGHTING); glutReshapeWindow ( 600, 700 ); reshape(600,700); MAX_PARTICLES=0; break; case 14:value=MessageBox(NULL,L"Do you really want to Quit?",L"Confirmat ion",MB_OKCANCEL | MB_ICONQUESTION); if(value==1) exit(0); } } void createmenu(void) { rshp=glutCreateMenu(menu); glutAddMenuEntry("Ortho View (Default)",1); glutAddMenuEntry("Perspective View",2); scrn=glutCreateMenu(menu); glutAddMenuEntry("500x600",3); glutAddMenuEntry("600x700 (Default)",4); prtl=glutCreateMenu(menu); glutAddMenuEntry("100",5); glutAddMenuEntry("1000 (Default)",6); glutAddMenuEntry("10000",7); glutAddMenuEntry("20000",8); lght=glutCreateMenu(menu); glutAddMenuEntry("Light On (Default)",9); glutAddMenuEntry("Light Off",10); mainmenu=glutCreateMenu(menu); glutAddMenuEntry("About The Project",11); glutAddMenuEntry("Controls",12); glutAddSubMenu("Reshape View",rshp); glutAddSubMenu("Sceen",scrn); glutAddSubMenu("Particle No.",prtl); glutAddSubMenu("Lighting",lght); glutAddMenuEntry("Reset Rocket",13); glutAddMenuEntry("Quit",14); glutAttachMenu(GLUT_RIGHT_BUTTON); } void main(int argc,char** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE); glutInitWindowSize(600,700); glutCreateWindow("The Model of a Rocket"); init(); createmenu(); glutReshapeFunc(reshape); glutDisplayFunc(display); glutSpecialFunc( arrow_keys ); glutIdleFunc(display); glutMainLoop(); }