2 * Mesa 3-D graphics library
4 * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
28 * Raster position operations.
38 #include "main/dispatch.h"
42 * Helper function for all the RasterPos functions.
45 rasterpos(GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
47 GET_CURRENT_CONTEXT(ctx
);
55 FLUSH_VERTICES(ctx
, 0);
56 FLUSH_CURRENT(ctx
, 0);
59 _mesa_update_state( ctx
);
61 ctx
->Driver
.RasterPos(ctx
, p
);
66 _mesa_RasterPos2d(GLdouble x
, GLdouble y
)
68 rasterpos((GLfloat
)x
, (GLfloat
)y
, (GLfloat
)0.0, (GLfloat
)1.0);
72 _mesa_RasterPos2f(GLfloat x
, GLfloat y
)
74 rasterpos(x
, y
, 0.0F
, 1.0F
);
78 _mesa_RasterPos2i(GLint x
, GLint y
)
80 rasterpos((GLfloat
) x
, (GLfloat
) y
, 0.0F
, 1.0F
);
84 _mesa_RasterPos2s(GLshort x
, GLshort y
)
86 rasterpos(x
, y
, 0.0F
, 1.0F
);
90 _mesa_RasterPos3d(GLdouble x
, GLdouble y
, GLdouble z
)
92 rasterpos((GLfloat
) x
, (GLfloat
) y
, (GLfloat
) z
, 1.0F
);
96 _mesa_RasterPos3f(GLfloat x
, GLfloat y
, GLfloat z
)
98 rasterpos(x
, y
, z
, 1.0F
);
102 _mesa_RasterPos3i(GLint x
, GLint y
, GLint z
)
104 rasterpos((GLfloat
) x
, (GLfloat
) y
, (GLfloat
) z
, 1.0F
);
108 _mesa_RasterPos3s(GLshort x
, GLshort y
, GLshort z
)
110 rasterpos(x
, y
, z
, 1.0F
);
114 _mesa_RasterPos4d(GLdouble x
, GLdouble y
, GLdouble z
, GLdouble w
)
116 rasterpos((GLfloat
) x
, (GLfloat
) y
, (GLfloat
) z
, (GLfloat
) w
);
120 _mesa_RasterPos4f(GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
122 rasterpos(x
, y
, z
, w
);
126 _mesa_RasterPos4i(GLint x
, GLint y
, GLint z
, GLint w
)
128 rasterpos((GLfloat
) x
, (GLfloat
) y
, (GLfloat
) z
, (GLfloat
) w
);
132 _mesa_RasterPos4s(GLshort x
, GLshort y
, GLshort z
, GLshort w
)
134 rasterpos(x
, y
, z
, w
);
138 _mesa_RasterPos2dv(const GLdouble
*v
)
140 rasterpos((GLfloat
) v
[0], (GLfloat
) v
[1], 0.0F
, 1.0F
);
144 _mesa_RasterPos2fv(const GLfloat
*v
)
146 rasterpos(v
[0], v
[1], 0.0F
, 1.0F
);
150 _mesa_RasterPos2iv(const GLint
*v
)
152 rasterpos((GLfloat
) v
[0], (GLfloat
) v
[1], 0.0F
, 1.0F
);
156 _mesa_RasterPos2sv(const GLshort
*v
)
158 rasterpos(v
[0], v
[1], 0.0F
, 1.0F
);
162 _mesa_RasterPos3dv(const GLdouble
*v
)
164 rasterpos((GLfloat
) v
[0], (GLfloat
) v
[1], (GLfloat
) v
[2], 1.0F
);
168 _mesa_RasterPos3fv(const GLfloat
*v
)
170 rasterpos(v
[0], v
[1], v
[2], 1.0F
);
174 _mesa_RasterPos3iv(const GLint
*v
)
176 rasterpos((GLfloat
) v
[0], (GLfloat
) v
[1], (GLfloat
) v
[2], 1.0F
);
180 _mesa_RasterPos3sv(const GLshort
*v
)
182 rasterpos(v
[0], v
[1], v
[2], 1.0F
);
186 _mesa_RasterPos4dv(const GLdouble
*v
)
188 rasterpos((GLfloat
) v
[0], (GLfloat
) v
[1],
189 (GLfloat
) v
[2], (GLfloat
) v
[3]);
193 _mesa_RasterPos4fv(const GLfloat
*v
)
195 rasterpos(v
[0], v
[1], v
[2], v
[3]);
199 _mesa_RasterPos4iv(const GLint
*v
)
201 rasterpos((GLfloat
) v
[0], (GLfloat
) v
[1],
202 (GLfloat
) v
[2], (GLfloat
) v
[3]);
206 _mesa_RasterPos4sv(const GLshort
*v
)
208 rasterpos(v
[0], v
[1], v
[2], v
[3]);
212 /**********************************************************************/
213 /*** GL_ARB_window_pos / GL_MESA_window_pos ***/
214 /**********************************************************************/
218 * All glWindowPosMESA and glWindowPosARB commands call this function to
219 * update the current raster position.
222 window_pos3f(GLfloat x
, GLfloat y
, GLfloat z
)
224 GET_CURRENT_CONTEXT(ctx
);
227 FLUSH_VERTICES(ctx
, 0);
228 FLUSH_CURRENT(ctx
, 0);
230 z2
= CLAMP(z
, 0.0F
, 1.0F
) * (ctx
->Viewport
.Far
- ctx
->Viewport
.Near
)
231 + ctx
->Viewport
.Near
;
233 /* set raster position */
234 ctx
->Current
.RasterPos
[0] = x
;
235 ctx
->Current
.RasterPos
[1] = y
;
236 ctx
->Current
.RasterPos
[2] = z2
;
237 ctx
->Current
.RasterPos
[3] = 1.0F
;
239 ctx
->Current
.RasterPosValid
= GL_TRUE
;
241 if (ctx
->Fog
.FogCoordinateSource
== GL_FOG_COORDINATE_EXT
)
242 ctx
->Current
.RasterDistance
= ctx
->Current
.Attrib
[VERT_ATTRIB_FOG
][0];
244 ctx
->Current
.RasterDistance
= 0.0;
246 /* raster color = current color or index */
247 ctx
->Current
.RasterColor
[0]
248 = CLAMP(ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][0], 0.0F
, 1.0F
);
249 ctx
->Current
.RasterColor
[1]
250 = CLAMP(ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][1], 0.0F
, 1.0F
);
251 ctx
->Current
.RasterColor
[2]
252 = CLAMP(ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][2], 0.0F
, 1.0F
);
253 ctx
->Current
.RasterColor
[3]
254 = CLAMP(ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][3], 0.0F
, 1.0F
);
255 ctx
->Current
.RasterSecondaryColor
[0]
256 = CLAMP(ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR1
][0], 0.0F
, 1.0F
);
257 ctx
->Current
.RasterSecondaryColor
[1]
258 = CLAMP(ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR1
][1], 0.0F
, 1.0F
);
259 ctx
->Current
.RasterSecondaryColor
[2]
260 = CLAMP(ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR1
][2], 0.0F
, 1.0F
);
261 ctx
->Current
.RasterSecondaryColor
[3]
262 = CLAMP(ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR1
][3], 0.0F
, 1.0F
);
264 /* raster texcoord = current texcoord */
267 for (texSet
= 0; texSet
< ctx
->Const
.MaxTextureCoordUnits
; texSet
++) {
268 assert(texSet
< Elements(ctx
->Current
.RasterTexCoords
));
269 COPY_4FV( ctx
->Current
.RasterTexCoords
[texSet
],
270 ctx
->Current
.Attrib
[VERT_ATTRIB_TEX0
+ texSet
] );
274 if (ctx
->RenderMode
==GL_SELECT
) {
275 _mesa_update_hitflag( ctx
, ctx
->Current
.RasterPos
[2] );
280 /* This is just to support the GL_MESA_window_pos version */
282 window_pos4f(GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
284 GET_CURRENT_CONTEXT(ctx
);
285 window_pos3f(x
, y
, z
);
286 ctx
->Current
.RasterPos
[3] = w
;
291 _mesa_WindowPos2d(GLdouble x
, GLdouble y
)
293 window_pos4f((GLfloat
) x
, (GLfloat
) y
, 0.0F
, 1.0F
);
297 _mesa_WindowPos2f(GLfloat x
, GLfloat y
)
299 window_pos4f(x
, y
, 0.0F
, 1.0F
);
303 _mesa_WindowPos2i(GLint x
, GLint y
)
305 window_pos4f((GLfloat
) x
, (GLfloat
) y
, 0.0F
, 1.0F
);
309 _mesa_WindowPos2s(GLshort x
, GLshort y
)
311 window_pos4f(x
, y
, 0.0F
, 1.0F
);
315 _mesa_WindowPos3d(GLdouble x
, GLdouble y
, GLdouble z
)
317 window_pos4f((GLfloat
) x
, (GLfloat
) y
, (GLfloat
) z
, 1.0F
);
321 _mesa_WindowPos3f(GLfloat x
, GLfloat y
, GLfloat z
)
323 window_pos4f(x
, y
, z
, 1.0F
);
327 _mesa_WindowPos3i(GLint x
, GLint y
, GLint z
)
329 window_pos4f((GLfloat
) x
, (GLfloat
) y
, (GLfloat
) z
, 1.0F
);
333 _mesa_WindowPos3s(GLshort x
, GLshort y
, GLshort z
)
335 window_pos4f(x
, y
, z
, 1.0F
);
339 _mesa_WindowPos4dMESA(GLdouble x
, GLdouble y
, GLdouble z
, GLdouble w
)
341 window_pos4f((GLfloat
) x
, (GLfloat
) y
, (GLfloat
) z
, (GLfloat
) w
);
345 _mesa_WindowPos4fMESA(GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
347 window_pos4f(x
, y
, z
, w
);
351 _mesa_WindowPos4iMESA(GLint x
, GLint y
, GLint z
, GLint w
)
353 window_pos4f((GLfloat
) x
, (GLfloat
) y
, (GLfloat
) z
, (GLfloat
) w
);
357 _mesa_WindowPos4sMESA(GLshort x
, GLshort y
, GLshort z
, GLshort w
)
359 window_pos4f(x
, y
, z
, w
);
363 _mesa_WindowPos2dv(const GLdouble
*v
)
365 window_pos4f((GLfloat
) v
[0], (GLfloat
) v
[1], 0.0F
, 1.0F
);
369 _mesa_WindowPos2fv(const GLfloat
*v
)
371 window_pos4f(v
[0], v
[1], 0.0F
, 1.0F
);
375 _mesa_WindowPos2iv(const GLint
*v
)
377 window_pos4f((GLfloat
) v
[0], (GLfloat
) v
[1], 0.0F
, 1.0F
);
381 _mesa_WindowPos2sv(const GLshort
*v
)
383 window_pos4f(v
[0], v
[1], 0.0F
, 1.0F
);
387 _mesa_WindowPos3dv(const GLdouble
*v
)
389 window_pos4f((GLfloat
) v
[0], (GLfloat
) v
[1], (GLfloat
) v
[2], 1.0F
);
393 _mesa_WindowPos3fv(const GLfloat
*v
)
395 window_pos4f(v
[0], v
[1], v
[2], 1.0);
399 _mesa_WindowPos3iv(const GLint
*v
)
401 window_pos4f((GLfloat
) v
[0], (GLfloat
) v
[1], (GLfloat
) v
[2], 1.0F
);
405 _mesa_WindowPos3sv(const GLshort
*v
)
407 window_pos4f(v
[0], v
[1], v
[2], 1.0F
);
411 _mesa_WindowPos4dvMESA(const GLdouble
*v
)
413 window_pos4f((GLfloat
) v
[0], (GLfloat
) v
[1],
414 (GLfloat
) v
[2], (GLfloat
) v
[3]);
418 _mesa_WindowPos4fvMESA(const GLfloat
*v
)
420 window_pos4f(v
[0], v
[1], v
[2], v
[3]);
424 _mesa_WindowPos4ivMESA(const GLint
*v
)
426 window_pos4f((GLfloat
) v
[0], (GLfloat
) v
[1],
427 (GLfloat
) v
[2], (GLfloat
) v
[3]);
431 _mesa_WindowPos4svMESA(const GLshort
*v
)
433 window_pos4f(v
[0], v
[1], v
[2], v
[3]);
440 * OpenGL implementation of glWindowPos*MESA()
442 void glWindowPos4fMESA( GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
446 /* Push current matrix mode and viewport attributes */
447 glPushAttrib( GL_TRANSFORM_BIT
| GL_VIEWPORT_BIT
);
449 /* Setup projection parameters */
450 glMatrixMode( GL_PROJECTION
);
453 glMatrixMode( GL_MODELVIEW
);
457 glDepthRange( z
, z
);
458 glViewport( (int) x
- 1, (int) y
- 1, 2, 2 );
460 /* set the raster (window) position */
463 glRasterPos4f( fx
, fy
, 0.0, w
);
465 /* restore matrices, viewport and matrix mode */
467 glMatrixMode( GL_PROJECTION
);
476 /**********************************************************************/
477 /** \name Initialization */
478 /**********************************************************************/
482 * Initialize the context current raster position information.
484 * \param ctx GL context.
486 * Initialize the current raster position information in
487 * __struct gl_contextRec::Current, and adds the extension entry points to the
490 void _mesa_init_rastpos( struct gl_context
* ctx
)
494 ASSIGN_4V( ctx
->Current
.RasterPos
, 0.0, 0.0, 0.0, 1.0 );
495 ctx
->Current
.RasterDistance
= 0.0;
496 ASSIGN_4V( ctx
->Current
.RasterColor
, 1.0, 1.0, 1.0, 1.0 );
497 ASSIGN_4V( ctx
->Current
.RasterSecondaryColor
, 0.0, 0.0, 0.0, 1.0 );
498 for (i
= 0; i
< Elements(ctx
->Current
.RasterTexCoords
); i
++)
499 ASSIGN_4V( ctx
->Current
.RasterTexCoords
[i
], 0.0, 0.0, 0.0, 1.0 );
500 ctx
->Current
.RasterPosValid
= GL_TRUE
;