[Scummvm-cvs-logs] SF.net SVN: scummvm: [22481] residual/trunk/tinygl/ztriangle.cpp

aquadran at users.sourceforge.net aquadran at users.sourceforge.net
Mon May 15 10:45:28 CEST 2006


Revision: 22481
Author:   aquadran
Date:     2006-05-15 10:28:11 -0700 (Mon, 15 May 2006)
ViewCVS:  http://svn.sourceforge.net/scummvm/?rev=22481&view=rev

Log Message:
-----------
de-macro ZB_fillTriangleMappingPerspective func

Modified Paths:
--------------
    residual/trunk/tinygl/ztriangle.cpp
Modified: residual/trunk/tinygl/ztriangle.cpp
===================================================================
--- residual/trunk/tinygl/ztriangle.cpp	2006-05-15 13:30:34 UTC (rev 22480)
+++ residual/trunk/tinygl/ztriangle.cpp	2006-05-15 17:28:11 UTC (rev 22481)
@@ -137,115 +137,356 @@
     float fdzdx,fndzdx,ndszdx,ndtzdx;
     int _drgbdx;
 
-#define INTERP_Z
-#define INTERP_RGB
-#define INTERP_STZ
-
 #define NB_INTERP 8
 
-#define SAR_RND_TO_ZERO(v,n) (v / (1<<n))
+{
+  ZBufferPoint *t,*pr1,*pr2,*l1,*l2;
+  float fdx1, fdx2, fdy1, fdy2, fz, d1, d2;
+  unsigned short *pz1;
+  PIXEL *pp1;
+  int part,update_left,update_right;
 
-#define DRAW_INIT()				\
-{						\
-  texture=zb->current_texture;\
-  fdzdx=(float)dzdx;\
-  fndzdx=NB_INTERP * fdzdx;\
-  ndszdx=NB_INTERP * dszdx;\
-  ndtzdx=NB_INTERP * dtzdx;\
-  _drgbdx=(SAR_RND_TO_ZERO(drdx,6) << 22) & 0xFFC00000;		\
-  _drgbdx|=SAR_RND_TO_ZERO(dgdx,5) & 0x000007FF;		\
-  _drgbdx|=(SAR_RND_TO_ZERO(dbdx,7) << 12) & 0x001FF000; 	\
+  int nb_lines,dx1,dy1,tmp,dx2,dy2;
+
+  int error,derror;
+  int x1,dxdy_min,dxdy_max;
+/* warning: x2 is multiplied by 2^16 */
+  int x2,dx2dy2;  
+
+  int z1,dzdx,dzdy,dzdl_min,dzdl_max;
+
+  int r1,drdx,drdy,drdl_min,drdl_max;
+  int g1,dgdx,dgdy,dgdl_min,dgdl_max;
+  int b1,dbdx,dbdy,dbdl_min,dbdl_max;
+
+  float sz1,dszdx,dszdy,dszdl_min,dszdl_max;
+  float tz1,dtzdx,dtzdy,dtzdl_min,dtzdl_max;
+
+  /* we sort the vertex with increasing y */
+  if (p1->y < p0->y) {
+    t = p0;
+    p0 = p1;
+    p1 = t;
+  }
+  if (p2->y < p0->y) {
+    t = p2;
+    p2 = p1;
+    p1 = p0;
+    p0 = t;
+  } else if (p2->y < p1->y) {
+    t = p1;
+    p1 = p2;
+    p2 = t;
+  }
+
+  /* we compute dXdx and dXdy for all interpolated values */
+  
+  fdx1 = (float)(p1->x - p0->x);
+  fdy1 = (float)(p1->y - p0->y);
+
+  fdx2 = (float)(p2->x - p0->x);
+  fdy2 = (float)(p2->y - p0->y);
+
+  fz = fdx1 * fdy2 - fdx2 * fdy1;
+  if (fz == 0)
+    return;
+  fz = (float)(1.0 / fz);
+
+  fdx1 *= fz;
+  fdy1 *= fz;
+  fdx2 *= fz;
+  fdy2 *= fz;
+
+  d1 = (float)(p1->z - p0->z);
+  d2 = (float)(p2->z - p0->z);
+  dzdx = (int) (fdy2 * d1 - fdy1 * d2);
+  dzdy = (int) (fdx1 * d2 - fdx2 * d1);
+
+  d1 = (float)(p1->r - p0->r);
+  d2 = (float)(p2->r - p0->r);
+  drdx = (int) (fdy2 * d1 - fdy1 * d2);
+  drdy = (int) (fdx1 * d2 - fdx2 * d1);
+
+  d1 = (float)(p1->g - p0->g);
+  d2 = (float)(p2->g - p0->g);
+  dgdx = (int) (fdy2 * d1 - fdy1 * d2);
+  dgdy = (int) (fdx1 * d2 - fdx2 * d1);
+
+  d1 = (float)(p1->b - p0->b);
+  d2 = (float)(p2->b - p0->b);
+  dbdx = (int) (fdy2 * d1 - fdy1 * d2);
+  dbdy = (int) (fdx1 * d2 - fdx2 * d1);
+
+  
+  {
+    float zz;
+    zz=(float) p0->z;
+    p0->sz= (float) p0->s * zz;
+    p0->tz= (float) p0->t * zz;
+    zz=(float) p1->z;
+    p1->sz= (float) p1->s * zz;
+    p1->tz= (float) p1->t * zz;
+    zz=(float) p2->z;
+    p2->sz= (float) p2->s * zz;
+    p2->tz= (float) p2->t * zz;
+
+    d1 = p1->sz - p0->sz;
+    d2 = p2->sz - p0->sz;
+    dszdx = (fdy2 * d1 - fdy1 * d2);
+    dszdy = (fdx1 * d2 - fdx2 * d1);
+    
+    d1 = p1->tz - p0->tz;
+    d2 = p2->tz - p0->tz;
+    dtzdx = (fdy2 * d1 - fdy1 * d2);
+    dtzdy = (fdx1 * d2 - fdx2 * d1);
+  }
+
+  /* screen coordinates */
+
+  pp1 = (PIXEL *) ((char *) zb->pbuf + zb->linesize * p0->y);
+  pz1 = zb->zbuf + p0->y * zb->xsize;
+
+{
+  texture=zb->current_texture;
+  fdzdx=(float)dzdx;
+  fndzdx=NB_INTERP * fdzdx;
+  ndszdx=NB_INTERP * dszdx;
+  ndtzdx=NB_INTERP * dtzdx;
+  _drgbdx=((drdx / (1<<6)) << 22) & 0xFFC00000;
+  _drgbdx|=(dgdx / (1<<5)) & 0x000007FF;
+  _drgbdx|=((dbdx / (1<<7)) << 12) & 0x001FF000;
 }
 
+  for(part=0;part<2;part++) {
+    if (part == 0) {
+      if (fz > 0) {
+	update_left=1;
+	update_right=1;
+	l1=p0;
+	l2=p2;
+	pr1=p0;
+	pr2=p1;
+      } else {
+	update_left=1;
+	update_right=1;
+	l1=p0;
+	l2=p1;
+	pr1=p0;
+	pr2=p2;
+      }
+      nb_lines = p1->y - p0->y;
+    } else {
+      /* second part */
+      if (fz > 0) {
+	update_left=0;
+	update_right=1;
+	pr1=p1;
+	pr2=p2;
+      } else {
+	update_left=1;
+	update_right=0;
+	l1=p1; 
+	l2=p2;
+      }
+      nb_lines = p2->y - p1->y + 1;
+    }
 
-#define PUT_PIXEL(_a)				\
-{						\
-   zz=z >> ZB_POINT_Z_FRAC_BITS;		\
-     if (ZCMP(zz,pz[_a])) {				\
-       tmp=rgb & 0xF81F07E0;			\
-	   unsigned int light = tmp | (tmp >> 16); \
-       PIXEL pixel = *(PIXEL *)((char *)texture+ \
-          (((t & 0x3FC00000) | (s & 0x003FC000)) >> (17 - PSZSH)));\
-       unsigned int c_r = (pixel & 0xF800) >> 8;    \
-       unsigned int c_g = (pixel & 0x07E0) >> 3;    \
-       unsigned int c_b = (pixel & 0x001F) << 3;    \
-       unsigned int l_r = (light & 0xF800) >> 8;    \
-       unsigned int l_g = (light & 0x07E0) >> 3;    \
-       unsigned int l_b = (light & 0x001F) << 3;    \
-       c_r = (c_r * l_r) / 256; \
-       c_g = (c_g * l_g) / 256; \
-       c_b = (c_b * l_b) / 256; \
-       pixel = ((c_r & 0xF8) << 8) | ((c_g & 0xFC) << 3) | (c_b >> 3); \
-       pp[_a]=pixel;            \
-       pz[_a]=zz;				\
-    }						\
-    z+=dzdx;					\
-    s+=dsdx;					\
-    t+=dtdx;					\
-    rgb=(rgb+drgbdx) & ( ~ 0x00200800);		\
+    /* compute the values for the left edge */
+
+    if (update_left) {
+      dy1 = l2->y - l1->y;
+      dx1 = l2->x - l1->x;
+      if (dy1 > 0) 
+	tmp = (dx1 << 16) / dy1;
+      else
+	tmp = 0;
+      x1 = l1->x;
+      error = 0;
+      derror = tmp & 0x0000ffff;
+      dxdy_min = tmp >> 16;
+      dxdy_max = dxdy_min + 1;
+      
+      z1=l1->z;
+      dzdl_min=(dzdy + dzdx * dxdy_min); 
+      dzdl_max=dzdl_min + dzdx;
+
+	  r1=l1->r;
+      drdl_min=(drdy + drdx * dxdy_min);
+      drdl_max=drdl_min + drdx;
+      
+      g1=l1->g;
+      dgdl_min=(dgdy + dgdx * dxdy_min);
+      dgdl_max=dgdl_min + dgdx;
+      
+      b1=l1->b;
+      dbdl_min=(dbdy + dbdx * dxdy_min);
+      dbdl_max=dbdl_min + dbdx;
+
+	  sz1=l1->sz;
+      dszdl_min=(dszdy + dszdx * dxdy_min);
+      dszdl_max=dszdl_min + dszdx;
+      
+      tz1=l1->tz;
+      dtzdl_min=(dtzdy + dtzdx * dxdy_min);
+      dtzdl_max=dtzdl_min + dtzdx;
+    }
+
+    /* compute values for the right edge */
+
+    if (update_right) {
+      dx2 = (pr2->x - pr1->x);
+      dy2 = (pr2->y - pr1->y);
+      if (dy2>0) 
+	dx2dy2 = ( dx2 << 16) / dy2;
+      else
+	dx2dy2 = 0;
+      x2 = pr1->x << 16;
+    }
+
+    /* we draw all the scan line of the part */
+
+    while (nb_lines>0) {
+      nb_lines--;
+
+{
+  register unsigned short *pz;
+  register PIXEL *pp;
+  register unsigned int s,t,z,zz,rgb,drgbdx;
+  register int n,dsdx,dtdx;
+  float sz,tz,fz,zinv;
+  n=(x2>>16)-x1;
+  fz=(float)z1;
+  zinv=(float)(1.0 / fz);
+  pp=(PIXEL *)((char *)pp1 + x1 * PSZB);
+  pz=pz1+x1;
+  z=z1;
+  sz=sz1;
+  tz=tz1;
+  rgb=(r1 << 16) & 0xFFC00000;
+  rgb|=(g1 >> 5) & 0x000007FF;
+  rgb|=(b1 << 5) & 0x001FF000;
+  drgbdx=_drgbdx;
+  while (n>=(NB_INTERP-1)) {
+    {
+      float ss,tt;
+      ss=(sz * zinv);
+      tt=(tz * zinv);
+      s=(int) ss;
+      t=(int) tt;
+      dsdx= (int)( (dszdx - ss*fdzdx)*zinv );
+      dtdx= (int)( (dtzdx - tt*fdzdx)*zinv );
+      fz+=fndzdx;
+      zinv=(float)(1.0 / fz);
+    }
+	for (int _a = 0; _a < 8; _a++)
+{
+   zz=z >> ZB_POINT_Z_FRAC_BITS;
+     if (ZCMP(zz,pz[_a])) {
+       tmp=rgb & 0xF81F07E0;
+	   unsigned int light = tmp | (tmp >> 16);
+       PIXEL pixel = *(PIXEL *)((char *)texture+
+          (((t & 0x3FC00000) | (s & 0x003FC000)) >> (17 - PSZSH)));
+       unsigned int c_r = (pixel & 0xF800) >> 8;
+       unsigned int c_g = (pixel & 0x07E0) >> 3;
+       unsigned int c_b = (pixel & 0x001F) << 3;
+       unsigned int l_r = (light & 0xF800) >> 8;
+       unsigned int l_g = (light & 0x07E0) >> 3;
+       unsigned int l_b = (light & 0x001F) << 3;
+       c_r = (c_r * l_r) / 256;
+       c_g = (c_g * l_g) / 256;
+       c_b = (c_b * l_b) / 256;
+       pixel = ((c_r & 0xF8) << 8) | ((c_g & 0xFC) << 3) | (c_b >> 3);
+       pp[_a]=pixel;
+       pz[_a]=zz;
+    }
+    z+=dzdx;
+    s+=dsdx;
+    t+=dtdx;
+    rgb=(rgb+drgbdx) & ( ~ 0x00200800);
 }
 
-#define DRAW_LINE()				\
-{						\
-  register unsigned short *pz;		\
-  register PIXEL *pp;		\
-  register unsigned int s,t,z,zz,rgb,drgbdx;	\
-  register int n,dsdx,dtdx;		\
-  float sz,tz,fz,zinv; \
-  n=(x2>>16)-x1;                             \
-  fz=(float)z1;\
-  zinv=(float)(1.0 / fz);\
-  pp=(PIXEL *)((char *)pp1 + x1 * PSZB); \
-  pz=pz1+x1;					\
-  z=z1;						\
-  sz=sz1;\
-  tz=tz1;\
-  rgb=(r1 << 16) & 0xFFC00000;						   \
-  rgb|=(g1 >> 5) & 0x000007FF;						   \
-  rgb|=(b1 << 5) & 0x001FF000;						   \
-  drgbdx=_drgbdx;							   \
-  while (n>=(NB_INTERP-1)) {						   \
-    {\
-      float ss,tt;\
-      ss=(sz * zinv);\
-      tt=(tz * zinv);\
-      s=(int) ss;\
-      t=(int) tt;\
-      dsdx= (int)( (dszdx - ss*fdzdx)*zinv );\
-      dtdx= (int)( (dtzdx - tt*fdzdx)*zinv );\
-      fz+=fndzdx;\
-      zinv=(float)(1.0 / fz);\
-    }\
-    PUT_PIXEL(0);							   \
-    PUT_PIXEL(1);							   \
-    PUT_PIXEL(2);							   \
-    PUT_PIXEL(3);							   \
-    PUT_PIXEL(4);							   \
-    PUT_PIXEL(5);							   \
-    PUT_PIXEL(6);							   \
-    PUT_PIXEL(7);							   \
-    pz+=NB_INTERP;							   \
-    pp=(PIXEL *)((char *)pp + NB_INTERP * PSZB);\
-    n-=NB_INTERP;							   \
-    sz+=ndszdx;\
-    tz+=ndtzdx;\
-  }									   \
-    {\
-      float ss,tt;\
-      ss=(sz * zinv);\
-      tt=(tz * zinv);\
-      s=(int) ss;\
-      t=(int) tt;\
-      dsdx= (int)( (dszdx - ss*fdzdx)*zinv );\
-      dtdx= (int)( (dtzdx - tt*fdzdx)*zinv );\
-    }\
-  while (n>=0) {							   \
-    PUT_PIXEL(0);							   \
-    pz+=1;								   \
-    pp=(PIXEL *)((char *)pp + PSZB);\
-    n-=1;								   \
-  }									   \
+	pz+=NB_INTERP;
+    pp=(PIXEL *)((char *)pp + NB_INTERP * PSZB);
+    n-=NB_INTERP;
+    sz+=ndszdx;
+    tz+=ndtzdx;
+  }
+    {
+      float ss,tt;
+      ss=(sz * zinv);
+      tt=(tz * zinv);
+      s=(int) ss;
+      t=(int) tt;
+      dsdx= (int)( (dszdx - ss*fdzdx)*zinv );
+      dtdx= (int)( (dtzdx - tt*fdzdx)*zinv );
+    }
+  while (n>=0) {
+{
+   zz=z >> ZB_POINT_Z_FRAC_BITS;
+     if (ZCMP(zz,pz[0])) {
+       tmp=rgb & 0xF81F07E0;
+	   unsigned int light = tmp | (tmp >> 16);
+       PIXEL pixel = *(PIXEL *)((char *)texture+
+          (((t & 0x3FC00000) | (s & 0x003FC000)) >> (17 - PSZSH)));
+       unsigned int c_r = (pixel & 0xF800) >> 8;
+       unsigned int c_g = (pixel & 0x07E0) >> 3;
+       unsigned int c_b = (pixel & 0x001F) << 3;
+       unsigned int l_r = (light & 0xF800) >> 8;
+       unsigned int l_g = (light & 0x07E0) >> 3;
+       unsigned int l_b = (light & 0x001F) << 3;
+       c_r = (c_r * l_r) / 256;
+       c_g = (c_g * l_g) / 256;
+       c_b = (c_b * l_b) / 256;
+       pixel = ((c_r & 0xF8) << 8) | ((c_g & 0xFC) << 3) | (c_b >> 3);
+       pp[0]=pixel;
+       pz[0]=zz;
+    }
+    z+=dzdx;
+    s+=dsdx;
+    t+=dtdx;
+    rgb=(rgb+drgbdx) & ( ~ 0x00200800);
 }
-  
-#include "ztriangle.h"
+    pz+=1;
+    pp=(PIXEL *)((char *)pp + PSZB);
+    n-=1;
+  }
 }
+      
+      /* left edge */
+      error+=derror;
+      if (error > 0) {
+	error-=0x10000;
+	x1+=dxdy_max;
+
+	z1+=dzdl_max;
+
+	r1+=drdl_max;
+	g1+=dgdl_max;
+	b1+=dbdl_max;
+
+	sz1+=dszdl_max;
+	tz1+=dtzdl_max;
+	  } else {
+	x1+=dxdy_min;
+
+	z1+=dzdl_min;
+
+	r1+=drdl_min;
+	g1+=dgdl_min;
+	b1+=dbdl_min;
+
+	sz1+=dszdl_min;
+	tz1+=dtzdl_min;
+      } 
+      
+      /* right edge */
+      x2+=dx2dy2;
+
+      /* screen coordinates */
+      pp1=(PIXEL *)((char *)pp1 + zb->linesize);
+      pz1+=zb->xsize;
+    }
+  }
+}
+
+}


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.





More information about the Scummvm-git-logs mailing list