1 /* $Id: rastpos.c,v 1.33 2001/12/14 02:50:02 brianp Exp $ */
4 * Mesa 3-D graphics library
7 * Copyright (C) 1999-2001 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.
41 #include "simple_list.h"
44 #include "math/m_matrix.h"
45 #include "math/m_xform.h"
50 * Clip a point against the view volume.
51 * Input: v - vertex-vector describing the point to clip
52 * Return: 0 = outside view volume
53 * 1 = inside view volume
56 viewclip_point( const GLfloat v
[] )
58 if ( v
[0] > v
[3] || v
[0] < -v
[3]
59 || v
[1] > v
[3] || v
[1] < -v
[3]
60 || v
[2] > v
[3] || v
[2] < -v
[3] ) {
69 /* As above, but only clip test against far/near Z planes */
71 viewclip_point_z( const GLfloat v
[] )
73 if (v
[2] > v
[3] || v
[2] < -v
[3] ) {
84 * Clip a point against the user clipping planes.
85 * Input: v - vertex-vector describing the point to clip.
86 * Return: 0 = point was clipped
87 * 1 = point not clipped
90 userclip_point( GLcontext
* ctx
, const GLfloat v
[] )
94 for (p
= 0; p
< ctx
->Const
.MaxClipPlanes
; p
++) {
95 if (ctx
->Transform
.ClipEnabled
[p
]) {
96 GLfloat dot
= v
[0] * ctx
->Transform
._ClipUserPlane
[p
][0]
97 + v
[1] * ctx
->Transform
._ClipUserPlane
[p
][1]
98 + v
[2] * ctx
->Transform
._ClipUserPlane
[p
][2]
99 + v
[3] * ctx
->Transform
._ClipUserPlane
[p
][3];
110 /* This has been split off to allow the normal shade routines to
111 * get a little closer to the vertex buffer, and to use the
112 * GLvector objects directly.
113 * Input: ctx - the context
114 * vertex - vertex location
115 * normal - normal vector
116 * Output: Rcolor - returned color
117 * Rspec - returned specular color (if separate specular enabled)
118 * Rindex - returned color index
121 shade_rastpos(GLcontext
*ctx
,
122 const GLfloat vertex
[4],
123 const GLfloat normal
[3],
128 GLfloat (*base
)[3] = ctx
->Light
._BaseColor
;
129 struct gl_light
*light
;
130 GLfloat diffuseColor
[4], specularColor
[4];
131 GLfloat diffuse
= 0, specular
= 0;
133 if (!ctx
->_ShineTable
[0] || !ctx
->_ShineTable
[1])
134 _mesa_validate_all_lighting_tables( ctx
);
136 COPY_3V(diffuseColor
, base
[0]);
137 diffuseColor
[3] = CLAMP( ctx
->Light
.Material
[0].Diffuse
[3], 0.0F
, 1.0F
);
138 ASSIGN_4V(specularColor
, 0.0, 0.0, 0.0, 0.0);
140 foreach (light
, &ctx
->Light
.EnabledList
) {
142 GLfloat attenuation
= 1.0;
146 GLfloat diffuseContrib
[3], specularContrib
[3];
147 GLboolean normalized
;
149 if (!(light
->_Flags
& LIGHT_POSITIONAL
)) {
150 COPY_3V(VP
, light
->_VP_inf_norm
);
151 attenuation
= light
->_VP_inf_spot_attenuation
;
156 SUB_3V(VP
, light
->_Position
, vertex
);
157 d
= (GLfloat
) LEN_3FV( VP
);
160 GLfloat invd
= 1.0F
/ d
;
161 SELF_SCALE_SCALAR_3V(VP
, invd
);
163 attenuation
= 1.0F
/ (light
->ConstantAttenuation
+ d
*
164 (light
->LinearAttenuation
+ d
*
165 light
->QuadraticAttenuation
));
167 if (light
->_Flags
& LIGHT_SPOT
) {
168 GLfloat PV_dot_dir
= - DOT3(VP
, light
->_NormDirection
);
170 if (PV_dot_dir
<light
->_CosCutoff
) {
174 double x
= PV_dot_dir
* (EXP_TABLE_SIZE
-1);
176 GLfloat spot
= (GLfloat
) (light
->_SpotExpTable
[k
][0]
177 + (x
-k
)*light
->_SpotExpTable
[k
][1]);
183 if (attenuation
< 1e-3)
186 n_dot_VP
= DOT3( normal
, VP
);
188 if (n_dot_VP
< 0.0F
) {
189 ACC_SCALE_SCALAR_3V(diffuseColor
, attenuation
, light
->_MatAmbient
[0]);
193 COPY_3V(diffuseContrib
, light
->_MatAmbient
[0]);
194 ACC_SCALE_SCALAR_3V(diffuseContrib
, n_dot_VP
, light
->_MatDiffuse
[0]);
195 diffuse
+= n_dot_VP
* light
->_dli
* attenuation
;
196 ASSIGN_3V(specularContrib
, 0.0, 0.0, 0.0);
199 if (ctx
->Light
.Model
.LocalViewer
) {
207 else if (light
->_Flags
& LIGHT_POSITIONAL
) {
209 ACC_3V(h
, ctx
->_EyeZDir
);
213 h
= light
->_h_inf_norm
;
217 n_dot_h
= DOT3(normal
, h
);
219 if (n_dot_h
> 0.0F
) {
220 const struct gl_material
*mat
= &ctx
->Light
.Material
[0];
222 GLfloat shininess
= mat
->Shininess
;
226 n_dot_h
/= LEN_SQUARED_3FV( h
);
230 GET_SHINE_TAB_ENTRY( ctx
->_ShineTable
[0], n_dot_h
, spec_coef
);
232 if (spec_coef
> 1.0e-10) {
233 if (ctx
->Light
.Model
.ColorControl
==GL_SEPARATE_SPECULAR_COLOR
) {
234 ACC_SCALE_SCALAR_3V( specularContrib
, spec_coef
,
235 light
->_MatSpecular
[0]);
238 ACC_SCALE_SCALAR_3V( diffuseContrib
, spec_coef
,
239 light
->_MatSpecular
[0]);
241 specular
+= spec_coef
* light
->_sli
* attenuation
;
246 ACC_SCALE_SCALAR_3V( diffuseColor
, attenuation
, diffuseContrib
);
247 ACC_SCALE_SCALAR_3V( specularColor
, attenuation
, specularContrib
);
250 if (ctx
->Visual
.rgbMode
) {
251 Rcolor
[0] = CLAMP(diffuseColor
[0], 0.0F
, 1.0F
);
252 Rcolor
[1] = CLAMP(diffuseColor
[1], 0.0F
, 1.0F
);
253 Rcolor
[2] = CLAMP(diffuseColor
[2], 0.0F
, 1.0F
);
254 Rcolor
[3] = CLAMP(diffuseColor
[3], 0.0F
, 1.0F
);
255 Rspec
[0] = CLAMP(specularColor
[0], 0.0F
, 1.0F
);
256 Rspec
[1] = CLAMP(specularColor
[1], 0.0F
, 1.0F
);
257 Rspec
[2] = CLAMP(specularColor
[2], 0.0F
, 1.0F
);
258 Rspec
[3] = CLAMP(specularColor
[3], 0.0F
, 1.0F
);
261 struct gl_material
*mat
= &ctx
->Light
.Material
[0];
262 GLfloat d_a
= mat
->DiffuseIndex
- mat
->AmbientIndex
;
263 GLfloat s_a
= mat
->SpecularIndex
- mat
->AmbientIndex
;
264 GLfloat ind
= mat
->AmbientIndex
265 + diffuse
* (1.0F
-specular
) * d_a
267 if (ind
> mat
->SpecularIndex
) {
268 ind
= mat
->SpecularIndex
;
270 *Rindex
= (GLuint
) (GLint
) ind
;
276 * Caller: context->API.RasterPos4f
279 raster_pos4f(GLcontext
*ctx
, GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
281 GLfloat v
[4], eye
[4], clip
[4], ndc
[3], d
;
282 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
283 FLUSH_CURRENT(ctx
, 0);
286 _mesa_update_state( ctx
);
288 ASSIGN_4V( v
, x
, y
, z
, w
);
289 TRANSFORM_POINT( eye
, ctx
->ModelView
.m
, v
);
292 if (ctx
->Light
.Enabled
) {
293 GLfloat
*norm
, eyenorm
[3];
294 GLfloat
*objnorm
= ctx
->Current
.Attrib
[VERT_ATTRIB_NORMAL
];
296 if (ctx
->_NeedEyeCoords
) {
297 GLfloat
*inv
= ctx
->ModelView
.inv
;
298 TRANSFORM_NORMAL( eyenorm
, objnorm
, inv
);
305 shade_rastpos( ctx
, v
, norm
,
306 ctx
->Current
.RasterColor
,
307 ctx
->Current
.RasterSecondaryColor
,
308 &ctx
->Current
.RasterIndex
);
312 /* use current color or index */
313 if (ctx
->Visual
.rgbMode
) {
314 COPY_4FV(ctx
->Current
.RasterColor
,
315 ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
]);
316 COPY_4FV(ctx
->Current
.RasterSecondaryColor
,
317 ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR1
]);
320 ctx
->Current
.RasterIndex
= ctx
->Current
.Index
;
324 /* compute raster distance */
325 ctx
->Current
.RasterDistance
= (GLfloat
)
326 GL_SQRT( eye
[0]*eye
[0] + eye
[1]*eye
[1] + eye
[2]*eye
[2] );
328 /* apply projection matrix: clip = Proj * eye */
329 TRANSFORM_POINT( clip
, ctx
->ProjectionMatrix
.m
, eye
);
331 /* clip to view volume */
332 if (ctx
->Transform
.RasterPositionUnclipped
) {
333 /* GL_IBM_rasterpos_clip: only clip against Z */
334 if (viewclip_point_z(clip
) == 0)
335 ctx
->Current
.RasterPosValid
= GL_FALSE
;
337 else if (viewclip_point(clip
) == 0) {
338 /* Normal OpenGL behaviour */
339 ctx
->Current
.RasterPosValid
= GL_FALSE
;
343 /* clip to user clipping planes */
344 if (ctx
->Transform
._AnyClip
&&
345 userclip_point(ctx
, clip
) == 0) {
346 ctx
->Current
.RasterPosValid
= GL_FALSE
;
351 ASSERT( clip
[3]!=0.0 );
353 ndc
[0] = clip
[0] * d
;
354 ndc
[1] = clip
[1] * d
;
355 ndc
[2] = clip
[2] * d
;
357 ctx
->Current
.RasterPos
[0] = (ndc
[0] * ctx
->Viewport
._WindowMap
.m
[MAT_SX
] +
358 ctx
->Viewport
._WindowMap
.m
[MAT_TX
]);
359 ctx
->Current
.RasterPos
[1] = (ndc
[1] * ctx
->Viewport
._WindowMap
.m
[MAT_SY
] +
360 ctx
->Viewport
._WindowMap
.m
[MAT_TY
]);
361 ctx
->Current
.RasterPos
[2] = (ndc
[2] * ctx
->Viewport
._WindowMap
.m
[MAT_SZ
] +
362 ctx
->Viewport
._WindowMap
.m
[MAT_TZ
]) / ctx
->DepthMaxF
;
363 ctx
->Current
.RasterPos
[3] = clip
[3];
364 ctx
->Current
.RasterPosValid
= GL_TRUE
;
366 ctx
->Current
.RasterFogCoord
= ctx
->Current
.Attrib
[VERT_ATTRIB_FOG
][0];
370 for (texSet
= 0; texSet
< ctx
->Const
.MaxTextureUnits
; texSet
++) {
371 COPY_4FV( ctx
->Current
.RasterMultiTexCoord
[texSet
],
372 ctx
->Current
.Attrib
[VERT_ATTRIB_TEX0
+ texSet
] );
376 if (ctx
->RenderMode
==GL_SELECT
) {
377 _mesa_update_hitflag( ctx
, ctx
->Current
.RasterPos
[2] );
385 _mesa_RasterPos2d(GLdouble x
, GLdouble y
)
387 _mesa_RasterPos4f((GLfloat
) x
, (GLfloat
) y
, 0.0F
, 1.0F
);
391 _mesa_RasterPos2f(GLfloat x
, GLfloat y
)
393 _mesa_RasterPos4f(x
, y
, 0.0F
, 1.0F
);
397 _mesa_RasterPos2i(GLint x
, GLint y
)
399 _mesa_RasterPos4f((GLfloat
) x
, (GLfloat
) y
, 0.0F
, 1.0F
);
403 _mesa_RasterPos2s(GLshort x
, GLshort y
)
405 _mesa_RasterPos4f(x
, y
, 0.0F
, 1.0F
);
409 _mesa_RasterPos3d(GLdouble x
, GLdouble y
, GLdouble z
)
411 _mesa_RasterPos4f((GLfloat
) x
, (GLfloat
) y
, (GLfloat
) z
, 1.0F
);
415 _mesa_RasterPos3f(GLfloat x
, GLfloat y
, GLfloat z
)
417 _mesa_RasterPos4f(x
, y
, z
, 1.0F
);
421 _mesa_RasterPos3i(GLint x
, GLint y
, GLint z
)
423 _mesa_RasterPos4f((GLfloat
) x
, (GLfloat
) y
, (GLfloat
) z
, 1.0F
);
427 _mesa_RasterPos3s(GLshort x
, GLshort y
, GLshort z
)
429 _mesa_RasterPos4f(x
, y
, z
, 1.0F
);
433 _mesa_RasterPos4d(GLdouble x
, GLdouble y
, GLdouble z
, GLdouble w
)
435 _mesa_RasterPos4f((GLfloat
) x
, (GLfloat
) y
, (GLfloat
) z
, (GLfloat
) w
);
439 _mesa_RasterPos4f(GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
441 GET_CURRENT_CONTEXT(ctx
);
442 raster_pos4f(ctx
, x
, y
, z
, w
);
446 _mesa_RasterPos4i(GLint x
, GLint y
, GLint z
, GLint w
)
448 _mesa_RasterPos4f((GLfloat
) x
, (GLfloat
) y
, (GLfloat
) z
, (GLfloat
) w
);
452 _mesa_RasterPos4s(GLshort x
, GLshort y
, GLshort z
, GLshort w
)
454 _mesa_RasterPos4f(x
, y
, z
, w
);
458 _mesa_RasterPos2dv(const GLdouble
*v
)
460 _mesa_RasterPos4f((GLfloat
) v
[0], (GLfloat
) v
[1], 0.0F
, 1.0F
);
464 _mesa_RasterPos2fv(const GLfloat
*v
)
466 _mesa_RasterPos4f(v
[0], v
[1], 0.0F
, 1.0F
);
470 _mesa_RasterPos2iv(const GLint
*v
)
472 _mesa_RasterPos4f((GLfloat
) v
[0], (GLfloat
) v
[1], 0.0F
, 1.0F
);
476 _mesa_RasterPos2sv(const GLshort
*v
)
478 _mesa_RasterPos4f(v
[0], v
[1], 0.0F
, 1.0F
);
482 _mesa_RasterPos3dv(const GLdouble
*v
)
484 _mesa_RasterPos4f((GLfloat
) v
[0], (GLfloat
) v
[1], (GLfloat
) v
[2], 1.0F
);
488 _mesa_RasterPos3fv(const GLfloat
*v
)
490 _mesa_RasterPos4f(v
[0], v
[1], v
[2], 1.0F
);
494 _mesa_RasterPos3iv(const GLint
*v
)
496 _mesa_RasterPos4f((GLfloat
) v
[0], (GLfloat
) v
[1], (GLfloat
) v
[2], 1.0F
);
500 _mesa_RasterPos3sv(const GLshort
*v
)
502 _mesa_RasterPos4f(v
[0], v
[1], v
[2], 1.0F
);
506 _mesa_RasterPos4dv(const GLdouble
*v
)
508 _mesa_RasterPos4f((GLfloat
) v
[0], (GLfloat
) v
[1],
509 (GLfloat
) v
[2], (GLfloat
) v
[3]);
513 _mesa_RasterPos4fv(const GLfloat
*v
)
515 _mesa_RasterPos4f(v
[0], v
[1], v
[2], v
[3]);
519 _mesa_RasterPos4iv(const GLint
*v
)
521 _mesa_RasterPos4f((GLfloat
) v
[0], (GLfloat
) v
[1],
522 (GLfloat
) v
[2], (GLfloat
) v
[3]);
526 _mesa_RasterPos4sv(const GLshort
*v
)
528 _mesa_RasterPos4f(v
[0], v
[1], v
[2], v
[3]);
533 /**********************************************************************/
534 /*** GL_MESA_window_pos ***/
535 /**********************************************************************/
539 * This is a MESA extension function. Pretty much just like glRasterPos
540 * except we don't apply the modelview or projection matrices; specify a
541 * window coordinate directly.
542 * Caller: context->API.WindowPos4fMESA pointer.
545 _mesa_WindowPos4fMESA( GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
547 GET_CURRENT_CONTEXT(ctx
);
548 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
549 FLUSH_CURRENT(ctx
, 0);
551 /* set raster position */
552 ctx
->Current
.RasterPos
[0] = x
;
553 ctx
->Current
.RasterPos
[1] = y
;
554 ctx
->Current
.RasterPos
[2] = CLAMP( z
, 0.0F
, 1.0F
);
555 ctx
->Current
.RasterPos
[3] = w
;
557 ctx
->Current
.RasterPosValid
= GL_TRUE
;
558 ctx
->Current
.RasterDistance
= 0.0F
;
559 ctx
->Current
.RasterFogCoord
= 0.0F
;
561 /* raster color = current color or index */
562 if (ctx
->Visual
.rgbMode
) {
563 COPY_4FV(ctx
->Current
.RasterColor
,
564 ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
]);
567 ctx
->Current
.RasterIndex
= ctx
->Current
.Index
;
570 /* raster texcoord = current texcoord */
573 for (texSet
= 0; texSet
< ctx
->Const
.MaxTextureUnits
; texSet
++) {
574 COPY_4FV( ctx
->Current
.RasterMultiTexCoord
[texSet
],
575 ctx
->Current
.Attrib
[VERT_ATTRIB_TEX0
+ texSet
] );
579 if (ctx
->RenderMode
==GL_SELECT
) {
580 _mesa_update_hitflag( ctx
, ctx
->Current
.RasterPos
[2] );
588 _mesa_WindowPos2dMESA(GLdouble x
, GLdouble y
)
590 _mesa_WindowPos4fMESA((GLfloat
) x
, (GLfloat
) y
, 0.0F
, 1.0F
);
594 _mesa_WindowPos2fMESA(GLfloat x
, GLfloat y
)
596 _mesa_WindowPos4fMESA(x
, y
, 0.0F
, 1.0F
);
600 _mesa_WindowPos2iMESA(GLint x
, GLint y
)
602 _mesa_WindowPos4fMESA((GLfloat
) x
, (GLfloat
) y
, 0.0F
, 1.0F
);
606 _mesa_WindowPos2sMESA(GLshort x
, GLshort y
)
608 _mesa_WindowPos4fMESA(x
, y
, 0.0F
, 1.0F
);
612 _mesa_WindowPos3dMESA(GLdouble x
, GLdouble y
, GLdouble z
)
614 _mesa_WindowPos4fMESA((GLfloat
) x
, (GLfloat
) y
, (GLfloat
) z
, 1.0F
);
618 _mesa_WindowPos3fMESA(GLfloat x
, GLfloat y
, GLfloat z
)
620 _mesa_WindowPos4fMESA(x
, y
, z
, 1.0F
);
624 _mesa_WindowPos3iMESA(GLint x
, GLint y
, GLint z
)
626 _mesa_WindowPos4fMESA((GLfloat
) x
, (GLfloat
) y
, (GLfloat
) z
, 1.0F
);
630 _mesa_WindowPos3sMESA(GLshort x
, GLshort y
, GLshort z
)
632 _mesa_WindowPos4fMESA(x
, y
, z
, 1.0F
);
636 _mesa_WindowPos4dMESA(GLdouble x
, GLdouble y
, GLdouble z
, GLdouble w
)
638 _mesa_WindowPos4fMESA((GLfloat
) x
, (GLfloat
) y
, (GLfloat
) z
, (GLfloat
) w
);
642 _mesa_WindowPos4iMESA(GLint x
, GLint y
, GLint z
, GLint w
)
644 _mesa_WindowPos4fMESA((GLfloat
) x
, (GLfloat
) y
, (GLfloat
) z
, (GLfloat
) w
);
648 _mesa_WindowPos4sMESA(GLshort x
, GLshort y
, GLshort z
, GLshort w
)
650 _mesa_WindowPos4fMESA(x
, y
, z
, w
);
654 _mesa_WindowPos2dvMESA(const GLdouble
*v
)
656 _mesa_WindowPos4fMESA((GLfloat
) v
[0], (GLfloat
) v
[1], 0.0F
, 1.0F
);
660 _mesa_WindowPos2fvMESA(const GLfloat
*v
)
662 _mesa_WindowPos4fMESA(v
[0], v
[1], 0.0F
, 1.0F
);
666 _mesa_WindowPos2ivMESA(const GLint
*v
)
668 _mesa_WindowPos4fMESA((GLfloat
) v
[0], (GLfloat
) v
[1], 0.0F
, 1.0F
);
672 _mesa_WindowPos2svMESA(const GLshort
*v
)
674 _mesa_WindowPos4fMESA(v
[0], v
[1], 0.0F
, 1.0F
);
678 _mesa_WindowPos3dvMESA(const GLdouble
*v
)
680 _mesa_WindowPos4fMESA((GLfloat
) v
[0], (GLfloat
) v
[1], (GLfloat
) v
[2], 1.0F
);
684 _mesa_WindowPos3fvMESA(const GLfloat
*v
)
686 _mesa_WindowPos4fMESA(v
[0], v
[1], v
[2], 1.0F
);
690 _mesa_WindowPos3ivMESA(const GLint
*v
)
692 _mesa_WindowPos4fMESA((GLfloat
) v
[0], (GLfloat
) v
[1], (GLfloat
) v
[2], 1.0F
);
696 _mesa_WindowPos3svMESA(const GLshort
*v
)
698 _mesa_WindowPos4fMESA(v
[0], v
[1], v
[2], 1.0F
);
702 _mesa_WindowPos4dvMESA(const GLdouble
*v
)
704 _mesa_WindowPos4fMESA((GLfloat
) v
[0], (GLfloat
) v
[1],
705 (GLfloat
) v
[2], (GLfloat
) v
[3]);
709 _mesa_WindowPos4fvMESA(const GLfloat
*v
)
711 _mesa_WindowPos4fMESA(v
[0], v
[1], v
[2], v
[3]);
715 _mesa_WindowPos4ivMESA(const GLint
*v
)
717 _mesa_WindowPos4fMESA((GLfloat
) v
[0], (GLfloat
) v
[1],
718 (GLfloat
) v
[2], (GLfloat
) v
[3]);
722 _mesa_WindowPos4svMESA(const GLshort
*v
)
724 _mesa_WindowPos4fMESA(v
[0], v
[1], v
[2], v
[3]);
732 * OpenGL implementation of glWindowPos*MESA()
734 void glWindowPos4fMESA( GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
738 /* Push current matrix mode and viewport attributes */
739 glPushAttrib( GL_TRANSFORM_BIT
| GL_VIEWPORT_BIT
);
741 /* Setup projection parameters */
742 glMatrixMode( GL_PROJECTION
);
745 glMatrixMode( GL_MODELVIEW
);
749 glDepthRange( z
, z
);
750 glViewport( (int) x
- 1, (int) y
- 1, 2, 2 );
752 /* set the raster (window) position */
755 glRasterPos4f( fx
, fy
, 0.0, w
);
757 /* restore matrices, viewport and matrix mode */
759 glMatrixMode( GL_PROJECTION
);
768 /**********************************************************************/
769 /*** GL_ARB_window_pos ***/
770 /**********************************************************************/
772 void _mesa_WindowPos2dARB(GLdouble x
, GLdouble y
)
774 _mesa_WindowPos3fARB((GLfloat
) x
, (GLfloat
) y
, 0.0F
);
777 void _mesa_WindowPos2fARB(GLfloat x
, GLfloat y
)
779 _mesa_WindowPos3fARB(x
, y
, 0.0F
);
782 void _mesa_WindowPos2iARB(GLint x
, GLint y
)
784 _mesa_WindowPos3fARB((GLfloat
) x
, (GLfloat
) y
, 0.0F
);
787 void _mesa_WindowPos2sARB(GLshort x
, GLshort y
)
789 _mesa_WindowPos3fARB((GLfloat
) x
, (GLfloat
) y
, 0.0F
);
792 void _mesa_WindowPos2dvARB(const GLdouble
*p
)
794 _mesa_WindowPos3fARB((GLfloat
) p
[0], (GLfloat
) p
[1], 0.0F
);
797 void _mesa_WindowPos2fvARB(const GLfloat
*p
)
799 _mesa_WindowPos3fARB((GLfloat
) p
[0], (GLfloat
) p
[1], 0.0F
);
802 void _mesa_WindowPos2ivARB(const GLint
*p
)
804 _mesa_WindowPos3fARB((GLfloat
) p
[0], (GLfloat
) p
[1], 0.0F
);
807 void _mesa_WindowPos2svARB(const GLshort
*p
)
809 _mesa_WindowPos3fARB((GLfloat
) p
[0], (GLfloat
) p
[1], 0.0F
);
812 void _mesa_WindowPos3dARB(GLdouble x
, GLdouble y
, GLdouble z
)
814 _mesa_WindowPos3fARB((GLfloat
) x
, (GLfloat
) y
, (GLfloat
) z
);
817 void _mesa_WindowPos3fARB(GLfloat x
, GLfloat y
, GLfloat z
)
819 GET_CURRENT_CONTEXT(ctx
);
822 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
);
823 FLUSH_CURRENT(ctx
, 0);
825 z2
= CLAMP(z
, 0.0F
, 1.0F
) * (ctx
->Viewport
.Far
- ctx
->Viewport
.Near
)
826 + ctx
->Viewport
.Near
;
828 /* set raster position */
829 ctx
->Current
.RasterPos
[0] = x
;
830 ctx
->Current
.RasterPos
[1] = y
;
831 ctx
->Current
.RasterPos
[2] = z2
;
832 ctx
->Current
.RasterPos
[3] = 0.0F
;
834 ctx
->Current
.RasterPosValid
= GL_TRUE
;
835 /* XXX might have to change this */
836 ctx
->Current
.RasterDistance
= ctx
->Current
.Attrib
[VERT_ATTRIB_FOG
][0];
837 ctx
->Current
.RasterFogCoord
= ctx
->Current
.Attrib
[VERT_ATTRIB_FOG
][0];
839 /* raster color = current color or index */
840 if (ctx
->Visual
.rgbMode
) {
841 ctx
->Current
.RasterColor
[0]
842 = CLAMP(ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][0], 0.0F
, 1.0F
);
843 ctx
->Current
.RasterColor
[1]
844 = CLAMP(ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][1], 0.0F
, 1.0F
);
845 ctx
->Current
.RasterColor
[2]
846 = CLAMP(ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][2], 0.0F
, 1.0F
);
847 ctx
->Current
.RasterColor
[3]
848 = CLAMP(ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][3], 0.0F
, 1.0F
);
849 ctx
->Current
.RasterSecondaryColor
[0]
850 = CLAMP(ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR1
][0], 0.0F
, 1.0F
);
851 ctx
->Current
.RasterSecondaryColor
[1]
852 = CLAMP(ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR1
][1], 0.0F
, 1.0F
);
853 ctx
->Current
.RasterSecondaryColor
[2]
854 = CLAMP(ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR1
][2], 0.0F
, 1.0F
);
855 ctx
->Current
.RasterSecondaryColor
[3]
856 = CLAMP(ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR1
][3], 0.0F
, 1.0F
);
859 ctx
->Current
.RasterIndex
= ctx
->Current
.Index
;
862 /* raster texcoord = current texcoord */
865 for (texSet
= 0; texSet
< ctx
->Const
.MaxTextureUnits
; texSet
++) {
866 COPY_4FV( ctx
->Current
.RasterMultiTexCoord
[texSet
],
867 ctx
->Current
.Attrib
[VERT_ATTRIB_TEX0
+ texSet
] );
871 if (ctx
->RenderMode
==GL_SELECT
) {
872 _mesa_update_hitflag( ctx
, ctx
->Current
.RasterPos
[2] );
876 void _mesa_WindowPos3iARB(GLint x
, GLint y
, GLint z
)
878 _mesa_WindowPos3fARB((GLfloat
) x
, (GLfloat
) y
, (GLfloat
) z
);
881 void _mesa_WindowPos3sARB(GLshort x
, GLshort y
, GLshort z
)
883 _mesa_WindowPos3fARB((GLfloat
) x
, (GLfloat
) y
, (GLfloat
) z
);
886 void _mesa_WindowPos3dvARB(const GLdouble
*p
)
888 _mesa_WindowPos3fARB((GLfloat
) p
[0], (GLfloat
) p
[1], (GLfloat
) p
[2]);
891 void _mesa_WindowPos3fvARB(const GLfloat
*p
)
893 _mesa_WindowPos3fARB(p
[0], p
[1], p
[2]);
896 void _mesa_WindowPos3ivARB(const GLint
*p
)
898 _mesa_WindowPos3fARB((GLfloat
) p
[0], (GLfloat
) p
[1], (GLfloat
) p
[2]);
901 void _mesa_WindowPos3svARB(const GLshort
*p
)
903 _mesa_WindowPos3fARB((GLfloat
) p
[0], (GLfloat
) p
[1], (GLfloat
) p
[2]);