void Gl1_Polyhedra::go(const shared_ptr<Shape>& cm, const shared_ptr<State>&,bool wire2,const GLViewInfo&) { glMaterialv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,Vector3r(cm->color[0],cm->color[1],cm->color[2])); glColor3v(cm->color); Polyhedra* t=static_cast<Polyhedra*>(cm.get()); vector<int> faceTri = t->GetSurfaceTriangulation(); if (wire || wire2) { glDisable(GL_LIGHTING); glBegin(GL_LINES); #define __ONEWIRE(a,b) glVertex3v(t->v[a]);glVertex3v(t->v[b]) for(int tri=0; tri < (int) faceTri.size(); tri+=3) {__ONEWIRE(faceTri[tri],faceTri[tri+1]); __ONEWIRE(faceTri[tri],faceTri[tri+2]); __ONEWIRE(faceTri[tri+1],faceTri[tri+2]);} #undef __ONEWIRE glEnd(); } else { Vector3r centroid = t->GetCentroid(); Vector3r faceCenter, n; glDisable(GL_CULL_FACE); glEnable(GL_LIGHTING); glBegin(GL_TRIANGLES); #define __ONEFACE(a,b,c) n=(t->v[b]-t->v[a]).cross(t->v[c]-t->v[a]); n.normalize(); faceCenter=(t->v[a]+t->v[b]+t->v[c])/3.; if((faceCenter-centroid).dot(n)<0)n=-n; glNormal3v(n); glVertex3v(t->v[a]); glVertex3v(t->v[b]); glVertex3v(t->v[c]); for(int tri=0; tri < (int) faceTri.size(); tri+=3) {__ONEFACE(faceTri[tri],faceTri[tri+1],faceTri[tri+2]);} #undef __ONEFACE glEnd(); } }
void Renderer::setLightHighlighted(int highLev){ // highLev can be <=0 (for 0), or 1 (for 1) const Vector3r& h=(highLev<=0?highlightEmission0:highlightEmission1); glMaterialv(GL_FRONT_AND_BACK,GL_EMISSION,h); glMaterialv(GL_FRONT_AND_BACK,GL_SPECULAR,h); }
inline void glMaterial( const GLenum & face, const GLenum & pname, const QVector4D & v ) { glMaterialv( face, pname, reinterpret_cast<const float*>(&v) ); }