scene.c

来自「FreeFem++可以生成高质量的有限元网格。可以用于流体力学」· C语言 代码 · 共 931 行 · 第 1/2 页

C
931
字号
#include "medit.h"#include "extern.h"#include "sproto.h"extern GLboolean  hasStereo;extern int       *pilmat,ipilmat,refmat,reftype,refitem;extern short      schw,schh;extern ubyte      quiet,fullscreen,tiling,stereoMode;/* return current active scene */int currentScene() {  int  k,idw;  idw = glutGetWindow();  for (k=0; k<MAX_SCENE; k++) {    if ( cv.scene[k] && idw == cv.scene[k]->idwin )      return(k);  }  return(0);}/* check for OpenGL error */void checkErrors(void) {  GLenum error;  while ( (error = glGetError()) != GL_NO_ERROR ) {    fprintf(stderr,"  ## ERROR: %d: %s\n",            (int)error,(char*)gluErrorString(error));    exit(1);  }}void farclip(GLboolean b) {  pScene  sc;  pPersp  p;  pCamera c;  float   look[3],ratio,units;  int     idw = currentScene();  static  GLfloat up[3] = { 0.0, 1.0, 0.0};  /* default */  sc    = cv.scene[idw];  p     = sc->persp;  c     = sc->camera;  ratio = (GLfloat)sc->par.xs / sc->par.ys;  glMatrixMode(GL_PROJECTION);  glLoadIdentity();  switch (p->pmode) {  case ORTHO:    glOrtho(-1.,1.,-1.,0.1,0.01,0.01);    break;  case PERSPECTIVE:    if ( b )      gluPerspective(p->fovy,ratio,sc->dmax,4.0*sc->dmax);    else      gluPerspective(p->fovy,ratio,0.01,10000.0*sc->dmax);    units = 1.e-02;    glPolygonOffset(1.0, units);    break;  case CAMERA:    gluPerspective(p->fovy,ratio,0.001*sc->dmax,4.0*sc->dmax);    look[0] = c->eye[0] + 0.001*sc->dmax*c->speed[0];    look[1] = c->eye[1] + 0.001*sc->dmax*c->speed[1];    look[2] = c->eye[2] + 0.001*sc->dmax*c->speed[2];    gluLookAt(c->eye[0],c->eye[1],c->eye[2],               look[0],look[1],look[2],              up[0],up[1],up[2]);    break;  }  /* zoom transformation */  if ( p->rubber == 2 ) {    glPushMatrix();    glLoadIdentity();    glRotatef(-p->gamma,1.,0.,0.);    glRotatef(p->alpha,0.,1.,0.);    glMultMatrixf(p->matrix);    glGetFloatv(GL_PROJECTION_MATRIX,p->matrix);    glPopMatrix();    p->rubber = 0;  }  /* apply transformation */  glMultMatrixf(p->matrix);  glMatrixMode(GL_MODELVIEW);}void reshapeScene(int width,int height) {  pScene   sc;  if ( ddebug ) printf("reshape scene\n");  sc = cv.scene[currentScene()];  sc->par.xs = width;  sc->par.ys = height;  glViewport(0,0,width,height);  farclip(GL_TRUE);}static void drawList(pScene sc,int clip,int map) {  pMesh   mesh = cv.mesh[sc->idmesh];  ubyte   elev = sc->mode & S_ALTITUDE;  if ( ddebug ) printf("drawList %p %d %d\n",sc,clip,map);  if ( mesh->dim == 2 && !elev ) glDisable(GL_DEPTH_TEST);  glLineWidth(1.0);  if ( clip ) {    if ( map ) {      if ( sc->cmlist[LTets] ) glCallList(sc->cmlist[LTets]);      if ( sc->cmlist[LHexa] ) glCallList(sc->cmlist[LHexa]);    }    else {      if ( sc->clist[LTets] ) glCallList(sc->clist[LTets]);      if ( sc->clist[LHexa] ) glCallList(sc->clist[LHexa]);    }  }  else if ( map ) {    if ( mesh->nt+mesh->nq ) {      if ( sc->mlist[LTria] ) glCallList(sc->mlist[LTria]);      if ( sc->mlist[LQuad] ) glCallList(sc->mlist[LQuad]);    }    else {      if ( sc->mlist[LTets] ) glCallList(sc->mlist[LTets]);      if ( sc->mlist[LHexa] ) glCallList(sc->mlist[LHexa]);    }  }  else {    if ( mesh->nt+mesh->nq ) {      if ( sc->dlist[LTria] ) glCallList(sc->dlist[LTria]);      if ( sc->dlist[LQuad] ) glCallList(sc->dlist[LQuad]);    }    else {      if ( sc->dlist[LTets] ) glCallList(sc->dlist[LTets]);      if ( sc->dlist[LHexa] ) glCallList(sc->dlist[LHexa]);    }  }  if ( mesh->dim == 2 && !elev ) glEnable(GL_DEPTH_TEST);}#ifdef ppcvoid bogusQuad(pScene sc) {  /* bogus polygon (nvidia) */  glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);    glLineWidth(1.0);    glColor3fv(sc->par.back);    glBegin(GL_QUADS);      glVertex3f(0., 0.,-sc->persp->depth);      glVertex3f(0., 0.,-sc->persp->depth);      glVertex3f(0., 0.,-sc->persp->depth);      glVertex3f(0., 0.,-sc->persp->depth);    glEnd();  glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);}#endifstatic void displayScene(pScene sc,int mode,int clip) {  int     map;    map = mode & S_MAP;  switch(mode) {  case FILL:  /* solid fill */    if ( ddebug ) printf("solid fill\n");    glEnable(GL_LIGHTING);    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);    glDisable(GL_POLYGON_OFFSET_FILL);      drawList(sc,clip,0);    glDisable(GL_LIGHTING);    break;  case WIRE:  /* basic wireframe */  case WIRE+S_MATERIAL:    if ( ddebug ) printf("wireframe\n");#ifdef ppc    bogusQuad(sc);#endif    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);    glColor4fv(sc->par.line);    glDisable(GL_POLYGON_OFFSET_FILL);      drawList(sc,clip,0);    break;  case DEPTH:  /* depth wireframe */  case DEPTH + S_MATERIAL:    if ( ddebug ) printf("depth wireframe\n");    glEnable(GL_LIGHTING);    glDisable(GL_COLOR_MATERIAL);    glDisable(GL_POLYGON_OFFSET_FILL);    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);      drawList(sc,clip,0);    glDisable(GL_LIGHTING);    break;  case HIDDEN: /* hidden lines removal */  case HIDDEN + S_MATERIAL:    if ( ddebug ) printf("hidden lines\n");    glDisable(GL_LIGHTING);    glDisable(GL_COLOR_MATERIAL);    glEnable(GL_POLYGON_OFFSET_FILL);    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);    glColor3fv(sc->par.back);      drawList(sc,clip,0);    glDisable(GL_POLYGON_OFFSET_FILL);#ifdef ppc    bogusQuad(sc);#endif    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);    glColor4fv(sc->par.line);      drawList(sc,clip,0);    break;  case SHADED: /* shaded polygons */  case SHADED+S_MATERIAL:    if ( ddebug ) printf("shaded polygons\n");    glEnable(GL_LIGHTING);    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);    glEnable(GL_POLYGON_OFFSET_FILL);      drawList(sc,clip,0);    glDisable(GL_LIGHTING);    glDisable(GL_POLYGON_OFFSET_FILL);#ifdef ppc    bogusQuad(sc);#endif    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);    glColor4fv(sc->par.line);      drawList(sc,clip,0);    break;  case SIZEMAP: /* display metric map */  case SIZEMAP+S_MATERIAL:    if ( ddebug ) printf("display sizemap\n");    glEnable(GL_LIGHTING);    glEnable(GL_COLOR_MATERIAL);    glEnable(GL_POLYGON_OFFSET_FILL);    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);      drawList(sc,clip,map);    glDisable(GL_LIGHTING);    glDisable(GL_COLOR_MATERIAL);    glDisable(GL_POLYGON_OFFSET_FILL);#ifdef ppc    bogusQuad(sc);#endif    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);    glColor4fv(sc->par.line);    glLineWidth(1.0);      drawList(sc,clip,0);    if ( sc->mode & S_ALTITUDE ) {      glColor4fv(sc->par.line);      if ( sc->mlist[LTets] ) glCallList(sc->mlist[LTets]);      if ( sc->mlist[LHexa] ) glCallList(sc->mlist[LHexa]);    }    break;  default: /* other modes */    if ( ddebug ) printf("rendering mode %d\n",sc->mode);    /* interior */    if ( sc->mode & S_FILL ) {      if ( sc->mode & S_COLOR )  glEnable(GL_LIGHTING);      glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);      glEnable(GL_POLYGON_OFFSET_FILL);      if ( sc->mode & S_MAP ) {        glEnable(GL_COLOR_MATERIAL);	drawList(sc,clip,map);        glDisable(GL_COLOR_MATERIAL);      }      else { 	glColor4fv(sc->par.back);	drawList(sc,clip,0);      }    }    /* boundary */    glDisable(GL_LIGHTING);    glDisable(GL_COLOR_MATERIAL);    glDisable(GL_POLYGON_OFFSET_FILL);#ifdef ppc    bogusQuad(sc);#endif    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);    if ( !(sc->mode & S_BDRY) )  break;    if ( sc->mode & S_COLOR && !(sc->mode & S_FILL) ) {      glEnable(GL_COLOR_MATERIAL);      glEnable(GL_LIGHTING);    }    if ( sc->mode & S_MAP) {      if ( sc->mode & S_FILL ) {        glColor4fv(sc->par.line);        drawList(sc,clip,0);      }      else        drawList(sc,clip,map);    }    else if ( sc->mode & S_ALTITUDE ) {      glColor4fv(sc->par.line);      drawList(sc,clip,map);      if ( sc->mlist[LTets] ) glCallList(sc->mlist[LTets]);      if ( sc->mlist[LHexa] ) glCallList(sc->mlist[LHexa]);    }    else {      glColor4fv(sc->par.line);      drawList(sc,clip,0);    }  }}static void displayData(pScene sc,pMesh mesh) {  int  kk;    glDisable(GL_LIGHTING);  glDisable(GL_COLOR_MATERIAL);  /* iso-lines */  if ( sc->isotyp & S_ISOLINE ) {    glLineWidth(1.0);    if ( sc->ilist[LTria] )  glCallList(sc->ilist[LTria]);    if ( sc->ilist[LQuad] )  glCallList(sc->ilist[LQuad]);    glDisable(GL_CLIP_PLANE0);    if ( sc->ilist[LTets] && sc->clip->active & C_ON )      glCallList(sc->ilist[LTets]);  }  /* vector field */  if ( sc->isotyp & S_VECTOR ) {    if ( mesh->dim == 2 ) {      if ( sc->vlist[LTria] )  glCallList(sc->vlist[LTria]);      if ( sc->vlist[LQuad] )  glCallList(sc->vlist[LQuad]);    }    else {      if ( sc->clip->active & C_ON ) {        glDisable(GL_CLIP_PLANE0);        if ( sc->vlist[LTets] )  glCallList(sc->vlist[LTets]);        if ( sc->vlist[LHexa] )  glCallList(sc->vlist[LHexa]);      }      else if (mesh->ntet+mesh->nhex == 0 )        if ( sc->vlist[LTria] )  glCallList(sc->vlist[LTria]);    }  }  /* streamlines */  if ( sc->isotyp & S_CRITP && sc->cplist )    glCallList(sc->cplist);  if ( sc->isotyp & S_STREAML ) {    for (kk=0; kk<sc->stream->nbstl; kk++)      glCallList(sc->slist[kk]);  }  else if ( sc->isotyp & S_PARTICLE ) {    glEnable(GL_LIGHTING);    glEnable(GL_COLOR_MATERIAL);    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);    displayParticle(sc,mesh);    glDisable(GL_COLOR_MATERIAL);  }  /* iso-surfaces */  if ( sc->isotyp & S_ISOSURF ) {    glEnable(GL_LIGHTING);    glEnable(GL_COLOR_MATERIAL);    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);    if ( sc->ilist[LTets] )  glCallList(sc->ilist[LTets]);    if ( sc->ilist[LHexa] )  glCallList(sc->ilist[LHexa]);    glDisable(GL_LIGHTING);    glDisable(GL_COLOR_MATERIAL);  }  }void setupView(pScene sc) {  pScene       slave;  pMesh        mesh;  pTransform   view;  pPersp       p;  pCamera      c;  int          clvol;  /* default */  if ( ddebug )  fprintf(stdout,"setupView\n");  mesh = cv.mesh[sc->idmesh];  view = sc->view;  p    = sc->persp;  c    = sc->camera;  /* init transformation matrix */  if ( sc->type & S_RESET ) {    glPushMatrix();    glLoadIdentity();    if ( p->pmode != CAMERA ) {      if ( mesh->dim == 3 || sc->mode & S_ALTITUDE ) {        glRotatef(-60.,1.,0.,0.);        glRotatef(-120.,0.,0.,1.);      }    }    else {      if ( c->vecup == X_AXIS )        glRotatef(90.0,0.0,0.0,1.0);      else if ( c->vecup == Z_AXIS )        glRotatef(-90.0,1.0,0.0,0.0);    }    glGetFloatv(GL_MODELVIEW_MATRIX,view->matrix);    glPopMatrix();    sc->type ^= S_RESET;  }  /* keep old transformation */  memcpy(view->oldmat,view->matrix,16*sizeof(float));  /* compute new transformation */  glPushMatrix();  glLoadIdentity();  if ( p->pmode != CAMERA ) {    glTranslatef(view->panx,view->pany,0.0);    if ( mesh->dim == 3 || sc->mode & S_ALTITUDE )      glRotatef(view->angle,view->axis[0],view->axis[1],view->axis[2]);    glTranslatef(-view->opanx,-view->opany,0.);    glMultMatrixf(view->matrix);    glGetFloatv(GL_MODELVIEW_MATRIX,view->matrix);  }  else if ( animate ) {    c->eye[0] += c->spmod*c->speed[0];    c->eye[1] += c->spmod*c->speed[1];    c->eye[2] += c->spmod*c->speed[2];    animateCamera();    reshapeScene(sc->par.xs,sc->par.ys);  }  glPopMatrix();  /* keep old translation */  view->opanx = view->panx;  view->opany = view->pany;  /* copy views */  if ( !animate && sc->slave > -1 ) {    slave = cv.scene[sc->slave];    memcpy(slave->view,sc->view,sizeof(struct transform));    memcpy(slave->camera,sc->camera,sizeof(struct camera));    slave->view->angle = 0.0f;    clvol = slave->clip->active & C_VOL;    memcpy(slave->clip,sc->clip,sizeof(struct clip));    if ( clvol )  slave->clip->active |= C_VOL;  }}void drawModel(pScene sc) {  pMesh        mesh;  pTransform   view;  pClip        clip;  ubyte        sstatic;  /* default */  mesh = cv.mesh[sc->idmesh];  view = sc->view;  clip = sc->clip;  if ( ddebug ) printf("\n-- redraw scene %d, mesh %d\n",sc->idwin,sc->idmesh);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?