home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 19 / AACD19.BIN / AACD / Programming / MCC_GLArea / MCC_GLArea_Dev / GLArea_Demo / GLFunctions.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-12-28  |  12.7 KB  |  383 lines

  1. /*----------------------------------------------------
  2.   Note: Contains all OpenGL related functions
  3.     GNU-C (EGCS) Port
  4. -----------------------------------------------------*/
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <math.h>
  8.  
  9. #include <libraries/mui.h>
  10.  
  11. #include <proto/alib.h>
  12. #include <proto/dos.h>
  13. #include <proto/Amigamesa.h>
  14.  
  15. #include "Main.h"
  16.  
  17. #include "GLFunctions.h"
  18.  
  19. #include "Useful/GL_stubs.h"
  20.  
  21. //--- Object
  22. extern struct ObjApp *MyApp;
  23.  
  24. //--- Globale GLState variable
  25. double angleX=0,angleY=0,oldangleX=0,oldangleY=0,angle=0;
  26. extern int object;
  27. extern int rendering;
  28. extern struct GLImage *groundimage,*objimage,*backimage;
  29. extern struct GLImage *groundtex,*objtex,*backtex;
  30.  
  31. //--- GL object models
  32. extern int DrawPawn(struct GLContext *glcontext);
  33. extern int DrawColorCube(struct GLContext *glcontext);
  34. extern int DrawGround(struct GLContext *glcontext);
  35. extern int DrawBackground(struct GLContext *glcontext);
  36.  
  37. //--- built-in "Carrelage" Texture and standard texture
  38. #include "TextureSol.gl"
  39. UBYTE notexture[]={255,255,255};
  40.  
  41. int DrawObject(struct GLContext *glcontext, int otype) {
  42.     struct Library *glBase=glcontext->gl_Base;
  43.     struct Library *gluBase=glcontext->glu_Base;
  44.     struct Library *glutBase=glcontext->glut_Base;
  45.     struct GLUquadricObj *quad=NULL;
  46.     GLfloat ambient[]={0.20,0.20,0.20,1.00};
  47.     GLfloat diffuse[]={0.80,0.20,0.00,1.00};
  48.     GLfloat specular[]={1.00,1.00,1.00,1.00};
  49.     GLfloat emissive[]={0.00,0.00,0.00,1.00};
  50.  
  51.     glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,ambient);
  52.     glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,diffuse);
  53.     glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,specular);
  54.     glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emissive);
  55.     glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,25.60);
  56.  
  57.     if (otype==CUBE) {
  58.     //--- multi color cube
  59.     DrawColorCube(glcontext);
  60.     }
  61.     else if (otype==GLUTCUBE) {
  62.     glutSolidCube(2.0);
  63.     }
  64.     else if (otype==GLUTSPHERE) {
  65.     glutSolidSphere(1.0,16,16);
  66.     }
  67.     else if (otype==GLUTCONE) {
  68.     glRotated(90,-1.0,0.0,0.0);
  69.     glTranslated(0.0,0.0,-1.0);
  70.     glutSolidCone(1.0,2.0,16,16);
  71.     }
  72.     else if (otype==GLUTTORUS) {
  73.     glutSolidTorus(0.5,1.25,16,16);
  74.     }
  75.     else if (otype==GLUTDODECAHEDRON) {
  76.     glutSolidDodecahedron();
  77.     }
  78.     else if (otype==GLUTOCTAHEDRON) {
  79.     glutSolidOctahedron();
  80.     }
  81.     else if (otype==GLUTTETRAHEDRON) {
  82.     glutSolidTetrahedron();
  83.     }
  84.     else if (otype==ICOSAHEDRON) {
  85.     glutSolidIcosahedron();
  86.     }
  87.     else if (otype==GLUTTEAPOT) {
  88.     glutSolidTeapot(1.5);
  89.     }
  90.     else if (otype==GLUCYLINDER) {
  91.     quad=(struct GLUquadricObj *) gluNewQuadric();
  92.     glTranslated(0.0,0.0,-1.5);
  93.     gluCylinder(quad,1.0,1.0,3.0,16,16);
  94.     gluDeleteQuadric(quad);
  95.     }
  96.     else if (otype==PAWN) {
  97.     glPushMatrix();
  98.     glTranslated(0.0,-0.5,0.0);
  99.     DrawPawn(glcontext);
  100.     glPopMatrix();
  101.     };
  102. }
  103. //----------------------------------------------------
  104. //--- rendering function for the SingleTask window ---
  105. //----------------------------------------------------
  106. int DrawSinglePawn(struct GLContext *glcontext) {
  107.     struct Library *glBase=glcontext->gl_Base;
  108.     struct Library *gluBase=glcontext->glu_Base;
  109.     struct Library *glutBase=glcontext->glut_Base;
  110.  
  111.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  112.     glTranslated(0.0,0.0,-5.0);
  113.     DrawPawn(glcontext);
  114.     // AmigaMesaSwapBuffers(glcontext->context);
  115.     if (CheckSignal(SIGBREAKF_CTRL_D)) return 1;
  116.     return 0;
  117. }
  118.  
  119.  
  120. //---------------------------------------
  121. //--- subtask for the SimpleAnimation ---
  122. //---------------------------------------
  123. int DrawSimpleAnimation(struct GLContext *glcontext) {
  124.     struct Library *glBase=glcontext->gl_Base;
  125.     struct Library *gluBase=glcontext->glu_Base;
  126.     struct Library *glutBase=glcontext->glut_Base;
  127.  
  128.     glMatrixMode (GL_MODELVIEW);
  129.     if (rendering==SOLID) {
  130.         glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  131.         glShadeModel(GL_SMOOTH);
  132.         glDisable(GL_TEXTURE_2D);
  133.         glDisable(GL_BLEND);
  134.     }
  135.     else if (rendering==WIRE) {
  136.         glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
  137.         glShadeModel(GL_FLAT);
  138.         glDisable(GL_TEXTURE_2D);
  139.         glDisable(GL_BLEND);
  140.     }
  141.     else if (rendering==TEXTURED) {
  142.         glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  143.         glShadeModel(GL_SMOOTH);
  144.         glEnable(GL_TEXTURE_2D);
  145.         // glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
  146.         // glDisable(GL_BLEND);
  147.     };
  148.     glTexParameteri_stub(glcontext,GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
  149.     glTexParameteri_stub(glcontext,GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
  150.     glTexParameteri_stub(glcontext,GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  151.     glTexParameteri_stub(glcontext,GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
  152.     while(1) {
  153.     angle+=2;
  154.     if (angle>360) angle-=360;
  155.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  156.     glLoadIdentity();
  157.     glTranslated(0.0,-2.0,-5.0);
  158.     if (groundtex) {
  159.         glTexImage2D_stub(glcontext,GL_TEXTURE_2D,0,GL_RGB,128,128,0,GL_RGB,GL_UNSIGNED_BYTE,groundtex->image);
  160.         // glBindTexture(GL_TEXTURE_2D,groundtex->glid);
  161.     }
  162.     else {
  163.         glTexImage2D_stub(glcontext,GL_TEXTURE_2D,0,GL_RGB,1,1,0,GL_RGB,GL_UNSIGNED_BYTE,notexture);
  164.         // glEnable(GL_TEXTURE_2D);
  165.         // glBindTexture(GL_TEXTURE_2D,0);
  166.     };
  167.     DrawBackground(glcontext);
  168.     if (backtex) {
  169.         // printf("backtex->width:%d\n",backtex->width);
  170.         glTexImage2D_stub(glcontext,GL_TEXTURE_2D,0,GL_RGB,128,128,0,GL_RGB,GL_UNSIGNED_BYTE,backtex->image);
  171.         // glBindTexture(GL_TEXTURE_2D,backtex->glid);
  172.     }
  173.     else {
  174.         glTexImage2D_stub(glcontext,GL_TEXTURE_2D,0,GL_RGB,1,1,0,GL_RGB,GL_UNSIGNED_BYTE,notexture);
  175.         // glBindTexture(GL_TEXTURE_2D,0);
  176.     };
  177.     DrawGround(glcontext);
  178.     glTranslated(0.0,2.25,0.0);
  179.     glRotated(angle,0.0,1.0,0.0);
  180.     if (objtex) {
  181.         glTexImage2D_stub(glcontext,GL_TEXTURE_2D,0,GL_RGB,128,128,0,GL_RGB,GL_UNSIGNED_BYTE,objtex->image);
  182.         // glBindTexture(GL_TEXTURE_2D,objtex->glid);
  183.     }
  184.     else {
  185.         glTexImage2D_stub(glcontext,GL_TEXTURE_2D,0,GL_RGB,1,1,0,GL_RGB,GL_UNSIGNED_BYTE,notexture);
  186.         // glBindTexture(GL_TEXTURE_2D,0);
  187.     };
  188.     DrawObject(glcontext,object);
  189.     glTranslated(0.0,-1.0,0.0);
  190.     //--- The Swapbuffer is needed, because the rendering will not get back
  191.     //--- to GLArea class code for swapping until it's finished (breaked)
  192.     AmigaMesaSwapBuffers(glcontext->context);
  193.     if (CheckSignal(SIGBREAKF_CTRL_D)) break;
  194.     };
  195.     return 1;
  196. }
  197. //-------------------------------------------------------------------------
  198. //--- Sub task functions for the MouseMove object (middle GLArea object) ---
  199. //-------------------------------------------------------------------------
  200. int DrawMouseMove(struct GLContext *glcontext) {
  201.     struct Library *glBase=glcontext->gl_Base;
  202.     struct Library *gluBase=glcontext->glu_Base;
  203.     struct Library *glutBase=glcontext->glut_Base;
  204.     glMatrixMode (GL_MODELVIEW);
  205.     glLoadIdentity();
  206.     if (rendering==SOLID) {
  207.         glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  208.         glShadeModel(GL_SMOOTH);
  209.         glDisable(GL_TEXTURE_2D);
  210.         glDisable(GL_BLEND);
  211.     }
  212.     else if (rendering==WIRE) {
  213.         glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
  214.         glShadeModel(GL_FLAT);
  215.         glDisable(GL_TEXTURE_2D);
  216.         glDisable(GL_BLEND);
  217.     }
  218.     else if (rendering==TEXTURED) {
  219.         glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  220.         glShadeModel(GL_SMOOTH);
  221.         glEnable(GL_TEXTURE_2D);
  222.         glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
  223.         glEnable(GL_BLEND);
  224.     };
  225.     glTexParameteri_stub(glcontext,GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
  226.     glTexParameteri_stub(glcontext,GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
  227.     glTexParameteri_stub(glcontext,GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  228.     glTexParameteri_stub(glcontext,GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
  229.     if (objtex) {
  230.     glTexImage2D_stub(glcontext,GL_TEXTURE_2D,0,GL_RGB,128,128,0,GL_RGB,GL_UNSIGNED_BYTE,objtex->image);
  231.     }
  232.     else {
  233.     glTexImage2D_stub(glcontext,GL_TEXTURE_2D,0,GL_RGB,128,128,0,GL_RGB,GL_UNSIGNED_BYTE,solimage);
  234.     };
  235.     
  236.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  237.     glTranslated(0.0,0.0,-5.0);
  238.     //--- Mouse rotation
  239.     glRotated(angleY, -1.0, 0.0, 0.0);
  240.     glRotated(angleX, 0.0, -1.0, 0.0);
  241.     DrawObject(glcontext,object);
  242.     // AmigaMesaSwapBuffers(glcontext->context);
  243.     if (CheckSignal(SIGBREAKF_CTRL_D)) return 1;
  244.     return 0;
  245. }
  246. //--- When mouse down
  247. void DrawMouseDown(int x, int y, struct GLContext *glcontext) {
  248.     struct Library *glBase=glcontext->gl_Base;
  249.     struct Library *gluBase=glcontext->glu_Base;
  250.     struct Library *glutBase=glcontext->glut_Base;
  251.  
  252.     //--- Well, nothing to do here
  253. }
  254. //--- When mouse moves (dragging)
  255. void DrawMouseM(int dx, int dy,struct GLContext *glcontext) {
  256.     struct Library *glBase=glcontext->gl_Base;
  257.     struct Library *gluBase=glcontext->glu_Base;
  258.     struct Library *glutBase=glcontext->glut_Base;
  259.  
  260.     angleX=oldangleX+(double) dx;
  261.     angleY=oldangleY+(double) dy;
  262.     DrawMouseMove(glcontext);
  263. }
  264. //--- Mouse up
  265. void DrawMouseUp(int x, int y, struct GLContext *glcontext) {
  266.     struct Library *glBase=glcontext->gl_Base;
  267.     struct Library *gluBase=glcontext->glu_Base;
  268.     struct Library *glutBase=glcontext->glut_Base;
  269.  
  270.     oldangleX=angleX;oldangleY=angleY;
  271. }
  272. //----------------------------------------------------------------------------
  273. //--- Sub task function for the LongRendering object (right GLArea object) ---
  274. //----------------------------------------------------------------------------
  275. int DrawLongRendering(struct GLContext *glcontext) {
  276.     struct Library *glBase=glcontext->gl_Base;
  277.     struct Library *gluBase=glcontext->glu_Base;
  278.     struct Library *glutBase=glcontext->glut_Base;
  279.     int i=0,j=0,k=0,pos=0;
  280.     double xmax=0.0;
  281.     BOOL out=FALSE;
  282.     // puts("In drawscene2");
  283.     // glCamera();
  284.     glTexParameteri_stub(glcontext,GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
  285.     glTexParameteri_stub(glcontext,GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
  286.     glTexParameteri_stub(glcontext,GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  287.     glTexParameteri_stub(glcontext,GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
  288.     glTexImage2D_stub(glcontext,GL_TEXTURE_2D,0,GL_RGB,128,128,0,GL_RGB,GL_UNSIGNED_BYTE,solimage);
  289.     glEnable(GL_TEXTURE_2D);
  290.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  291.     glLoadIdentity();
  292.     glTranslated(-13.5,-15.0,-5.0);
  293.     // glRotated(45.0,0.0,1.0,0.0);
  294.     // DrawGround(glcontext);
  295.     // glTranslated(0.0,2.0,0.0);
  296.     pos=0;out=FALSE;
  297.     for (k=0;k<10;k++) {
  298.     glPushMatrix();
  299.     for (j=0;j<10;j++) {
  300.         glPushMatrix();
  301.         for (i=0;i<10;i++) {
  302.         DrawColorCube(glcontext);
  303.         pos++;
  304.         glTranslated(0.0,0.0,-3.0);
  305.         //--- Draw the bottom gauge
  306.         xmax=_mwidth(glcontext->glarea)/1000.0*pos;
  307.         // printf("width:%d xmax:%f total:%d currentpolygone:%d\n",_mwidth(st->glcontext->glarea),xmax,st->totalpolygones,st->currentpolygone);
  308.         SetAPen(_rp(glcontext->glarea),2);
  309.         // Call some MUI macro for the object size
  310.         RectFill(_rp(glcontext->glarea),_mleft(glcontext->glarea),_mtop(glcontext->glarea)+_mheight(glcontext->glarea)-2,_mleft(glcontext->glarea)+(int) xmax,_mtop(glcontext->glarea)+_mheight(glcontext->glarea)-1);
  311.         if (out) break;
  312.         if (CheckSignal(SIGBREAKF_CTRL_D)) out=TRUE;
  313.         };
  314.         glPopMatrix();
  315.         glTranslated(3.0,0.0,0.0);
  316.         if (out) break;
  317.         if (CheckSignal(SIGBREAKF_CTRL_D)) out=TRUE;
  318.     };
  319.     glPopMatrix();
  320.     glTranslated(0.0,3.0,0.0);
  321.     if (out) break;
  322.     if (CheckSignal(SIGBREAKF_CTRL_D)) out=TRUE;
  323.     };
  324.     // AmigaMesaSwapBuffers(glcontext->context);
  325.     if (out) {
  326.     return 1;
  327.     }
  328.     else {
  329.     return 0;
  330.     };
  331. }
  332.  
  333. //---------------------------------------
  334. //--- Texture preview stamps function ---
  335. //---------------------------------------
  336. int DrawBackgroundStamp(struct GLContext *glcontext) {
  337.     return DrawStamp(glcontext,backimage);
  338. }
  339. int DrawGroundStamp(struct GLContext *glcontext) {
  340.     return DrawStamp(glcontext,groundimage);
  341. }
  342. int DrawObjectStamp(struct GLContext *glcontext) {
  343.     return DrawStamp(glcontext,objimage);
  344. }
  345.  
  346. //--------------- Stamps size previews ------------------------
  347. int DrawStamp(struct GLContext *glcontext, struct GLImage *glimage) {
  348.     struct Library *glBase=glcontext->gl_Base;
  349.     struct Library *gluBase=glcontext->glu_Base;
  350.     struct Library *glutBase=glcontext->glut_Base;
  351.  
  352.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  353.     if (glimage) {
  354.     glMatrixMode(GL_PROJECTION);
  355.     glLoadIdentity();
  356.     gluOrtho2D_stub(glcontext,0.0,glimage->width,0.0,glimage->height);
  357.     glMatrixMode(GL_MODELVIEW);
  358.     glLoadIdentity();
  359.     glRasterPos2i(0,0);
  360.     glDrawPixels(glimage->width,glimage->height,GL_RGB,GL_UNSIGNED_BYTE,glimage->image);
  361.     };
  362.     if (CheckSignal(SIGBREAKF_CTRL_D)) return 1;
  363.     return 0;
  364. }
  365.  
  366. /*
  367. int Reset(AmigaMesaContext context) {
  368.     angleX=0;angleY=0;
  369.     oldangleX=0;oldangleY=0;
  370.     mycamera.X=0;
  371.     mycamera.Y=0;
  372.     mycamera.Z=40;
  373.     mycamera.heading=0;
  374.     mycamera.pitch=0;
  375.     oldcamera=mycamera;
  376.     glMatrixMode (GL_PROJECTION);
  377.     glLoadIdentity();
  378.     gluPerspective (40.0,1.333,0.1,6000.0);
  379.     glMatrixMode (GL_MODELVIEW);
  380.     return 0;
  381. }
  382. */
  383.