Rev 55 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
55 | pj | 1 | /* $Id: api_eval.c,v 1.1 2003-02-28 11:41:57 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 | * Keith Whitwell <keith@tungstengraphics.com> |
||
28 | */ |
||
29 | |||
30 | #include "glheader.h" |
||
31 | #include "api_eval.h" |
||
32 | #include "context.h" |
||
33 | #include "macros.h" |
||
34 | #include "mmath.h" |
||
35 | #include "math/m_eval.h" |
||
36 | |||
37 | static void do_EvalCoord1f(GLcontext* ctx, GLfloat u) |
||
38 | { |
||
39 | |||
40 | /** Color Index **/ |
||
41 | if (ctx->Eval.Map1Index) |
||
42 | { |
||
43 | GLfloat findex; |
||
44 | struct gl_1d_map *map = &ctx->EvalMap.Map1Index; |
||
45 | GLfloat uu = (u - map->u1) * map->du; |
||
46 | _math_horner_bezier_curve(map->Points, &findex, uu, 1, map->Order); |
||
47 | glIndexi( (GLint) findex ); |
||
48 | } |
||
49 | |||
50 | /** Color **/ |
||
51 | if (ctx->Eval.Map1Color4) { |
||
52 | GLfloat fcolor[4]; |
||
53 | struct gl_1d_map *map = &ctx->EvalMap.Map1Color4; |
||
54 | GLfloat uu = (u - map->u1) * map->du; |
||
55 | _math_horner_bezier_curve(map->Points, fcolor, uu, 4, map->Order); |
||
56 | glColor4fv( fcolor ); |
||
57 | } |
||
58 | |||
59 | /** Normal Vector **/ |
||
60 | if (ctx->Eval.Map1Normal) { |
||
61 | GLfloat normal[3]; |
||
62 | struct gl_1d_map *map = &ctx->EvalMap.Map1Normal; |
||
63 | GLfloat uu = (u - map->u1) * map->du; |
||
64 | _math_horner_bezier_curve(map->Points, normal, uu, 3, map->Order); |
||
65 | glNormal3fv( normal ); |
||
66 | } |
||
67 | |||
68 | /** Texture Coordinates **/ |
||
69 | if (ctx->Eval.Map1TextureCoord4) { |
||
70 | GLfloat texcoord[4]; |
||
71 | struct gl_1d_map *map = &ctx->EvalMap.Map1Texture4; |
||
72 | GLfloat uu = (u - map->u1) * map->du; |
||
73 | _math_horner_bezier_curve(map->Points, texcoord, uu, 4, map->Order); |
||
74 | glTexCoord4fv( texcoord ); |
||
75 | } |
||
76 | else if (ctx->Eval.Map1TextureCoord3) { |
||
77 | GLfloat texcoord[4]; |
||
78 | struct gl_1d_map *map = &ctx->EvalMap.Map1Texture3; |
||
79 | GLfloat uu = (u - map->u1) * map->du; |
||
80 | _math_horner_bezier_curve(map->Points, texcoord, uu, 3, map->Order); |
||
81 | glTexCoord3fv( texcoord ); |
||
82 | } |
||
83 | else if (ctx->Eval.Map1TextureCoord2) { |
||
84 | GLfloat texcoord[4]; |
||
85 | struct gl_1d_map *map = &ctx->EvalMap.Map1Texture2; |
||
86 | GLfloat uu = (u - map->u1) * map->du; |
||
87 | _math_horner_bezier_curve(map->Points, texcoord, uu, 2, map->Order); |
||
88 | glTexCoord2fv( texcoord ); |
||
89 | } |
||
90 | else if (ctx->Eval.Map1TextureCoord1) { |
||
91 | GLfloat texcoord[4]; |
||
92 | struct gl_1d_map *map = &ctx->EvalMap.Map1Texture1; |
||
93 | GLfloat uu = (u - map->u1) * map->du; |
||
94 | _math_horner_bezier_curve(map->Points, texcoord, uu, 1, map->Order); |
||
95 | glTexCoord1fv( texcoord ); |
||
96 | } |
||
97 | |||
98 | /** Vertex **/ |
||
99 | if (ctx->Eval.Map1Vertex4) |
||
100 | { |
||
101 | GLfloat vertex[4]; |
||
102 | struct gl_1d_map *map = &ctx->EvalMap.Map1Vertex4; |
||
103 | GLfloat uu = (u - map->u1) * map->du; |
||
104 | _math_horner_bezier_curve(map->Points, vertex, uu, 4, map->Order); |
||
105 | glVertex4fv( vertex ); |
||
106 | } |
||
107 | else if (ctx->Eval.Map1Vertex3) |
||
108 | { |
||
109 | GLfloat vertex[4]; |
||
110 | struct gl_1d_map *map = &ctx->EvalMap.Map1Vertex3; |
||
111 | GLfloat uu = (u - map->u1) * map->du; |
||
112 | _math_horner_bezier_curve(map->Points, vertex, uu, 3, map->Order); |
||
113 | glVertex3fv( vertex ); |
||
114 | } |
||
115 | } |
||
116 | |||
117 | #define CROSS_PROD(n, u, v) \ |
||
118 | (n)[0] = (u)[1]*(v)[2] - (u)[2]*(v)[1]; \ |
||
119 | (n)[1] = (u)[2]*(v)[0] - (u)[0]*(v)[2]; \ |
||
120 | (n)[2] = (u)[0]*(v)[1] - (u)[1]*(v)[0] |
||
121 | |||
122 | |||
123 | static void do_EvalCoord2f( GLcontext* ctx, GLfloat u, GLfloat v ) |
||
124 | { |
||
125 | /** Color Index **/ |
||
126 | if (ctx->Eval.Map2Index) { |
||
127 | GLfloat findex; |
||
128 | struct gl_2d_map *map = &ctx->EvalMap.Map2Index; |
||
129 | GLfloat uu = (u - map->u1) * map->du; |
||
130 | GLfloat vv = (v - map->v1) * map->dv; |
||
131 | _math_horner_bezier_surf(map->Points, &findex, uu, vv, 1, |
||
132 | map->Uorder, map->Vorder); |
||
133 | glIndexi( (GLuint) (GLint) findex ); |
||
134 | } |
||
135 | |||
136 | /** Color **/ |
||
137 | if (ctx->Eval.Map2Color4) { |
||
138 | GLfloat fcolor[4]; |
||
139 | struct gl_2d_map *map = &ctx->EvalMap.Map2Color4; |
||
140 | GLfloat uu = (u - map->u1) * map->du; |
||
141 | GLfloat vv = (v - map->v1) * map->dv; |
||
142 | _math_horner_bezier_surf(map->Points, fcolor, uu, vv, 4, |
||
143 | map->Uorder, map->Vorder); |
||
144 | glColor4fv( fcolor ); |
||
145 | } |
||
146 | |||
147 | /** Normal **/ |
||
148 | if (ctx->Eval.Map2Normal && |
||
149 | (!ctx->Eval.AutoNormal || (!ctx->Eval.Map2Vertex3 && |
||
150 | !ctx->Eval.Map2Vertex4))) { |
||
151 | GLfloat normal[3]; |
||
152 | struct gl_2d_map *map = &ctx->EvalMap.Map2Normal; |
||
153 | GLfloat uu = (u - map->u1) * map->du; |
||
154 | GLfloat vv = (v - map->v1) * map->dv; |
||
155 | _math_horner_bezier_surf(map->Points, normal, uu, vv, 3, |
||
156 | map->Uorder, map->Vorder); |
||
157 | glNormal3fv( normal ); |
||
158 | } |
||
159 | |||
160 | /** Texture Coordinates **/ |
||
161 | if (ctx->Eval.Map2TextureCoord4) { |
||
162 | GLfloat texcoord[4]; |
||
163 | struct gl_2d_map *map = &ctx->EvalMap.Map2Texture4; |
||
164 | GLfloat uu = (u - map->u1) * map->du; |
||
165 | GLfloat vv = (v - map->v1) * map->dv; |
||
166 | _math_horner_bezier_surf(map->Points, texcoord, uu, vv, 4, |
||
167 | map->Uorder, map->Vorder); |
||
168 | glTexCoord4fv( texcoord ); |
||
169 | } |
||
170 | else if (ctx->Eval.Map2TextureCoord3) { |
||
171 | GLfloat texcoord[4]; |
||
172 | struct gl_2d_map *map = &ctx->EvalMap.Map2Texture3; |
||
173 | GLfloat uu = (u - map->u1) * map->du; |
||
174 | GLfloat vv = (v - map->v1) * map->dv; |
||
175 | _math_horner_bezier_surf(map->Points, texcoord, uu, vv, 3, |
||
176 | map->Uorder, map->Vorder); |
||
177 | glTexCoord3fv( texcoord ); |
||
178 | } |
||
179 | else if (ctx->Eval.Map2TextureCoord2) { |
||
180 | GLfloat texcoord[4]; |
||
181 | struct gl_2d_map *map = &ctx->EvalMap.Map2Texture2; |
||
182 | GLfloat uu = (u - map->u1) * map->du; |
||
183 | GLfloat vv = (v - map->v1) * map->dv; |
||
184 | _math_horner_bezier_surf(map->Points, texcoord, uu, vv, 2, |
||
185 | map->Uorder, map->Vorder); |
||
186 | glTexCoord2fv( texcoord ); |
||
187 | } |
||
188 | else if (ctx->Eval.Map2TextureCoord1) { |
||
189 | GLfloat texcoord[4]; |
||
190 | struct gl_2d_map *map = &ctx->EvalMap.Map2Texture1; |
||
191 | GLfloat uu = (u - map->u1) * map->du; |
||
192 | GLfloat vv = (v - map->v1) * map->dv; |
||
193 | _math_horner_bezier_surf(map->Points, texcoord, uu, vv, 1, |
||
194 | map->Uorder, map->Vorder); |
||
195 | glTexCoord1fv( texcoord ); |
||
196 | } |
||
197 | |||
198 | /** Vertex **/ |
||
199 | if(ctx->Eval.Map2Vertex4) { |
||
200 | GLfloat vertex[4]; |
||
201 | GLfloat normal[3]; |
||
202 | struct gl_2d_map *map = &ctx->EvalMap.Map2Vertex4; |
||
203 | GLfloat uu = (u - map->u1) * map->du; |
||
204 | GLfloat vv = (v - map->v1) * map->dv; |
||
205 | |||
206 | if (ctx->Eval.AutoNormal) { |
||
207 | GLfloat du[4], dv[4]; |
||
208 | |||
209 | _math_de_casteljau_surf(map->Points, vertex, du, dv, uu, vv, 4, |
||
210 | map->Uorder, map->Vorder); |
||
211 | |||
212 | CROSS_PROD(normal, du, dv); |
||
213 | NORMALIZE_3FV(normal); |
||
214 | } |
||
215 | else { |
||
216 | _math_horner_bezier_surf(map->Points, vertex, uu, vv, 4, |
||
217 | map->Uorder, map->Vorder); |
||
218 | } |
||
219 | } |
||
220 | else if (ctx->Eval.Map2Vertex3) { |
||
221 | GLfloat vertex[4]; |
||
222 | struct gl_2d_map *map = &ctx->EvalMap.Map2Vertex3; |
||
223 | GLfloat uu = (u - map->u1) * map->du; |
||
224 | GLfloat vv = (v - map->v1) * map->dv; |
||
225 | if (ctx->Eval.AutoNormal) { |
||
226 | GLfloat du[3], dv[3]; |
||
227 | GLfloat normal[3]; |
||
228 | _math_de_casteljau_surf(map->Points, vertex, du, dv, uu, vv, 3, |
||
229 | map->Uorder, map->Vorder); |
||
230 | CROSS_PROD(normal, du, dv); |
||
231 | NORMALIZE_3FV(normal); |
||
232 | glNormal3fv( normal ); |
||
233 | glVertex3fv( vertex ); |
||
234 | } |
||
235 | else { |
||
236 | _math_horner_bezier_surf(map->Points, vertex, uu, vv, 3, |
||
237 | map->Uorder, map->Vorder); |
||
238 | glVertex3fv( vertex ); |
||
239 | } |
||
240 | } |
||
241 | } |
||
242 | |||
243 | |||
244 | void _mesa_EvalPoint1( GLint i ) |
||
245 | { |
||
246 | GET_CURRENT_CONTEXT( ctx ); |
||
247 | GLfloat du = ((ctx->Eval.MapGrid1u2 - ctx->Eval.MapGrid1u1) / |
||
248 | (GLfloat) ctx->Eval.MapGrid1un); |
||
249 | GLfloat u = i * du + ctx->Eval.MapGrid1u1; |
||
250 | |||
251 | glEvalCoord1f( u ); |
||
252 | } |
||
253 | |||
254 | |||
255 | void _mesa_EvalPoint2( GLint i, GLint j ) |
||
256 | { |
||
257 | GET_CURRENT_CONTEXT( ctx ); |
||
258 | GLfloat du = ((ctx->Eval.MapGrid2u2 - ctx->Eval.MapGrid2u1) / |
||
259 | (GLfloat) ctx->Eval.MapGrid2un); |
||
260 | GLfloat dv = ((ctx->Eval.MapGrid2v2 - ctx->Eval.MapGrid2v1) / |
||
261 | (GLfloat) ctx->Eval.MapGrid2vn); |
||
262 | GLfloat u = i * du + ctx->Eval.MapGrid2u1; |
||
263 | GLfloat v = j * dv + ctx->Eval.MapGrid2v1; |
||
264 | |||
265 | glEvalCoord2f( u, v ); |
||
266 | } |
||
267 | |||
268 | /* Wierd thing about eval is that it doesn't affect 'current' values. |
||
269 | * This technique of saving and resetting current values requires |
||
270 | * that: |
||
271 | * |
||
272 | * 1) Current values are updated immediately in the glColor, |
||
273 | * etc. functions. |
||
274 | * |
||
275 | * 2) Hardware color values are stored seperately from ctx->Current, |
||
276 | * for example in dma buffers, or direct emit to registers. |
||
277 | */ |
||
278 | void _mesa_EvalCoord1f( GLfloat u ) |
||
279 | { |
||
280 | GET_CURRENT_CONTEXT( ctx ); |
||
281 | GLfloat normal[3], texcoord[4], color[4]; |
||
282 | GLuint index; |
||
283 | |||
284 | COPY_3FV( normal, ctx->Current.Attrib[VERT_ATTRIB_NORMAL] ); |
||
285 | COPY_4FV( texcoord, ctx->Current.Attrib[VERT_ATTRIB_TEX0] ); |
||
286 | COPY_4FV( color, ctx->Current.Attrib[VERT_ATTRIB_COLOR0] ); |
||
287 | index = ctx->Current.Index; |
||
288 | |||
289 | do_EvalCoord1f( ctx, u ); |
||
290 | |||
291 | COPY_3FV( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], normal ); |
||
292 | COPY_4FV( ctx->Current.Attrib[VERT_ATTRIB_TEX0], texcoord ); |
||
293 | COPY_4FV( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], color ); |
||
294 | ctx->Current.Index = index; |
||
295 | } |
||
296 | |||
297 | void _mesa_EvalCoord2f( GLfloat u, GLfloat v ) |
||
298 | { |
||
299 | GET_CURRENT_CONTEXT( ctx ); |
||
300 | GLfloat normal[3], texcoord[4], color[4]; |
||
301 | GLuint index; |
||
302 | |||
303 | COPY_3FV( normal, ctx->Current.Attrib[VERT_ATTRIB_NORMAL] ); |
||
304 | COPY_4FV( texcoord, ctx->Current.Attrib[VERT_ATTRIB_TEX0] ); |
||
305 | COPY_4FV( color, ctx->Current.Attrib[VERT_ATTRIB_COLOR0] ); |
||
306 | index = ctx->Current.Index; |
||
307 | |||
308 | do_EvalCoord2f( ctx, u, v ); |
||
309 | |||
310 | COPY_3FV( ctx->Current.Attrib[VERT_ATTRIB_NORMAL], normal ); |
||
311 | COPY_4FV( ctx->Current.Attrib[VERT_ATTRIB_TEX0], texcoord ); |
||
312 | COPY_4FV( ctx->Current.Attrib[VERT_ATTRIB_COLOR0], color ); |
||
313 | ctx->Current.Index = index; |
||
314 | } |
||
315 | |||
316 | void _mesa_EvalCoord1fv( const GLfloat *u ) |
||
317 | { |
||
318 | glEvalCoord1f( u[0] ); |
||
319 | } |
||
320 | |||
321 | void _mesa_EvalCoord2fv( const GLfloat *u ) |
||
322 | { |
||
323 | glEvalCoord2f( u[0], u[1] ); |
||
324 | } |