⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 glrender.c

📁 有限元学习研究用源代码(老外的),供科研人员参考
💻 C
📖 第 1 页 / 共 5 页
字号:
  rnd->slice[2]=0.0;
  rnd->p_min=rnd->boxMin[0]+p_eps;
  rnd->p_boxMax=rnd->boxMax[0]-p_eps;
  rnd->sliceDir='x';
  rnd->level_surf=0;
  rnd->list_valid=0;

  return GL_TRUE;
}


static int iglrKeyAction_y(iglRenderer rnd, int mask)
{
  rnd->slice[0]=0.0;
  rnd->slice[1]=1.0;
  rnd->slice[2]=0.0;
  rnd->p_min=rnd->boxMin[1]+p_eps;
  rnd->p_boxMax=rnd->boxMax[1]-p_eps;
  rnd->sliceDir='y';
  rnd->level_surf=0;
  rnd->list_valid=0;
  return GL_TRUE;
}

static int iglrKeyAction_z(iglRenderer rnd, int mask)
{
  rnd->slice[0]=0.0;
  rnd->slice[1]=0.0;
  rnd->slice[2]=1.0;
  rnd->p_min=rnd->boxMin[2]+p_eps;
  rnd->p_boxMax=rnd->boxMax[2]-p_eps;
  rnd->sliceDir='z';
  rnd->level_surf=0;
  rnd->list_valid=0;
  return GL_TRUE;
}

static int iglrKeyAction_SC_in(iglRenderer rnd, int mask)
{double xm,ym,zm,xd,yd,zd;
  if(!rnd->object_move){
    rnd->cameraSC/=SQRT_2;
    return GL_TRUE;
  }
  xm = (rnd->boxMin[0] + rnd->boxMax[0])/2; xd = (rnd->boxMax[0] - rnd->boxMin[0])/2;
  ym = (rnd->boxMin[1] + rnd->boxMax[1])/2; yd = (rnd->boxMax[1] - rnd->boxMin[1])/2;
  zm = (rnd->boxMin[2] + rnd->boxMax[2])/2; zd = (rnd->boxMax[2] - rnd->boxMin[2])/2;
  iglrSetVolume(rnd,
               xm-xd/SQRT_2,xm+xd/SQRT_2,
               ym-yd/SQRT_2,ym+yd/SQRT_2,
       	       zm-zd/SQRT_2,zm+zd/SQRT_2);
  rnd->list_valid=0;
  return GL_TRUE;
}
static int iglrKeyAction_SC_out(iglRenderer rnd, int mask)
{double xm,ym,zm,xd,yd,zd;
  if(!rnd->object_move){
    rnd->cameraSC*=SQRT_2;
    return GL_TRUE;
  }
  xm = (rnd->boxMin[0] + rnd->boxMax[0])/2; xd = (rnd->boxMax[0] - rnd->boxMin[0])/2;
  ym = (rnd->boxMin[1] + rnd->boxMax[1])/2; yd = (rnd->boxMax[1] - rnd->boxMin[1])/2;
  zm = (rnd->boxMin[2] + rnd->boxMax[2])/2; zd = (rnd->boxMax[2] - rnd->boxMin[2])/2;
  iglrSetVolume(rnd,
               xm-xd*SQRT_2,xm+xd*SQRT_2,
               ym-yd*SQRT_2,ym+yd*SQRT_2,
       	       zm-zd*SQRT_2,zm+zd*SQRT_2);
  rnd->list_valid=0;
  return GL_TRUE;
}

static int iglrKeyAction_r(iglRenderer rnd, int mask)
{
  iglrReset(rnd);
  iglrShowState(rnd);
  return GL_TRUE;

}



static int iglrKeyAction_help(iglRenderer rnd, int mask)
{
  int i;
  fprintf(stderr,"-------------------------------------\n");
  fprintf(stderr,"---      IGLRender Key Table       ---\n");
  for (i=0;i<256;i++)
    {
      if (rnd->key_help_table[i])
	fprintf(stderr,"%s\n",rnd->key_help_table[i]);
    }
  fprintf(stderr,"-------------------------------------\n");
  return GL_FALSE;

}




/****************************************************************************/
static int iglrKeyAction_left(iglRenderer rnd, int mask)
{
  if (mask & GLW_SHIFT && mask & GLW_CONTROL)
     {
	if (rnd->level_surf)
	  {
	     rnd->level-= 0.1*rnd->sensitivity;  /* decrease level */
	  }
	else
	  {
	     /* shift slice */
	     rnd->slice[4]-= 0.1*rnd->sensitivity*(rnd->p_boxMax-rnd->p_min);
	     if ( -rnd->slice[4] < rnd->p_min) rnd->slice[4]= -rnd->p_min;
	     if ( -rnd->slice[4] > rnd->p_boxMax) rnd->slice[4]= -rnd->p_boxMax;
	  }
	rnd->list_valid=0;
     }
  else if (mask & GLW_CONTROL)
      rnd->lightTX-=rnd->sensitivity;         /* rotate light */
  else if (mask & GLW_SHIFT)
      if (rnd->object_move){
	  double xs;
	  xs= -0.1*rnd->sensitivity;
	  switch(rnd->sliceDir){
	  case 'x':
	      xs *= rnd->boxMax[1]-rnd->boxMin[1];
	      iglrSetVolume(rnd,
			   rnd->boxMin[0],rnd->boxMax[0],
			   rnd->boxMin[1]-xs,rnd->boxMax[1]-xs,
			   rnd->boxMin[2],rnd->boxMax[2]);
	      break;
	  case 'y':
	      xs *= rnd->boxMax[0]-rnd->boxMin[0];
	      iglrSetVolume(rnd,
			   rnd->boxMin[0]-xs,rnd->boxMax[0]-xs,
			   rnd->boxMin[1],rnd->boxMax[1],
			   rnd->boxMin[2],rnd->boxMax[2]);
	      break;
	  case 'z':
	      xs *= rnd->boxMax[0]-rnd->boxMin[0];
	      iglrSetVolume(rnd,
			   rnd->boxMin[0]-xs,rnd->boxMax[0]-xs,
			   rnd->boxMin[1],rnd->boxMax[1],
			   rnd->boxMin[2],rnd->boxMax[2]);
	      break;
	  }
	  rnd->list_valid=0;
      }else{
	  rnd->cameraTX-=0.1*rnd->sensitivity;   /* translate object */
      }
  else
      rnd->cameraRY-=10*rnd->sensitivity;     /* rotate object */

  iglrShowState(rnd);
  return GL_TRUE;

}

static int iglrKeyAction_right(iglRenderer rnd, int mask)
{
  if (mask & GLW_SHIFT && mask & GLW_CONTROL)
     {
	if (rnd->level_surf)
	  {
	     rnd->level+= 0.1*rnd->sensitivity;  /* increase level */
	  }
	else
	  {
	     /* shift slice */
	     rnd->slice[4]+= 0.1*rnd->sensitivity*(rnd->p_boxMax-rnd->p_min);
	     if ( -rnd->slice[4] < rnd->p_min) rnd->slice[4]= -rnd->p_min;
	     if ( -rnd->slice[4] > rnd->p_boxMax) rnd->slice[4]= -rnd->p_boxMax;
	  }
	rnd->list_valid=0;
     }
  else if (mask & GLW_CONTROL)
      rnd->lightTX+=rnd->sensitivity;         /* rotate light */
  else if (mask & GLW_SHIFT)
      if (rnd->object_move){
	  double xs;
	  xs= 0.1*rnd->sensitivity;
	  switch(rnd->sliceDir){
	  case 'x':
	      xs *= rnd->boxMax[1]-rnd->boxMin[1];
	      iglrSetVolume(rnd,
			   rnd->boxMin[0],rnd->boxMax[0],
			   rnd->boxMin[1]-xs,rnd->boxMax[1]-xs,
			   rnd->boxMin[2],rnd->boxMax[2]);
	      break;
	  case 'y':
	      xs *= rnd->boxMax[0]-rnd->boxMin[0];
	      iglrSetVolume(rnd,
			   rnd->boxMin[0]-xs,rnd->boxMax[0]-xs,
			   rnd->boxMin[1],rnd->boxMax[1],
			   rnd->boxMin[2],rnd->boxMax[2]);
	      break;
	  case 'z':
	      xs *= rnd->boxMax[0]-rnd->boxMin[0];
	      iglrSetVolume(rnd,
			   rnd->boxMin[0]-xs,rnd->boxMax[0]-xs,
			   rnd->boxMin[1],rnd->boxMax[1],
			   rnd->boxMin[2],rnd->boxMax[2]);
	      break;
	  }
	  rnd->list_valid=0;
      }else{
	  rnd->cameraTX+=0.1*rnd->sensitivity;   /* translate object */
      }
  else
      rnd->cameraRY+=10*rnd->sensitivity;     /* rotate object */

  iglrShowState(rnd);
  return GL_TRUE;

}
static int iglrKeyAction_up(iglRenderer rnd, int mask)
{
  if (mask & GLW_SHIFT && mask & GLW_CONTROL)
     {
	/* scale values */
	rnd->vscale += 	rnd->sensitivity;
	rnd->list_valid=0;
     }
  else if (mask & GLW_CONTROL)
     rnd->lightTY+=rnd->sensitivity;           /* rotate light */
  else if (mask & GLW_SHIFT)
      if (rnd->object_move){
	  double xs;
	  xs= 0.1*rnd->sensitivity;
	  switch(rnd->sliceDir){
	  case 'x':
	      xs *= rnd->boxMax[2]-rnd->boxMin[2];
	      iglrSetVolume(rnd,
			   rnd->boxMin[0],rnd->boxMax[0],
			   rnd->boxMin[1],rnd->boxMax[1],
			   rnd->boxMin[2]-xs,rnd->boxMax[2]-xs);
	      break;
	  case 'y':
	      xs *= rnd->boxMax[2]-rnd->boxMin[2];
	      iglrSetVolume(rnd,
			   rnd->boxMin[0],rnd->boxMax[0],
			   rnd->boxMin[1],rnd->boxMax[1],
			   rnd->boxMin[2]-xs,rnd->boxMax[2]-xs);
	      break;
	  case 'z':
	      xs *= rnd->boxMax[1]-rnd->boxMin[1];
	      iglrSetVolume(rnd,
			   rnd->boxMin[0],rnd->boxMax[0],
			   rnd->boxMin[1]-xs,rnd->boxMax[1]-xs,
			   rnd->boxMin[2],rnd->boxMax[2]);
	      break;
	  }
	  rnd->list_valid=0;
      }else{
	  rnd->cameraTY+=0.1*rnd->sensitivity;   /* translate object */
      }
  else
     rnd->cameraRX-=10*rnd->sensitivity;       /* rotate object */

  iglrShowState(rnd);
  return GL_TRUE;

}
static int iglrKeyAction_down(iglRenderer rnd, int mask)
{
  if (mask & GLW_SHIFT && mask & GLW_CONTROL)
     {
	/* scale values */
	rnd->vscale -= 	rnd->sensitivity;
	rnd->list_valid=0;
     }
  else if (mask & GLW_CONTROL)
     rnd->lightTY-=rnd->sensitivity;           /* rotate light */
  else if (mask & GLW_SHIFT)
      if (rnd->object_move){
	  double xs;
	  xs= -0.1*rnd->sensitivity;
	  switch(rnd->sliceDir){
	  case 'x':
	      xs *= rnd->boxMax[2]-rnd->boxMin[2];
	      iglrSetVolume(rnd,
			   rnd->boxMin[0],rnd->boxMax[0],
			   rnd->boxMin[1],rnd->boxMax[1],
			   rnd->boxMin[2]-xs,rnd->boxMax[2]-xs);
	      break;
	  case 'y':
	      xs *= rnd->boxMax[2]-rnd->boxMin[2];
	      iglrSetVolume(rnd,
			   rnd->boxMin[0],rnd->boxMax[0],
			   rnd->boxMin[1],rnd->boxMax[1],
			   rnd->boxMin[2]-xs,rnd->boxMax[2]-xs);
	      break;
	  case 'z':
	      xs *= rnd->boxMax[1]-rnd->boxMin[1];
	      iglrSetVolume(rnd,
			   rnd->boxMin[0],rnd->boxMax[0],
			   rnd->boxMin[1]-xs,rnd->boxMax[1]-xs,
			   rnd->boxMin[2],rnd->boxMax[2]);
	      break;
	  }
	  rnd->list_valid=0;
      }else{
	  rnd->cameraTY-=0.1*rnd->sensitivity;   /* translate object */
      }
  else
      rnd->cameraRX+=10*rnd->sensitivity;      /* rotate object */

  iglrShowState(rnd);
  return GL_TRUE;

}

static int iglrKeyAction_s(iglRenderer rnd, int mask)
{
	/* scale values */
	if(rnd->vscale==0) rnd->vscale= rnd->sensitivity;
	rnd->vscale/= SQRT_2;
	rnd->list_valid=0;
  return GL_TRUE;
}
static int iglrKeyAction_S(iglRenderer rnd, int mask)
{
	/* scale values */
	if(rnd->vscale==0) rnd->vscale= 1;
	rnd->vscale*= SQRT_2;
	rnd->list_valid=0;
  return GL_TRUE;
}


static int iglrKeyAction_wireframe(iglRenderer rnd, int mask)
{
   if(rnd->wireframe){
      glEnable(GL_LIGHTING);
      glEnable(GL_COLOR_MATERIAL);
      glEnable(GL_DEPTH_TEST);
      glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
      rnd->wireframe=0;
   }
   else  {
      rnd->wireframe=1;
      rnd->move_wireframe=1;
      rnd->move_frame=0;
      rnd->move_model=0;
      glDisable(GL_LIGHTING);
      glDisable(GL_COLOR_MATERIAL);
      glDisable(GL_DEPTH_TEST);
      glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
   }
   rnd->list_valid=0;
   iglrShowState(rnd);
   return GL_TRUE;
}

static int iglrKeyAction_info(iglRenderer rnd, int mask)
{
   fprintf(stderr,"-------------------------------------\n");
   fprintf(stderr,"---     GL State information      ---\n");
   fprintf(stderr,"-------------------------------------\n");

   if (rnd->dialog)
     fprintf(stderr,"state control: user controlled\n");
   else
     fprintf(stderr,"state control: application controlled\n");

   fprintf(stderr,"box:\n");
   fprintf(stderr,"  xmin= %+8.2e, xboxMax= %+8.2e\n",rnd->boxMin[0],rnd->boxMax[0]);
   fprintf(stderr,"  ymin= %+8.2e, yboxMax= %+8.2e\n",rnd->boxMin[1],rnd->boxMax[1]);
   fprintf(stderr,"  zmin= %+8.2e, zboxMax= %+8.2e\n",rnd->boxMin[2],rnd->boxMax[2]);

   fprintf(stderr,"object rotation:    rotx= %+8.2e,  rotz= %+8.2e\n",
	   rnd->cameraRX, rnd->cameraRY);
   fprintf(stderr,"object translation: x= %+8.2e, y= %+8.2e, z= %+8.2e\n",
	   rnd->cameraTX, rnd->cameraTY, rnd->cameraTZ);
   fprintf(stderr,"object distance:    %+8.2e\n", rnd->cameraSC);
   fprintf(stderr,"aspect ratio:       %+8.2e\n", rnd->asp);
   fprintf(stderr,"light position:     x= %+8.2e, y= %+8.2e, z= %+8.2e\n",
	   rnd->lightTX, rnd->lightTY, rnd->lightTZ);

   fprintf(stderr,"sensitivity:        %+8.2e\n", rnd->sensitivity);

   if(rnd->show_volume) fprintf(stderr,"show volume\n");
   if (rnd->level_surf)
     fprintf(stderr,"show isosurface:  level= %+8.2e\n",rnd->level);
   else  {
      fprintf(stderr,"show values on a slice:\n");
      fprintf(stderr,"  orthogonal with respect to the axis:\n");
      fprintf(stderr,"  a= %+8.2e, b= %+8.2e, c= %+8.2e\n",
	      rnd->slice[0],rnd->slice[1], rnd->slice[2]);
      fprintf(stderr,"  shift= %+8.2e\n", -rnd->slice[4]);
      fprintf(stderr,"  pmin= %+8.2e, pboxMax= %+8.2e\n",rnd->p_min, rnd->p_boxMax);

      fprintf(stderr,"scale factor for values: %+8.2e\n",rnd->vscale);
   }

   fprintf(stderr,"---\n");
   if (rnd->wireframe)  fprintf(stderr,"show edges, wireframe\n");
   else  {
      if (rnd->gouraud_shading)
      	fprintf(stderr,"show faces, gouraud shading\n");
      else
      	fprintf(stderr,"show faces, flat shading\n");
   }
   if (rnd->frame)
	  fprintf(stderr,"show bounding box(frame)\n");
   if (rnd->dialog)
     {
	if (rnd->move_model)
	  fprintf(stderr,"show the object while moving\n");
	else if (rnd->move_frame)
	  fprintf(stderr,"show the bounding box (frame) while moving\n");
	else if (rnd->move_wireframe)
	  fprintf(stderr,"show the wireframe while moving\n");
     }

   fprintf(stderr,"-------------------------------------\n");
   glwShowState(rnd->win,state);
   return GL_FALSE;
}




/****************************************************************************/


void iglrReset(iglRenderer rnd)
{
    rnd->button_hold = 0;
    rnd->object_move = 0;
    rnd->cameraRX=0.0;
    rnd->cameraRY=0.0;
    rnd->cameraTX=0.0;
    rnd->cameraTY=0.0;
    rnd->vscale=0.0;
    rnd->cameraSC=2.0;
    rnd->wireframe=0;
    rnd->move_wireframe=1;
    rnd->move_frame=0;
    rnd->asp=1.0;
    rnd->frame=1;
    rnd->gouraud_shading=1;
    rnd->sensitivity=0.5;

    rnd->bg_black=1;

⌨️ 快捷键说明

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