51 const char version[] =
"CUGL V2 2009.11.24";
54 const double PI = 4 * atan(1.0);
169 Point(GLfloat
x = 0, GLfloat
y = 0, GLfloat
z = 0, GLfloat
w = 1);
176 Point (GLfloat coordinates[]);
226 void light(GLenum lightNum)
const;
356 return sqrt((p.
x - q.
x) * (p.
x - q.
x) + (p.
y - q.
y) * (p.
y - q.
y) + (p.
z - q.
z) * (p.
z - q.
z));
431 friend std::ostream &
operator<<(std::ostream & os,
const Line & k);
467 Plane(GLfloat
a = 0, GLfloat
b = 1, GLfloat
c = 0, GLfloat
d = 0);
624 Vector(GLfloat coordinates[]);
712 GLfloat
norm()
const;
894 explicit Matrix(GLenum mode);
943 const GLfloat m00,
const GLfloat m10,
const GLfloat m20,
const GLfloat m30,
944 const GLfloat m01,
const GLfloat m11,
const GLfloat m21,
const GLfloat m31,
945 const GLfloat m02,
const GLfloat m12,
const GLfloat m22,
const GLfloat m32,
946 const GLfloat m03,
const GLfloat m13,
const GLfloat m23,
const GLfloat m33 );
976 return m[0][0] +
m[1][1] +
m[2][2] +
m[3][3];
1025 double angle()
const;
1040 const GLfloat &
operator()(
int i,
int j)
const;
1180 :
s(GLfloat(cos(angle/2))),
v(GLfloat(sin(angle/2)) * axis)
1378 GLfloat
norm()
const;
1416 double angle()
const;
1436 void euler(
double & xr,
double & yr,
double & zr)
const;
1451 void trackball(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
1474 return (angle == 0) ?
1476 Quaternion(cos(angle), a * sin(angle)/angle);
1486 return (angle == 0) ?
1488 Quaternion(cos(angle), v * sin(angle)/angle);
1614 virtual void idle()=0;
1620 virtual void apply()
const =0;
1728 virtual void idle();
1743 void moveUp(GLfloat distance);
1765 void tiltUp(
double angle);
1874 void apply(
double t)
const;
1892 virtual void idle();
1900 virtual void apply()
const;
1981 PixelMap(GLint x, GLint y, GLsizei w, GLsizei h);
2005 void read(
const char *bmpFileName);
2018 void read(GLint x, GLint y, GLsizei w, GLsizei h, GLenum mode = GL_FRONT);
2024 void write(
const char *bmpFileName);
2100 void select(
const PixelMap & src,
int xp,
int yp,
int width,
int height);
2156 bool allocate(
unsigned long newSize);
2213 Revolute(
int numSteps, GLfloat profile[][2]);
2261 void draw(
bool showNormals =
false);
2284 double eccentricity;
2317 return angle *
PI / 180;
2325 return angle * 180 /
PI;
2337 static unsigned int seed = 12345678;
2338 unsigned int result;
2339 const unsigned int bucket =
static_cast<unsigned int>(4294967296.0 / max);
2342 seed = 1664525 * seed + 1013904223;
2343 result = seed / bucket;
2345 while (result >= max);
2352 return randInt(2 * max + 1) - max;
2359 return double(
randInt(BIG)) / double(BIG);
2378 void triStripNormals(Point points[], Vector normals[],
int numPoints,
bool neg =
false);
2407 void revolve(
int numSteps, GLfloat coor[][2],
int numSlices,
bool drawNormals =
false);
2422 eye[0], eye[1], eye[2],
2437 eye[0], eye[1], eye[2],
2438 model[0], model[1], model[2],
2453 eye[0], eye[1], eye[2],
2454 model[0], model[1], model[2],
2481 void axes(GLfloat size = 1);
2540 void setMaterial(
const int m, GLenum face = GL_FRONT);
2562 GLfloat ambR, GLfloat ambG, GLfloat ambB, GLfloat ambA,
2563 GLfloat difR, GLfloat difG, GLfloat difB, GLfloat difA,
2564 GLfloat speR, GLfloat speG, GLfloat speB, GLfloat speA,
2623 glVertex4f(
x,
y,
z,
w);
2633 glLightfv(lightNum, GL_POSITION, p);
2638 glTranslatef(
x/
w,
y/
w,
z/
w);
2655 return Point(s * p.
x, s * p.
y, s * p.
z, s * p.
w);
2660 return Point(s * p.
x, s * p.
y, s * p.
z, s * p.
w);
2665 return p.
x == q.
x && p.
y == q.
y && p.
z == q.
z && p.
w == q.
w;
2675 return p.
x * s.
a + p.
y * s.
b + p.
z * s.
c + p.
w * s.
d;
2680 return s.
a * p.
x + s.
b * p.
y + s.
c * p.
z + s.
d * p.
w;
2698 return m.
s == n.
s && m.
f == n.
f;
2719 return p.
a == q.
a && p.
b == q.
b && p.
c == q.
c && p.
d == q.
d;
2740 if (p.
w == 0 || q.
w == 0)
2748 x = p.
x/p.
w - q.
x/q.
w;
2749 y = p.
y/p.
w - q.
y/q.
w;
2750 z = p.
z/p.
w - q.
z/q.
w;
2794 return x *
x +
y *
y +
z *
z;
2799 return GLfloat(sqrt(
norm()));
2804 glTranslatef(
x,
y,
z);
2813 0.0f, 0.0f, 0.0f, 1.0f );
2818 glNormal3f(
x,
y,
z);
2825 (p + (*this)).
draw();
2833 if (p.
w == 0 || q.
w == 0)
2851 return Vector(s * v.
x, s * v.
y, s * v.
z);
2856 return Vector(s * v.
x, s * v.
y, s * v.
z);
2862 u.
y * v.
z - u.
z * v.
y,
2863 u.
z * v.
x - u.
x * v.
z,
2864 u.
x * v.
y - u.
y * v.
x );
2870 u.
y * v.
z - u.
z * v.
y,
2871 u.
z * v.
x - u.
x * v.
z,
2872 u.
x * v.
y - u.
y * v.
x );
2877 return u.
x * v.
x + u.
y * v.
y + u.
z * v.
z;
2882 return u.
x == v.
x && u.
y == v.
y && u.
z == v.
z;
2905 GLfloat m00, GLfloat m10, GLfloat m20, GLfloat m30,
2906 GLfloat m01, GLfloat m11, GLfloat m21, GLfloat m31,
2907 GLfloat m02, GLfloat m12, GLfloat m22, GLfloat m32,
2908 GLfloat m03, GLfloat m13, GLfloat m23, GLfloat m33 )
2934 m[0][0] * p.
x +
m[0][1] * p.
y +
m[0][2] * p.
z +
m[0][3] * p.
w,
2935 m[1][0] * p.
x +
m[1][1] * p.
y +
m[1][2] * p.
z +
m[1][3] * p.
w,
2936 m[2][0] * p.
x +
m[2][1] * p.
y +
m[2][2] * p.
z +
m[2][3] * p.
w,
2937 m[3][0] * p.
x +
m[3][1] * p.
y +
m[3][2] * p.
z +
m[3][3] * p.
w
2943 glMultMatrixf(&
m[0][0]);
2971 m[0][0] * v[0] +
m[0][1] * v[1] +
m[0][2] * v[2],
2972 m[1][0] * v[0] +
m[1][1] * v[1] +
m[1][2] * v[2],
2973 m[2][0] * v[0] +
m[2][1] * v[1] +
m[2][2] * v[2]
3023 for (
int c = 0; c < 4; ++c)
3024 for (
int r = 0; r < 4; ++r)
3025 m[c][r] += rhs(c,r);
3038 for (
int c = 0; c < 4; ++c)
3039 for (
int r = 0; r < 4; ++r)
3040 m[c][r] -= rhs(c,r);
3053 *
this = (*this) * rhs;
3060 r(0,0) = m(0,0) * n(0,0) + m(0,1) * n(1,0) + m(0,2) * n(2,0) + m(0,3) * n(3,0);
3061 r(0,1) = m(0,0) * n(0,1) + m(0,1) * n(1,1) + m(0,2) * n(2,1) + m(0,3) * n(3,1);
3062 r(0,2) = m(0,0) * n(0,2) + m(0,1) * n(1,2) + m(0,2) * n(2,2) + m(0,3) * n(3,2);
3063 r(0,3) = m(0,0) * n(0,3) + m(0,1) * n(1,3) + m(0,2) * n(2,3) + m(0,3) * n(3,3);
3064 r(1,0) = m(1,0) * n(0,0) + m(1,1) * n(1,0) + m(1,2) * n(2,0) + m(1,3) * n(3,0);
3065 r(1,1) = m(1,0) * n(0,1) + m(1,1) * n(1,1) + m(1,2) * n(2,1) + m(1,3) * n(3,1);
3066 r(1,2) = m(1,0) * n(0,2) + m(1,1) * n(1,2) + m(1,2) * n(2,2) + m(1,3) * n(3,2);
3067 r(1,3) = m(1,0) * n(0,3) + m(1,1) * n(1,3) + m(1,2) * n(2,3) + m(1,3) * n(3,3);
3068 r(2,0) = m(2,0) * n(0,0) + m(2,1) * n(1,0) + m(2,2) * n(2,0) + m(2,3) * n(3,0);
3069 r(2,1) = m(2,0) * n(0,1) + m(2,1) * n(1,1) + m(2,2) * n(2,1) + m(2,3) * n(3,1);
3070 r(2,2) = m(2,0) * n(0,2) + m(2,1) * n(1,2) + m(2,2) * n(2,2) + m(2,3) * n(3,2);
3071 r(2,3) = m(2,0) * n(0,3) + m(2,1) * n(1,3) + m(2,2) * n(2,3) + m(2,3) * n(3,3);
3072 r(3,0) = m(3,0) * n(0,0) + m(3,1) * n(1,0) + m(3,2) * n(2,0) + m(3,3) * n(3,0);
3073 r(3,1) = m(3,0) * n(0,1) + m(3,1) * n(1,1) + m(3,2) * n(2,1) + m(3,3) * n(3,1);
3074 r(3,2) = m(3,0) * n(0,2) + m(3,1) * n(1,2) + m(3,2) * n(2,2) + m(3,3) * n(3,2);
3075 r(3,3) = m(3,0) * n(0,3) + m(3,1) * n(1,3) + m(3,2) * n(2,3) + m(3,3) * n(3,3);
3081 for (
int i = 0; i < 4; i++)
3082 for (
int j = 0; j < 4; j++)
3083 if (m(i,j) != n(i,j))
3090 for (
int i = 0; i < 4; i++)
3091 for (
int j = 0; j < 4; j++)
3092 if (m(i,j) != n(i,j))
3100 for (
int i = 0; i < 4; i++)
3101 for (
int j = 0; j < 4; j++)
3102 sm(i, j) = s * m(i, j);
3109 for (
int i = 0; i < 4; i++)
3110 for (
int j = 0; j < 4; j++)
3111 ms(i, j) = s * m(i, j);
3156 -(-w[0] *
v[0] - w[1] *
v[1] - w[2] *
v[2]) * v[0] +
s * (
s * w[0] + w[1] * v[2] - w[2] * v[1])
3157 - v[1] * (
s * w[2] + w[0] * v[1] - w[1] * v[0]) + v[2] * (
s * w[1] + w[2] * v[0] - w[0] * v[2]),
3158 -(-w[0] * v[0] - w[1] * v[1] - w[2] * v[2]) * v[1] +
s * (
s * w[1] + w[2] * v[0] - w[0] * v[2])
3159 - v[2] * (
s * w[0] + w[1] * v[2] - w[2] * v[1]) + v[0] * (
s * w[2] + w[0] * v[1] - w[1] * v[0]),
3160 -(-w[0] * v[0] - w[1] * v[1] - w[2] * v[2]) * v[2] +
s * (
s * w[2] + w[0] * v[1] - w[1] * v[0])
3161 - v[0] * (
s * w[1] + w[2] * v[0] - w[0] * v[2]) + v[1] * (
s * w[0] + w[1] * v[2] - w[2] * v[1])
3182 return GLfloat(sqrt(
norm()));
3207 GLfloat ns =
s * q.
s -
v[0] * q.
v[0] -
v[1] * q.
v[1] -
v[2] * q.
v[2];
3209 q.
s *
v[0] +
s * q.
v[0] +
v[1] * q.
v[2] -
v[2] * q.
v[1],
3210 q.
s *
v[1] +
s * q.
v[1] +
v[2] * q.
v[0] -
v[0] * q.
v[2],
3211 q.
s *
v[2] +
s * q.
v[2] +
v[0] * q.
v[1] -
v[1] * q.
v[0] );
3221 return q.
s * r.
s +
dot(q.
v, r.
v);
3238 q.
s * r.
s - q.
v[0] * r.
v[0] - q.
v[1] * r.
v[1] - q.
v[2] * r.
v[2],
3239 r.
s * q.
v[0] + q.
s * r.
v[0] + q.
v[1] * r.
v[2] - q.
v[2] * r.
v[1],
3240 r.
s * q.
v[1] + q.
s * r.
v[1] + q.
v[2] * r.
v[0] - q.
v[0] * r.
v[2],
3241 r.
s * q.
v[2] + q.
s * r.
v[2] + q.
v[0] * r.
v[1] - q.
v[1] * r.
v[0]
3249 - v[0] * q.
v[0] - v[1] * q.
v[1] - v[2] * q.
v[2],
3250 q.
s * v[0] + v[1] * q.
v[2] - v[2] * q.
v[1],
3251 q.
s * v[1] + v[2] * q.
v[0] - v[0] * q.
v[2],
3252 q.
s * v[2] + v[0] * q.
v[1] - v[1] * q.
v[0]
3260 - q.
v[0] * v[0] - q.
v[1] * v[1] - q.
v[2] * v[2],
3261 q.
s * v[0] + q.
v[1] * v[2] - q.
v[2] * v[1],
3262 q.
s * v[1] + q.
v[2] * v[0] - q.
v[0] * v[2],
3263 q.
s * v[2] + q.
v[0] * v[1] - q.
v[1] * v[0]
3269 GLfloat den = q.
norm();
3270 GLfloat ns = (
s * q.
s +
v[0] * q.
v[0] +
v[1] * q.
v[1] +
v[2] * q.
v[2]) / den;
3273 (q.
s *
v[0] -
s * q.
v[0] -
v[1] * q.
v[2] +
v[2] * q.
v[1]) / den,
3274 (q.
s *
v[1] -
s * q.
v[1] -
v[2] * q.
v[0] +
v[0] * q.
v[2]) / den,
3275 (q.
s *
v[2] -
s * q.
v[2] -
v[0] * q.
v[1] +
v[1] * q.
v[0]) / den
3293 return q.
s == r.
s && q.
v == r.
v;