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;
}
Beispiel #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;
}
void TAG(print_vertex)( GLcontext *ctx, const VERTEX *v )
{
   LOCALVARS
   GLuint format = GET_VERTEX_FORMAT();
   CARD32 *p = (CARD32 *)v + 10 - mmesa->vertex_size;
   
   switch ( format ) {
      case TEX1_VERTEX_FORMAT:
	 {
	    GLfloat u, v, w;
#ifdef MACH64_PREMULT_TEXCOORDS
	    float rhw = 1.0 / LE32_IN_FLOAT( p + 2 );
	    
	    u = rhw*LE32_IN_FLOAT( p++ );
	    v = rhw*LE32_IN_FLOAT( p++ );
#else
	    u = LE32_IN_FLOAT( p++ );
	    v = LE32_IN_FLOAT( p++ );
#endif
	    w = LE32_IN_FLOAT( p++ );
	    fprintf( stderr, "u1 %f v1 %f w1 %f\n", u, v, w );
	 }

      case TEX0_VERTEX_FORMAT:
	 {
	    GLfloat u, v, w;
#ifdef MACH64_PREMULT_TEXCOORDS
	    float rhw = 1.0 / LE32_IN_FLOAT( p + 2 );
	    
	    u = rhw*LE32_IN_FLOAT( p++ );
	    v = rhw*LE32_IN_FLOAT( p++ );
#else
	    u = LE32_IN_FLOAT( p++ );
	    v = LE32_IN_FLOAT( p++ );
#endif
	    w = LE32_IN_FLOAT( p++ );
	    fprintf( stderr, "u0 %f v0 %f w0 %f\n", u, v, w );
	 }
	
      case NOTEX_VERTEX_FORMAT:
	 {
	    GLubyte r, g, b, a;
	    
	    b = ((GLubyte *)p)[0];
	    g = ((GLubyte *)p)[1];
	    r = ((GLubyte *)p)[2];
	    a = ((GLubyte *)p)[3];
	    p++;
	    fprintf(stderr, "spec: r %d g %d b %d a %d\n", r, g, b, a);
	 }

      case TINY_VERTEX_FORMAT:
	 {
	    GLuint xy;
	    GLfloat x, y, z;
	    GLubyte r, g, b, a;
	    
	    z = LE32_IN( p++ ) / 65536.0;

	    b = ((GLubyte *)p)[0];
	    g = ((GLubyte *)p)[1];
	    r = ((GLubyte *)p)[2];
	    a = ((GLubyte *)p)[3];
	    p++;
	    xy = LE32_IN( p );
	    x = (GLfloat)(GLshort)( xy >> 16 ) / 4.0;
	    y = (GLfloat)(GLshort)( xy & 0xffff ) / 4.0;
	    
	    fprintf(stderr, "x %f y %f z %f\n", x, y, z);
	    fprintf(stderr, "r %d g %d b %d a %d\n", r, g, b, a);
	 }
   }
   
   assert( p + 1 - (CARD32 *)v == 10 );	 

   fprintf(stderr, "\n");
}
Beispiel #4
0
void TAG(print_vertex)( GLcontext *ctx, const VERTEX *v )
{
   LOCALVARS
   GLuint format = GET_VERTEX_FORMAT();

   fprintf(stderr, "(%x) ", format);

   switch (format) {
#if HAVE_TINY_VERTICES
   case TINY_VERTEX_FORMAT:
      fprintf(stderr, "xyz %.4f,%.4f,%.4f rgba %x:%x:%x:%x\n",
	      v->v.x, v->v.y, v->v.z,
	      v->tv.color.red,
	      v->tv.color.green,
	      v->tv.color.blue,
	      v->tv.color.alpha);
      break;
#endif
#if HAVE_NOTEX_VERTICES
   case NOTEX_VERTEX_FORMAT:
      fprintf(stderr, "xyzw %.4f,%.4f,%.4f,%.4f rgba %x:%x:%x:%x spec %x:%x:%x:%x\n",
	      v->v.x, v->v.y, v->v.z, v->v.w,
	      v->v.color.red,
	      v->v.color.green,
	      v->v.color.blue,
	      v->v.color.alpha,
	      v->v.specular.red,
	      v->v.specular.green,
	      v->v.specular.blue,
	      v->v.specular.alpha);
      break;
#endif
#if HAVE_TEX0_VERTICES
   case TEX0_VERTEX_FORMAT:
      fprintf(stderr, "xyzw %.4f,%.4f,%.4f,%.4f rgba %x:%x:%x:%x st %.4f,%.4f\n",
	      v->v.x, v->v.y, v->v.z, v->v.w,
	      v->v.color.red,
	      v->v.color.green,
	      v->v.color.blue,
	      v->v.color.alpha,
	      v->v.u0,
	      v->v.v0);
      break;
#endif
#if HAVE_TEX1_VERTICES
   case TEX1_VERTEX_FORMAT:
      fprintf(stderr, "xyzw %.4f,%.4f,%.4f,%.4f rgba %x:%x:%x:%x st %.4f,%.4f st %.4f,%.4f\n",
	      v->v.x, v->v.y, v->v.z, v->v.w,
	      v->v.color.red,
	      v->v.color.green,
	      v->v.color.blue,
	      v->v.color.alpha,
	      v->v.u0,
	      v->v.v0,
	      v->v.u1,
	      v->v.u2);
      break;
#endif
#if HAVE_PTEX_VERTICES
   case PROJ_TEX1_VERTEX_FORMAT:
      fprintf(stderr, "xyzw %.4f,%.4f,%.4f,%.4f rgba %x:%x:%x:%x stq %.4f,%.4f,%.4f stq %.4f,%.4f,%.4f\n",
	      v->v.x, v->v.y, v->v.z, v->v.w,
	      v->v.color.red,
	      v->v.color.green,
	      v->v.color.blue,
	      v->v.color.alpha,
	      v->pv.u0,
	      v->pv.v0,
	      v->pv.q0,
	      v->pv.u1,
	      v->pv.v1,
	      v->pv.q1);
      break;
#endif      
   default:
      fprintf(stderr, "???\n");
      break;
   }

   fprintf(stderr, "\n");
}