rastpos.c revision 4a49301e
12007c8b2Snia/*
22007c8b2Snia * Mesa 3-D graphics library
32007c8b2Snia * Version:  6.5.3
42007c8b2Snia *
52007c8b2Snia * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
62007c8b2Snia *
72007c8b2Snia * Permission is hereby granted, free of charge, to any person obtaining a
82007c8b2Snia * copy of this software and associated documentation files (the "Software"),
92007c8b2Snia * to deal in the Software without restriction, including without limitation
102007c8b2Snia * the rights to use, copy, modify, merge, publish, distribute, sublicense,
112007c8b2Snia * and/or sell copies of the Software, and to permit persons to whom the
122007c8b2Snia * Software is furnished to do so, subject to the following conditions:
132007c8b2Snia *
142007c8b2Snia * The above copyright notice and this permission notice shall be included
152007c8b2Snia * in all copies or substantial portions of the Software.
162007c8b2Snia *
172007c8b2Snia * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
182007c8b2Snia * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
192007c8b2Snia * 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.
23 */
24
25
26/**
27 * \file rastpos.c
28 * Raster position operations.
29 */
30
31#include "glheader.h"
32#include "context.h"
33#include "feedback.h"
34#include "macros.h"
35#include "rastpos.h"
36#include "state.h"
37#include "glapi/dispatch.h"
38
39
40#if FEATURE_rastpos
41
42
43/**
44 * Helper function for all the RasterPos functions.
45 */
46static void
47rasterpos(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
48{
49   GET_CURRENT_CONTEXT(ctx);
50   GLfloat p[4];
51
52   p[0] = x;
53   p[1] = y;
54   p[2] = z;
55   p[3] = w;
56
57   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
58   FLUSH_CURRENT(ctx, 0);
59
60   if (ctx->NewState)
61      _mesa_update_state( ctx );
62
63   ctx->Driver.RasterPos(ctx, p);
64}
65
66
67static void GLAPIENTRY
68_mesa_RasterPos2d(GLdouble x, GLdouble y)
69{
70   rasterpos((GLfloat)x, (GLfloat)y, (GLfloat)0.0, (GLfloat)1.0);
71}
72
73static void GLAPIENTRY
74_mesa_RasterPos2f(GLfloat x, GLfloat y)
75{
76   rasterpos(x, y, 0.0F, 1.0F);
77}
78
79static void GLAPIENTRY
80_mesa_RasterPos2i(GLint x, GLint y)
81{
82   rasterpos((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
83}
84
85static void GLAPIENTRY
86_mesa_RasterPos2s(GLshort x, GLshort y)
87{
88   rasterpos(x, y, 0.0F, 1.0F);
89}
90
91static void GLAPIENTRY
92_mesa_RasterPos3d(GLdouble x, GLdouble y, GLdouble z)
93{
94   rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
95}
96
97static void GLAPIENTRY
98_mesa_RasterPos3f(GLfloat x, GLfloat y, GLfloat z)
99{
100   rasterpos(x, y, z, 1.0F);
101}
102
103static void GLAPIENTRY
104_mesa_RasterPos3i(GLint x, GLint y, GLint z)
105{
106   rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
107}
108
109static void GLAPIENTRY
110_mesa_RasterPos3s(GLshort x, GLshort y, GLshort z)
111{
112   rasterpos(x, y, z, 1.0F);
113}
114
115static void GLAPIENTRY
116_mesa_RasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
117{
118   rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
119}
120
121static void GLAPIENTRY
122_mesa_RasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
123{
124   rasterpos(x, y, z, w);
125}
126
127static void GLAPIENTRY
128_mesa_RasterPos4i(GLint x, GLint y, GLint z, GLint w)
129{
130   rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
131}
132
133static void GLAPIENTRY
134_mesa_RasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
135{
136   rasterpos(x, y, z, w);
137}
138
139static void GLAPIENTRY
140_mesa_RasterPos2dv(const GLdouble *v)
141{
142   rasterpos((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
143}
144
145static void GLAPIENTRY
146_mesa_RasterPos2fv(const GLfloat *v)
147{
148   rasterpos(v[0], v[1], 0.0F, 1.0F);
149}
150
151static void GLAPIENTRY
152_mesa_RasterPos2iv(const GLint *v)
153{
154   rasterpos((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
155}
156
157static void GLAPIENTRY
158_mesa_RasterPos2sv(const GLshort *v)
159{
160   rasterpos(v[0], v[1], 0.0F, 1.0F);
161}
162
163static void GLAPIENTRY
164_mesa_RasterPos3dv(const GLdouble *v)
165{
166   rasterpos((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
167}
168
169static void GLAPIENTRY
170_mesa_RasterPos3fv(const GLfloat *v)
171{
172   rasterpos(v[0], v[1], v[2], 1.0F);
173}
174
175static void GLAPIENTRY
176_mesa_RasterPos3iv(const GLint *v)
177{
178   rasterpos((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
179}
180
181static void GLAPIENTRY
182_mesa_RasterPos3sv(const GLshort *v)
183{
184   rasterpos(v[0], v[1], v[2], 1.0F);
185}
186
187static void GLAPIENTRY
188_mesa_RasterPos4dv(const GLdouble *v)
189{
190   rasterpos((GLfloat) v[0], (GLfloat) v[1],
191		     (GLfloat) v[2], (GLfloat) v[3]);
192}
193
194static void GLAPIENTRY
195_mesa_RasterPos4fv(const GLfloat *v)
196{
197   rasterpos(v[0], v[1], v[2], v[3]);
198}
199
200static void GLAPIENTRY
201_mesa_RasterPos4iv(const GLint *v)
202{
203   rasterpos((GLfloat) v[0], (GLfloat) v[1],
204		     (GLfloat) v[2], (GLfloat) v[3]);
205}
206
207static void GLAPIENTRY
208_mesa_RasterPos4sv(const GLshort *v)
209{
210   rasterpos(v[0], v[1], v[2], v[3]);
211}
212
213
214/**********************************************************************/
215/***           GL_ARB_window_pos / GL_MESA_window_pos               ***/
216/**********************************************************************/
217
218
219/**
220 * All glWindowPosMESA and glWindowPosARB commands call this function to
221 * update the current raster position.
222 */
223static void
224window_pos3f(GLfloat x, GLfloat y, GLfloat z)
225{
226   GET_CURRENT_CONTEXT(ctx);
227   GLfloat z2;
228
229   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
230   FLUSH_CURRENT(ctx, 0);
231
232   z2 = CLAMP(z, 0.0F, 1.0F) * (ctx->Viewport.Far - ctx->Viewport.Near)
233      + ctx->Viewport.Near;
234
235   /* set raster position */
236   ctx->Current.RasterPos[0] = x;
237   ctx->Current.RasterPos[1] = y;
238   ctx->Current.RasterPos[2] = z2;
239   ctx->Current.RasterPos[3] = 1.0F;
240
241   ctx->Current.RasterPosValid = GL_TRUE;
242
243   if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT)
244      ctx->Current.RasterDistance = ctx->Current.Attrib[VERT_ATTRIB_FOG][0];
245   else
246      ctx->Current.RasterDistance = 0.0;
247
248   /* raster color = current color or index */
249   if (ctx->Visual.rgbMode) {
250      ctx->Current.RasterColor[0]
251         = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][0], 0.0F, 1.0F);
252      ctx->Current.RasterColor[1]
253         = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][1], 0.0F, 1.0F);
254      ctx->Current.RasterColor[2]
255         = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][2], 0.0F, 1.0F);
256      ctx->Current.RasterColor[3]
257         = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][3], 0.0F, 1.0F);
258      ctx->Current.RasterSecondaryColor[0]
259         = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][0], 0.0F, 1.0F);
260      ctx->Current.RasterSecondaryColor[1]
261         = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][1], 0.0F, 1.0F);
262      ctx->Current.RasterSecondaryColor[2]
263         = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][2], 0.0F, 1.0F);
264      ctx->Current.RasterSecondaryColor[3]
265         = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][3], 0.0F, 1.0F);
266   }
267   else {
268      ctx->Current.RasterIndex
269         = ctx->Current.Attrib[VERT_ATTRIB_COLOR_INDEX][0];
270   }
271
272   /* raster texcoord = current texcoord */
273   {
274      GLuint texSet;
275      for (texSet = 0; texSet < ctx->Const.MaxTextureCoordUnits; texSet++) {
276         COPY_4FV( ctx->Current.RasterTexCoords[texSet],
277                  ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texSet] );
278      }
279   }
280
281   if (ctx->RenderMode==GL_SELECT) {
282      _mesa_update_hitflag( ctx, ctx->Current.RasterPos[2] );
283   }
284}
285
286
287/* This is just to support the GL_MESA_window_pos version */
288static void
289window_pos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
290{
291   GET_CURRENT_CONTEXT(ctx);
292   window_pos3f(x, y, z);
293   ctx->Current.RasterPos[3] = w;
294}
295
296
297static void GLAPIENTRY
298_mesa_WindowPos2dMESA(GLdouble x, GLdouble y)
299{
300   window_pos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
301}
302
303static void GLAPIENTRY
304_mesa_WindowPos2fMESA(GLfloat x, GLfloat y)
305{
306   window_pos4f(x, y, 0.0F, 1.0F);
307}
308
309static void GLAPIENTRY
310_mesa_WindowPos2iMESA(GLint x, GLint y)
311{
312   window_pos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
313}
314
315static void GLAPIENTRY
316_mesa_WindowPos2sMESA(GLshort x, GLshort y)
317{
318   window_pos4f(x, y, 0.0F, 1.0F);
319}
320
321static void GLAPIENTRY
322_mesa_WindowPos3dMESA(GLdouble x, GLdouble y, GLdouble z)
323{
324   window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
325}
326
327static void GLAPIENTRY
328_mesa_WindowPos3fMESA(GLfloat x, GLfloat y, GLfloat z)
329{
330   window_pos4f(x, y, z, 1.0F);
331}
332
333static void GLAPIENTRY
334_mesa_WindowPos3iMESA(GLint x, GLint y, GLint z)
335{
336   window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
337}
338
339static void GLAPIENTRY
340_mesa_WindowPos3sMESA(GLshort x, GLshort y, GLshort z)
341{
342   window_pos4f(x, y, z, 1.0F);
343}
344
345static void GLAPIENTRY
346_mesa_WindowPos4dMESA(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
347{
348   window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
349}
350
351static void GLAPIENTRY
352_mesa_WindowPos4fMESA(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
353{
354   window_pos4f(x, y, z, w);
355}
356
357static void GLAPIENTRY
358_mesa_WindowPos4iMESA(GLint x, GLint y, GLint z, GLint w)
359{
360   window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
361}
362
363static void GLAPIENTRY
364_mesa_WindowPos4sMESA(GLshort x, GLshort y, GLshort z, GLshort w)
365{
366   window_pos4f(x, y, z, w);
367}
368
369static void GLAPIENTRY
370_mesa_WindowPos2dvMESA(const GLdouble *v)
371{
372   window_pos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
373}
374
375static void GLAPIENTRY
376_mesa_WindowPos2fvMESA(const GLfloat *v)
377{
378   window_pos4f(v[0], v[1], 0.0F, 1.0F);
379}
380
381static void GLAPIENTRY
382_mesa_WindowPos2ivMESA(const GLint *v)
383{
384   window_pos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
385}
386
387static void GLAPIENTRY
388_mesa_WindowPos2svMESA(const GLshort *v)
389{
390   window_pos4f(v[0], v[1], 0.0F, 1.0F);
391}
392
393static void GLAPIENTRY
394_mesa_WindowPos3dvMESA(const GLdouble *v)
395{
396   window_pos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
397}
398
399static void GLAPIENTRY
400_mesa_WindowPos3fvMESA(const GLfloat *v)
401{
402   window_pos4f(v[0], v[1], v[2], 1.0);
403}
404
405static void GLAPIENTRY
406_mesa_WindowPos3ivMESA(const GLint *v)
407{
408   window_pos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
409}
410
411static void GLAPIENTRY
412_mesa_WindowPos3svMESA(const GLshort *v)
413{
414   window_pos4f(v[0], v[1], v[2], 1.0F);
415}
416
417static void GLAPIENTRY
418_mesa_WindowPos4dvMESA(const GLdouble *v)
419{
420   window_pos4f((GLfloat) v[0], (GLfloat) v[1],
421			 (GLfloat) v[2], (GLfloat) v[3]);
422}
423
424static void GLAPIENTRY
425_mesa_WindowPos4fvMESA(const GLfloat *v)
426{
427   window_pos4f(v[0], v[1], v[2], v[3]);
428}
429
430static void GLAPIENTRY
431_mesa_WindowPos4ivMESA(const GLint *v)
432{
433   window_pos4f((GLfloat) v[0], (GLfloat) v[1],
434			 (GLfloat) v[2], (GLfloat) v[3]);
435}
436
437static void GLAPIENTRY
438_mesa_WindowPos4svMESA(const GLshort *v)
439{
440   window_pos4f(v[0], v[1], v[2], v[3]);
441}
442
443
444#if 0
445
446/*
447 * OpenGL implementation of glWindowPos*MESA()
448 */
449void glWindowPos4fMESA( GLfloat x, GLfloat y, GLfloat z, GLfloat w )
450{
451   GLfloat fx, fy;
452
453   /* Push current matrix mode and viewport attributes */
454   glPushAttrib( GL_TRANSFORM_BIT | GL_VIEWPORT_BIT );
455
456   /* Setup projection parameters */
457   glMatrixMode( GL_PROJECTION );
458   glPushMatrix();
459   glLoadIdentity();
460   glMatrixMode( GL_MODELVIEW );
461   glPushMatrix();
462   glLoadIdentity();
463
464   glDepthRange( z, z );
465   glViewport( (int) x - 1, (int) y - 1, 2, 2 );
466
467   /* set the raster (window) position */
468   fx = x - (int) x;
469   fy = y - (int) y;
470   glRasterPos4f( fx, fy, 0.0, w );
471
472   /* restore matrices, viewport and matrix mode */
473   glPopMatrix();
474   glMatrixMode( GL_PROJECTION );
475   glPopMatrix();
476
477   glPopAttrib();
478}
479
480#endif
481
482
483void
484_mesa_init_rastpos_dispatch(struct _glapi_table *disp)
485{
486   SET_RasterPos2f(disp, _mesa_RasterPos2f);
487   SET_RasterPos2fv(disp, _mesa_RasterPos2fv);
488   SET_RasterPos2i(disp, _mesa_RasterPos2i);
489   SET_RasterPos2iv(disp, _mesa_RasterPos2iv);
490   SET_RasterPos2d(disp, _mesa_RasterPos2d);
491   SET_RasterPos2dv(disp, _mesa_RasterPos2dv);
492   SET_RasterPos2s(disp, _mesa_RasterPos2s);
493   SET_RasterPos2sv(disp, _mesa_RasterPos2sv);
494   SET_RasterPos3d(disp, _mesa_RasterPos3d);
495   SET_RasterPos3dv(disp, _mesa_RasterPos3dv);
496   SET_RasterPos3f(disp, _mesa_RasterPos3f);
497   SET_RasterPos3fv(disp, _mesa_RasterPos3fv);
498   SET_RasterPos3i(disp, _mesa_RasterPos3i);
499   SET_RasterPos3iv(disp, _mesa_RasterPos3iv);
500   SET_RasterPos3s(disp, _mesa_RasterPos3s);
501   SET_RasterPos3sv(disp, _mesa_RasterPos3sv);
502   SET_RasterPos4d(disp, _mesa_RasterPos4d);
503   SET_RasterPos4dv(disp, _mesa_RasterPos4dv);
504   SET_RasterPos4f(disp, _mesa_RasterPos4f);
505   SET_RasterPos4fv(disp, _mesa_RasterPos4fv);
506   SET_RasterPos4i(disp, _mesa_RasterPos4i);
507   SET_RasterPos4iv(disp, _mesa_RasterPos4iv);
508   SET_RasterPos4s(disp, _mesa_RasterPos4s);
509   SET_RasterPos4sv(disp, _mesa_RasterPos4sv);
510
511   /* 197. GL_MESA_window_pos */
512   SET_WindowPos2dMESA(disp, _mesa_WindowPos2dMESA);
513   SET_WindowPos2dvMESA(disp, _mesa_WindowPos2dvMESA);
514   SET_WindowPos2fMESA(disp, _mesa_WindowPos2fMESA);
515   SET_WindowPos2fvMESA(disp, _mesa_WindowPos2fvMESA);
516   SET_WindowPos2iMESA(disp, _mesa_WindowPos2iMESA);
517   SET_WindowPos2ivMESA(disp, _mesa_WindowPos2ivMESA);
518   SET_WindowPos2sMESA(disp, _mesa_WindowPos2sMESA);
519   SET_WindowPos2svMESA(disp, _mesa_WindowPos2svMESA);
520   SET_WindowPos3dMESA(disp, _mesa_WindowPos3dMESA);
521   SET_WindowPos3dvMESA(disp, _mesa_WindowPos3dvMESA);
522   SET_WindowPos3fMESA(disp, _mesa_WindowPos3fMESA);
523   SET_WindowPos3fvMESA(disp, _mesa_WindowPos3fvMESA);
524   SET_WindowPos3iMESA(disp, _mesa_WindowPos3iMESA);
525   SET_WindowPos3ivMESA(disp, _mesa_WindowPos3ivMESA);
526   SET_WindowPos3sMESA(disp, _mesa_WindowPos3sMESA);
527   SET_WindowPos3svMESA(disp, _mesa_WindowPos3svMESA);
528   SET_WindowPos4dMESA(disp, _mesa_WindowPos4dMESA);
529   SET_WindowPos4dvMESA(disp, _mesa_WindowPos4dvMESA);
530   SET_WindowPos4fMESA(disp, _mesa_WindowPos4fMESA);
531   SET_WindowPos4fvMESA(disp, _mesa_WindowPos4fvMESA);
532   SET_WindowPos4iMESA(disp, _mesa_WindowPos4iMESA);
533   SET_WindowPos4ivMESA(disp, _mesa_WindowPos4ivMESA);
534   SET_WindowPos4sMESA(disp, _mesa_WindowPos4sMESA);
535   SET_WindowPos4svMESA(disp, _mesa_WindowPos4svMESA);
536}
537
538
539#endif /* FEATURE_rastpos */
540
541
542/**********************************************************************/
543/** \name Initialization                                              */
544/**********************************************************************/
545/*@{*/
546
547/**
548 * Initialize the context current raster position information.
549 *
550 * \param ctx GL context.
551 *
552 * Initialize the current raster position information in
553 * __GLcontextRec::Current, and adds the extension entry points to the
554 * dispatcher.
555 */
556void _mesa_init_rastpos( GLcontext * ctx )
557{
558   int i;
559
560   ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 );
561   ctx->Current.RasterDistance = 0.0;
562   ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
563   ASSIGN_4V( ctx->Current.RasterSecondaryColor, 0.0, 0.0, 0.0, 1.0 );
564   ctx->Current.RasterIndex = 1.0;
565   for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
566      ASSIGN_4V( ctx->Current.RasterTexCoords[i], 0.0, 0.0, 0.0, 1.0 );
567   ctx->Current.RasterPosValid = GL_TRUE;
568}
569
570/*@}*/
571