1 /* $Id: rastpos.c,v 1.11 2000/10/29 19:02:23 brianp Exp $ */
4 * Mesa 3-D graphics library
7 * Copyright (C) 1999-2000 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.
49 * Caller: context->API.RasterPos4f
51 static void raster_pos4f( GLcontext
*ctx
,
52 GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
54 GLfloat v
[4], eye
[4], clip
[4], ndc
[3], d
;
56 /* KW: Added this test, which is in the spec. We can't do this
57 * outside begin/end any more because the ctx->Current values
58 * aren't uptodate during that period.
60 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH( ctx
, "glRasterPos" );
63 gl_update_state( ctx
);
65 ASSIGN_4V( v
, x
, y
, z
, w
);
66 TRANSFORM_POINT( eye
, ctx
->ModelView
.m
, v
);
69 if (ctx
->Light
.Enabled
)
72 GLfloat
*norm
, eyenorm
[3];
73 GLfloat
*objnorm
= ctx
->Current
.Normal
;
76 vert = (ctx->NeedEyeCoords ? eye : v);
79 if (ctx
->NeedEyeNormals
) {
80 GLfloat
*inv
= ctx
->ModelView
.inv
;
81 TRANSFORM_NORMAL( eyenorm
, objnorm
, inv
);
87 gl_shade_rastpos( ctx
, v
, norm
,
88 ctx
->Current
.RasterColor
,
89 &ctx
->Current
.RasterIndex
);
93 /* use current color or index */
94 if (ctx
->Visual
.RGBAflag
) {
95 ctx
->Current
.RasterColor
[0] = CHAN_TO_FLOAT(ctx
->Current
.Color
[0]);
96 ctx
->Current
.RasterColor
[1] = CHAN_TO_FLOAT(ctx
->Current
.Color
[1]);
97 ctx
->Current
.RasterColor
[2] = CHAN_TO_FLOAT(ctx
->Current
.Color
[2]);
98 ctx
->Current
.RasterColor
[3] = CHAN_TO_FLOAT(ctx
->Current
.Color
[3]);
101 ctx
->Current
.RasterIndex
= ctx
->Current
.Index
;
105 /* compute raster distance */
106 ctx
->Current
.RasterDistance
= (GLfloat
)
107 GL_SQRT( eye
[0]*eye
[0] + eye
[1]*eye
[1] + eye
[2]*eye
[2] );
109 /* apply projection matrix: clip = Proj * eye */
110 TRANSFORM_POINT( clip
, ctx
->ProjectionMatrix
.m
, eye
);
112 /* clip to view volume */
113 if (gl_viewclip_point( clip
)==0) {
114 ctx
->Current
.RasterPosValid
= GL_FALSE
;
118 /* clip to user clipping planes */
119 if ( ctx
->Transform
.AnyClip
&&
120 gl_userclip_point(ctx
, clip
) == 0)
122 ctx
->Current
.RasterPosValid
= GL_FALSE
;
127 ASSERT( clip
[3]!=0.0 );
129 ndc
[0] = clip
[0] * d
;
130 ndc
[1] = clip
[1] * d
;
131 ndc
[2] = clip
[2] * d
;
133 ctx
->Current
.RasterPos
[0] = (ndc
[0] * ctx
->Viewport
.WindowMap
.m
[MAT_SX
] +
134 ctx
->Viewport
.WindowMap
.m
[MAT_TX
]);
135 ctx
->Current
.RasterPos
[1] = (ndc
[1] * ctx
->Viewport
.WindowMap
.m
[MAT_SY
] +
136 ctx
->Viewport
.WindowMap
.m
[MAT_TY
]);
137 ctx
->Current
.RasterPos
[2] = (ndc
[2] * ctx
->Viewport
.WindowMap
.m
[MAT_SZ
] +
138 ctx
->Viewport
.WindowMap
.m
[MAT_TZ
]) / ctx
->Visual
.DepthMaxF
;
139 ctx
->Current
.RasterPos
[3] = clip
[3];
140 ctx
->Current
.RasterPosValid
= GL_TRUE
;
146 for (texSet
= 0; texSet
< ctx
->Const
.MaxTextureUnits
; texSet
++) {
147 COPY_4FV( ctx
->Current
.RasterMultiTexCoord
[texSet
],
148 ctx
->Current
.Texcoord
[texSet
] );
152 if (ctx
->RenderMode
==GL_SELECT
) {
153 gl_update_hitflag( ctx
, ctx
->Current
.RasterPos
[2] );
161 _mesa_RasterPos2d(GLdouble x
, GLdouble y
)
163 _mesa_RasterPos4f(x
, y
, 0.0F
, 1.0F
);
167 _mesa_RasterPos2f(GLfloat x
, GLfloat y
)
169 _mesa_RasterPos4f(x
, y
, 0.0F
, 1.0F
);
173 _mesa_RasterPos2i(GLint x
, GLint y
)
175 _mesa_RasterPos4f(x
, y
, 0.0F
, 1.0F
);
179 _mesa_RasterPos2s(GLshort x
, GLshort y
)
181 _mesa_RasterPos4f(x
, y
, 0.0F
, 1.0F
);
185 _mesa_RasterPos3d(GLdouble x
, GLdouble y
, GLdouble z
)
187 _mesa_RasterPos4f(x
, y
, z
, 1.0F
);
191 _mesa_RasterPos3f(GLfloat x
, GLfloat y
, GLfloat z
)
193 _mesa_RasterPos4f(x
, y
, z
, 1.0F
);
197 _mesa_RasterPos3i(GLint x
, GLint y
, GLint z
)
199 _mesa_RasterPos4f(x
, y
, z
, 1.0F
);
203 _mesa_RasterPos3s(GLshort x
, GLshort y
, GLshort z
)
205 _mesa_RasterPos4f(x
, y
, z
, 1.0F
);
209 _mesa_RasterPos4d(GLdouble x
, GLdouble y
, GLdouble z
, GLdouble w
)
211 _mesa_RasterPos4f(x
, y
, z
, w
);
215 _mesa_RasterPos4f(GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
217 GET_CURRENT_CONTEXT(ctx
);
218 raster_pos4f(ctx
, x
, y
, z
, w
);
222 _mesa_RasterPos4i(GLint x
, GLint y
, GLint z
, GLint w
)
224 _mesa_RasterPos4f(x
, y
, z
, w
);
228 _mesa_RasterPos4s(GLshort x
, GLshort y
, GLshort z
, GLshort w
)
230 _mesa_RasterPos4f(x
, y
, z
, w
);
234 _mesa_RasterPos2dv(const GLdouble
*v
)
236 _mesa_RasterPos4f(v
[0], v
[1], 0.0F
, 1.0F
);
240 _mesa_RasterPos2fv(const GLfloat
*v
)
242 _mesa_RasterPos4f(v
[0], v
[1], 0.0F
, 1.0F
);
246 _mesa_RasterPos2iv(const GLint
*v
)
248 _mesa_RasterPos4f(v
[0], v
[1], 0.0F
, 1.0F
);
252 _mesa_RasterPos2sv(const GLshort
*v
)
254 _mesa_RasterPos4f(v
[0], v
[1], 0.0F
, 1.0F
);
258 _mesa_RasterPos3dv(const GLdouble
*v
)
260 _mesa_RasterPos4f(v
[0], v
[1], v
[2], 1.0F
);
264 _mesa_RasterPos3fv(const GLfloat
*v
)
266 _mesa_RasterPos4f(v
[0], v
[1], v
[2], 1.0F
);
270 _mesa_RasterPos3iv(const GLint
*v
)
272 _mesa_RasterPos4f(v
[0], v
[1], v
[2], 1.0F
);
276 _mesa_RasterPos3sv(const GLshort
*v
)
278 _mesa_RasterPos4f(v
[0], v
[1], v
[2], 1.0F
);
282 _mesa_RasterPos4dv(const GLdouble
*v
)
284 _mesa_RasterPos4f(v
[0], v
[1], v
[2], v
[3]);
288 _mesa_RasterPos4fv(const GLfloat
*v
)
290 _mesa_RasterPos4f(v
[0], v
[1], v
[2], v
[3]);
294 _mesa_RasterPos4iv(const GLint
*v
)
296 _mesa_RasterPos4f(v
[0], v
[1], v
[2], v
[3]);
300 _mesa_RasterPos4sv(const GLshort
*v
)
302 _mesa_RasterPos4f(v
[0], v
[1], v
[2], v
[3]);