📄 s3v_tritmp.h
字号:
} while (0)#define SET_D() \do { \ GLfloat sxy, suv; \ int lev; \\ suv = (v[idx[0]].attrib[FRAG_ATTRIB_TEX0][0] - \ v[idx[2]].attrib[FRAG_ATTRIB_TEX0][0]) * \ (v[idx[1]].attrib[FRAG_ATTRIB_TEX0][1] - \ v[idx[2]].attrib[FRAG_ATTRIB_TEX0][1]) - \ (v[idx[1]].attrib[FRAG_ATTRIB_TEX0][0] - \ v[idx[2]].attrib[FRAG_ATTRIB_TEX0][0]) * \ (v[idx[0]].attrib[FRAG_ATTRIB_TEX0][1] - \ v[idx[2]].attrib[FRAG_ATTRIB_TEX0][2]); \\ sxy = (v[idx[0]].attrib[FRAG_ATTRIB_TEX0][0] - \ v[idx[2]].attrib[FRAG_ATTRIB_TEX0][0]) * \ (v[idx[1]].attrib[FRAG_ATTRIB_TEX0][1] - \ v[idx[2]].attrib[FRAG_ATTRIB_TEX0][1]) - \ (v[idx[1]].attrib[FRAG_ATTRIB_TEX0][0] - \ v[idx[2]].attrib[FRAG_ATTRIB_TEX0][0]) * \ (v[idx[0]].attrib[FRAG_ATTRIB_TEX0][1] - \ v[idx[2]].attrib[FRAG_ATTRIB_TEX0][2]); \\ if (sxy < 0) sxy *= -1.0; \ if (suv < 0) suv *= -1.0; \\ lev = *(int*)&suv - *(int *)&sxy; \ if (lev < 0) \ lev = 0; \ else \ lev >>=23; \ dstart = (lev << 27); \} while (0)#define SET_UVWD() \do { \ SET_BASEUV(); \ SET_RW(); \ SET_D(); \ ru0 = (((u0 - baseu) * rw0)); \ ru1 = (((u1 - baseu) * rw1)); \ ru2 = (((u2 - baseu) * rw2)); \ rv0 = (((v0 - basev) * rw0)); \ rv1 = (((v1 - basev) * rw1)); \ rv2 = (((v2 - basev) * rw2)); \\ while (baseu < 0) { baseu += (t->globj->Image[0][0]->Width << 8); } \ while (basev < 0) { basev += (t->globj->Image[0][0]->Height << 8); } \\ if (!(baseu & 0xFF)) \ { baseu = (baseu >> 8); } \ else \ { baseu = (baseu >> 8) + 1; } \\ if ((basev & 0x80) || !(basev & 0xFF)) \ { basev = (basev >> 8); } \ else \ { basev = (basev >> 8) - 1; } \\ rbaseu = (baseu) << (16 - t->globj->Image[0][0]->WidthLog2); \ rbasev = (basev) << (16 - t->globj->Image[0][0]->WidthLog2); \ deltuy = (((ru2 - ru0) / dy02)); \ deltvy = (((rv2 - rv0) / dy02)); \ rw0 *= (1024.0 * 512.0); \ rw1 *= (1024.0 * 512.0); \ rw2 *= (1024.0 * 512.0); \ deltwy = ((rw2 - rw0) / dy02); \ if (tmp) { \ deltux = ((ru1 - (dy01 * deltuy + ru0)) / tmp); \ deltvx = ((rv1 - (dy01 * deltvy + rv0)) / tmp); \ deltwx = ((rw1 - (dy01 * deltwy + rw0)) / tmp); \ } else { deltux = deltvx = deltwx = 0; } \ ustart = (deltuy * ydiff) + (ru0); \ vstart = (deltvy * ydiff) + (rv0); \ wstart = (deltwy * ydiff) + (rw0); \} while (0)#define SEND_UVWD() \do { \ DMAOUT((rbasev & 0xFFFF)); \ DMAOUT((0xa0000000 | (rbaseu & 0xFFFF))); \ DMAOUT(deltwx); \ DMAOUT(deltwy); \ DMAOUT(wstart); \ DMAOUT(deltdx); \ DMAOUT(deltvx); \ DMAOUT(deltux); \ DMAOUT(deltdy); \ DMAOUT(deltvy); \ DMAOUT(deltuy); \ DMAOUT(dstart); \ DMAOUT(vstart); \ DMAOUT(ustart); \} while (0)#define SEND_VERT() \do { \ DMAOUT(deltzx); \ DMAOUT(deltzy); \ DMAOUT(zstart); \ DMAOUT(delt12); \ DMAOUT(end12); \ DMAOUT(delt01); \ DMAOUT(end01); \ DMAOUT(delt02); \ DMAOUT(start02); \ DMAOUT(ystart); \ DMAOUT(y01y12); \} while (0)#define SEND_COL() \do { \ DMAOUT(deltgbx); \ DMAOUT(deltarx); \ DMAOUT(deltgby); \ DMAOUT(deltary); \ DMAOUT(gbstart); \ DMAOUT(arstart); \} while (0)/**** MACROS end ****/static void TAG(s3v_point)( s3vContextPtr vmesa, const s3vVertex *_v0 ){}static void TAG(s3v_line)( s3vContextPtr vmesa, const s3vVertex *_v0, const s3vVertex *_v1 ){ GLcontext *ctx = vmesa->glCtx; __DRIdrawablePrivate *dPriv = vmesa->driDrawable; LINE_VERT_VARS;#if (IND & S3V_RAST_FLAT_BIT) LINE_FLAT_VARS;#else LINE_GOURAUD_VARS;#endif#if (IND & S3V_RAST_CULL_BIT) GLfloat cull; (void) cull;#endif LINE_VERT_VARS_VOIDS;#if (IND & S3V_RAST_FLAT_BIT) LINE_FLAT_VARS_VOIDS;#else LINE_GOURAUD_VARS_VOIDS;#endif DEBUG(("*** s3v_line: "));#if (IND & S3V_RAST_CULL_BIT) DEBUG(("cull "));#endif#if (IND & S3V_RAST_FLAT_BIT) DEBUG(("flat "));#endif DEBUG(("***\n"));#if 0 s3v_print_vertex(ctx, _v0); s3v_print_vertex(ctx, _v1);#endif s3v_translate_vertex( ctx, _v0, &v[0] ); s3v_translate_vertex( ctx, _v1, &v[1] );#if (IND & S3V_RAST_CULL_BIT) /* FIXME: should we cull lines too? */#endif (void)v; /* v[0]; v[1]; */ SORT_LINE_VERT(); SET_LINE_VERT(); SET_LINE_XY(); SET_LINE_DIR(); SET_LINE_Z();#if (IND & S3V_RAST_FLAT_BIT) SET_LINE_FLAT_COL();#else SET_LINE_GOURAUD_COL();#endif DMAOUT_CHECK(3DLINE_GBD, 15); SEND_LINE_COL(); DMAOUT(0); SEND_LINE_VERT(); DMAFINISH();}static void TAG(s3v_triangle)( s3vContextPtr vmesa, const s3vVertex *_v0, const s3vVertex *_v1, const s3vVertex *_v2 ){ GLcontext *ctx = vmesa->glCtx; __DRIdrawablePrivate *dPriv = vmesa->driDrawable; VERT_VARS;#if (IND & S3v_RAST_FLAT_BIT) FLAT_VARS;#else GOURAUD_VARS;#endif#if (IND & S3V_RAST_TEX_BIT) TEX_VARS;#endif#if (IND & S3V_RAST_CULL_BIT) GLfloat cull;#endif VERT_VARS_VOIDS;#if (IND & S3v_RAST_FLAT_BIT) FLAT_VARS_VOIDS;#else GOURAUD_VARS_VOIDS;#endif#if (IND & S3V_RAST_TEX_BIT) TEX_VARS_VOIDS;#endif DEBUG(("*** s3v_triangle: "));#if (IND & S3V_RAST_CULL_BIT) DEBUG(("cull "));#endif#if (IND & S3V_RAST_FLAT_BIT) DEBUG(("flat "));#endif#if (IND & S3V_RAST_TEX_BIT) DEBUG(("tex "));#endifDEBUG(("***\n"));#if 0 s3v_print_vertex(ctx, _v0); s3v_print_vertex(ctx, _v1); s3v_print_vertex(ctx, _v2);#endif s3v_translate_vertex( ctx, _v0, &v[0] ); s3v_translate_vertex( ctx, _v1, &v[1] ); s3v_translate_vertex( ctx, _v2, &v[2] );#if (IND & S3V_RAST_CULL_BIT) cull = vmesa->backface_sign * ((v[1].attrib[FRAG_ATTRIB_WPOS][0] - v[0].attrib[FRAG_ATTRIB_WPOS][0]) * (v[0].attrib[FRAG_ATTRIB_WPOS][1] - v[2].attrib[FRAG_ATTRIB_WPOS][1]) + (v[1].attrib[FRAG_ATTRIB_WPOS][1] - v[0].attrib[FRAG_ATTRIB_WPOS][1]) * (v[2].attrib[FRAG_ATTRIB_WPOS][0] - v[0].attrib[FRAG_ATTRIB_WPOS][0])); if (cull < vmesa->cull_zero /* -0.02f */) return;#endif (void)v; /* v[0]; v[1]; v[2]; */ SORT_VERT(); SET_VERT(); if (dy02 == 0) return; SET_XY(); SET_DIR(); SET_Z(); #if (IND & S3V_RAST_TEX_BIT) SET_TEX_VERT(); SET_UVWD();#endif#if (IND & S3V_RAST_FLAT_BIT) SET_FLAT_COL();#else SET_GOURAUD_COL();#endif#if (IND & S3V_RAST_TEX_BIT) DMAOUT_CHECK(3DTRI_BASEV, 31); SEND_UVWD(); SEND_COL(); SEND_VERT(); DMAFINISH();#else DMAOUT_CHECK(3DTRI_GBX, 17); SEND_COL(); SEND_VERT(); DMAFINISH();#endif}static void TAG(s3v_quad)( s3vContextPtr vmesa, const s3vVertex *_v0, const s3vVertex *_v1, const s3vVertex *_v2, const s3vVertex *_v3 ){ GLcontext *ctx = vmesa->glCtx; __DRIdrawablePrivate *dPriv = vmesa->driDrawable; SWvertex temp_v[4]; VERT_VARS;#if (IND & S3v_RAST_FLAT_BIT) FLAT_VARS;#else GOURAUD_VARS;#endif#if (IND & S3V_RAST_TEX_BIT) TEX_VARS;#endif#if (IND & S3V_RAST_CULL_BIT) GLfloat cull;#endif VERT_VARS_VOIDS;#if (IND & S3v_RAST_FLAT_BIT) FLAT_VARS_VOIDS;#else GOURAUD_VARS_VOIDS;#endif#if (IND & S3V_RAST_TEX_BIT) TEX_VARS_VOIDS;#endif DEBUG(("*** s3v_quad: "));#if (IND & S3V_RAST_CULL_BIT) DEBUG(("cull ")); /* printf(""); */ /* speed trick */#endif#if (IND & S3V_RAST_FLAT_BIT) DEBUG(("flat "));#endif#if (IND & S3V_RAST_TEX_BIT) DEBUG(("tex "));#endif DEBUG(("***\n"));#if 0 s3v_print_vertex(ctx, _v0); s3v_print_vertex(ctx, _v1); s3v_print_vertex(ctx, _v2); s3v_print_vertex(ctx, _v3);#endif s3v_translate_vertex( ctx, _v0, &temp_v[0] ); s3v_translate_vertex( ctx, _v1, &temp_v[1] ); s3v_translate_vertex( ctx, _v2, &temp_v[2] ); s3v_translate_vertex( ctx, _v3, &temp_v[3] ); /* FIRST TRI (0,1,2) */ /* ROMEO */ /* printf(""); */ /* speed trick (a) [turn on if (a) is return]*/ v[0] = temp_v[0]; v[1] = temp_v[1]; v[2] = temp_v[2];#if (IND & S3V_RAST_CULL_BIT) cull = vmesa->backface_sign * ((v[1].attrib[FRAG_ATTRIB_WPOS][0] - v[0].attrib[FRAG_ATTRIB_WPOS][0]) * (v[0].attrib[FRAG_ATTRIB_WPOS][1] - v[2].attrib[FRAG_ATTRIB_WPOS][1]) + (v[1].attrib[FRAG_ATTRIB_WPOS][1] - v[0].attrib[FRAG_ATTRIB_WPOS][1]) * (v[2].attrib[FRAG_ATTRIB_WPOS][0] - v[0].attrib[FRAG_ATTRIB_WPOS][0])); if (cull < vmesa->cull_zero /* -0.02f */) goto second; /* return; */ /* (a) */#endif #if 0 v[0] = temp_v[0]; v[1] = temp_v[1]; v[2] = temp_v[2];#else (void) v;#endif SORT_VERT(); SET_VERT(); if (dy02 == 0) goto second; SET_XY(); SET_DIR(); SET_Z();#if (IND & S3V_RAST_TEX_BIT) SET_TEX_VERT(); SET_UVWD();#endif#if (IND & S3V_RAST_FLAT_BIT) SET_FLAT_COL();#else SET_GOURAUD_COL();#endif#if (IND & S3V_RAST_TEX_BIT) DMAOUT_CHECK(3DTRI_BASEV, 31); SEND_UVWD(); SEND_COL(); SEND_VERT(); DMAFINISH();#else DMAOUT_CHECK(3DTRI_GBX, 17); SEND_COL(); SEND_VERT(); DMAFINISH();#endif /* SECOND TRI (0,2,3) */second: v[0] = temp_v[0]; v[1] = temp_v[2]; v[2] = temp_v[3];#if (IND & S3V_RAST_CULL_BIT) cull = vmesa->backface_sign * ((v[1].attrib[FRAG_ATTRIB_WPOS][0] - v[0].attrib[FRAG_ATTRIB_WPOS][0]) * (v[0].attrib[FRAG_ATTRIB_WPOS][1] - v[2].attrib[FRAG_ATTRIB_WPOS][1]) + (v[1].attrib[FRAG_ATTRIB_WPOS][1] - v[0].attrib[FRAG_ATTRIB_WPOS][1]) * (v[2].attrib[FRAG_ATTRIB_WPOS][0] - v[0].attrib[FRAG_ATTRIB_WPOS][0])); if (cull < /* -0.02f */ vmesa->cull_zero) return;#endif/* second: */ /* ROMEO */ /* printf(""); */ /* speed trick */ v[0] = temp_v[0]; v[1] = temp_v[2]; v[2] = temp_v[3]; SORT_VERT(); SET_VERT(); if (dy02 == 0) return; SET_XY(); SET_DIR(); SET_Z();#if (IND & S3V_RAST_TEX_BIT) SET_TEX_VERT(); SET_UVWD();#endif#if (IND & S3V_RAST_FLAT_BIT) SET_FLAT_COL();#else SET_GOURAUD_COL();#endif#if (IND & S3V_RAST_TEX_BIT) DMAOUT_CHECK(3DTRI_BASEV, 31); SEND_UVWD(); SEND_COL(); SEND_VERT(); DMAFINISH();#else DMAOUT_CHECK(3DTRI_GBX, 17); SEND_COL(); SEND_VERT(); DMAFINISH();#endif}static void TAG(s3v_init)(void){ s3v_point_tab[IND] = TAG(s3v_point); s3v_line_tab[IND] = TAG(s3v_line); s3v_tri_tab[IND] = TAG(s3v_triangle); s3v_quad_tab[IND] = TAG(s3v_quad);}#undef IND#undef TAG
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -