1 /* $Id: ss_vbtmp.h,v 1.22 2002/10/29 20:29:01 brianp Exp $ */
4 * Mesa 3-D graphics library
7 * Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
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:
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
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.
27 * Keith Whitwell <keith@tungstengraphics.com>
31 static void TAG(emit
)(GLcontext
*ctx
, GLuint start
, GLuint end
,
34 TNLcontext
*tnl
= TNL_CONTEXT(ctx
);
35 struct vertex_buffer
*VB
= &tnl
->vb
;
37 GLfloat
*proj
; /* projected clip coordinates */
38 GLfloat
*tc
[MAX_TEXTURE_UNITS
];
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
;
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];
59 tc
[0] = (GLfloat
*)VB
->TexCoordPtr
[0]->data
;
60 tsz
[0] = VB
->TexCoordPtr
[0]->size
;
61 tstride
[0] = VB
->TexCoordPtr
[0]->stride
;
65 for (i
= 0 ; i
< ctx
->Const
.MaxTextureUnits
; i
++) {
66 if (VB
->TexCoordPtr
[i
]) {
68 tc
[i
] = (GLfloat
*)VB
->TexCoordPtr
[i
]->data
;
69 tsz
[i
] = VB
->TexCoordPtr
[i
]->size
;
70 tstride
[i
] = VB
->TexCoordPtr
[i
]->stride
;
76 proj
= VB
->NdcPtr
->data
[0];
77 proj_stride
= VB
->NdcPtr
->stride
;
80 fog
= (GLfloat
*) VB
->FogCoordPtr
->data
;
81 fog_stride
= VB
->FogCoordPtr
->stride
;
84 if (VB
->ColorPtr
[0]->Type
!= CHAN_TYPE
)
85 import_float_colors( ctx
);
87 color
= (GLchan
*) VB
->ColorPtr
[0]->Ptr
;
88 color_stride
= VB
->ColorPtr
[0]->StrideB
;
91 if (VB
->SecondaryColorPtr
[0]->Type
!= CHAN_TYPE
)
92 import_float_spec_colors( ctx
);
94 spec
= (GLchan
*) VB
->SecondaryColorPtr
[0]->Ptr
;
95 spec_stride
= VB
->SecondaryColorPtr
[0]->StrideB
;
98 index
= VB
->IndexPtr
[0]->data
;
99 index_stride
= VB
->IndexPtr
[0]->stride
;
102 pointSize
= (GLfloat
*) VB
->PointSizePtr
->data
;
103 pointSize_stride
= VB
->PointSizePtr
->stride
;
106 v
= &(SWSETUP_CONTEXT(ctx
)->verts
[start
]);
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
;
115 STRIDE_F(proj
, proj_stride
);
118 COPY_CLEAN_4V( v
->texcoord
[0], tsz
[0], tc
[0] );
119 STRIDE_F(tc
[0], tstride
[0]);
122 if (IND
& MULTITEX
) {
124 for (u
= 0 ; u
< maxtex
; u
++)
126 COPY_CLEAN_4V( v
->texcoord
[u
], tsz
[u
], tc
[u
] );
127 STRIDE_F(tc
[u
], tstride
[u
]);
132 COPY_CHAN4(v
->color
, color
);
133 STRIDE_CHAN(color
, color_stride
);
137 COPY_CHAN4(v
->specular
, spec
);
138 STRIDE_CHAN(spec
, spec_stride
);
143 STRIDE_F(fog
, fog_stride
);
148 STRIDE_UI(index
, index_stride
);
152 v
->pointSize
= pointSize
[0];
153 STRIDE_F(pointSize
, pointSize_stride
);
160 static void TAG(interp
)( GLcontext
*ctx
,
162 GLuint edst
, GLuint eout
, GLuint ein
,
163 GLboolean force_boundary
)
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
];
170 SWvertex
*dst
= &swsetup
->verts
[edst
];
171 SWvertex
*in
= &swsetup
->verts
[ein
];
172 SWvertex
*out
= &swsetup
->verts
[eout
];
174 /* Avoid division by zero by rearranging order of clip planes?
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];
185 INTERP_4F( t
, dst
->texcoord
[0], out
->texcoord
[0], in
->texcoord
[0] );
188 if (IND
& MULTITEX
) {
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
] );
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] );
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] );
211 INTERP_F( t
, dst
->fog
, out
->fog
, in
->fog
);
215 INTERP_UI( t
, dst
->index
, out
->index
, in
->index
);
218 /* XXX Point size interpolation??? */
220 INTERP_F( t
, dst
->pointSize
, out
->pointSize
, in
->pointSize
);
225 static void TAG(copy_pv
)( GLcontext
*ctx
, GLuint edst
, GLuint esrc
)
227 SScontext
*swsetup
= SWSETUP_CONTEXT(ctx
);
228 SWvertex
*dst
= &swsetup
->verts
[edst
];
229 SWvertex
*src
= &swsetup
->verts
[esrc
];
232 COPY_CHAN4( dst
->color
, src
->color
);
236 COPY_3V( dst
->specular
, src
->specular
);
240 dst
->index
= src
->index
;
245 static void TAG(init
)( void )
247 setup_tab
[IND
] = TAG(emit
);
248 interp_tab
[IND
] = TAG(interp
);
249 copy_pv_tab
[IND
] = TAG(copy_pv
);