📄 glrender.c
字号:
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 + -