rendered paste bodyvoid Object::renderstencilshadow_glvertex ( int slot, Light *l, bool reverse ) { unsigned short *ind = outlines->indices[slot]; int nind = outlines->nindices[slot]; if ( !nind ) return; int i; int mask = 1<<slot; StartCounter ("10stencil render"); // varhandle assumed to be valid from regular rendering m.Gl (glm); glMatrixMode (GL_MODELVIEW); // is assumed to be set to camera matrix glPushMatrix (); glMultMatrixf (glm); Vector osl = l->pos * mi; glCullFace ( GL_BACK ); if ( !reverse ) glStencilOp ( GL_KEEP, GL_KEEP, GL_INCR_WRAP_EXT ); else glStencilOp ( GL_KEEP, GL_INCR_WRAP_EXT, GL_KEEP ); // draw twice once for frontfacing, once for backfacing for ( int side=0; side<2; side++ ) { // extrusion glBegin ( GL_QUADS ); for ( i=0; i<nind-1; i+=2 ) { glVertex3fv ( v[ind[i]].os.longvec ); glVertex3fv ( v[ind[i+1]].os.longvec ); glVertex4f ( v[ind[i+1]].os.x - osl.x, v[ind[i+1]].os.y - osl.y, v[ind[i+1]].os.z - osl.z, 0 ); glVertex4f ( v[ind[i]].os.x - osl.x, v[ind[i]].os.y - osl.y, v[ind[i]].os.z - osl.z, 0 ); } glEnd (); if ( !reverse ) { // only cap front glBegin ( GL_TRIANGLES ); for ( i=0; i<nf; i++ ) { if ( (f[i].flags&mask)==0 ) continue; glVertex3fv ( v[f[i].v[0]].os.longvec ); glVertex3fv ( v[f[i].v[1]].os.longvec ); glVertex3fv ( v[f[i].v[2]].os.longvec ); } glEnd (); } else { glBegin ( GL_TRIANGLES ); for ( i=0; i<nf; i++ ) { if ( (f[i].flags&mask)==0 ) { glVertex4f ( v[f[i].v[0]].os.x - osl.x, v[f[i].v[0]].os.y - osl.y, v[f[i].v[0]].os.z - osl.z, 0 ); glVertex4f ( v[f[i].v[1]].os.x - osl.x, v[f[i].v[1]].os.y - osl.y, v[f[i].v[1]].os.z - osl.z, 0 ); glVertex4f ( v[f[i].v[2]].os.x - osl.x, v[f[i].v[2]].os.y - osl.y, v[f[i].v[2]].os.z - osl.z, 0 ); } else { glVertex3fv ( v[f[i].v[0]].os.longvec ); glVertex3fv ( v[f[i].v[1]].os.longvec ); glVertex3fv ( v[f[i].v[2]].os.longvec ); } } glEnd (); } glCullFace ( GL_FRONT ); if ( !reverse ) glStencilOp ( GL_KEEP, GL_KEEP, GL_DECR_WRAP_EXT ); else glStencilOp ( GL_KEEP, GL_DECR_WRAP_EXT, GL_KEEP ); } glMatrixMode (GL_MODELVIEW); glPopMatrix (); StopCounter ("10stencil render"); }