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

📄 s3v_tritmp.h

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 H
📖 第 1 页 / 共 2 页
字号:
/* * Author: Max Lingua <sunmax@libero.it> *//**** MACROS start ****//* point/line macros */#define LINE_VERT_VARS \        SWvertex v[3]; \	s3vVertex* vvv[2]; \        int x[3], y[3], z[3]; \        int idx[3]; \        int dx01, dy01; \        int delt02; \        int deltzy, zstart; \        int start02, end01; \        int ystart, y01y12; \        int i, tmp, tmp2, tmp3; \        GLfloat ydiff, fy[3]#define LINE_VERT_VARS_VOIDS \        (void) v; (void) vvv; (void) x; (void) y; (void) z; (void) idx; \        (void) dx01; (void) dy01; (void) delt02; (void) deltzy; \        (void) zstart; (void) start02; (void) ystart; (void) y01y12; \        (void) i; (void) tmp; (void) tmp2; (void) tmp3; (void) ydiff; (void) fy#define LINE_FLAT_VARS \        int arstart, gbstart; \        int deltarx, deltgbx, deltary, deltgby; \        GLubyte *(col)[3]#define LINE_FLAT_VARS_VOIDS \        (void) arstart; (void) gbstart; (void) deltarx; (void) deltgbx; \        (void) deltary; (void) deltgby; (void) col#define LINE_GOURAUD_VARS \        int arstart, gbstart; \        int deltary, deltgby; \        int ctmp, ctmp2, ctmp3, ctmp4; \        GLubyte *(col)[3]#define LINE_GOURAUD_VARS_VOIDS \        (void) arstart; (void) gbstart; (void) deltary; (void) deltgby; \        (void) ctmp; (void) ctmp2; (void) ctmp3; (void) ctmp4; (void) col#define SORT_LINE_VERT() \do { \	if(v[0].attrib[FRAG_ATTRIB_WPOS][1] <= v[1].attrib[FRAG_ATTRIB_WPOS][1]) { \\                idx[0] = 0; \                idx[1] = 1; \\        } else if (v[0].attrib[FRAG_ATTRIB_WPOS][1] > v[1].attrib[FRAG_ATTRIB_WPOS][1]) { \\                idx[0] = 1; \                idx[1] = 0; \\        } \} while(0)#define SET_LINE_VERT() \do { \        x[0] = (v[idx[0]].attrib[FRAG_ATTRIB_WPOS][0] * 1024.0f * 1024.0f); /* 0x100000 */ \        y[0] = fy[0] = dPriv->h - v[idx[0]].attrib[FRAG_ATTRIB_WPOS][1]; \        z[0] = (v[idx[0]].attrib[FRAG_ATTRIB_WPOS][2]) * 1024.0f * 32.0f; /* 0x8000; */ \\        x[1] = (v[idx[1]].attrib[FRAG_ATTRIB_WPOS][0] * 1024.0f * 1024.0f); /* 0x100000 */ \        y[1] = dPriv->h - v[idx[1]].attrib[FRAG_ATTRIB_WPOS][1]; \        z[1] = (v[idx[1]].attrib[FRAG_ATTRIB_WPOS][2]) * 1024.0f * 32.0f; /* 0x8000 */ \} while(0)#define SET_LINE_XY() \do { \	tmp = v[idx[0]].attrib[FRAG_ATTRIB_WPOS][0]; \        tmp2 = v[idx[1]].attrib[FRAG_ATTRIB_WPOS][0]; \\	dx01 = x[0] - x[1]; \        dy01 = y[0] - y[1]; \\        ydiff = fy[0] - (float)y[0]; \        ystart = y[0]; \        y01y12 = dy01 + 1; \} while (0)#define SET_LINE_DIR() \do { \        if (tmp2 > tmp) { \                y01y12 |= 0x80000000; \                tmp3 = tmp2-tmp; \        } else { \                tmp3 = tmp-tmp2; \        } \\        end01 = ((tmp << 16) | tmp2); \\	if (dy01) \                delt02 = -(dx01/dy01); \        else \		delt02 = 0; \\        if (dy01 > tmp3) { /* Y MAJ */ \	/* NOTE: tmp3 always >=0 */ \                start02 = x[0]; \        } else if (delt02 >= 0){ /* X MAJ - positive delta */ \                start02 = x[0] + delt02/2; \                dy01 = tmp3; /* could be 0 */ \        } else { /* X MAJ - negative delta */ \                start02 = x[0] + delt02/2 + ((1 << 20) - 1); \                dy01 = tmp3; /* could be 0 */ \        } \} while(0)#define SET_LINE_Z() \do { \	zstart = z[0]; \\	if (dy01) { \                deltzy = (z[1] - z[0])/dy01; \        } else { \                deltzy = 0; /* dy01 = tmp3 = 0 (it's a point)*/ \        } \} while (0)#define SET_LINE_FLAT_COL() \do { \        col[0] = &(v[idx[0]].color[0]); \        deltarx = deltary = deltgbx = deltgby = 0; \        gbstart = (((col[0][1]) << 23) | ((col[0][2]) << 7)); \        arstart = (((col[0][3]) << 23) | ((col[0][0]) << 7)); \} while(0)#define SET_LINE_GOURAUD_COL() \do { \        col[0] = &(v[idx[0]].color[0]); \        col[1] = &(v[idx[1]].color[0]); \\        vvv[0] = _v0; \        vvv[1] = _v1; \\        for (i=0; i<2; i++) { \	/* FIXME: swapped ! */ \                col[i][0] = vvv[!idx[i]]->v.color.red; \                col[i][1] = vvv[!idx[i]]->v.color.green; \                col[i][2] = vvv[!idx[i]]->v.color.blue; \                col[i][3] = vvv[!idx[i]]->v.color.alpha; \        } \\	if (dy01) { \\        ctmp = ((col[0][1] - col[1][1]) << 7) / dy01; \        ctmp2 = ((col[0][2] - col[1][2]) << 7) / dy01; \        deltgby = ((ctmp << 16) & 0xFFFF0000) | (ctmp2 & 0xFFFF); \\        ctmp3 = ((col[0][3] - col[1][3]) << 7) / dy01; \        ctmp4 = ((col[0][0] - col[1][0]) << 7) / dy01; \        deltary = ((ctmp3 << 16) & 0xFFFF0000) | (ctmp4 & 0xFFFF); \        } else { \        ctmp = ((col[1][1] - col[0][1]) << 7); \        ctmp2 = ((col[1][2] - col[0][2]) << 7); \        deltgby = ((ctmp << 16) & 0xFFFF0000) | (ctmp2 & 0xFFFF); \\        ctmp3 = ((col[1][3] - col[0][3]) << 7); \        ctmp4 = ((col[1][0] - col[0][0]) << 7); \        deltary = ((ctmp3 << 16) & 0xFFFF0000) | (ctmp4 & 0xFFFF); \        deltgby = deltary = 0; \        } \\	idx[0] = 1; /* FIXME: swapped */ \\        gbstart = \	(((int)((ydiff * ctmp) + (col[idx[0]][1] << 7)) << 16) & 0x7FFF0000) \	| ((int)((ydiff * ctmp2) + (col[idx[0]][2] << 7)) & 0x7FFF); \        arstart = \	(((int)((ydiff * ctmp3) + (col[idx[0]][3] << 7)) << 16) & 0x7FFF0000) \	| ((int)((ydiff * ctmp4) + (col[idx[0]][0] << 7)) & 0x7FFF); \} while(0)#define SEND_LINE_COL() \do { \	DMAOUT(deltgby); \	DMAOUT(deltary); \	DMAOUT(gbstart); \	DMAOUT(arstart); \} while (0)#define SEND_LINE_VERT() \do { \	DMAOUT(deltzy); \	DMAOUT(zstart); \	DMAOUT(0); \	DMAOUT(0); \	DMAOUT(0); \	DMAOUT(end01); \	DMAOUT(delt02); \	DMAOUT(start02); \	DMAOUT(ystart); \	DMAOUT(y01y12); \} while (0)/* tri macros (mostly stolen from utah-glx...) */#define VERT_VARS \        SWvertex v[3]; \        int x[3], y[3], z[3]; \        int idx[3]; \        int dx01, dy01; \        int dx02, dy02; \        int dx12, dy12; \        int delt01, delt02, delt12; \        int deltzx, deltzy, zstart; \        int start02, end01, end12; \        int ystart, y01y12; \        int i, tmp, lr; \        GLfloat ydiff, fy[3]#define VERT_VARS_VOIDS \        (void) v; (void) x; (void) y; (void) z; (void) idx; (void) dx01; \        (void) dy01; (void) dx02; (void) dy02; (void) dx12; (void) dy12; \        (void) delt01; (void) delt02; (void) delt12; (void) deltzx; \        (void) deltzy; (void) zstart; (void) start02; (void) end01; \        (void) end12; (void) ystart; (void) y01y12; (void) i; (void) tmp; \        (void) lr; (void) ydiff; (void) fy#define GOURAUD_VARS \        int arstart, gbstart; \        int deltarx, deltgbx, deltary, deltgby; \        int ctmp, ctmp2, ctmp3, ctmp4; \        GLubyte *(col)[3]#define GOURAUD_VARS_VOIDS \        (void) arstart; (void) gbstart; (void) deltarx; (void) deltgbx; \        (void) deltary; (void) deltgby; (void) ctmp; (void) ctmp2; \        (void) ctmp3; (void) ctmp4; (void) col#define FLAT_VARS \        int arstart, gbstart; \        int deltarx, deltgbx, deltary, deltgby; \        GLubyte *(col)[3]#define FLAT_VARS_VOIDS \        (void) arstart; (void) gbstart; (void) deltarx; (void) deltgbx; \        (void) deltary; (void) deltgby; (void) col#define TEX_VARS \        int u0, u1, u2; \        GLfloat ru0, ru1, ru2; \        int v0, v1, v2; \        GLfloat rv0, rv1, rv2; \        GLfloat w0, w1, w2; \        GLfloat rw0, rw1, rw2; \        int baseu, basev; \        int d0, d1, d2; \        int deltdx, deltvx, deltux, deltdy, deltvy, deltuy; \        int deltwx, deltwy; \        int rbaseu, rbasev; \        int dstart, ustart, wstart, vstart; \        static int stmp = 0; \        s3vTextureObjectPtr t#define TEX_VARS_VOIDS \        (void) u0; (void) u1; (void) u2; (void) ru0; (void) ru1; (void) ru2; \        (void) v0; (void) v1; (void) v2; (void) rv0; (void) rv1; (void) rv2; \        (void) w0; (void) w1; (void) w2; (void) rw0; (void) rw1; (void) rw2; \        (void) baseu; (void) basev; (void) d0; (void) d1; (void) d2; \        (void) deltdx; (void) deltvx; (void) deltux; (void) deltdy; \        (void) deltuy; (void) deltwx; (void) deltwy; (void) rbaseu; \        (void) rbasev; (void) dstart; (void) ustart; (void) wstart; \        (void) vstart; (void) stmp; (void) t#define SORT_VERT() \do { \	for (i=0; i<3; i++) \		fy[i] = v[i].attrib[FRAG_ATTRIB_WPOS][1]; \\		if (fy[1] > fy[0]) {  /* (fy[1] > fy[0]) */ \\			if (fy[2] > fy[0]) { \				idx[0] = 0; \				if (fy[1] > fy[2]) { \					idx[1] = 2; \					idx[2] = 1; \				} else { \					idx[1] = 1; \					idx[2] = 2; \				} \			} else { \				idx[0] = 2; \				idx[1] = 0; \				idx[2] = 1; \			} \		} else { /* (fy[1] < y[0]) */ \			if (fy[2] > fy[0]) { \				idx[0] = 1; \				idx[1] = 0; \				idx[2] = 2; \		} else { \			idx[2] = 0; \			if (fy[2] > fy[1]) { \				idx[0] = 1; \				idx[1] = 2; \			} else { \				idx[0] = 2; \				idx[1] = 1; \			} \		} \	} \} while(0)#define SET_VERT() \do { \	for (i=0; i<3; i++) \	{ \		x[i] = ((v[idx[i]].attrib[FRAG_ATTRIB_WPOS][0]) * /* 0x100000*/  1024.0 * 1024.0); \		y[i] = fy[i] = (dPriv->h - v[idx[i]].attrib[FRAG_ATTRIB_WPOS][1]); \		z[i] = ((v[idx[i]].attrib[FRAG_ATTRIB_WPOS][2]) * /* 0x8000 */ 1024.0 * 32.0); \	} \\	ydiff = fy[0] - (float)y[0]; \\	ystart = y[0]; \\	dx12 = x[2] - x[1]; \	dy12 = y[1] - y[2]; \	dx01 = x[1] - x[0]; \	dy01 = y[0] - y[1]; \	dx02 = x[2] - x[0]; \	dy02 = y[0] - y[2]; \\	delt01 = delt02 = delt12 = 0; \} while (0)#define SET_XY() \do { \	if (dy01) delt01 = dx01 / dy01; \	if (dy12) delt12 = dx12 / dy12; \	delt02 = dx02 / dy02; \\	start02 = x[0] + (ydiff * delt02); \	end01 = x[0] + (ydiff * delt01); \	end12 = x[1] + ((fy[1] - (GLfloat)y[1]) * delt12); \} while (0)#define SET_DIR() \do { \	tmp = x[1] - (dy01 * delt02 + x[0]); \	if (tmp > 0) { \		lr = 0x80000000; \	} else { \		tmp *= -1; \		lr = 0; \	} \	tmp >>= 20; \\        y01y12 = ((((y[0] - y[1]) & 0x7FF) << 16) \                 | ((y[1] - y[2]) & 0x7FF) | lr); \} while (0)#define SET_Z() \do { \	deltzy = (z[2] - z[0]) / dy02; \	if (tmp) { \		deltzx = (z[1] - (dy01 * deltzy + z[0])) / tmp; \	} else { \		deltzx = 0; \	} \	zstart = (deltzy * ydiff) + z[0]; \} while (0)#define SET_FLAT_COL() \do { \	col[0] = &(v[0].color[0]); \	deltarx = deltary = deltgbx = deltgby = 0; \	gbstart = (((col[0][1]) << 23) | ((col[0][2]) << 7)); \	arstart = (((col[0][3]) << 23) | ((col[0][0]) << 7)); \} while(0)#define SET_GOURAUD_COL() \do { \	col[0] = &(v[idx[0]].color[0]); \	col[1] = &(v[idx[1]].color[0]); \	col[2] = &(v[idx[2]].color[0]); \\	ctmp = ((col[2][3] - col[0][3]) << 7) / dy02; \	ctmp2 = ((col[2][0] - col[0][0]) << 7) / dy02; \	deltary = ((ctmp << 16) & 0xFFFF0000) | (ctmp2 & 0xFFFF); \	ctmp3 = ((col[2][1] - col[0][1]) << 7) / dy02; \	ctmp4 = ((col[2][2] - col[0][2]) << 7) / dy02; \	deltgby = ((ctmp3 << 16) & 0xFFFF0000) | (ctmp4 & 0xFFFF); \	gbstart = \	(((int)((ydiff * ctmp3) + (col[0][1] << 7)) << 16) & 0x7FFF0000) \	| ((int)((ydiff * ctmp4) + (col[0][2] << 7)) & 0x7FFF); \	arstart = \	(((int)((ydiff * ctmp) + (col[0][3] << 7)) << 16) & 0x7FFF0000) \	| ((int)((ydiff * ctmp2) + (col[0][0] << 7)) & 0x7FFF); \	if (tmp) { \	int ax, rx, gx, bx; \	ax = ((col[1][3] << 7) - (dy01 * ctmp + (col[0][3] << 7))) / tmp; \	rx = ((col[1][0] << 7) - (dy01 * ctmp2 + (col[0][0] << 7))) / tmp; \	gx = ((col[1][1] << 7) - (dy01 * ctmp3 + (col[0][1] << 7))) / tmp; \	bx = ((col[1][2] << 7) - (dy01 * ctmp4 + (col[0][2] << 7))) / tmp; \	deltarx = ((ax << 16) & 0xFFFF0000) | (rx & 0xFFFF); \	deltgbx = ((gx << 16) & 0xFFFF0000) | (bx & 0xFFFF); \	} else { \	deltgbx = deltarx = 0; \	} \} while (0)#define SET_TEX_VERT() \do { \        t = ((s3vTextureObjectPtr) \                ctx->Texture.Unit[0]._Current->DriverData); \        deltwx = deltwy = wstart = deltdx = deltdy = dstart = 0; \\        u0 = (v[idx[0]].attrib[FRAG_ATTRIB_TEX0][0] \                * (GLfloat)(t->image[0].image->Width) * 256.0); \        u1 = (v[idx[1]].attrib[FRAG_ATTRIB_TEX0][0] \                * (GLfloat)(t->globj->Image[0][0]->Width) * 256.0); \        u2 = (v[idx[2]].attrib[FRAG_ATTRIB_TEX0][0] \                * (GLfloat)(t->globj->Image[0][0]->Width) * 256.0); \        v0 = (v[idx[0]].attrib[FRAG_ATTRIB_TEX0][1] \                * (GLfloat)(t->globj->Image[0][0]->Height) * 256.0); \        v1 = (v[idx[1]].attrib[FRAG_ATTRIB_TEX0][1] \                * (GLfloat)(t->globj->Image[0][0]->Height) * 256.0); \        v2 = (v[idx[2]].attrib[FRAG_ATTRIB_TEX0][1] \                * (GLfloat)(t->globj->Image[0][0]->Height) * 256.0); \\        w0 = (v[idx[0]].attrib[FRAG_ATTRIB_WPOS][3]); \        w1 = (v[idx[1]].attrib[FRAG_ATTRIB_WPOS][3]); \        w2 = (v[idx[2]].attrib[FRAG_ATTRIB_WPOS][3]); \} while (0)#define SET_BASEUV() \do { \        if (u0 < u1) { \                if (u0 < u2) { \                        baseu = u0; \                } else { \                        baseu = u2; \                } \        } else { \                if (u1 < u2) { \                        baseu = u1; \                } else { \                        baseu = u2; \                } \        } \\        if (v0 < v1) { \                if (v0 < v2) { \                        basev = v0; \                } else { \                        basev = v2; \                } \        } else { \                if (v1 < v2) { \                        basev = v1; \                } else { \                        basev = v2; \                } \        } \} while (0)#define SET_RW() \do { \        /* GLfloat minW; \\        if (w0 < w1) { \                if (w0 < w2) { \                        minW = w0; \                } else { \                        minW = w2; \                } \        } else { \                if (w1 < w2) { \                        minW = w1; \                } else { \                        minW = w2; \                } \        } */ \\        rw0 = (512.0 * w0); \        rw1 = (512.0 * w1); \        rw2 = (512.0 * w2); \

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -