Demo opengl

Description

Bonjour, ce projet à été réalisé dans le cadre de mon cours Correction de Programmes au Cégep. Le but était de trouver un programme sur cppfrance et d'y apporter des modifications.

Source écrite par Kled: http://www.cppfrance.com/code.aspx?ID=35513

J'ai enlever des DLL pour pouvoir mettre le zip sur cppfrance.
glut32.dll : http://www.dll-files.com/dllindex/dll-files.shtml?glut32
fmod.dll : http://www.dll-files.com/dllindex/dll-files.shtml?fmod

Source / Exemple :


/*
    Auteur: Jean-Sébastien Bilodeau
    Projet: Demo OpenGL
    Date:   2008/05/11

    - Les info sont dans le fichier readme.txt
    - Version initiale du code:
        Auteur: Kled
        Titre:  DOOM LIKE EN OPENGL
        Lien:   http://www.cppfrance.com/code.aspx?ID=35513

  • /
#ifdef WIN32 #include <windows.h> #endif #include <GL/openglut_std.h> #include <string> #include <cstring> #include <sstream> #include <iostream> using namespace std ; #include <fmod/fmod.h>//2008/05/04:FMOD v375 #include "Affichage.h" #include "camera.h" //Variables générales GLint nWindowID; GLboolean pleinEcran=false; GLint lecran=800,hecran=600; GLint width = glutGet(GLUT_SCREEN_WIDTH); //Largeur (pixels) GLint height= glutGet(GLUT_SCREEN_HEIGHT); //Hauteur GLdouble x=0, y=5, z=92; //Position de la camera GLboolean zoom=false,affText=false; GLdouble current_time,last_time; FSOUND_SAMPLE *tir = NULL; FSOUND_SAMPLE *pla = NULL; FMUSIC_MODULE *backgrnd = NULL; //Déclare les objets Affichage ini; Camera fpscam; //Prototypes des fonctions GLvoid initFmod ();//2008/05/04: Initialise FMOD GLvoid delFmod ();//2008/05/04: Fermeture FMOD GLvoid keyboard (GLubyte key, GLint sourisX, GLint sourisY); GLvoid keyboardUP (GLubyte key, GLint sourisX, GLint sourisY); GLvoid special (GLint key, GLint sourisX, GLint sourisY); GLvoid specialUP (GLint key, GLint sourisX, GLint sourisY); GLvoid mouse (GLint button, GLint state, GLint sourisX, GLint sourisY); GLvoid vue (GLint sourisX, GLint sourisY); GLvoid attente(GLvoid); GLvoid display(GLvoid); GLvoid display1(GLvoid); GLvoid theDisplay (); //Convertir n'importe quel type d'objet en string template<typename T> string to_string( const T & Value ) { //Utiliser un flux de sortie pour créer la chaîne ostringstream oss; //Écrire la valeur dans le flux oss << Value; //Renvoyer une string return oss.str(); } //Cette fonction utiliser dans glut ne marche pas directement. GLvoid reshape (GLint w, GLint h){ini.reshape(w,h,45.0f);} /******************************************************************************* int main(int argc, char** argv) ;
                                                                                                                                                              • /
GLint main (GLint argc, char* argv[]) { string resoPleinEcran; GLint rep; rep = MessageBox(NULL, "Voulez-vous entrer en mode plein écran?", "Plein écran ?", MB_ICONQUESTION | MB_YESNO); if(rep==IDYES) pleinEcran = true; //Initialiser OpenGL glutInit(&argc, argv); glutInitDisplayMode ( GLUT_DOUBLE | GLUT_RGB | GLUT_MULTISAMPLE); //Construire la fenêtre if (pleinEcran==true) { //2008/04/06: Récupérer la résolution resoPleinEcran =to_string(width); resoPleinEcran +='x'; resoPleinEcran +=to_string(height); resoPleinEcran +=":32";//32bpp Mode //glutGameModeString() n'acepte pas de string size_t size = resoPleinEcran.size() + 1; char * buffer = new char[ size ]; strncpy( buffer, resoPleinEcran.c_str(),size ); glutGameModeString(buffer); if (glutGameModeGet(GLUT_GAME_MODE_POSSIBLE)) glutEnterGameMode();// Mode plein écran } else { glutInitWindowSize(lecran, hecran); glutInitWindowPosition (width/2-lecran/2, 100); nWindowID=glutCreateWindow ("Demo OpenGL");//Nom de la fenêtre width=lecran;//2008/04/24: Changer les valeurs de la résolution height=hecran; } ini.init1 (); //Blending ini.InitTexture(); //Fonction utilisée pour charger les textures ini.init2(); //Blending fpscam.initCam(x,y,z); //Initialiser la camera initFmod (); //Initialisation de FMOD glutDisplayFunc(display); //Monde normal glutReshapeFunc(reshape); //Gestion du clavier glutIgnoreKeyRepeat(true); //2008/04/27: Désactive la répétition auto glutKeyboardFunc (keyboard); //Clavier (PRESS) glutKeyboardUpFunc (keyboardUP); //2008/04/25: Touche clavier relâcher glutSpecialFunc (special); //Touche spécial (PRESS) glutSpecialUpFunc (specialUP); //2008/04/25: Touche spécial relâcher //Gestion de la souris glutMouseFunc (mouse); //Gestion des boutons de la souris glutMotionFunc (vue); //2008/04/15: Si un bouton de la souris est appuyer glutPassiveMotionFunc (vue); //S'il y a aucun bouton de la souris d'appuyer glutIdleFunc (attente); glutSetCursor(GLUT_CURSOR_NONE); //GLUT_CURSOR_CROSSHAIR | GLUT_CURSOR_NONE glutMainLoop(); ini.DelTexture(); //2008/05/05: Suprime les textures delFmod(); //2008/05/05: Suprime les musiques et ferme FMOD return 0; } /******************************************************************************* Initialisation de FMOD et des sons
                                                                                                                                                              • /
GLvoid initFmod ()//2008/05/05: Date de création { FSOUND_Init(44100, 32, 0); //Son au commencement backgrnd = FMUSIC_LoadSong("./Data/Son/backgrnd.mid");//Charger un MIDI if (backgrnd == NULL) MessageBox(NULL,"Erreur chargement du son:\n./Data/Son/backgrnd.mid","ERROR",MB_OK|MB_ICONEXCLAMATION); else { FMUSIC_PlaySong(backgrnd); //Jouer un MIDI FMUSIC_SetLooping(backgrnd, 1); //Répéter un MIDI FMUSIC_SetMasterVolume(backgrnd, 200); //Modifier le volume (0 à 256) } tir = FSOUND_Sample_Load(FSOUND_FREE, "./Data/Son/shot.wav", 0, 0, 0); if (tir == NULL) MessageBox(NULL,"Erreur chargement du son:\n./Data/Son/shot.wav","ERROR",MB_OK|MB_ICONEXCLAMATION); pla = FSOUND_Sample_Load(FSOUND_FREE, "./Data/Son/pla.wav", 0, 0, 0); if (tir == NULL) MessageBox(NULL,"Erreur chargement du son:\n./Data/Son/pla.wav","ERROR",MB_OK|MB_ICONEXCLAMATION); } GLvoid delFmod ()//2008/05/05: Date de création { FSOUND_Sample_Free(tir); //Libérer le son de la mémoire FSOUND_Sample_Free(pla); FMUSIC_FreeSong(backgrnd); //Libérer la musique MIDI FSOUND_Close(); //Fermer FMOD } /******************************************************************************* Gestion du clavier
                                                                                                                                                              • /
GLvoid keyboard(GLubyte key, GLint sourisX, GLint sourisY) { switch (key) { //Changement de vue case 'v':glutDisplayFunc(display1); break; case 'V':glutDisplayFunc(display); break; //Audio pour tir case 'z':FSOUND_PlaySound(FSOUND_FREE, tir);break;//PlaySound("shot.wav",NULL,SND_ASYNC); case 'x':FSOUND_PlaySound(FSOUND_FREE, pla);break;//PlaySound("pla.wav",NULL,SND_ASYNC); //2008/04/07: Mode d'affichage case 'b':ini.Brouillard(); break;//Brouillard case 'B':glDisable(GL_FOG); break; case 'n':ini.initNight(); break;//Faire tomber la nuit case 'N':glDisable(GL_LIGHTING);break; //case 'm':ini.initSpot();break; //Lumiere spot //case 'M':glDisable(GL_LIGHTING);break; //2008/05/11:Change l'état de l'affichage du texte case '\t':affText=!affText;break; //Utilisez les W-S-A-D pour les mouvements. case 'w':case 'W':fpscam.avance(); break; //UP case 's':case 'S':fpscam.recule(); break; //DOWN case 'a':case 'A':fpscam.gauche(); break; //LEFT case 'd':case 'D':fpscam.droite(); break; //RIGHT case ' ':fpscam.saut();break; //JUMP //2008/05/05: Pour mettre en pause la musique de fond case 'p':case 'P': if (FMUSIC_GetPaused(backgrnd)) // Si la chanson est en pause FMUSIC_SetPaused(backgrnd, 0); // On enlève la pause else // Sinon, elle est en cours de lecture FMUSIC_SetPaused(backgrnd, 1); // On active la pause break; //ESCAPE pour quitter case 27:if (pleinEcran==false) glutDestroyWindow(nWindowID);//Destruction de la fenêtre exit (0);break; default:break; } glutPostRedisplay(); } //2008/04/25: Quand la toucheUT_UP est relaché, on arrête le mouvement. GLvoid keyboardUP (GLubyte key, GLint sourisX, GLint sourisY) { switch (key) { //Utilisez les UT_UP W-S-A-D pour les mouvements. case 'w':case 'W':fpscam.avanceUP(); break; //UP case 's':case 'S':fpscam.reculeUP(); break; //DOWN case 'a':case 'A':fpscam.gaucheUP(); break; //LEFT case 'd':case 'D':fpscam.droiteUP(); break; //RIGHT default:break; } glutPostRedisplay(); } //2008/04/25: Date de modification GLvoid special(GLint key,GLint sourisX, GLint sourisY) { switch (key) { case GLUT_KEY_UP :fpscam.avance(); break;//UP case GLUT_KEY_DOWN :fpscam.recule(); break;//DOWN case GLUT_KEY_LEFT :fpscam.gauche(); break;//LEFT case GLUT_KEY_RIGHT:fpscam.droite(); break;//RIGHT case GLUT_KEY_F1:glutFullScreen();break; default:break; } glutPostRedisplay(); } GLvoid specialUP(GLint key,GLint sourisX, GLint sourisY) { switch (key) { case GLUT_KEY_UP :fpscam.avanceUP(); break;//UP case GLUT_KEY_DOWN :fpscam.reculeUP(); break;//DOWN case GLUT_KEY_LEFT :fpscam.gaucheUP(); break;//LEFT case GLUT_KEY_RIGHT:fpscam.droiteUP(); break;//RIGHT default:break; } glutPostRedisplay(); } /******************************************************************************* Gestion de , int sourisX, int sourisYla souris
                                                                                                                                                              • /
GLvoid mouse (GLint button, GLint state, GLint sourisX, GLint sourisY) { //Si l'on appuie sur le bouton gauche if ( button == GLUT_LEFT_BUTTON && state == GLUT_DOWN ) FSOUND_PlaySound(FSOUND_FREE, tir);//PlaySound("shot.wav",NULL,SND_ASYNC); //2008/04/25: Zoom si le bouton droit de la souris est appuyer if ( state == GLUT_UP && button == GLUT_RIGHT_BUTTON) zoom=!zoom; else if ( state == GLUT_DOWN && button == GLUT_RIGHT_BUTTON) zoom=!zoom; vue (sourisX,sourisY); } GLvoid vue (GLint sourisX, GLint sourisY) { GLdouble dx=sourisX-width/2; GLdouble dy=sourisY-height/2; fpscam.calculMouvementS(dx,dy); } /******************************************************************************* void attente(void) ; - Fonction appelée lorsque l'application fait rien.
                                                                                                                                                              • /
GLvoid attente(GLvoid) { //2008/04/16: Centrer la souris glutWarpPointer(width/2,height/2) ; //2008/04/24: Zoom GLboolean reshape=false; if (zoom) { ini.reshape(width,height,25.0f); reshape=true; } else //2008/04/28: Pour ne pas faire de reshape à chaque fois if (reshape=true) { ini.reshape(width,height,45.0f); reshape=false; } //2008/04/28: Calculer un délais current_time = glutGet(GLUT_ELAPSED_TIME); double elapsed_time = current_time - last_time; last_time = current_time; fpscam.calculMouvement (elapsed_time); glutPostRedisplay();//Pour rafraichir l'affichage } /******************************************************************************* void display(void);
                                                                                                                                                              • /
GLvoid display(GLvoid)//VUE FPS { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glLoadIdentity(); //Position et direction de la camera fpscam.fixeCam();//gluLookAt ini.ciel (); ini.theDisplay (); if(affText) { ini.drawT("Texte Texte Texte", GLUT_BITMAP_HELVETICA_12, 1.0f, 1.0f, 1.0f, 0.03, 0.96 ); ini.drawT("Texte Texte Texte", GLUT_BITMAP_HELVETICA_12, 1.0f, 1.0f, 1.0f, 0.03, 0.93 ); } ini.drawT("+", GLUT_BITMAP_HELVETICA_18, 1.0f, 1.0f, 1.0f, 0.5, 0.5 );//2008/05/11: Viseur glutSwapBuffers(); } /******************************************************************************* void display1(void);
                                                                                                                                                              • /
GLvoid display1(GLvoid)// VUE DU CIEL { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glLoadIdentity(); gluLookAt (0.0, 95.0, 150.0f, 0.0, 0.0,40.0, 0.0, 1.0, 0.0); ini.theDisplay(); if(affText) { ini.drawT("Texte Texte Texte", GLUT_BITMAP_HELVETICA_12, 1.0f, 1.0f, 1.0f, 0.03, 0.96 ); ini.drawT("Texte Texte Texte", GLUT_BITMAP_HELVETICA_12, 1.0f, 1.0f, 1.0f, 0.03, 0.935 ); } glutSwapBuffers(); }

Conclusion :


Pour finir, je remercie Kled pour la version initiale du code. Ce code n'est pas un tutoriel. Donc, si vous ne connaissez pas une fonction d'une librairie, n'hésiter surtout pas pour faire une petite recherche sur Google.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.