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

📄 glrender.c

📁 有限元学习研究用源代码(老外的),供科研人员参考
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -