home *** CD-ROM | disk | FTP | other *** search
- #include <allegro.h>
- #include <alleggl.h>
-
- #include "glode.h"
- #include <GL/gl.h>
-
- void position_gl(dBodyID b)
- {
- const dReal *p;
- float m[16];
- p = dBodyGetPosition(b);
- glTranslatef(p[0], p[1], p[2]);
-
- p = dBodyGetRotation(b);
- m[0]=p[0]; m[4]=p[1]; m[8]=p[2]; m[12]=0;
- m[1]=p[4]; m[5]=p[5]; m[9]=p[6]; m[13]=0;
- m[2]=p[8]; m[6]=p[9]; m[10]=p[10]; m[14]=0;
- m[3]=0; m[7]=0; m[11]=0; m[15]=1;
-
- glMultMatrixf(m);
- }
- void position_gl(dGeomID g)
- {
- const dReal *p;
- float m[16];
- p = dGeomGetPosition(g);
- glTranslatef(p[0], p[1], p[2]);
-
- p = dGeomGetRotation(g);
- m[0]=p[0]; m[4]=p[1]; m[8]=p[2]; m[12]=0;
- m[1]=p[4]; m[5]=p[5]; m[9]=p[6]; m[13]=0;
- m[2]=p[8]; m[6]=p[9]; m[10]=p[10]; m[14]=0;
- m[3]=0; m[7]=0; m[11]=0; m[15]=1;
-
- glMultMatrixf(m);
- }
-
- void draw_box(double length, double width, double height)
- {
- double x=length/2, y=width/2, z=height/2;
-
- glBegin(GL_QUADS);
- glNormal3f( 0.0f, 0.0f, 1.0f);
- glTexCoord2f(0.0f, 0.0f); glVertex3f(-x, -y, z);
- glTexCoord2f(0.0f, 0.0f); glVertex3f( x, -y, z);
- glTexCoord2f(1.0f, 1.0f); glVertex3f( x, y, z);
- glTexCoord2f(0.0f, 1.0f); glVertex3f(-x, y, z);
- glNormal3f( 0.0f, 0.0f,-1.0f);
- glTexCoord2f(1.0f, 0.0f); glVertex3f(-x, -y, -z);
- glTexCoord2f(1.0f, 1.0f); glVertex3f(-x, y, -z);
- glTexCoord2f(0.0f, 1.0f); glVertex3f( x, y, -z);
- glTexCoord2f(0.0f, 0.0f); glVertex3f( x, -y, -z);
- glNormal3f( 0.0f, 1.0f, 0.0f);
- glTexCoord2f(0.0f, 1.0f); glVertex3f(-x, y, -z);
- glTexCoord2f(0.0f, 0.0f); glVertex3f(-x, y, z);
- glTexCoord2f(1.0f, 0.0f); glVertex3f( x, y, z);
- glTexCoord2f(1.0f, 1.0f); glVertex3f( x, y, -z);
- glNormal3f( 0.0f,-1.0f, 0.0f);
- glTexCoord2f(1.0f, 1.0f); glVertex3f(-x, -y, -z);
- glTexCoord2f(0.0f, 1.0f); glVertex3f( x, -y, -z);
- glTexCoord2f(0.0f, 0.0f); glVertex3f( x, -y, z);
- glTexCoord2f(1.0f, 0.0f); glVertex3f(-x, -y, z);
- glNormal3f( 1.0f, 0.0f, 0.0f);
- glTexCoord2f(1.0f, 0.0f); glVertex3f( x, -y, -z);
- glTexCoord2f(1.0f, 1.0f); glVertex3f( x, y, -z);
- glTexCoord2f(0.0f, 1.0f); glVertex3f( x, y, z);
- glTexCoord2f(0.0f, 0.0f); glVertex3f( x, -y, z);
- glNormal3f(-1.0f, 0.0f, 0.0f);
- glTexCoord2f(0.0f, 0.0f); glVertex3f(-x, -y, -z);
- glTexCoord2f(1.0f, 0.0f); glVertex3f(-x, -y, z);
- glTexCoord2f(1.0f, 1.0f); glVertex3f(-x, y, z);
- glTexCoord2f(0.0f, 1.0f); glVertex3f(-x, y, -z);
- glEnd();
- }
-
- void draw_sphere(double r, int n=8)
- {
- int i,j;
- double theta1,theta2,theta3;
- double ex, ey, ez;
- if (r < 0)
- r = -r;
- if (n < 0)
- n = -n;
- if (n < 1 || r <= 0) {
- glBegin(GL_POINTS);
- glVertex3f(0,0,0);
- glEnd();
- return;
- }
- for (j=0;j<n/2;j++) {
- theta1 = j * M_PI*2 / n - M_PI/2;
- theta2 = (j + 1) * M_PI*2 / n - M_PI/2;
- glBegin(GL_QUAD_STRIP);
- for (i=0;i<=n;i++) {
- theta3 = i * M_PI*2 / n;
- ex = r * cos(theta2) * cos(theta3);
- ey = r * sin(theta2);
- ez = r * cos(theta2) * sin(theta3);
- glNormal3f(ex/r,ey/r,ez/r);
- glTexCoord2f(i/(double)n,2*(j+1)/(double)n);
- glVertex3f(ex,ey,ez);
- ex = r * cos(theta1) * cos(theta3);
- ey = r * sin(theta1);
- ez = r * cos(theta1) * sin(theta3);
- glNormal3f(ex/r,ey/r,ez/r);
- glTexCoord2f(i/(double)n,2*j/(double)n);
- glVertex3f(ex,ey,ez);
- }
- glEnd();
- }
- }
-