// called for rendering spheres both and ellipsoids, differing in the scale parameter void Gl1_Sphere::renderScaledSphere(const shared_ptr<Shape>& shape, const Vector3r& shift, bool wire2, const GLViewInfo& glInfo, const Real& radius, const Vector3r& scaleAxes){ const shared_ptr<Node>& n=shape->nodes[0]; Vector3r dPos=(n->hasData<GlData>()?n->getData<GlData>().dGlPos:Vector3r::Zero()); GLUtils::setLocalCoords(shape->nodes[0]->pos+shift+dPos,shape->nodes[0]->ori); // for rendering ellipsoid if(!isnan(scaleAxes[0])) glScalev(scaleAxes); glClearDepth(1.0f); glEnable(GL_NORMALIZE); if(quality>10) quality=10; // insane setting can quickly kill the GPU Real r=radius*scale; //glColor3v(CompUtils::mapColor(shape->getBaseColor())); bool doPoints=(Renderer::fastDraw || quality<0 || (int)(quality*glutSlices)<2 || (int)(quality*glutStacks)<2); if(doPoints){ if(smooth) glEnable(GL_POINT_SMOOTH); else glDisable(GL_POINT_SMOOTH); glPointSize(1.); glBegin(GL_POINTS); glVertex3v(Vector3r(0,0,0)); glEnd(); } else if (wire || wire2 ){ glLineWidth(1.); if(!smooth) glDisable(GL_LINE_SMOOTH); glutWireSphere(r,quality*glutSlices,quality*glutStacks); if(!smooth) glEnable(GL_LINE_SMOOTH); // re-enable } else { glEnable(GL_LIGHTING); glShadeModel(GL_SMOOTH); glutSolidSphere(r,quality*glutSlices,quality*glutStacks); #if 0 //Check if quality has been modified or if previous lists are invalidated (e.g. by creating a new qt view), then regenerate lists bool somethingChanged = (abs(quality-prevQuality)>0.001 || glIsList(glStripedSphereList)!=GL_TRUE); if (somethingChanged) {initStripedGlList(); initGlutGlList(); prevQuality=quality;} glScalef(r,r,r); if(stripes) glCallList(glStripedSphereList); else glCallList(glGlutSphereList); #endif } return; }
void Gl1_Sphere::go(const shared_ptr<Shape>& cm, const shared_ptr<State>& ,bool wire2, const GLViewInfo&) { glClearDepth(1.0f); glEnable(GL_NORMALIZE); Real r=(static_cast<Sphere*>(cm.get()))->radius; glColor3v(cm->color); if (circleView) { bool somethingChanged = (std::abs(quality-prevQuality)>0.001 || prevDisplayMode!="torus" || prevCircleAllowedRotationAxis!=circleAllowedRotationAxis); if (somethingChanged) { prevCircleAllowedRotationAxis=circleAllowedRotationAxis; prevDisplayMode="torus"; glDeleteLists(glGlutSphereList,1); glGlutSphereList = glGenLists(1); glNewList(glGlutSphereList,GL_COMPILE); glEnable(GL_LIGHTING); glShadeModel(GL_SMOOTH); switch (tolower(circleAllowedRotationAxis)) { //rotate the torus according to the axis from which we want to look at it. case 'z':break; //Initial torus axis is z, nothing to do case 'x':glRotatef(90,0,1,0);break; case 'y':glRotatef(90,1,0,0);break; default:cerr<<"Error in Gl1_Sphere::go, circleAllowedRotationAxis should be \"x\", \"y\" or \"z\"."<<endl; } glutSolidTorus(0.5*circleRelThickness*r,r*(1.0-circleRelThickness/2.),quality*glutStacks,quality*glutSlices); //generate torus glEndList(); } glCallList(glGlutSphereList); } else if (wire || wire2) glutWireSphere(r,quality*glutSlices,quality*glutStacks); else { //Check if quality has been modified or if previous lists are invalidated (e.g. by creating a new qt view), then regenerate lists bool somethingChanged = (std::abs(quality-prevQuality)>0.001 || glIsList(glStripedSphereList)!=GL_TRUE || prevDisplayMode!="sphere"); if (somethingChanged) {initStripedGlList(); initGlutGlList(); prevQuality=quality;prevDisplayMode="sphere";} glScalef(r,r,r); if(stripes) glCallList(glStripedSphereList); else glCallList(glGlutSphereList); } return; }