Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
58 | pj | 1 | /* $Id: t_dd_imm_vapi.h,v 1.1 2003-02-28 11:54:02 pj Exp $ */ |
2 | |||
3 | /* |
||
4 | * Mesa 3-D graphics library |
||
5 | * Version: 3.5 |
||
6 | * |
||
7 | * Copyright (C) 1999-2001 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 | * Gareth Hughes <gareth@valinux.com> |
||
28 | * Keith Whitwell <keithw@valinux.com> |
||
29 | */ |
||
30 | |||
31 | /* Template for immediate mode vertex functions. |
||
32 | */ |
||
33 | |||
34 | #define DBG 0 |
||
35 | |||
36 | #define VERTEX( ox, oy, oz, ow ) |
||
37 | do { |
||
38 | GET_CURRENT_VERTEX; |
||
39 | GLfloat w; |
||
40 | GLuint mask; |
||
41 | const GLfloat * const m = ctx->_ModelProjectMatrix.m; |
||
42 | |||
43 | if (DO_FULL_MATRIX) { |
||
44 | VERTEX_CLIP(0) = m[0] * ox + m[4] * oy + m[8] * oz + m[12] * ow; |
||
45 | VERTEX_CLIP(1) = m[1] * ox + m[5] * oy + m[9] * oz + m[13] * ow; |
||
46 | VERTEX_CLIP(2) = m[2] * ox + m[6] * oy + m[10] * oz + m[14] * ow; |
||
47 | VERTEX_CLIP(3) = m[3] * ox + m[7] * oy + m[11] * oz + m[15] * ow; |
||
48 | w = VERTEX_CLIP(3); |
||
49 | } |
||
50 | else if (DO_NOROT_MATRIX) { |
||
51 | VERTEX_CLIP(0) = m[0] * ox + m[12] * ow; |
||
52 | VERTEX_CLIP(1) = m[5] * oy + m[13] * ow; |
||
53 | VERTEX_CLIP(2) = m[10] * oz + m[14] * ow; |
||
54 | VERTEX_CLIP(3) = ow; |
||
55 | w = ow; |
||
56 | } |
||
57 | else { |
||
58 | ASSERT (DO_IDENTITY_MATRIX); |
||
59 | VERTEX_CLIP(0) = ox; |
||
60 | VERTEX_CLIP(1) = oy; |
||
61 | VERTEX_CLIP(2) = oz; |
||
62 | VERTEX_CLIP(3) = ow; |
||
63 | w = ow; |
||
64 | } |
||
65 | |||
66 | mask = 0; |
||
67 | if (DO_CLIP_TEST) { |
||
68 | if ( VERTEX_CLIP(0) > w ) mask |= CLIP_RIGHT_BIT; |
||
69 | if ( VERTEX_CLIP(0) < -w ) mask |= CLIP_LEFT_BIT; |
||
70 | if ( VERTEX_CLIP(1) > w ) mask |= CLIP_TOP_BIT; |
||
71 | if ( VERTEX_CLIP(1) < -w ) mask |= CLIP_BOTTOM_BIT; |
||
72 | if ( VERTEX_CLIP(2) > w ) mask |= CLIP_FAR_BIT; |
||
73 | if ( VERTEX_CLIP(2) < -w ) mask |= CLIP_NEAR_BIT; |
||
74 | VERTEX_MASK(v) = mask; |
||
75 | } |
||
76 | |||
77 | if (!mask) { |
||
78 | if (HAVE_VERTEX_WIN) { |
||
79 | if (!HAVE_HW_VIEWPORT) { |
||
80 | const GLfloat *s = GET_VIEWPORT_MATRIX(); |
||
81 | if (HAVE_W && HAVE_HW_DIVIDE) { |
||
82 | VERTEX_WIN( 0 ) = s[0] * VERTEX_CLIP( 0 ) + s[12]; |
||
83 | VERTEX_WIN( 1 ) = s[5] * VERTEX_CLIP( 1 ) + s[13]; |
||
84 | VERTEX_WIN( 2 ) = s[10] * VERTEX_CLIP( 2 ) + s[14]; |
||
85 | VERTEX_WIN( 3 ) = w; |
||
86 | } |
||
87 | else { |
||
88 | const GLfloat oow = 1.0/w; /* possibly opt away */ |
||
89 | VERTEX_WIN( 0 ) = s[0] * VERTEX_CLIP( 0 ) * oow + s[12]; |
||
90 | VERTEX_WIN( 1 ) = s[5] * VERTEX_CLIP( 1 ) * oow + s[13]; |
||
91 | VERTEX_WIN( 2 ) = s[10] * VERTEX_CLIP( 2 ) * oow + s[14]; |
||
92 | if (HAVE_W) |
||
93 | VERTEX_WIN( 3 ) = oow; |
||
94 | } |
||
95 | } |
||
96 | else if (HAVE_W && HAVE_HW_DIVIDE) { |
||
97 | if (!VERTEX_WIN_IS_VERTEX_CLIP) { |
||
98 | VERTEX_WIN( 0 ) = VERTEX_CLIP( 0 ); |
||
99 | VERTEX_WIN( 1 ) = VERTEX_CLIP( 1 ); |
||
100 | VERTEX_WIN( 2 ) = VERTEX_CLIP( 2 ); |
||
101 | VERTEX_WIN( 3 ) = w; |
||
102 | } |
||
103 | } |
||
104 | else { |
||
105 | const GLfloat oow = 1.0/w; /* possibly opt away */ |
||
106 | VERTEX_WIN( 0 ) = VERTEX_CLIP( 0 ) * oow; |
||
107 | VERTEX_WIN( 1 ) = VERTEX_CLIP( 1 ) * oow; |
||
108 | VERTEX_WIN( 2 ) = VERTEX_CLIP( 2 ) * oow; |
||
109 | if (HAVE_W) |
||
110 | VERTEX_WIN( 3 ) = oow; |
||
111 | } |
||
112 | } |
||
113 | } else if (!FALLBACK_OR_CLIPPING) { |
||
114 | SET_CLIPPING(); /* transition to clipping */ |
||
115 | } |
||
116 | |||
117 | COPY_VERTEX_FROM_CURRENT; |
||
118 | BUILD_PRIM_FROM_VERTEX; |
||
119 | } |
||
120 | |||
121 | /* Let the compiler optimize away the constant operations: |
||
122 | */ |
||
123 | static void VTAG(Vertex2f)( GLfloat ox, GLfloat oy ) |
||
124 | { |
||
125 | /* Cliptest on clip[2] could also be eliminated... |
||
126 | */ |
||
127 | VERTEX( ox, oy, 0, 1 ); |
||
128 | } |
||
129 | |||
130 | static void VTAG(Vertex2fv)( const GLfloat *obj ) |
||
131 | { |
||
132 | /* Cliptest on clip[2] could also be eliminated... |
||
133 | */ |
||
134 | VERTEX( obj[0], obj[1], 0, 1 ); |
||
135 | } |
||
136 | |||
137 | static void VTAG(Vertex3f)( GLfloat ox, GLfloat oy, GLfloat oz ) |
||
138 | { |
||
139 | VERTEX( ox, oy, oz, 1 ); |
||
140 | } |
||
141 | |||
142 | static void VTAG(Vertex3fv)( const GLfloat *obj ) |
||
143 | { |
||
144 | VERTEX( obj[0], obj[1], obj[2], 1 ); |
||
145 | } |
||
146 | |||
147 | static void VTAG(Vertex4f)( GLfloat ox, GLfloat oy, GLfloat oz, GLfloat ow ) |
||
148 | { |
||
149 | VERTEX( ox, oy, oz, ow ); |
||
150 | } |
||
151 | |||
152 | static void VTAG(Vertex4fv)( const GLfloat *obj ) |
||
153 | { |
||
154 | VERTEX( obj[0], obj[1], obj[2], obj[3] ); |
||
155 | } |
||
156 | |||
157 | |||
158 | #undef DO_FULL_MATRIX |
||
159 | #undef VTAG |
||
160 | #undef VERTEX |