void TAG(translate_vertex)(GLcontext *ctx,
			   const VERTEX *src,
			   SWvertex *dst)
{
   LOCALVARS
   GLuint format = GET_VERTEX_FORMAT();
   UNVIEWPORT_VARS;
   CARD32 *p = (CARD32 *)src + 10 - mmesa->vertex_size;

   dst->attrib[FRAG_ATTRIB_WPOS][3] = 1.0;
   
   switch ( format ) {
      case TEX1_VERTEX_FORMAT:
#ifdef MACH64_PREMULT_TEXCOORDS
	 {
	    float rhw = 1.0 / LE32_IN_FLOAT( p + 2 );
	    
	    dst->attrib[FRAG_ATTRIB_TEX1][0] = rhw*LE32_IN_FLOAT( p++ );
	    dst->attrib[FRAG_ATTRIB_TEX1][1] = rhw*LE32_IN_FLOAT( p++ );
	 }
#else
	 dst->attrib[FRAG_ATTRIB_TEX1][0] = LE32_IN_FLOAT( p++ );
	 dst->attrib[FRAG_ATTRIB_TEX1][1] = LE32_IN_FLOAT( p++ );
#endif
	 dst->attrib[FRAG_ATTRIB_TEX1][3] = 1.0;
	 p++;

      case TEX0_VERTEX_FORMAT:
#ifdef MACH64_PREMULT_TEXCOORDS
	 {
	    float rhw = 1.0 / LE32_IN_FLOAT( p + 2 );
	    
	    dst->attrib[FRAG_ATTRIB_TEX0][0] = rhw*LE32_IN_FLOAT( p++ );
	    dst->attrib[FRAG_ATTRIB_TEX0][1] = rhw*LE32_IN_FLOAT( p++ );
	 }
#else
	 dst->attrib[FRAG_ATTRIB_TEX0][0] = LE32_IN_FLOAT( p++ );
	 dst->attrib[FRAG_ATTRIB_TEX0][1] = LE32_IN_FLOAT( p++ );
#endif
	 dst->attrib[FRAG_ATTRIB_TEX0][3] = 1.0;
	 dst->attrib[FRAG_ATTRIB_WPOS][3] = LE32_IN_FLOAT( p++ );
	
      case NOTEX_VERTEX_FORMAT:
	 dst->attrib[FRAG_ATTRIB_COL1][2] = UBYTE_TO_FLOAT(((GLubyte *)p)[0]);
	 dst->attrib[FRAG_ATTRIB_COL1][1] = UBYTE_TO_FLOAT(((GLubyte *)p)[1]);
	 dst->attrib[FRAG_ATTRIB_COL1][0] = UBYTE_TO_FLOAT(((GLubyte *)p)[2]);
	 dst->attrib[FRAG_ATTRIB_FOGC][0] = ((GLubyte *)p)[3]; /*XXX int->float?*/
	 p++;

      case TINY_VERTEX_FORMAT:
	 dst->attrib[FRAG_ATTRIB_WPOS][2] = UNVIEWPORT_Z( LE32_IN( p++ ) );

	 dst->color[2] = ((GLubyte *)p)[0];
	 dst->color[1] = ((GLubyte *)p)[1];
	 dst->color[0] = ((GLubyte *)p)[2];
	 dst->color[3] = ((GLubyte *)p)[3];
	 p++;
	 
	 {
	    GLuint xy = LE32_IN( p );
	    
	    dst->attrib[FRAG_ATTRIB_WPOS][0] = UNVIEWPORT_X( (GLfloat)(GLshort)( xy >> 16 ) );
	    dst->attrib[FRAG_ATTRIB_WPOS][1] = UNVIEWPORT_Y( (GLfloat)(GLshort)( xy & 0xffff ) );
	 }
   }

   assert( p + 1 - (CARD32 *)src == 10 );
	 
   dst->pointSize = ctx->Point.Size;
}
Example #2
0
void TAG(translate_vertex)(GLcontext *ctx,
			   const VERTEX *src,
			   SWvertex *dst)
{
   LOCALVARS
   GLuint format = GET_VERTEX_FORMAT();
   GLfloat *s = ctx->Viewport._WindowMap.m;
   UNVIEWPORT_VARS;

   if (format == TINY_VERTEX_FORMAT) {
      if (HAVE_HW_VIEWPORT) {
	 dst->win[0] = s[0]  * src->v.x + s[12];
	 dst->win[1] = s[5]  * src->v.y + s[13];
	 dst->win[2] = s[10] * src->v.z + s[14];
	 dst->win[3] = 1.0;
      } else {
	 dst->win[0] = UNVIEWPORT_X( src->v.x );
	 dst->win[1] = UNVIEWPORT_Y( src->v.y );
	 dst->win[2] = UNVIEWPORT_Z( src->v.z );
	 dst->win[3] = 1.0;
      }

      dst->color[0] = src->tv.color.red;
      dst->color[1] = src->tv.color.green;
      dst->color[2] = src->tv.color.blue;
      dst->color[3] = src->tv.color.alpha;
   }
   else {
      if (HAVE_HW_VIEWPORT) {
	 if (HAVE_HW_DIVIDE && CHECK_HW_DIVIDE) {
	    GLfloat oow = 1.0 / src->v.w;
	    dst->win[0] = s[0]  * src->v.x * oow + s[12];
	    dst->win[1] = s[5]  * src->v.y * oow + s[13];
	    dst->win[2] = s[10] * src->v.z * oow + s[14];
	    dst->win[3] = oow;
	 } else {
	    dst->win[0] = s[0]  * src->v.x + s[12];
	    dst->win[1] = s[5]  * src->v.y + s[13];
	    dst->win[2] = s[10] * src->v.z + s[14];
	    dst->win[3] = src->v.w;
	 }
      } else {
	 dst->win[0] = UNVIEWPORT_X( src->v.x );
	 dst->win[1] = UNVIEWPORT_Y( src->v.y );
	 dst->win[2] = UNVIEWPORT_Z( src->v.z );
	 dst->win[3] = src->v.w;
      }

      dst->color[0] = src->v.color.red;
      dst->color[1] = src->v.color.green;
      dst->color[2] = src->v.color.blue;
      dst->color[3] = src->v.color.alpha;

      dst->specular[0] = src->v.specular.red;
      dst->specular[1] = src->v.specular.green;
      dst->specular[2] = src->v.specular.blue;

      dst->fog = src->v.specular.alpha/255.0;

      if (HAVE_PTEX_VERTICES &&
	  ((HAVE_TEX2_VERTICES && format == PROJ_TEX3_VERTEX_FORMAT) ||
	   (format == PROJ_TEX1_VERTEX_FORMAT))) {

	 dst->texcoord[0][0] = src->pv.u0;
	 dst->texcoord[0][1] = src->pv.v0;
	 dst->texcoord[0][3] = src->pv.q0;

	 dst->texcoord[1][0] = src->pv.u1;
	 dst->texcoord[1][1] = src->pv.v1;
	 dst->texcoord[1][3] = src->pv.q1;

	 if (HAVE_TEX2_VERTICES) {
	    dst->texcoord[2][0] = src->pv.u2;
	    dst->texcoord[2][1] = src->pv.v2;
	    dst->texcoord[2][3] = src->pv.q2;
	 }

	 if (HAVE_TEX3_VERTICES) {
	    dst->texcoord[3][0] = src->pv.u3;
	    dst->texcoord[3][1] = src->pv.v3;
	    dst->texcoord[3][3] = src->pv.q3;
	 }
      }
      else {
	 dst->texcoord[0][0] = src->v.u0;
	 dst->texcoord[0][1] = src->v.v0;
	 dst->texcoord[0][3] = 1.0;

	 dst->texcoord[1][0] = src->v.u1;
	 dst->texcoord[1][1] = src->v.v1;
	 dst->texcoord[1][3] = 1.0;

	 if (HAVE_TEX2_VERTICES) {
	    dst->texcoord[2][0] = src->v.u2;
	    dst->texcoord[2][1] = src->v.v2;
	    dst->texcoord[2][3] = 1.0;
	 }

	 if (HAVE_TEX3_VERTICES) {
	    dst->texcoord[3][0] = src->v.u3;
	    dst->texcoord[3][1] = src->v.v3;
	    dst->texcoord[3][3] = 1.0;
	 }
      }
   }

   dst->pointSize = ctx->Point._Size;
}