2 * Mesa 3-D graphics library
5 * Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 * Keith Whitwell <keith@tungstengraphics.com>
37 static void TAG(emit
)( GLcontext
*ctx
,
38 GLuint start
, GLuint end
,
42 struct vertex_buffer
*VB
= &TNL_CONTEXT(ctx
)->vb
;
43 GLuint (*tc0
)[4], (*tc1
)[4], (*tc2
)[4];
44 GLfloat (*col
)[4], (*spec
)[4];
47 GLuint tc0_stride
, tc1_stride
, col_stride
, spec_stride
, fog_stride
;
48 GLuint tc2_stride
, norm_stride
;
51 GLuint coord_stride
; /* object coordinates */
55 union emit_union
*v
= (union emit_union
*)dest
;
57 if (RADEON_DEBUG
& DEBUG_VERTS
)
58 fprintf(stderr
, "%s\n", __FUNCTION__
);
60 coord
= (GLuint (*)[4])VB
->ObjPtr
->data
;
61 coord_stride
= VB
->ObjPtr
->stride
;
64 if (VB
->TexCoordPtr
[2]) {
65 const GLuint t2
= GET_TEXSOURCE(2);
66 tc2
= (GLuint (*)[4])VB
->TexCoordPtr
[t2
]->data
;
67 tc2_stride
= VB
->TexCoordPtr
[t2
]->stride
;
68 if (DO_PTEX
&& VB
->TexCoordPtr
[t2
]->size
< 4) {
72 tc2
= (GLuint (*)[4])&ctx
->Current
.Attrib
[VERT_ATTRIB_TEX2
];
78 if (VB
->TexCoordPtr
[1]) {
79 const GLuint t1
= GET_TEXSOURCE(1);
80 tc1
= (GLuint (*)[4])VB
->TexCoordPtr
[t1
]->data
;
81 tc1_stride
= VB
->TexCoordPtr
[t1
]->stride
;
82 if (DO_PTEX
&& VB
->TexCoordPtr
[t1
]->size
< 4) {
86 tc1
= (GLuint (*)[4])&ctx
->Current
.Attrib
[VERT_ATTRIB_TEX1
];
92 if (VB
->TexCoordPtr
[0]) {
93 const GLuint t0
= GET_TEXSOURCE(0);
94 tc0_stride
= VB
->TexCoordPtr
[t0
]->stride
;
95 tc0
= (GLuint (*)[4])VB
->TexCoordPtr
[t0
]->data
;
96 if (DO_PTEX
&& VB
->TexCoordPtr
[t0
]->size
< 4) {
100 tc0
= (GLuint (*)[4])&ctx
->Current
.Attrib
[VERT_ATTRIB_TEX0
];
108 norm_stride
= VB
->NormalPtr
->stride
;
109 norm
= (GLuint (*)[4])VB
->NormalPtr
->data
;
112 norm
= (GLuint (*)[4])&ctx
->Current
.Attrib
[VERT_ATTRIB_NORMAL
];
117 if (VB
->ColorPtr
[0]) {
118 col
= VB
->ColorPtr
[0]->data
;
119 col_stride
= VB
->ColorPtr
[0]->stride
;
121 col
= (GLfloat (*)[4])ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
];
127 if (VB
->SecondaryColorPtr
[0]) {
128 spec
= VB
->SecondaryColorPtr
[0]->data
;
129 spec_stride
= VB
->SecondaryColorPtr
[0]->stride
;
131 spec
= (GLfloat (*)[4])ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR1
];
137 if (VB
->FogCoordPtr
) {
138 fog
= VB
->FogCoordPtr
->data
;
139 fog_stride
= VB
->FogCoordPtr
->stride
;
141 fog
= (GLfloat (*)[4])&dummy
; fog
[0][0] = 0.0F
;
148 coord
= (GLuint (*)[4])((GLubyte
*)coord
+ start
* coord_stride
);
150 tc0
= (GLuint (*)[4])((GLubyte
*)tc0
+ start
* tc0_stride
);
152 tc1
= (GLuint (*)[4])((GLubyte
*)tc1
+ start
* tc1_stride
);
154 tc2
= (GLuint (*)[4])((GLubyte
*)tc2
+ start
* tc2_stride
);
156 norm
= (GLuint (*)[4])((GLubyte
*)norm
+ start
* norm_stride
);
158 STRIDE_4F(col
, start
* col_stride
);
160 STRIDE_4F(spec
, start
* spec_stride
);
162 STRIDE_4F(fog
, start
* fog_stride
);
167 for (i
=start
; i
< end
; i
++) {
169 v
[0].ui
= coord
[0][0];
170 v
[1].ui
= coord
[0][1];
171 v
[2].ui
= coord
[0][2];
173 v
[3].ui
= coord
[0][3];
178 coord
= (GLuint (*)[4])((GLubyte
*)coord
+ coord_stride
);
181 v
[0].ui
= norm
[0][0];
182 v
[1].ui
= norm
[0][1];
183 v
[2].ui
= norm
[0][2];
185 norm
= (GLuint (*)[4])((GLubyte
*)norm
+ norm_stride
);
188 UNCLAMPED_FLOAT_TO_UBYTE(v
[0].rgba
.red
, col
[0][0]);
189 UNCLAMPED_FLOAT_TO_UBYTE(v
[0].rgba
.green
, col
[0][1]);
190 UNCLAMPED_FLOAT_TO_UBYTE(v
[0].rgba
.blue
, col
[0][2]);
191 UNCLAMPED_FLOAT_TO_UBYTE(v
[0].rgba
.alpha
, col
[0][3]);
192 STRIDE_4F(col
, col_stride
);
195 if (DO_SPEC
|| DO_FOG
) {
197 UNCLAMPED_FLOAT_TO_UBYTE(v
[0].rgba
.red
, spec
[0][0]);
198 UNCLAMPED_FLOAT_TO_UBYTE(v
[0].rgba
.green
, spec
[0][1]);
199 UNCLAMPED_FLOAT_TO_UBYTE(v
[0].rgba
.blue
, spec
[0][2]);
200 STRIDE_4F(spec
, spec_stride
);
203 UNCLAMPED_FLOAT_TO_UBYTE(v
[0].rgba
.alpha
, fog
[0][0]);
204 fog
= (GLfloat (*)[4])((GLubyte
*)fog
+ fog_stride
);
206 if (TCL_DEBUG
) fprintf(stderr
, "%x ", v
[0].ui
);
212 if (TCL_DEBUG
) fprintf(stderr
, "t0: %.2f %.2f ", v
[0].f
, v
[1].f
);
214 if (fill_tex
& (1<<0))
218 if (TCL_DEBUG
) fprintf(stderr
, "%.2f ", v
[2].f
);
223 tc0
= (GLuint (*)[4])((GLubyte
*)tc0
+ tc0_stride
);
228 if (TCL_DEBUG
) fprintf(stderr
, "t1: %.2f %.2f ", v
[0].f
, v
[1].f
);
230 if (fill_tex
& (1<<1))
234 if (TCL_DEBUG
) fprintf(stderr
, "%.2f ", v
[2].f
);
239 tc1
= (GLuint (*)[4])((GLubyte
*)tc1
+ tc1_stride
);
245 if (fill_tex
& (1<<2))
253 tc2
= (GLuint (*)[4])((GLubyte
*)tc2
+ tc2_stride
);
255 if (TCL_DEBUG
) fprintf(stderr
, "\n");
262 static void TAG(init
)( void )
266 if (DO_NORM
) sz
+= 3;
268 if (DO_SPEC
|| DO_FOG
) sz
++;
269 if (DO_TEX0
) sz
+= 2;
270 if (DO_TEX0
&& DO_PTEX
) sz
++;
271 if (DO_TEX1
) sz
+= 2;
272 if (DO_TEX1
&& DO_PTEX
) sz
++;
273 if (DO_TEX2
) sz
+= 2;
274 if (DO_TEX2
&& DO_PTEX
) sz
++;
276 setup_tab
[IDX
].emit
= TAG(emit
);
277 setup_tab
[IDX
].vertex_format
= IND
;
278 setup_tab
[IDX
].vertex_size
= sz
;