
/**********************************************************************/
void cpack(long hexad){ 
   float red, green, blue;
   red   = (hexad & 255)/255.;
   green = ((hexad >> 8) & 255)/255.;
   blue =  ((hexad >> 16)& 255)/255.;
   glColor3f(red,green,blue);
 }
/**********************************************************************/
void drawvert(int th, int ta){  
int hexad, bb,gg,rr; 
float lmb,spec,nn[3], dog, cat;
nn[0] = C(th)*C(ta); /* unit sphere radius vector */  
nn[1] = S(th)*C(ta);
nn[2] =       S(ta);
lmb = DOT(nn,luxx);lmb =(lmb<0 ? .2 : lmb);  lmb = MAX(amb, lmb); 
spec = CLAMP((1.1 - pwr+pwr*lmb), 0., 1.);  
dog = (ta-ta0)/(float)(ta1-ta0); cat = (th-th0)/(float)(th1-th0);
/* cpack */
rr = (int)(255.* MAX(spec, lmb*dog));
gg = (int)(255.*MAX(spec, lmb*(.25 + ABS(cat -.5))));
bb = (int)(255.*MAX(spec, lmb*(1 - cat)));
hexad = (bb<<16) + (gg<<8) + rr ;
/*
hexad = ((int)(bb*255))<<16 + ((int)(gg*255))<<8 + (int)(rr*255);
*/
cpack(hexad);
#if 0
glColor3f(rr,gg,bb);
  MAX(spec, lmb*dog),                    /* map R^2(dog,cat)->R^3(RGBspace */
  MAX(spec, lmb*(.25 + ABS(cat -.5))),  /* dog cat model of Hartman       */
  MAX(spec, lmb*(1 - cat)));            /* illiLight by Ray Idaszak 1989  */
#endif
glVertex3f(
  C(th) + .5*nn[0],
  S(th) + .5*nn[1],
          .5*nn[2]);
} /* end drawvert */
/**********************************************************************/
void drawtor(void){
int th, ta;
dth = (int)((th1-th0)/24);  /* 24  meridian strips */ 
dta = (int)((ta1-ta0)/24);  /* 24  triangle pairs per strip */
for(th=th0; th < th1; th += dth){
  glBegin(GL_TRIANGLE_STRIP);
  for(ta=ta0; ta < ta1; ta += dta){ drawvert(th,ta); drawvert(th+gap*dth,ta); }
  glEnd();
  } /* end for.theta loop */
}   /* end drawtor */

