home *** CD-ROM | disk | FTP | other *** search
/ ST-Computer Leser-CD 2001 January / LCD_01_2001.iso / develop / mesalib / mesa / dev / dev.txt next >
Encoding:
Text File  |  1999-03-22  |  9.5 KB  |  217 lines

  1. Documentation sur mesa_gl.ldg   le 22/03/99
  2.  
  3. Mesa_gl.ldg est une librairie dynamique du type LDG (Dominique 
  4. Béréziat et Olivier Landemarre) basée sur la devenue célèbre librairie 
  5. Mesa de Brian Paul, développée pour donner accès à tous au fameux 
  6. standard 3D de SGI nommé OpenGL.
  7.  
  8. Mesa est écrite principalement en C et est facilement adaptable sur 
  9. toute machine si l'on utilise le driver virtuel (qui réalise l'image 
  10. en mémoire) nommé OSMESA, des drivers spécifiques existent aussi pour 
  11. des cartes vidéo afin d'accélérer l'affichage. Ici seul le driver 
  12. OSMESA est implémenté principalement parceque OpenGL n'est pas fenêtré 
  13. et qu'il faut passer par des extensions de ce système (GLX) pour créer 
  14. facilement des fenêtres, les sources de ces extensions certes existent 
  15. mais sont du ressort de X11, il ne saurait être question pour moi de 
  16. passer trop de temps sur ce genre de portage sans grand intérêt. Avec 
  17. le driver OSMESA il est par contre assez facile d'utiliser les images 
  18. crées en fenêtrage (éventuellement la librairie screen.ldg vous y 
  19. aidera elle a été développée dans cette optique). Tant pis pour les 
  20. jeux qui auraient pu bénéficier de l'accélération mais à part le 
  21. Milan et sa carte S3 de toute facon à l'heure actuelle personne n'en 
  22. tirerait profit.
  23.  
  24. Cette librairie est basée sur Mesa 2.6, la dernière version en date 
  25. est la 3.0, les différences minimes ne justifiant pas le portage 
  26. immédiat vous m'excuserez pour ce décalage, mais déja quand vous aurez 
  27. fait le tour de cette version on en reparlera! Je préfère finaliser 
  28. cette librairie voir l'accélérer.
  29.  
  30. Bonne programmation!!!
  31.  
  32.  
  33. Cette documentation n'est pas une documentation OpenGL, elle n'a pour 
  34. seule objectif, la mise en route de la librairie ldg sur Atari. En 
  35. effet vous ne pourrez trouver dans les docs officielles cette mise en 
  36. oeuvre car elle est spécifique. L'utilisation ensuite est tout a fait 
  37. classique et vous n'aurez plus qu'à vous référer au livres de 
  38. référence sur OpenGL.
  39.  
  40. Toutes les fonctions accessibles avec leur protypage sont inscrites 
  41. dans le fichier "Fonctions.txt", ce protypage peut légèrement différer 
  42. des documentations OpenGL, cela afin de rendre accessible à un plus 
  43. grand nombre de compilateurs la librairie. Ainsi tous les entiers sont 
  44. systématiquement castés en "long". Les procédures utilisant des 
  45. "double" ne sont pas implémentées (elle n'ont d'ailleur aucun intérêt 
  46. car dans Mesa tous ces double sont transformés systématiquement en 
  47. "float"). Ces fonctions existent d'ailleur toujours en "float". Le 
  48. format "float" a pour principal intérêt d'être standard à la norme 
  49. IEEE, contrairement aux "double".
  50. Mesa_gl.ldg contrairement au principe des LDG n'a pas l'aptitude à 
  51. être partagée par plusieurs programmes. Dans le cas d'appel de 
  52. plusieurs programmes différents, cette librairie sera dupliquée 
  53. automatiquement.
  54.  
  55. Un exemple documenté valant mieux que de longs discours:
  56.  
  57. !!!! CAS PURE_C: PureC ne passant pas correctement les float avec
  58. le passage standard cdecl il est nécessaire de ruser!
  59. les fonctions passant des paramêtres de type float doivent être
  60. prototypées comme "long" (32 bits comme un float) et passer un
  61. "long" qui est la représentation du "float" (en créant par example
  62. un "union" entre float et long).
  63.  
  64.  
  65. Pour tester ce programme vous devez récupérer le kit de developpement
  66. LDG 1.0 ou ultérieur ainsi que Mesa_gl.ldg
  67.  
  68. For test this example you must use the LDG SDK 1.0 or higher and 
  69. Mesa_gl.ldg.
  70.  
  71. #include <stdio.h>
  72. #include <osbind.h>
  73. #include <ldg.h>  /* pour le chargement de Mesa_gl (système LDG) */
  74. #include "mesa_ldg.h"   /* Définitions pour OpenGL */
  75.  
  76.  
  77.                   /* pour déclarer toutes les fonctions à utiliser 
  78.                   dans Mesa */
  79. #undef APIENTRY
  80. #define APIENTRY __CDECL
  81.                       /* toutes les fonctions ont un passage standard 
  82.                       C de type _CDECL c'est la condition obligatoire 
  83.                       */
  84.                       /* fonctions standard OpenGL */
  85. void APIENTRY (*_glBegin)( long mode);  /*fonction glBegin() */
  86. void APIENTRY (*_glEnd)( void );        /* glEnd() */
  87. void APIENTRY (*_glColor3f)( float red, float green, float blue ); 
  88.                     /* glColor3f() */
  89. void APIENTRY (*_glClear)( long mask);  /* glClear() */
  90. void APIENTRY (*_glClearColor)( float red, float green, float blue, float alpha );
  91.                     /* glClearColor() */
  92. void APIENTRY (*_glOrtho)( float left, float right,float bottom, float top,float nearval, float farval );
  93.                     /*  glOrtho() */
  94. void APIENTRY (*_glMatrixMode)( long mode); /* glMatrixMode() */
  95. void APIENTRY (*_glLoadIdentity)( void  );  
  96.                     /* glLoadIdentity() */
  97. void APIENTRY (*_glVertex3f)( float x, float y, float z);
  98.                     /* glVertex3f() */
  99. void APIENTRY (*_glRotatef)( float angle, float x, float y, float z);
  100.                     /* glRotatef() */
  101. void APIENTRY (*_glEnable)( long cap );  /* glEnable() */
  102.  
  103.         /* fonctions spécifiques non standard ce sont les 5 
  104.         seules!!!  manque max_height() et max_width()
  105.         */
  106. void* APIENTRY (*OSMesaCreateLDG)( long format, long type, long width, long height);
  107.                     /* initialisation de Mesa et 
  108.                     création du contexte */
  109. void APIENTRY (*OSMesaDestroyLDG)( void); 
  110.                     /* destruction du contexte */
  111. void APIENTRY (*Save_TGA)(char *file, void *buffer, long width, long height);
  112.                     /* sauvegarde au format TGA */
  113.  
  114. main()
  115. { int app_id;   LDG *mesaldg;
  116.   char *image_buffer;   /* buffer de l'image générée */
  117.   long width=200, height=200;  /* taille de l'image à générer */
  118.   
  119.   app_id = appl_init (); /*initialisation GEM nécessaire pour les LDG*/
  120.   if( (mesaldg = ldg_exec ( app_id, "mesa_gl.ldg")) == NULL)  /* Chargement de la lib mesa_gl.ldg*/
  121.   { /* échec */
  122.       /* vous pouvez relancer éventuellement ldg_exec() des fois que 
  123.       le système soit lambin !!! (Mint + Multitos) ca passe souvent 
  124.       mesa est très grosse */
  125.     form_alert ( 1, "[1][Erreur chargement librairie |MESA_GL.LDG!][OK]");
  126.     appl_exit();
  127.     exit(0);
  128.   }
  129.   /* librairie chargée en mémoire tout va bien pour le moment */
  130.   /* Réalisation des liens dynamiques pour les fonctions */
  131.   _glBegin=ldg_find("glBegin", mesaldg);
  132.   _glEnd=ldg_find("glEnd", mesaldg);
  133.   _glColor3f=ldg_find("glColor3f", mesaldg);
  134.   _glClear=ldg_find("glClear", mesaldg);
  135.   _glClearColor=ldg_find("glClearColor", mesaldg);
  136.   _glOrtho=ldg_find("glOrtho", mesaldg);
  137.   _glMatrixMode=ldg_find("glMatrixMode", mesaldg); 
  138.   _glLoadIdentity=ldg_find("glLoadIdentity", mesaldg);
  139.   _glVertex3f=ldg_find("glVertex3f", mesaldg);
  140.   _glRotatef=ldg_find("glRotatef", mesaldg);
  141.   _glEnable=ldg_find("glEnable", mesaldg);
  142.   OSMesaCreateLDG=ldg_find("OSMesaCreateLDG", mesaldg);
  143.   OSMesaDestroyLDG=ldg_find("OSMesaDestroyLDG", mesaldg);
  144.   Save_TGA=ldg_find("Save_TGA", mesaldg);
  145.   
  146.   /* utilisation de la librairie */
  147.   
  148.   /* initialisation */
  149.   image_buffer = OSMesaCreateLDG(VDI_RGB, (long)GL_UNSIGNED_BYTE, width, height );
  150.       /* création du contexte la fonction retourne le pointeur sur 
  151.       le buffer image VDI_RGB type de format d'écran type 
  152.       coordonnées VDI 24bits, il existe d'autres formats voir dans 
  153.       gl.h 
  154.       2eme paramêtre mettre tj  GL_UNSIGNED_BYTE
  155.       3eme et 4eme paramêtre largeur et hauteur de l'image à créer
  156.       vous pouvez tester la taille maximale admissible par la lib
  157.       avec les fonction max_width() et max_height() ici 200*200
  158.       c'est petit donc on ne le fait pas!!!
  159.       */
  160.   if(image_buffer)  /* initialisation OK */
  161.   {
  162.       /* la on arrive dans OpenGL pur et dur juste un petit exemple */
  163.   
  164.     _glMatrixMode((long)GL_PROJECTION);
  165.     _glLoadIdentity();  /* avant toute chose il faut charger la matrice identité */
  166.     _glOrtho(-1.0,       1.0,   -1.0,    1.0,  -1.0,    1.0);  /* zone 3D de calcul et de vision*/
  167.          /*
  168.                 Y | 
  169.                   |
  170.                   |-------X
  171.                  /
  172.                Z/ 
  173.                       */
  174.     _glMatrixMode((long)GL_MODELVIEW);
  175.     _glClearColor(0.5,0.5,0.5,0.);  /* couleur d'éffacement RGBA*/
  176.     _glClear( (long)(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) );   /* on éfface */
  177.     _glEnable(GL_DEPTH_TEST);    /* test de la profondeur par rapport à l'observateur sinon les triangles sont les uns sur les autres */
  178.  
  179.     _glBegin(GL_TRIANGLES);  /* on dit que l'on va faire des triangles (en fait qu'un pour notre exemple) */
  180.                                /* 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 */
  181.         
  182.        _glColor3f(0.0, 0.0, 1.0);   /* chaque point peut recevoir une couleur ici bleu */
  183.        _glVertex3f((float)-0.5, (float)0.0, (float)0.0);  /* coin gauche */
  184.          _glColor3f(1.0, 1.0, 1.0);   /* blanc */
  185.          _glVertex3f((float)0.0, (float)0.5, (float)0.2);  /* sommet haut */ 
  186.          _glColor3f((float)1.0, (float)0.0, (float)0.0);   /* rouge */
  187.          _glVertex3f((float)0.5, (float)0.0, (float)0.0);  /* coin droit */
  188.         
  189.          _glColor3f((float)0.0, (float)1.0, (float)0.0);     /* triangle tout Vert */
  190.      
  191.          _glVertex3f((float)-0.5, (float)0.2, (float)-0.5);
  192.          _glVertex3f((float)0.5, (float)0.2, (float)-0.5);
  193.          _glVertex3f((float)0.0, (float)-0.1, (float)0.5);
  194.      
  195.     _glEnd();   /* fin de faire des triangles */
  196.         /* fin de l'utilisation de OpenGL */
  197.       /* fermeture spécifique */
  198.     OSMesaDestroyLDG();
  199.     Save_TGA("image.tga", image_buffer, width, height);  /* sauvegarde de l'image */
  200.     Mfree( image_buffer );   /* ne pas oublier de libérer le buffer image */
  201.     
  202.   }
  203.   
  204.   ldg_term(app_id, mesaldg); /* libération du LDG */
  205.  
  206.   appl_exit();
  207. }
  208.  
  209.  
  210.  
  211. Olivier LANDEMARRE
  212. 89 av jean Moulin
  213. 90000 BELFORT
  214. FRANCE
  215. Email: Olivier.landemarre@utbm.fr
  216.  
  217.