+static void
+pinit(ModeInfo * mi, int zera)
+{
+ pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+ int X, Y, Z;
+
+ if (zera)
+ mi->polygon_count = 0;
+
+ glClearDepth(1.0);
+ glClearColor(0.0, 0.0, 0.0, 1.0);
+ glColor3f(1.0, 1.0, 1.0);
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient0);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse0);
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, ambient1);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse1);
+ glLightfv(GL_LIGHT1, GL_POSITION, position1);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_CULL_FACE);
+
+ glShadeModel(GL_SMOOTH);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+
+ if (zera) {
+ pp->system_number = 1;
+ glDrawBuffer(dbuf_p ? GL_BACK : GL_FRONT);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ (void) memset(pp->Cells, 0, sizeof (pp->Cells));
+ for (X = 0; X < HCELLS; X++) {
+ for (Y = 0; Y < VCELLS; Y++) {
+ pp->Cells[X][Y][0] = 1;
+ pp->Cells[X][Y][HCELLS - 1] = 1;
+ pp->Cells[0][Y][X] = 1;
+ pp->Cells[HCELLS - 1][Y][X] = 1;
+ }
+ }
+ for (X = 0; X < HCELLS; X++) {
+ for (Z = 0; Z < HCELLS; Z++) {
+ pp->Cells[X][0][Z] = 1;
+ pp->Cells[X][VCELLS - 1][Z] = 1;
+ }
+ }
+ (void) memset(pp->usedcolors, 0, sizeof (pp->usedcolors));
+ if ((pp->initial_rotation += 10.0) > 45.0) {
+ pp->initial_rotation -= 90.0;
+ }
+ }
+ pp->counter = 0;
+ pp->turncounter = 0;
+
+ if (!MI_IS_MONO(mi)) {
+ int collist[DEFINEDCOLORS];
+ int i, j, lower = 1000;
+
+ /* Avoid repeating colors on the same screen unless necessary */
+ for (i = 0; i < DEFINEDCOLORS; i++) {
+ if (lower > pp->usedcolors[i])
+ lower = pp->usedcolors[i];
+ }
+ for (i = 0, j = 0; i < DEFINEDCOLORS; i++) {
+ if (pp->usedcolors[i] == lower) {
+ collist[j] = i;
+ j++;
+ }
+ }
+ i = collist[NRAND(j)];
+ pp->usedcolors[i]++;
+ switch (i) {
+ case 0:
+ pp->system_color = MaterialRed;
+ break;
+ case 1:
+ pp->system_color = MaterialGreen;
+ break;
+ case 2:
+ pp->system_color = MaterialBlue;
+ break;
+ case 3:
+ pp->system_color = MaterialCyan;
+ break;
+ case 4:
+ pp->system_color = MaterialYellow;
+ break;
+ case 5:
+ pp->system_color = MaterialMagenta;
+ break;
+ case 6:
+ pp->system_color = MaterialWhite;
+ break;
+ }
+ } else {
+ pp->system_color = MaterialGray;
+ }
+
+ do {
+ pp->PX = NRAND((HCELLS - 1)) + 1;
+ pp->PY = NRAND((VCELLS - 1)) + 1;
+ pp->PZ = NRAND((HCELLS - 1)) + 1;
+ } while (pp->Cells[pp->PX][pp->PY][pp->PZ] ||
+ (pp->Cells[pp->PX + 1][pp->PY][pp->PZ] && pp->Cells[pp->PX - 1][pp->PY][pp->PZ] &&
+ pp->Cells[pp->PX][pp->PY + 1][pp->PZ] && pp->Cells[pp->PX][pp->PY - 1][pp->PZ] &&
+ pp->Cells[pp->PX][pp->PY][pp->PZ + 1] && pp->Cells[pp->PX][pp->PY][pp->PZ - 1]));
+ pp->Cells[pp->PX][pp->PY][pp->PZ] = 1;
+ pp->olddir = dirNone;
+
+ FindNeighbors(mi);
+
+ pp->nowdir = SelectNeighbor(mi);
+}
+
+ENTRYPOINT void
+reshape_pipes(ModeInfo * mi, int width, int height)
+{
+ pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+ pinit(mi, 1);
+
+ glViewport(0, 0, pp->WindW = (GLint) width, pp->WindH = (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ /*glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0); */
+ gluPerspective(65.0, (GLfloat) width / (GLfloat) height, 0.1, 20.0);
+ glMatrixMode(GL_MODELVIEW);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+ENTRYPOINT void
+init_pipes (ModeInfo * mi)
+{
+ int screen = MI_SCREEN(mi);
+ pipesstruct *pp;
+
+ if (pipes == NULL) {
+ if ((pipes = (pipesstruct *) calloc(MI_NUM_SCREENS(mi),
+ sizeof (pipesstruct))) == NULL)
+ return;
+ }
+ pp = &pipes[screen];
+
+ pp->window = MI_WINDOW(mi);
+ if ((pp->glx_context = init_GL(mi)) != NULL) {
+
+ reshape_pipes(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ if (rotatepipes)
+ pp->initial_rotation = NRAND(180); /* jwz */
+ else
+ pp->initial_rotation = -10.0;
+ pinit(mi, 1);
+
+ if (factory > 0) {
+ pp->valve = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_BigValve);
+ pp->bolts = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_Bolts3D);
+ pp->betweenbolts = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_PipeBetweenBolts);
+
+ pp->elbowbolts = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_ElbowBolts);
+ pp->elbowcoins = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_ElbowCoins);
+
+ pp->guagehead = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_GuageHead);
+ pp->guageface = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_GuageFace);
+ pp->guagedial = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_GuageDial);
+ pp->guageconnector = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_GuageConnector);
+ }
+ /* else they are all 0, thanks to calloc(). */
+
+ if (MI_COUNT(mi) < 1 || MI_COUNT(mi) > NofSysTypes + 1) {
+ pp->system_type = NRAND(NofSysTypes) + 1;
+ } else {
+ pp->system_type = MI_COUNT(mi);
+ }
+
+ if (MI_CYCLES(mi) > 0 && MI_CYCLES(mi) < 11) {
+ pp->number_of_systems = MI_CYCLES(mi);
+ } else {
+ pp->number_of_systems = 5;
+ }
+
+ if (MI_SIZE(mi) < 10) {
+ pp->system_length = 10;
+ } else if (MI_SIZE(mi) > 1000) {
+ pp->system_length = 1000;
+ } else {
+ pp->system_length = MI_SIZE(mi);
+ }
+ } else {
+ MI_CLEARWINDOW(mi);
+ }
+}