⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s3v_tritmp.h

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 H
📖 第 1 页 / 共 2 页
字号:
} 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 + -