home *** CD-ROM | disk | FTP | other *** search
/ 3D Games (Spidla) / 3dhry1.iso / carterrain / src / glode.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2003-03-17  |  3.3 KB  |  113 lines

  1. #include <allegro.h>
  2. #include <alleggl.h>
  3.  
  4. #include "glode.h"
  5. #include <GL/gl.h>
  6.  
  7. void position_gl(dBodyID b)
  8. {
  9.     const dReal *p;
  10.     float m[16];
  11.     p = dBodyGetPosition(b);
  12.     glTranslatef(p[0], p[1], p[2]);
  13.     
  14.     p = dBodyGetRotation(b);
  15.     m[0]=p[0];    m[4]=p[1];    m[8]=p[2];    m[12]=0;
  16.     m[1]=p[4];    m[5]=p[5];    m[9]=p[6];    m[13]=0;
  17.     m[2]=p[8];    m[6]=p[9];    m[10]=p[10];    m[14]=0;
  18.     m[3]=0;        m[7]=0;        m[11]=0;    m[15]=1;
  19.         
  20.     glMultMatrixf(m);
  21. }
  22. void position_gl(dGeomID g)
  23. {
  24.     const dReal *p;
  25.     float m[16];
  26.     p = dGeomGetPosition(g);
  27.     glTranslatef(p[0], p[1], p[2]);
  28.     
  29.     p = dGeomGetRotation(g);
  30.     m[0]=p[0];    m[4]=p[1];    m[8]=p[2];    m[12]=0;
  31.     m[1]=p[4];    m[5]=p[5];    m[9]=p[6];    m[13]=0;
  32.     m[2]=p[8];    m[6]=p[9];    m[10]=p[10];    m[14]=0;
  33.     m[3]=0;        m[7]=0;        m[11]=0;    m[15]=1;
  34.         
  35.     glMultMatrixf(m);
  36. }
  37.  
  38. void draw_box(double length, double width, double height)
  39. {
  40.     double x=length/2, y=width/2, z=height/2;
  41.  
  42.     glBegin(GL_QUADS);
  43.     glNormal3f( 0.0f, 0.0f, 1.0f);
  44.     glTexCoord2f(0.0f, 0.0f); glVertex3f(-x, -y,  z);
  45.     glTexCoord2f(0.0f, 0.0f); glVertex3f( x, -y,  z);
  46.     glTexCoord2f(1.0f, 1.0f); glVertex3f( x,  y,  z);
  47.     glTexCoord2f(0.0f, 1.0f); glVertex3f(-x,  y,  z);
  48.     glNormal3f( 0.0f, 0.0f,-1.0f);
  49.     glTexCoord2f(1.0f, 0.0f); glVertex3f(-x, -y, -z);
  50.     glTexCoord2f(1.0f, 1.0f); glVertex3f(-x,  y, -z);
  51.     glTexCoord2f(0.0f, 1.0f); glVertex3f( x,  y, -z);
  52.     glTexCoord2f(0.0f, 0.0f); glVertex3f( x, -y, -z);
  53.     glNormal3f( 0.0f, 1.0f, 0.0f);
  54.     glTexCoord2f(0.0f, 1.0f); glVertex3f(-x,  y, -z);
  55.     glTexCoord2f(0.0f, 0.0f); glVertex3f(-x,  y,  z);
  56.     glTexCoord2f(1.0f, 0.0f); glVertex3f( x,  y,  z);
  57.     glTexCoord2f(1.0f, 1.0f); glVertex3f( x,  y, -z);
  58.     glNormal3f( 0.0f,-1.0f, 0.0f);
  59.     glTexCoord2f(1.0f, 1.0f); glVertex3f(-x, -y, -z);
  60.     glTexCoord2f(0.0f, 1.0f); glVertex3f( x, -y, -z);
  61.     glTexCoord2f(0.0f, 0.0f); glVertex3f( x, -y,  z);
  62.     glTexCoord2f(1.0f, 0.0f); glVertex3f(-x, -y,  z);
  63.     glNormal3f( 1.0f, 0.0f, 0.0f);
  64.     glTexCoord2f(1.0f, 0.0f); glVertex3f( x, -y, -z);
  65.     glTexCoord2f(1.0f, 1.0f); glVertex3f( x,  y, -z);
  66.     glTexCoord2f(0.0f, 1.0f); glVertex3f( x,  y,  z);
  67.     glTexCoord2f(0.0f, 0.0f); glVertex3f( x, -y,  z);
  68.     glNormal3f(-1.0f, 0.0f, 0.0f);
  69.     glTexCoord2f(0.0f, 0.0f); glVertex3f(-x, -y, -z);
  70.     glTexCoord2f(1.0f, 0.0f); glVertex3f(-x, -y,  z);
  71.     glTexCoord2f(1.0f, 1.0f); glVertex3f(-x,  y,  z);
  72.     glTexCoord2f(0.0f, 1.0f); glVertex3f(-x,  y, -z);
  73.     glEnd();
  74. }
  75.  
  76. void draw_sphere(double r, int n=8)
  77. {
  78.    int i,j;
  79.    double theta1,theta2,theta3;
  80.    double ex, ey, ez;
  81.    if (r < 0)
  82.       r = -r;
  83.    if (n < 0)
  84.       n = -n;
  85.    if (n < 1 || r <= 0) {
  86.       glBegin(GL_POINTS);
  87.       glVertex3f(0,0,0);
  88.       glEnd();
  89.       return;
  90.    }
  91.    for (j=0;j<n/2;j++) {
  92.       theta1 = j * M_PI*2 / n - M_PI/2;
  93.       theta2 = (j + 1) * M_PI*2 / n - M_PI/2;
  94.       glBegin(GL_QUAD_STRIP);
  95.       for (i=0;i<=n;i++) {
  96.          theta3 = i * M_PI*2 / n;
  97.          ex = r * cos(theta2) * cos(theta3);
  98.          ey = r * sin(theta2);
  99.          ez = r * cos(theta2) * sin(theta3);
  100.          glNormal3f(ex/r,ey/r,ez/r);
  101.          glTexCoord2f(i/(double)n,2*(j+1)/(double)n);
  102.          glVertex3f(ex,ey,ez);
  103.          ex = r * cos(theta1) * cos(theta3);
  104.          ey = r * sin(theta1);
  105.          ez = r * cos(theta1) * sin(theta3);
  106.          glNormal3f(ex/r,ey/r,ez/r);
  107.          glTexCoord2f(i/(double)n,2*j/(double)n);
  108.          glVertex3f(ex,ey,ez);
  109.       }
  110.       glEnd();
  111.    }
  112. }
  113.