📄 glrender.c
字号:
rnd->list_valid=rnd->data_valid;
glLightfv(GL_LIGHT0,GL_AMBIENT,lgt_ambient);
glLightfv(GL_LIGHT0,GL_DIFFUSE,lgt_diffuse);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, AmbientLight);
glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, TwoSideLighting);
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_ambient_and_diffuse);
glEnable(GL_LIGHTING);
glEnable(GL_NORMALIZE);
if (rnd->gouraud_shading)
glShadeModel(GL_SMOOTH);
else
glShadeModel(GL_FLAT);
glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER,1);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_DEPTH_TEST);
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
rnd->firstcall=0;
}
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(400.0, rnd->asp, rnd->cameraSC , rnd->cameraSC+2.0);
/*
if (rnd->state.ortho)
glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0);
else
glFrustum(-1.0,1.0,-1.0,1.0,4.0,6.0);
*/
if (rnd->bg_black)
glClearColor(0.0, 0.0, 0.0, 0.0);
else
glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if (rnd->bg_black)
glColor3f(1.0,1.0,1.0);
else
glColor3f(0.0,0.0,0.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
lt_position[0]=rnd->lightTX;
lt_position[1]=rnd->lightTY;
lt_position[2]=rnd->lightTZ;
lt_position[3]=1.0;
glTranslatef(0.0,0.0,-(rnd->cameraSC+1.0));
if(!rnd->wireframe)
{
glLightfv(GL_LIGHT0, GL_POSITION, lt_position);
glEnable(GL_LIGHT0);
}
if(rnd->frame)
{
double d=0.02;
glBegin(GL_LINES);
glVertex3f(rnd->lightTX-d,rnd->lightTY,rnd->lightTZ);
glVertex3f(rnd->lightTX+d,rnd->lightTY,rnd->lightTZ);
glVertex3f(rnd->lightTX,rnd->lightTY-d,rnd->lightTZ);
glVertex3f(rnd->lightTX,rnd->lightTY+d,rnd->lightTZ);
glVertex3f(rnd->lightTX,rnd->lightTY,rnd->lightTZ-d);
glVertex3f(rnd->lightTX,rnd->lightTY,rnd->lightTZ+d);
glVertex3f(-rnd->lightTX-d,-rnd->lightTY,-rnd->lightTZ);
glVertex3f(-rnd->lightTX+d,-rnd->lightTY,-rnd->lightTZ);
glVertex3f(-rnd->lightTX,-rnd->lightTY-d,-rnd->lightTZ);
glVertex3f(-rnd->lightTX,-rnd->lightTY+d,-rnd->lightTZ);
glVertex3f(-rnd->lightTX,-rnd->lightTY,-rnd->lightTZ-d);
glVertex3f(-rnd->lightTX,-rnd->lightTY,-rnd->lightTZ+d);
glEnd();
}
glTranslatef(rnd->cameraTX,rnd->cameraTY,0.0);
glRotatef(rnd->cameraRX,1.0,0.0,0.0);
glRotatef(rnd->cameraRY,0.0,1.0,0.0);
xsize=rnd->boxMax[0]-rnd->boxMin[0];
ysize=rnd->boxMax[1]-rnd->boxMin[1];
zsize=rnd->boxMax[2]-rnd->boxMin[2];
scalefac=xsize;
if (ysize>scalefac) scalefac=ysize;
if (zsize>scalefac) scalefac=zsize;
glScalef(1.0/scalefac,1.0/scalefac,1.0/scalefac);
glTranslatef(
-0.5*(rnd->boxMax[0]+rnd->boxMin[0]),
-0.5*(rnd->boxMax[1]+rnd->boxMin[1]),
-0.5*(rnd->boxMax[2]+rnd->boxMin[2])
);
if (rnd->frame)
{
glBegin(GL_LINES);
/* Marker an Schnittpunkten mit section slice einsetzen ist das einfachste! */
glVertex3f(rnd->boxMin[0],rnd->boxMin[1],rnd->boxMin[2]);
glVertex3f(rnd->boxMax[0],rnd->boxMin[1],rnd->boxMin[2]);
glVertex3f(rnd->boxMax[0],rnd->boxMin[1],rnd->boxMin[2]);
glVertex3f(rnd->boxMax[0],rnd->boxMax[1],rnd->boxMin[2]);
glVertex3f(rnd->boxMax[0],rnd->boxMax[1],rnd->boxMin[2]);
glVertex3f(rnd->boxMin[0],rnd->boxMax[1],rnd->boxMin[2]);
glVertex3f(rnd->boxMin[0],rnd->boxMax[1],rnd->boxMin[2]);
glVertex3f(rnd->boxMin[0],rnd->boxMin[1],rnd->boxMin[2]);
glVertex3f(rnd->boxMin[0],rnd->boxMin[1],rnd->boxMax[2]);
glVertex3f(rnd->boxMax[0],rnd->boxMin[1],rnd->boxMax[2]);
glVertex3f(rnd->boxMax[0],rnd->boxMin[1],rnd->boxMax[2]);
glVertex3f(rnd->boxMax[0],rnd->boxMax[1],rnd->boxMax[2]);
glVertex3f(rnd->boxMax[0],rnd->boxMax[1],rnd->boxMax[2]);
glVertex3f(rnd->boxMin[0],rnd->boxMax[1],rnd->boxMax[2]);
glVertex3f(rnd->boxMin[0],rnd->boxMax[1],rnd->boxMax[2]);
glVertex3f(rnd->boxMin[0],rnd->boxMin[1],rnd->boxMax[2]);
glVertex3f(rnd->boxMin[0],rnd->boxMin[1],rnd->boxMin[2]);
glVertex3f(rnd->boxMin[0],rnd->boxMin[1],rnd->boxMax[2]);
glVertex3f(rnd->boxMax[0],rnd->boxMin[1],rnd->boxMin[2]);
glVertex3f(rnd->boxMax[0],rnd->boxMin[1],rnd->boxMax[2]);
glVertex3f(rnd->boxMax[0],rnd->boxMax[1],rnd->boxMin[2]);
glVertex3f(rnd->boxMax[0],rnd->boxMax[1],rnd->boxMax[2]);
glVertex3f(rnd->boxMin[0],rnd->boxMax[1],rnd->boxMin[2]);
glVertex3f(rnd->boxMin[0],rnd->boxMax[1],rnd->boxMax[2]);
glEnd();
glRasterPos3f(rnd->boxMin[0],rnd->boxMin[1],rnd->boxMin[2]);
iglrPrint(rnd,"O");
glRasterPos3f(rnd->boxMax[0],rnd->boxMin[1],rnd->boxMin[2]);
iglrPrint(rnd,"x");
glRasterPos3f(rnd->boxMin[0],rnd->boxMax[1],rnd->boxMin[2]);
iglrPrint(rnd,"y");
glRasterPos3f(rnd->boxMin[0],rnd->boxMin[1],rnd->boxMax[2]);
iglrPrint(rnd,"z");
}
if (!rnd->wireframe || (rnd->wireframe&&rnd->move_wireframe))
{
if (!rnd->list_valid)
{
glNewList(rnd->list,GL_COMPILE_AND_EXECUTE);
rnd->list_valid=1;
iglrenderLoop(rnd);
glEndList();
}
else
glCallList(rnd->list);
}
glFlush();
if (!rnd->dump)
{
glwSwapBuffers(w);
if (!rnd->dialog) glwQuit(w);
glDisable(GL_LIGHT0);
glDisable(GL_LIGHT1);
glDisable(GL_LIGHT2);
}
}
static void iglrender0(iglRenderer rnd)
{
int was_dialog;
if (rnd->dump)
{
char fname[64];
sprintf(fname,"%s-%d.tiff",rnd->dump_name_stub,rnd->dump_i);
glwDump(rnd->win,rnd,fname,rnd->dump_w,rnd->dump_h);
rnd->dump_i++;
}
else
{
rnd->list_valid=rnd->data_valid;
glwAttach(rnd->win);
glwSetKeyDownFunc(rnd->win,iglrKey);
glwSetMouseDownFunc(rnd->win,iglrMouseDown);
glwSetMouseUpFunc(rnd->win,iglrMouseUp);
glwSetReshapeFunc(rnd->win,iglrReshape);
glwSetExposeFunc(rnd->win,iglrReshape);
glwSetRedrawFunc(rnd->win,iglrDraw);
if (rnd->next_dialog)
{
rnd->dialog=1;
rnd->next_dialog=0;
}
if (rnd->dialog)
{
iglrShowState(rnd);
glwSetControlMode(rnd->win,GLW_EVENT_DRIVEN);
was_dialog=1;
}
else
{
glwSetControlMode(rnd->win,GLW_APPLICATION_DRIVEN);
was_dialog=0;
}
glwProcess(rnd->win,rnd);
if ((!was_dialog)&&rnd->dialog)
{
glwSetControlMode(rnd->win,GLW_EVENT_DRIVEN);
glwProcess(rnd->win,rnd);
}
iglrShowState(rnd);
}
}
void iglrender1(iglRenderer rnd, iglrCallback f, void *info)
{
rnd->draw=f;
rnd->draw2=NULL;
rnd->info=info;
iglrender0(rnd);
rnd->dump=0;
}
void iglrender2(iglRenderer rnd, iglrCallback2 f, void * structure,void *info)
{
rnd->draw2=f;
rnd->draw=NULL;
rnd->info=structure;
rnd->info2=info;
iglrender0(rnd);
rnd->dump=0;
}
/*#############################@define@############################*/
void iglrInit(iglRenderer rnd)
{
int i;
iglrInitStatus(&(rnd->c));
iglrInitStatus(&(rnd->old));
rnd->saveFileName = IGLR_NAME_DefaultSaveFile;
rnd->printLevel = IGLR_PRINT_ALL;
rnd->drawLevel = IGLR_DRAW_NORMAL;
rnd->drawType = IGLR_TYPE_RECTANGLE;
rnd->drawBound[IGLR_DRAW_NONE] = 0;
rnd->drawBound[IGLR_DRAW_FRAME] = 1;
rnd->drawBound[IGLR_DRAW_WIREFRAME] = 200;
rnd->drawBound[IGLR_DRAW_COARSE] = 1000;
rnd->drawBound[IGLR_DRAW_NORMAL] = 10000;
rnd->drawBound[IGLR_DRAW_BEST] = 100000;
rnd->moveFactor[IGLR_MOVE_RX] = 10.0;
rnd->moveFactor[IGLR_MOVE_RY] = 10.0;
rnd->moveFactor[IGLR_MOVE_TX] = 0.1;
rnd->moveFactor[IGLR_MOVE_TY] = 0.1;
rnd->moveFactor[IGLR_MOVE_TZ] = 0.1;
rnd->moveFactor[IGLR_MOVE_SC] = -0.2;
rnd->moveMouseFactor[IGLR_MOVE_RX] = 0.1;
rnd->moveMouseFactor[IGLR_MOVE_RY] = 0.1;
rnd->moveMouseFactor[IGLR_MOVE_TX] = 0.1;
rnd->moveMouseFactor[IGLR_MOVE_TY] = -0.1;
rnd->moveMouseFactor[IGLR_MOVE_TZ] = 0.1;
rnd->moveMouseFactor[IGLR_MOVE_SC] = 0.1;
for(i=0;i<3;i++){
rnd->boxFullMin[i] = rnd->boxMin[i] = 0;
rnd->boxFullDelta[i] = rnd->boxDelta[i] = 1;
rnd->boxMax[i] = rnd->boxMin[i] + rnd->boxDelta[i];
rnd->prel[i] = rnd->point[i] = rnd->puntrans[i]=0.5;
rnd->slice[i] = 0;
}
rnd->slice[2] = 1;
rnd->slice[3] = -0.5;
iglrReadStatus(&(rnd->c),rnd->saveFileName);
iglrDefinePosition(rnd);
}
void iglrGetDrawType( iglRenderer rnd, int *type)
{*type = rnd->drawType;}
void iglrGetPrintLevel( iglRenderer rnd, int *level)
{*level = rnd->printLevel;}
void iglrGetDrawLevel( iglRenderer rnd, int *level, int *bound)
{*level = rnd->drawLevel; *bound = rnd->drawBound[*level];}
void iglrDefineObject( iglRenderer rnd, int obj,
char key, char *name, char *help, char *url,
iglrCallback d, void *data)
{
if(obj<1 || obj > rnd->c.maxObjects[IGLR_MODE_O]) return;
rnd->c.defined[IGLR_MODE_O][obj] = rnd->objectDefined[obj] = 1;
rnd->objectName[obj] = name;
rnd->objectHelp[obj] = help;
rnd->objectURL[obj] = url;
rnd->objectKey[obj] = key;
rnd->objectCallback[obj] = d;
rnd->object[obj] = data;
}
/*#############################@parameter@############################*/
static int iglrDefineParameter(iglRenderer rnd, int obj, int par,
char key, char *name, char *help, char *url)
{
if(obj<0 || obj >= IGLR_OBJECTS) return 0;
if(par<0 || par >= IGLR_PARAMETERS) return 0;
rnd->parDefined[obj][par] = 1;
rnd->parName[obj][par] = name;
rnd->parHelp[obj][par] = help;
rnd->parURL[obj][par] = url;
rnd->parKey[obj][par] = key;
return 1;
}
void iglrDefineAction( iglRenderer rnd, int obj, int par,
char key, char *name, char *help, char *url,
iglrCallback d)
{
if(iglrDefineParameter(rnd,obj,par,key,name,help,url)){
rnd->parType[obj][par] = IGLR_TYPE_Action;
rnd->par[obj][par].Action.call = d;
}
}
void iglrDefineInteger( iglRenderer rnd, int obj, int par,
char key, char *name, char *help, char *url,
int min, int max)
{
if(iglrDefineParameter(rnd,obj,par,key,name,help,url)){
rnd->parType[obj][par] = IGLR_TYPE_Integer;
rnd->par[obj][par].Int.min = min;
rnd->par[obj][par].Int.max = max;
}
}
void iglrDefineDouble( iglRenderer rnd, int obj, int par,
char key, char *name, char *help, char *url,
double min, double max)
{
if(iglrDefineParameter(rnd,obj,par,key,name,help,url)){
rnd->parType[obj][par] = IGLR_TYPE_Double;
rnd->par[obj][par].Double.min = min;
rnd->par[obj][par].Double.max = max;
}
}
void iglrDefineSwitch( iglRenderer rnd, int obj, int par,
char key, char *name, char *help, char *url)
{
if(iglrDefineParameter(rnd,obj,par,key,name,help,url)){
rnd->parType[obj][par] = IGLR_TYPE_Switch;
}
}
void iglrDefineEnum( iglRenderer rnd, int obj, int par,
char key, char *name, char *help, char *url,
int values, char** value)
{
if(iglrDefineParameter(rnd,obj,par,key,name,help,url)){
rnd->parType[obj][par] = IGLR_TYPE_Enum;
rnd->par[obj][par].Enum.values = values;
rnd->par[obj][par].Enum.value = value;
}
}
void iglrSetInteger( iglRenderer rnd, int obj, int par, int value)
{
if(obj<0 || obj >= IGLR_OBJECTS) return;
if(par<0 || par >= IGLR_PARAMETERS) return;
rnd->c.value[obj][par].i = value;
}
void iglrSetSwitch( iglRenderer rnd, int obj, int par, int value)
{
if(obj<0 || obj >= IGLR_OBJECTS) return;
if(par<0 || par >= IGLR_PARAMETERS) return;
rnd->c.value[obj][par].i = value;
}
void iglrSetEnum( iglRenderer rnd, int obj, int par, int value)
{
if(obj<0 || obj >= IGLR_OBJECTS) return;
if(par<0 || par >= IGLR_PARAMETERS) return;
rnd->c.value[obj][par].i = value;
}
void iglrSetDouble( iglRenderer rnd, int obj, int par, double value)
{
if(obj<0 || obj >= IGLR_OBJECTS) return;
if(par<0 || par >= IGLR_PARAMETERS) return;
rnd->c.value[obj][par].d = value;
}
int iglrGetObject( iglRenderer rnd)
{
return rnd->c.current[IGLR_MODE_O];
}
void iglrGetDouble( iglRenderer rnd, int obj, int par, double *value)
{
if(obj<0 || obj >= IGLR_OBJECTS) {*value = 0; return;}
if(par<0 || par >= IGLR_PARAMETERS) {*value = 0; return;}
*value = rnd->c.value[obj][par].d;
}
void iglrGetInteger( iglRenderer rnd, int obj, int par, int *value)
{
if(obj<0 || obj >= IGLR_OBJECTS) {*value = 0; return;}
if(par<0 || par >= IGLR_PARAMETERS) {*value = 0; return;}
*value = rnd->c.value[obj][par].i;
}
void iglrGetSwitch( iglRenderer rnd, int obj, int par, int *value)
{
if(obj<0 || obj >= IGLR_OBJECTS) {*value = 0; return;}
if(par<0 || par >= IGLR_PARAMETERS) {*value = 0; return;}
*value = rnd->c.value[obj][par].i;
}
void iglrGetEnum( iglRenderer rnd, int obj, int par, int *value)
{
if(obj<0 || obj >= IGLR_OBJECTS) {*value = 0; return;}
if(par<0 || par >= IGLR_PARAMETERS) {*value = 0; return;}
*value = rnd->c.value[obj][par].i;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -