Rev 143 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
143 | giacomo | 1 | /* $Id: ss_vbtmp.h,v 1.1 2003-04-29 12:46:52 giacomo Exp $ */ |
2 | |||
3 | /* |
||
4 | * Mesa 3-D graphics library |
||
5 | * Version: 4.1 |
||
6 | * |
||
7 | * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. |
||
8 | * |
||
9 | * Permission is hereby granted, free of charge, to any person obtaining a |
||
10 | * copy of this software and associated documentation files (the "Software"), |
||
11 | * to deal in the Software without restriction, including without limitation |
||
12 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||
13 | * and/or sell copies of the Software, and to permit persons to whom the |
||
14 | * Software is furnished to do so, subject to the following conditions: |
||
15 | * |
||
16 | * The above copyright notice and this permission notice shall be included |
||
17 | * in all copies or substantial portions of the Software. |
||
18 | * |
||
19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||
20 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||
21 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||
22 | * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN |
||
23 | * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
||
24 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||
25 | * |
||
26 | * Authors: |
||
27 | * Keith Whitwell <keith@tungstengraphics.com> |
||
28 | */ |
||
29 | |||
30 | |||
31 | static void TAG(emit)(GLcontext *ctx, GLuint start, GLuint end, |
||
32 | GLuint newinputs ) |
||
33 | { |
||
34 | TNLcontext *tnl = TNL_CONTEXT(ctx); |
||
35 | struct vertex_buffer *VB = &tnl->vb; |
||
36 | SWvertex *v; |
||
37 | GLfloat *proj; /* projected clip coordinates */ |
||
38 | GLfloat *tc[MAX_TEXTURE_UNITS]; |
||
39 | GLchan *color; |
||
40 | GLchan *spec; |
||
41 | GLuint *index; |
||
42 | GLfloat *fog; |
||
43 | GLfloat *pointSize; |
||
44 | GLuint tsz[MAX_TEXTURE_UNITS]; |
||
45 | GLuint tstride[MAX_TEXTURE_UNITS]; |
||
46 | GLuint proj_stride, color_stride, spec_stride, index_stride; |
||
47 | GLuint fog_stride, pointSize_stride; |
||
48 | GLuint i; |
||
49 | GLfloat *m = ctx->Viewport._WindowMap.m; |
||
50 | const GLfloat sx = m[0]; |
||
51 | const GLfloat sy = m[5]; |
||
52 | const GLfloat sz = m[10]; |
||
53 | const GLfloat tx = m[12]; |
||
54 | const GLfloat ty = m[13]; |
||
55 | const GLfloat tz = m[14]; |
||
56 | GLuint maxtex = 0; |
||
57 | |||
58 | if (IND & TEX0) { |
||
59 | tc[0] = (GLfloat *)VB->TexCoordPtr[0]->data; |
||
60 | tsz[0] = VB->TexCoordPtr[0]->size; |
||
61 | tstride[0] = VB->TexCoordPtr[0]->stride; |
||
62 | } |
||
63 | |||
64 | if (IND & MULTITEX) { |
||
65 | for (i = 0 ; i < ctx->Const.MaxTextureUnits ; i++) { |
||
66 | if (VB->TexCoordPtr[i]) { |
||
67 | maxtex = i+1; |
||
68 | tc[i] = (GLfloat *)VB->TexCoordPtr[i]->data; |
||
69 | tsz[i] = VB->TexCoordPtr[i]->size; |
||
70 | tstride[i] = VB->TexCoordPtr[i]->stride; |
||
71 | } |
||
72 | else tc[i] = 0; |
||
73 | } |
||
74 | } |
||
75 | |||
76 | proj = VB->NdcPtr->data[0]; |
||
77 | proj_stride = VB->NdcPtr->stride; |
||
78 | |||
79 | if (IND & FOG) { |
||
80 | fog = (GLfloat *) VB->FogCoordPtr->data; |
||
81 | fog_stride = VB->FogCoordPtr->stride; |
||
82 | } |
||
83 | if (IND & COLOR) { |
||
84 | if (VB->ColorPtr[0]->Type != CHAN_TYPE) |
||
85 | import_float_colors( ctx ); |
||
86 | |||
87 | color = (GLchan *) VB->ColorPtr[0]->Ptr; |
||
88 | color_stride = VB->ColorPtr[0]->StrideB; |
||
89 | } |
||
90 | if (IND & SPEC) { |
||
91 | if (VB->SecondaryColorPtr[0]->Type != CHAN_TYPE) |
||
92 | import_float_spec_colors( ctx ); |
||
93 | |||
94 | spec = (GLchan *) VB->SecondaryColorPtr[0]->Ptr; |
||
95 | spec_stride = VB->SecondaryColorPtr[0]->StrideB; |
||
96 | } |
||
97 | if (IND & INDEX) { |
||
98 | index = VB->IndexPtr[0]->data; |
||
99 | index_stride = VB->IndexPtr[0]->stride; |
||
100 | } |
||
101 | if (IND & POINT) { |
||
102 | pointSize = (GLfloat *) VB->PointSizePtr->data; |
||
103 | pointSize_stride = VB->PointSizePtr->stride; |
||
104 | } |
||
105 | |||
106 | v = &(SWSETUP_CONTEXT(ctx)->verts[start]); |
||
107 | |||
108 | for (i=start; i < end; i++, v++) { |
||
109 | if (VB->ClipMask[i] == 0) { |
||
110 | v->win[0] = sx * proj[0] + tx; |
||
111 | v->win[1] = sy * proj[1] + ty; |
||
112 | v->win[2] = sz * proj[2] + tz; |
||
113 | v->win[3] = proj[3]; |
||
114 | } |
||
115 | STRIDE_F(proj, proj_stride); |
||
116 | |||
117 | if (IND & TEX0) { |
||
118 | COPY_CLEAN_4V( v->texcoord[0], tsz[0], tc[0] ); |
||
119 | STRIDE_F(tc[0], tstride[0]); |
||
120 | } |
||
121 | |||
122 | if (IND & MULTITEX) { |
||
123 | GLuint u; |
||
124 | for (u = 0 ; u < maxtex ; u++) |
||
125 | if (tc[u]) { |
||
126 | COPY_CLEAN_4V( v->texcoord[u], tsz[u], tc[u] ); |
||
127 | STRIDE_F(tc[u], tstride[u]); |
||
128 | } |
||
129 | } |
||
130 | |||
131 | if (IND & COLOR) { |
||
132 | COPY_CHAN4(v->color, color); |
||
133 | STRIDE_CHAN(color, color_stride); |
||
134 | } |
||
135 | |||
136 | if (IND & SPEC) { |
||
137 | COPY_CHAN4(v->specular, spec); |
||
138 | STRIDE_CHAN(spec, spec_stride); |
||
139 | } |
||
140 | |||
141 | if (IND & FOG) { |
||
142 | v->fog = fog[0]; |
||
143 | STRIDE_F(fog, fog_stride); |
||
144 | } |
||
145 | |||
146 | if (IND & INDEX) { |
||
147 | v->index = index[0]; |
||
148 | STRIDE_UI(index, index_stride); |
||
149 | } |
||
150 | |||
151 | if (IND & POINT) { |
||
152 | v->pointSize = pointSize[0]; |
||
153 | STRIDE_F(pointSize, pointSize_stride); |
||
154 | } |
||
155 | } |
||
156 | } |
||
157 | |||
158 | |||
159 | |||
160 | static void TAG(interp)( GLcontext *ctx, |
||
161 | GLfloat t, |
||
162 | GLuint edst, GLuint eout, GLuint ein, |
||
163 | GLboolean force_boundary ) |
||
164 | { |
||
165 | SScontext *swsetup = SWSETUP_CONTEXT(ctx); |
||
166 | struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; |
||
167 | GLfloat *m = ctx->Viewport._WindowMap.m; |
||
168 | GLfloat *clip = VB->ClipPtr->data[edst]; |
||
169 | |||
170 | SWvertex *dst = &swsetup->verts[edst]; |
||
171 | SWvertex *in = &swsetup->verts[ein]; |
||
172 | SWvertex *out = &swsetup->verts[eout]; |
||
173 | |||
174 | /* Avoid division by zero by rearranging order of clip planes? |
||
175 | */ |
||
176 | if (clip[3] != 0.0) { |
||
177 | GLfloat oow = 1.0F / clip[3]; |
||
178 | dst->win[0] = m[0] * clip[0] * oow + m[12]; |
||
179 | dst->win[1] = m[5] * clip[1] * oow + m[13]; |
||
180 | dst->win[2] = m[10] * clip[2] * oow + m[14]; |
||
181 | dst->win[3] = oow; |
||
182 | } |
||
183 | |||
184 | if (IND & TEX0) { |
||
185 | INTERP_4F( t, dst->texcoord[0], out->texcoord[0], in->texcoord[0] ); |
||
186 | } |
||
187 | |||
188 | if (IND & MULTITEX) { |
||
189 | GLuint u; |
||
190 | GLuint maxtex = ctx->Const.MaxTextureUnits; |
||
191 | for (u = 0 ; u < maxtex ; u++) |
||
192 | if (VB->TexCoordPtr[u]) { |
||
193 | INTERP_4F( t, dst->texcoord[u], out->texcoord[u], in->texcoord[u] ); |
||
194 | } |
||
195 | } |
||
196 | |||
197 | if (IND & COLOR) { |
||
198 | INTERP_CHAN( t, dst->color[0], out->color[0], in->color[0] ); |
||
199 | INTERP_CHAN( t, dst->color[1], out->color[1], in->color[1] ); |
||
200 | INTERP_CHAN( t, dst->color[2], out->color[2], in->color[2] ); |
||
201 | INTERP_CHAN( t, dst->color[3], out->color[3], in->color[3] ); |
||
202 | } |
||
203 | |||
204 | if (IND & SPEC) { |
||
205 | INTERP_CHAN( t, dst->specular[0], out->specular[0], in->specular[0] ); |
||
206 | INTERP_CHAN( t, dst->specular[1], out->specular[1], in->specular[1] ); |
||
207 | INTERP_CHAN( t, dst->specular[2], out->specular[2], in->specular[2] ); |
||
208 | } |
||
209 | |||
210 | if (IND & FOG) { |
||
211 | INTERP_F( t, dst->fog, out->fog, in->fog ); |
||
212 | } |
||
213 | |||
214 | if (IND & INDEX) { |
||
215 | INTERP_UI( t, dst->index, out->index, in->index ); |
||
216 | } |
||
217 | |||
218 | /* XXX Point size interpolation??? */ |
||
219 | if (IND & POINT) { |
||
220 | INTERP_F( t, dst->pointSize, out->pointSize, in->pointSize ); |
||
221 | } |
||
222 | } |
||
223 | |||
224 | |||
225 | static void TAG(copy_pv)( GLcontext *ctx, GLuint edst, GLuint esrc ) |
||
226 | { |
||
227 | SScontext *swsetup = SWSETUP_CONTEXT(ctx); |
||
228 | SWvertex *dst = &swsetup->verts[edst]; |
||
229 | SWvertex *src = &swsetup->verts[esrc]; |
||
230 | |||
231 | if (IND & COLOR) { |
||
232 | COPY_CHAN4( dst->color, src->color ); |
||
233 | } |
||
234 | |||
235 | if (IND & SPEC) { |
||
236 | COPY_3V( dst->specular, src->specular ); |
||
237 | } |
||
238 | |||
239 | if (IND & INDEX) { |
||
240 | dst->index = src->index; |
||
241 | } |
||
242 | } |
||
243 | |||
244 | |||
245 | static void TAG(init)( void ) |
||
246 | { |
||
247 | setup_tab[IND] = TAG(emit); |
||
248 | interp_tab[IND] = TAG(interp); |
||
249 | copy_pv_tab[IND] = TAG(copy_pv); |
||
250 | } |
||
251 | |||
252 | #undef TAG |
||
253 | #undef IND |
||
254 | #undef SETUP_FLAGS |