home *** CD-ROM | disk | FTP | other *** search
- Documentation sur mesa_gl.ldg le 22/03/99
-
- Mesa_gl.ldg est une librairie dynamique du type LDG (Dominique
- Béréziat et Olivier Landemarre) basée sur la devenue célèbre librairie
- Mesa de Brian Paul, développée pour donner accès à tous au fameux
- standard 3D de SGI nommé OpenGL.
-
- Mesa est écrite principalement en C et est facilement adaptable sur
- toute machine si l'on utilise le driver virtuel (qui réalise l'image
- en mémoire) nommé OSMESA, des drivers spécifiques existent aussi pour
- des cartes vidéo afin d'accélérer l'affichage. Ici seul le driver
- OSMESA est implémenté principalement parceque OpenGL n'est pas fenêtré
- et qu'il faut passer par des extensions de ce système (GLX) pour créer
- facilement des fenêtres, les sources de ces extensions certes existent
- mais sont du ressort de X11, il ne saurait être question pour moi de
- passer trop de temps sur ce genre de portage sans grand intérêt. Avec
- le driver OSMESA il est par contre assez facile d'utiliser les images
- crées en fenêtrage (éventuellement la librairie screen.ldg vous y
- aidera elle a été développée dans cette optique). Tant pis pour les
- jeux qui auraient pu bénéficier de l'accélération mais à part le
- Milan et sa carte S3 de toute facon à l'heure actuelle personne n'en
- tirerait profit.
-
- Cette librairie est basée sur Mesa 2.6, la dernière version en date
- est la 3.0, les différences minimes ne justifiant pas le portage
- immédiat vous m'excuserez pour ce décalage, mais déja quand vous aurez
- fait le tour de cette version on en reparlera! Je préfère finaliser
- cette librairie voir l'accélérer.
-
- Bonne programmation!!!
-
-
- Cette documentation n'est pas une documentation OpenGL, elle n'a pour
- seule objectif, la mise en route de la librairie ldg sur Atari. En
- effet vous ne pourrez trouver dans les docs officielles cette mise en
- oeuvre car elle est spécifique. L'utilisation ensuite est tout a fait
- classique et vous n'aurez plus qu'à vous référer au livres de
- référence sur OpenGL.
-
- Toutes les fonctions accessibles avec leur protypage sont inscrites
- dans le fichier "Fonctions.txt", ce protypage peut légèrement différer
- des documentations OpenGL, cela afin de rendre accessible à un plus
- grand nombre de compilateurs la librairie. Ainsi tous les entiers sont
- systématiquement castés en "long". Les procédures utilisant des
- "double" ne sont pas implémentées (elle n'ont d'ailleur aucun intérêt
- car dans Mesa tous ces double sont transformés systématiquement en
- "float"). Ces fonctions existent d'ailleur toujours en "float". Le
- format "float" a pour principal intérêt d'être standard à la norme
- IEEE, contrairement aux "double".
- Mesa_gl.ldg contrairement au principe des LDG n'a pas l'aptitude à
- être partagée par plusieurs programmes. Dans le cas d'appel de
- plusieurs programmes différents, cette librairie sera dupliquée
- automatiquement.
-
- Un exemple documenté valant mieux que de longs discours:
-
- !!!! CAS PURE_C: PureC ne passant pas correctement les float avec
- le passage standard cdecl il est nécessaire de ruser!
- les fonctions passant des paramêtres de type float doivent être
- prototypées comme "long" (32 bits comme un float) et passer un
- "long" qui est la représentation du "float" (en créant par example
- un "union" entre float et long).
-
-
- Pour tester ce programme vous devez récupérer le kit de developpement
- LDG 1.0 ou ultérieur ainsi que Mesa_gl.ldg
-
- For test this example you must use the LDG SDK 1.0 or higher and
- Mesa_gl.ldg.
-
- #include <stdio.h>
- #include <osbind.h>
- #include <ldg.h> /* pour le chargement de Mesa_gl (système LDG) */
- #include "mesa_ldg.h" /* Définitions pour OpenGL */
-
-
- /* pour déclarer toutes les fonctions à utiliser
- dans Mesa */
- #undef APIENTRY
- #define APIENTRY __CDECL
- /* toutes les fonctions ont un passage standard
- C de type _CDECL c'est la condition obligatoire
- */
- /* fonctions standard OpenGL */
- void APIENTRY (*_glBegin)( long mode); /*fonction glBegin() */
- void APIENTRY (*_glEnd)( void ); /* glEnd() */
- void APIENTRY (*_glColor3f)( float red, float green, float blue );
- /* glColor3f() */
- void APIENTRY (*_glClear)( long mask); /* glClear() */
- void APIENTRY (*_glClearColor)( float red, float green, float blue, float alpha );
- /* glClearColor() */
- void APIENTRY (*_glOrtho)( float left, float right,float bottom, float top,float nearval, float farval );
- /* glOrtho() */
- void APIENTRY (*_glMatrixMode)( long mode); /* glMatrixMode() */
- void APIENTRY (*_glLoadIdentity)( void );
- /* glLoadIdentity() */
- void APIENTRY (*_glVertex3f)( float x, float y, float z);
- /* glVertex3f() */
- void APIENTRY (*_glRotatef)( float angle, float x, float y, float z);
- /* glRotatef() */
- void APIENTRY (*_glEnable)( long cap ); /* glEnable() */
-
- /* fonctions spécifiques non standard ce sont les 5
- seules!!! manque max_height() et max_width()
- */
- void* APIENTRY (*OSMesaCreateLDG)( long format, long type, long width, long height);
- /* initialisation de Mesa et
- création du contexte */
- void APIENTRY (*OSMesaDestroyLDG)( void);
- /* destruction du contexte */
- void APIENTRY (*Save_TGA)(char *file, void *buffer, long width, long height);
- /* sauvegarde au format TGA */
-
- main()
- { int app_id; LDG *mesaldg;
- char *image_buffer; /* buffer de l'image générée */
- long width=200, height=200; /* taille de l'image à générer */
-
- app_id = appl_init (); /*initialisation GEM nécessaire pour les LDG*/
- if( (mesaldg = ldg_exec ( app_id, "mesa_gl.ldg")) == NULL) /* Chargement de la lib mesa_gl.ldg*/
- { /* échec */
- /* vous pouvez relancer éventuellement ldg_exec() des fois que
- le système soit lambin !!! (Mint + Multitos) ca passe souvent
- mesa est très grosse */
- form_alert ( 1, "[1][Erreur chargement librairie |MESA_GL.LDG!][OK]");
- appl_exit();
- exit(0);
- }
- /* librairie chargée en mémoire tout va bien pour le moment */
- /* Réalisation des liens dynamiques pour les fonctions */
- _glBegin=ldg_find("glBegin", mesaldg);
- _glEnd=ldg_find("glEnd", mesaldg);
- _glColor3f=ldg_find("glColor3f", mesaldg);
- _glClear=ldg_find("glClear", mesaldg);
- _glClearColor=ldg_find("glClearColor", mesaldg);
- _glOrtho=ldg_find("glOrtho", mesaldg);
- _glMatrixMode=ldg_find("glMatrixMode", mesaldg);
- _glLoadIdentity=ldg_find("glLoadIdentity", mesaldg);
- _glVertex3f=ldg_find("glVertex3f", mesaldg);
- _glRotatef=ldg_find("glRotatef", mesaldg);
- _glEnable=ldg_find("glEnable", mesaldg);
- OSMesaCreateLDG=ldg_find("OSMesaCreateLDG", mesaldg);
- OSMesaDestroyLDG=ldg_find("OSMesaDestroyLDG", mesaldg);
- Save_TGA=ldg_find("Save_TGA", mesaldg);
-
- /* utilisation de la librairie */
-
- /* initialisation */
- image_buffer = OSMesaCreateLDG(VDI_RGB, (long)GL_UNSIGNED_BYTE, width, height );
- /* création du contexte la fonction retourne le pointeur sur
- le buffer image VDI_RGB type de format d'écran type
- coordonnées VDI 24bits, il existe d'autres formats voir dans
- gl.h
- 2eme paramêtre mettre tj GL_UNSIGNED_BYTE
- 3eme et 4eme paramêtre largeur et hauteur de l'image à créer
- vous pouvez tester la taille maximale admissible par la lib
- avec les fonction max_width() et max_height() ici 200*200
- c'est petit donc on ne le fait pas!!!
- */
- if(image_buffer) /* initialisation OK */
- {
- /* la on arrive dans OpenGL pur et dur juste un petit exemple */
-
- _glMatrixMode((long)GL_PROJECTION);
- _glLoadIdentity(); /* avant toute chose il faut charger la matrice identité */
- _glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); /* zone 3D de calcul et de vision*/
- /*
- Y |
- |
- |-------X
- /
- Z/
- */
- _glMatrixMode((long)GL_MODELVIEW);
- _glClearColor(0.5,0.5,0.5,0.); /* couleur d'éffacement RGBA*/
- _glClear( (long)(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ); /* on éfface */
- _glEnable(GL_DEPTH_TEST); /* test de la profondeur par rapport à l'observateur sinon les triangles sont les uns sur les autres */
-
- _glBegin(GL_TRIANGLES); /* on dit que l'on va faire des triangles (en fait qu'un pour notre exemple) */
- /* les triangles sont formés par 3 paires de points se suivant on peut en faire autant que l'on veut a la suite avant le glEnd */
-
- _glColor3f(0.0, 0.0, 1.0); /* chaque point peut recevoir une couleur ici bleu */
- _glVertex3f((float)-0.5, (float)0.0, (float)0.0); /* coin gauche */
- _glColor3f(1.0, 1.0, 1.0); /* blanc */
- _glVertex3f((float)0.0, (float)0.5, (float)0.2); /* sommet haut */
- _glColor3f((float)1.0, (float)0.0, (float)0.0); /* rouge */
- _glVertex3f((float)0.5, (float)0.0, (float)0.0); /* coin droit */
-
- _glColor3f((float)0.0, (float)1.0, (float)0.0); /* triangle tout Vert */
-
- _glVertex3f((float)-0.5, (float)0.2, (float)-0.5);
- _glVertex3f((float)0.5, (float)0.2, (float)-0.5);
- _glVertex3f((float)0.0, (float)-0.1, (float)0.5);
-
- _glEnd(); /* fin de faire des triangles */
- /* fin de l'utilisation de OpenGL */
- /* fermeture spécifique */
- OSMesaDestroyLDG();
- Save_TGA("image.tga", image_buffer, width, height); /* sauvegarde de l'image */
- Mfree( image_buffer ); /* ne pas oublier de libérer le buffer image */
-
- }
-
- ldg_term(app_id, mesaldg); /* libération du LDG */
-
- appl_exit();
- }
-
-
-
- Olivier LANDEMARRE
- 89 av jean Moulin
- 90000 BELFORT
- FRANCE
- Email: Olivier.landemarre@utbm.fr
-
-