windows-nt/Source/XPSP1/NT/multimedia/opengl/test/demos/insect/parts.c
2020-09-26 16:20:57 +08:00

970 lines
13 KiB
C

#include <windows.h>
#include <stdio.h>
#include <math.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "gl42ogl.h"
#include "tk.h"
#include "insect.h"
#include "insectco.h"
#define BLACK 0
/* For ECLIPSE 8 bit machine */
extern GLboolean is_8bit;
GLuint screen,viewit,shadow,body,hip[6],thigh[6],shin[6],kneeball[6];
GLuint body_shadow,hip_shadow,thigh_shadow,shin_shadow,kneeball_shadow;
GLfloat k2[6][3];
GLfloat k3[6][3];
GLfloat b7[12][3];
GLfloat b8[12][3];
GLint scr[4][2];
GLfloat b1[4][3] = {
{
R1 * SIN30 * -SIN15,
R1 * SIN30 * COS15,
R1 * COS30
},
{
R1 * SIN30 * SIN15,
R1 * SIN30 * COS15,
R1 * COS30
},
{
A2 * SIN30,
A1,
A2 * COS30
},
{
-A2 * SIN30,
A1,
A2 * COS30
}
};
GLfloat b4[4][3] = {
{
R1 * SIN30 * -SIN15,
R1 * SIN30 * COS15,
-R1 * COS30
},
{
-A2 * SIN30,
A1,
-A2 * COS30
},
{
A2 * SIN30,
A1,
-A2 * COS30
},
{
R1 * SIN30 * SIN15,
R1 * SIN30 * COS15,
-R1 * COS30
}
};
GLfloat b2[4][3] = {{
R1 * SIN30 * -SIN45,
R1 * SIN30 * COS45,
R1 * COS30
},
{
R1 * SIN30 * -SIN15,
R1 * SIN30 * COS15,
R1 * COS30
},
{
-A2 * SIN30,
A1,
A2 * COS30
},
{
(A2 * SIN30) * COS60 - A1 * SIN60,
A1 * COS60 + (A2 * SIN30) * SIN60,
A2 * COS30
}
};
GLfloat b5[4][3] = {{
R1 * SIN30 * -SIN45,
R1 * SIN30 * COS45,
-R1 * COS30
},
{
(A2 * SIN30) * COS60 - A1 * SIN60,
A1 * COS60 + (A2 * SIN30) * SIN60,
-A2 * COS30
},
{
-A2 * SIN30,
A1,
-A2 * COS30
},
{
R1 * SIN30 * -SIN15,
R1 * SIN30 * COS15,
-R1 * COS30
}
};
GLfloat b3[4][3] = {{
(A2 * SIN30) * COS60 - A1 * SIN60,
A1 * COS60 + (A2 * SIN30) * SIN60,
A2 * COS30
},
{
-A2 * SIN30,
A1,
A2 * COS30
},
{
-A2,
A1,
0
},
{
(A2) * COS60 - A1 * SIN60,
A1 * COS60 + (A2) * SIN60,
0
}
};
GLfloat b6[4][3] = {{
(A2 * SIN30) * COS60 - A1 * SIN60,
A1 * COS60 + (A2 * SIN30) * SIN60,
-A2 * COS30
},
{
(A2) * COS60 - A1 * SIN60,
A1 * COS60 + (A2) * SIN60,
0.0
},
{
-A2,
A1,
0.0
},
{
-A2 * SIN30,
A1,
-A2 * COS30
}
};
GLfloat h1[4][3] = {{
A2, -A2, 0.0
},
{
R2, 0.0, 0.0
},
{
R2 * COS60,
0,
R2 * SIN60
},
{
A2 * COS60,
-A2,
A2 * SIN60
}
};
GLfloat h2[4][3] = {{
R2 * COS60,
0.0,
R2 * SIN60
},
{
R2, 0.0, 0.0
},
{
A2, A2, 0.0
},
{
A2 * COS60,
A2,
A2 * SIN60
}
};
GLfloat h3[3][3] = {{
A2, A2, 0.0
},
{
0.0, R2, 0.0
},
{
A2 * COS60,
A2,
A2 * SIN60
},
};
GLfloat t1[4][3] = {{
-A2 * COS60,
A2,
A2 * SIN60
},
{
A2 * COS60,
A2,
A2 * SIN60
},
{
A2 * COS60,
1 - A2 * COS60,
A2 * SIN60
},
{
-A2 * COS60,
1 - A2 * COS60,
A2 * SIN60
}
};
GLfloat t2[3][3] = {{
-A2 * COS60,
A2,
A2 * SIN60
},
{
-A2 * COS60,
1 - A2 * COS60,
A2 * SIN60
},
{
-A2,
A2,
0.0
}
};
GLfloat t6[3][3] = {{
-A2 * COS60,
A2,
-A2 * SIN60
},
{
-A2,
A2,
0.0
},
{
-A2 * COS60,
1 - A2,
0.0
}
};
GLfloat t3[3][3] = {{
A2 * COS60,
A2,
A2 * SIN60
},
{
A2,
A2,
0.0
},
{
A2 * COS60,
1 - A2 * COS60,
A2 * SIN60
}
};
GLfloat t7[3][3] = {{
A2 * COS60,
A2,
-A2 * SIN60
},
{
A2 * COS60,
1 - A2,
0.0
},
{
A2,
A2,
0.0
}
};
GLfloat t4[3][3] = {{
-A2 * COS60,
1.0 - A2 * COS60,
A2 * SIN60
},
{
-A2 * COS60,
1.0 - A2,
0.0
},
{
-A2,
A2,
0.0
}
};
GLfloat t5[3][3] = {{
A2 * COS60,
1.0 - A2 * COS60,
A2 * SIN60
},
{
A2,
A2,
0.0
},
{
A2 * COS60,
1 - A2,
0.0
}
};
GLfloat t8[4][3] = {{
A2 * COS60,
A2,
-A2 * SIN60
},
{
-A2 * COS60,
A2,
-A2 * SIN60
},
{
-A2 * COS60,
1 - A2,
0.0
},
{
A2 * COS60,
1 - A2,
0.0
}
};
GLfloat s1[4][3] = {{
A2 * COS60,
-A2 * COS60,
-A2 * SIN60
},
{
A2 * COS60 * 0.4,
A2 * COS60 - 2.0,
-A2 * SIN60 * 0.4
},
{
-A2 * COS60 * 0.4,
A2 * COS60 - 2.0,
-A2 * SIN60 * 0.4
},
{
-A2 * COS60,
-A2 * COS60,
-A2 * SIN60
}
};
GLfloat s2[4][3] = {{
A2 * COS60,
-A2 * COS60,
-A2 * SIN60
},
{
A2 * COS60,
-A2,
0.0
},
{
A2 * COS60 * 0.4,
-2.0,
0.0
},
{
A2 * COS60 * 0.4,
A2 * COS60 - 2.0,
-A2 * SIN60 * 0.4
}
};
GLfloat s3[4][3] = {{
-A2 * COS60,
-A2 * COS60,
-A2 * SIN60
},
{
-A2 * COS60 * 0.4,
A2 * COS60 - 2.0,
-A2 * SIN60 * 0.4
},
{
-A2 * COS60 * 0.4,
-2.0,
0.0
},
{
-A2 * COS60,
-A2,
0.0
}
};
GLfloat s4[4][3] = {{
A2 * COS60,
-A2,
0.0
},
{
-A2 * COS60,
-A2,
0.0
},
{
-A2 * COS60 * 0.4,
-2.0,
0.0
},
{
A2 * COS60 * 0.4,
-2.0,
0.0
}
};
GLfloat s5[4][3] = {{
A2 * COS60 * 0.4,
-2.0,
0.0
},
{
-A2 * COS60 * 0.4,
-2.0,
0.0
},
{
-A2 * COS60 * 0.4,
A2 * COS60 - 2.0,
-A2 * SIN60 * 0.4
},
{
A2 * COS60 * 0.4,
A2 * COS60 - 2.0,
-A2 * SIN60 * 0.4
}
};
GLfloat k1[4][3] = {{
-A2 * COS60,
1.0 - A2 * COS60,
A2 * SIN60
},
{
A2 * COS60,
1.0 - A2 * COS60,
A2 * SIN60
},
{
A2 * COS60,
1.0 + A2 * COS60,
A2 * SIN60
},
{
-A2 * COS60,
1.0 + A2 * COS60,
A2 * SIN60
}
};
/* make display list objects
screen -- for checkerboard floor
shadow -- matrix to project insect onto flat surface
viewit -- viewing transformation
and various parts of the body and their shadows
*/
void
doViewit (void) {
/*
glFrustum (-8.0, 8.0, -8.0 * 0.75, 8.0 * 0.75, 10.0, 135.0);
guPerspective (viewitFOV, viewitASPECT, 0.01, 131072.);
*/
glRotatef (ctheta/10, 1, 0, 0);
glRotatef (cphi/10, 0, 0, 1);
glTranslatef (cx, cy, cz);
}
void
createobjects (void) {
int i,
j,
k;
screen = glGenLists(32);
if (screen == 0) tkQuit();
shadow = screen + 1;
body = screen + 2;
body_shadow = screen + 3;
/* hip [4..9]
* thigh [10..15]
* knee [16..21]
* shin [22..27]
*/
hip[0] = screen + 4;
thigh[0] = screen + 10;
kneeball[0] = screen + 16;
shin[0] = screen + 22;
hip_shadow = screen + 28;
thigh_shadow = screen + 29;
kneeball_shadow = screen + 30;
shin_shadow = screen + 31;
glNewList (screen, GL_COMPILE);
glShadeModel(GL_FLAT);
/* Changed for ECLIPSE 8 bit machine */
if (is_8bit)
glIndexi (ECLIPSE8_GRID);
else
glIndexi (GRID);
k = 1;
for (i = -8; i < 7; i++)
for (j = -8; j < 7; j++) {
if (k == 0) {
scr[0][0] = i * 3;
scr[0][1] = j * 3;
scr[1][0] = (i + 1) * 3;
scr[1][1] = j * 3;
scr[2][0] = (i + 1) * 3;
scr[2][1] = (j + 1) * 3;
scr[3][0] = i * 3;
scr[3][1] = (j + 1) * 3;
polf2i (4, scr);
}
k = 1 - k;
}
glEndList ();
glNewList (shadow, GL_COMPILE);
glShadeModel(GL_FLAT);
{
float sx,
sy,
sz;
GLfloat mshadow[16];
sx = -1.0;
sy = -1.0;
sz = 1.0;
gl_IdentifyMatrix (mshadow);
/*
mshadow[2][0] = -sx / sz;
mshadow[2][1] = -sy / sz;
mshadow[2][2] = 0.;
*/
mshadow[8] = -sx / sz;
mshadow[9] = -sy / sz;
mshadow[10] = 0;
glMultMatrixf (mshadow);
}
glIndexi (BLACK);
glEndList ();
for (i = 0; i < 12; i++) {
b7[i][2] = R1 * SIN60;
b7[i][0] = R1 * COS60 * cos ((float) i * (PI / 6.0) + (PI / 12.0));
b7[i][1] = R1 * COS60 * sin ((float) i * (PI / 6.0) + (PI / 12.0));
b8[11 - i][2] = -R1 * SIN60;
b8[11 - i][0] = R1 * COS60 * cos ((float) i * (PI / 6.0) + (PI / 12.0));
b8[11 - i][1] = R1 * COS60 * sin ((float) i * (PI / 6.0) + (PI / 12.0));
}
for (i = 0; i < 6; i++) {
k2[i][0] = A2 * COS60;
k2[i][1] = A2 * cos ((float) i * (PI / 3.0)) + 1.0;
k2[i][2] = A2 * sin ((float) i * (PI / 3.0));
k3[5 - i][0] = -A2 * COS60;
k3[5 - i][1] = A2 * cos ((float) i * (PI / 3.0)) + 1.0;
k3[5 - i][2] = A2 * sin ((float) i * (PI / 3.0));
}
glNewList (body, GL_COMPILE);
glShadeModel(GL_FLAT);
glEnable (GL_CULL_FACE);
getpolycolor (0, b7);
polf (12, b7);
getpolycolor (0, b8);
polf (12, b8);
getpolycolor (0, b1);
polf (4, b1);
getpolycolor (0, b2);
polf (4, b2);
getpolycolor (0, b3);
polf (4, b3);
getpolycolor (0, b4);
polf (4, b4);
getpolycolor (0, b5);
polf (4, b5);
getpolycolor (0, b6);
polf (4, b6);
for (i = 0; i < 5; i++) {
rotate60 ('z', 4, b1);
rotate60 ('z', 4, b2);
rotate60 ('z', 4, b3);
rotate60 ('z', 4, b4);
rotate60 ('z', 4, b5);
rotate60 ('z', 4, b6);
getpolycolor (0, b1);
polf (4, b1);
getpolycolor (0, b2);
polf (4, b2);
getpolycolor (0, b3);
polf (4, b3);
getpolycolor (0, b4);
polf (4, b4);
getpolycolor (0, b5);
polf (4, b5);
getpolycolor (0, b6);
polf (4, b6);
}
glDisable (GL_CULL_FACE);
glEndList ();
glNewList (body_shadow, GL_COMPILE);
glShadeModel(GL_FLAT);
glIndexi (SHADOW_COLOR);
if (lit (3, b7))
polf (12, b7);
if (lit (3, b1))
polf (4, b1);
if (lit (3, b2))
polf (4, b2);
if (lit (3, b3))
polf (4, b3);
if (lit (3, b4))
polf (4, b4);
if (lit (3, b5))
polf (4, b5);
if (lit (3, b6))
polf (4, b6);
for (i = 0; i < 5; i++) {
rotate60 ('z', 4, b1);
rotate60 ('z', 4, b2);
rotate60 ('z', 4, b3);
rotate60 ('z', 4, b4);
rotate60 ('z', 4, b5);
rotate60 ('z', 4, b6);
if (lit (3, b1))
polf (4, b1);
if (lit (3, b2))
polf (4, b2);
if (lit (3, b3))
polf (4, b3);
if (lit (3, b4))
polf (4, b4);
if (lit (3, b5))
polf (4, b5);
if (lit (3, b6))
polf (4, b6);
}
glEndList ();
for (j = 0; j < 6; j++) {
hip[j] = hip[0] + j;
glNewList (hip[j], GL_COMPILE);
glShadeModel(GL_FLAT);
glEnable (GL_CULL_FACE);
getpolycolor (1, h1);
polf (4, h1);
getpolycolor (1, h2);
polf (4, h2);
getpolycolor (1, h3);
polf (3, h3);
for (i = 0; i < 5; i++) {
rotate60 ('y', 4, h1);
rotate60 ('y', 4, h2);
rotate60 ('y', 3, h3);
getpolycolor (1, h1);
polf (4, h1);
getpolycolor (1, h2);
polf (4, h2);
getpolycolor (1, h3);
polf (3, h3);
}
phi += PI / 3.0;
getlightvector ();
glDisable (GL_CULL_FACE);
glEndList ();
}
glNewList (hip_shadow, GL_COMPILE);
glShadeModel(GL_FLAT);
/*glEnable (GL_CULL_FACE);*/
glIndexi (SHADOW_COLOR);
polf (4, h1);
polf (4, h2);
polf (3, h3);
for (i = 0; i < 5; i++) {
rotate60 ('y', 4, h1);
rotate60 ('y', 4, h2);
rotate60 ('y', 3, h3);
polf (4, h1);
polf (4, h2);
polf (3, h3);
}
/*glDisable (GL_CULL_FACE);*/
glEndList ();
phi = 0.0;
theta = PI / 4.0;
getlightvector ();
for (j = 0; j < 6; j++) {
thigh[j] = thigh[0] + j;
glNewList (thigh[j], GL_COMPILE);
glShadeModel(GL_FLAT);
glEnable (GL_CULL_FACE);
getpolycolor (2, t1);
polf (4, t1);
getpolycolor (2, t2);
polf (3, t2);
getpolycolor (2, t3);
polf (3, t3);
getpolycolor (2, t4);
polf (3, t4);
getpolycolor (2, t5);
polf (3, t5);
getpolycolor (2, t6);
polf (3, t6);
getpolycolor (2, t7);
polf (3, t7);
getpolycolor (2, t8);
polf (4, t8);
glDisable (GL_CULL_FACE);
glEndList ();
kneeball[j] = kneeball[0] + j;
glNewList (kneeball[j], GL_COMPILE);
glShadeModel(GL_FLAT);
glEnable (GL_CULL_FACE);
getpolycolor (3, k1);
polf (4, k1);
for (k = 0; k < 4; k++)
k1[k][1] -= 1.0;
rotate60 ('x', 4, k1);
for (k = 0; k < 4; k++)
k1[k][1] += 1.0;
for (i = 0; i < 5; i++) {
if (i != 0) {
getpolycolor (3, k1);
polf (4, k1);
}
for (k = 0; k < 4; k++)
k1[k][1] -= 1.0;
rotate60 ('x', 4, k1);
for (k = 0; k < 4; k++)
k1[k][1] += 1.0;
}
getpolycolor (3, k2);
polf (6, k2);
getpolycolor (3, k3);
polf (6, k3);
glDisable (GL_CULL_FACE);
glEndList ();
shin[j] = shin[0] + j;
glNewList (shin[j], GL_COMPILE);
glShadeModel(GL_FLAT);
glEnable (GL_CULL_FACE);
getpolycolor (4, s1);
polf (4, s1);
getpolycolor (4, s2);
polf (4, s2);
getpolycolor (4, s3);
polf (4, s3);
getpolycolor (4, s4);
polf (4, s4);
getpolycolor (4, s5);
polf (4, s5);
glDisable (GL_CULL_FACE);
glEndList ();
theta -= PI / 3.0;
getlightvector ();
}
glNewList (thigh_shadow, GL_COMPILE);
glShadeModel(GL_FLAT);
/*glEnable (GL_CULL_FACE);*/
glIndexi (SHADOW_COLOR);
polf (4, t1);
polf (3, t2);
polf (3, t3);
polf (3, t4);
polf (3, t5);
polf (3, t6);
polf (3, t7);
polf (4, t8);
/*glDisable (GL_CULL_FACE);*/
glEndList ();
glNewList (kneeball_shadow, GL_COMPILE);
glShadeModel(GL_FLAT);
/*glEnable (GL_CULL_FACE);*/
glIndexi (SHADOW_COLOR);
polf (4, k1);
for (k = 0; k < 4; k++)
k1[k][1] -= 1.0;
rotate60 ('x', 4, k1);
for (k = 0; k < 4; k++)
k1[k][1] += 1.0;
for (i = 0; i < 5; i++) {
if (i != 0) {
polf (4, k1);
}
for (k = 0; k < 4; k++)
k1[k][1] -= 1.0;
rotate60 ('x', 4, k1);
for (k = 0; k < 4; k++)
k1[k][1] += 1.0;
}
polf (6, k2);
polf (6, k3);
/*glDisable (GL_CULL_FACE);*/
glEndList ();
glNewList (shin_shadow, GL_COMPILE);
glShadeModel(GL_FLAT);
/*glEnable (GL_CULL_FACE);*/
glIndexi (SHADOW_COLOR);
polf (4, s1);
polf (4, s2);
polf (4, s3);
polf (4, s4);
polf (4, s5);
/*glDisable (GL_CULL_FACE);*/
glEndList ();
}