void reshape(int width,int height) { const double dim=2.5; // Ratio of the width to the height of the window double w2h = (height>0) ? (double)width/height : 1; // Set the viewport to the entire window glViewport(0,0, width,height); // Tell OpenGL we want to manipulate the projection matrix glMatrixMode(GL_PROJECTION); // Undo previous transformations glLoadIdentity(); // Orthogonal projection glOrtho(-w2h*dim,+w2h*dim, -dim,+dim, -dim,+dim); // Switch to manipulating the model matrix glMatrixMode(GL_MODELVIEW); // Undo previous transformations glLoadIdentity(); projectify(); }
void special(int key,int x,int y) { // Right arrow key - increase angle by 5 degrees if (key == GLUT_KEY_RIGHT) th += 4; // Left arrow key - decrease angle by 5 degrees else if (key == GLUT_KEY_LEFT) th -= 4; // Up arrow key - increase elevation by 5 degrees else if (key == GLUT_KEY_UP) ph += 4; // Down arrow key - decrease elevation by 5 degrees else if (key == GLUT_KEY_DOWN) ph -= 4; // Keep angles to +/-360 degrees th %= 360; ph %= 360; // Tell GLUT it is necessary to redisplay the scene projectify(); glutPostRedisplay(); }
NCerror fixprojections(NClist* list) { int i,j,k; NCerror ncstat = NC_NOERR; NClist* tmp = nclistnew(); /* misc. uses */ #ifdef DEBUG fprintf(stderr,"fixprojection: list = %s\n",dumpprojections(list)); #endif if(nclistlength(list) == 0) goto done; /* Step 1: remove duplicates and complain about slice mismatches */ for(i=0;i<nclistlength(list);i++) { DCEprojection* p1 = (DCEprojection*)nclistget(list,i); if(p1 == NULL) continue; if(p1->discrim != CES_VAR) continue; /* dont try to unify functions */ for(j=i;j<nclistlength(list);j++) { DCEprojection* p2 = (DCEprojection*)nclistget(list,j); if(p2 == NULL) continue; if(p1 == p2) continue; if(p2->discrim != CES_VAR) continue; if(p1->var->annotation != p2->var->annotation) continue; /* check for slice mismatches */ if(!slicematch(p1->var->segments,p2->var->segments)) { /* complain */ nclog(NCLOGWARN,"Malformed projection: same variable with different slicing"); } /* remove p32 */ nclistset(list,j,(ncelem)NULL); dcefree((DCEnode*)p2); } } /* Step 2: remove containers when a field is also present */ for(i=0;i<nclistlength(list);i++) { DCEprojection* p1 = (DCEprojection*)nclistget(list,i); if(p1 == NULL) continue; if(p1->discrim != CES_VAR) continue; /* dont try to unify functions */ if(!iscontainer((CDFnode*)p1->var->annotation)) continue; for(j=i;j<nclistlength(list);j++) { DCEprojection* p2 = (DCEprojection*)nclistget(list,j); if(p2 == NULL) continue; if(p2->discrim != CES_VAR) continue; nclistclear(tmp); collectnodepath3((CDFnode*)p2->var->annotation,tmp,WITHDATASET); for(k=0;k<nclistlength(tmp);k++) { void* candidate = (void*)nclistget(tmp,k); if(candidate == p1->var->annotation) { nclistset(list,i,(ncelem)NULL); dcefree((DCEnode*)p1); goto next; } } } next: continue; } /* Step 3: expand all containers recursively down to the leaf nodes */ for(;;) { nclistclear(tmp); for(i=0;i<nclistlength(list);i++) { DCEprojection* target = (DCEprojection*)nclistget(list,i); CDFnode* leaf; if(target == NULL) continue; if(target->discrim != CES_VAR) continue; /* dont try to unify functions */ leaf = (CDFnode*)target->var->annotation; ASSERT(leaf != NULL); if(iscontainer(leaf)) {/* capture container */ if(!nclistcontains(tmp,(ncelem)target)) nclistpush(tmp,(ncelem)target); nclistset(list,i,(ncelem)NULL); } } if(nclistlength(tmp) == 0) break; /*done*/ /* Now explode the containers */ for(i=0;i<nclistlength(tmp);i++) { DCEprojection* container = (DCEprojection*)nclistget(tmp,i); CDFnode* leaf = (CDFnode*)container->var->annotation; for(j=0;i<nclistlength(leaf->subnodes);j++) { CDFnode* field = (CDFnode*)nclistget(leaf->subnodes,j); /* Convert field node to a proper constraint */ DCEprojection* proj = projectify(field,container); nclistpush(list,(ncelem)proj); } /* reclaim the container */ dcefree((DCEnode*)container); } } /*for(;;)*/ /* remove all NULL elements */ for(i=nclistlength(list)-1;i>=0;i--) { DCEprojection* target = (DCEprojection*)nclistget(list,i); if(target == NULL) nclistremove(list,i); } done: #ifdef DEBUG fprintf(stderr,"fixprojection: exploded = %s\n",dumpprojections(list)); #endif nclistfree(tmp); return ncstat; }
void key(unsigned char ch,int x,int y) { // Exit on ESC if (ch == 27 || ch == 'q' || ch == 'Q') exit(0); // Reset view angle else if (ch == '0') { th = ph = 0; //zh = 45; } else if (ch == '>') { th += 2; ph += 2; } else if (ch == '<') { th -= 2; ph -=2; } else if (ch == 'p') { if (projection == ORTHO) projection = PERSP; else projection = ORTHO; } else if (ch == 'a') { movex--; } else if (ch == 's') { movey--; } else if (ch == 'd') { movex++; } else if (ch == 'w') { movey++; } else if (ch == 'u') { movez++; } else if (ch == 'v') { movez--; } else if (ch == 'l') { // toggle the sun if (light == 0) { light = 1; } else { light = 0; } } else if (ch == 32) { if (animation == 0) { animation = 1; } else { animation = 0; } } // Keep angles to +/-360 degrees th %= 360; ph %= 360; // Tell GLUT it is necessary to redisplay the scene projectify(); glutPostRedisplay(); }