1848b8605Smrg/*
2848b8605Smrg * Mesa 3-D graphics library
3848b8605Smrg *
4848b8605Smrg * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
5848b8605Smrg *
6848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a
7848b8605Smrg * copy of this software and associated documentation files (the "Software"),
8848b8605Smrg * to deal in the Software without restriction, including without limitation
9848b8605Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10848b8605Smrg * and/or sell copies of the Software, and to permit persons to whom the
11848b8605Smrg * Software is furnished to do so, subject to the following conditions:
12848b8605Smrg *
13848b8605Smrg * The above copyright notice and this permission notice shall be included
14848b8605Smrg * in all copies or substantial portions of the Software.
15848b8605Smrg *
16848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17848b8605Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18848b8605Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19848b8605Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20848b8605Smrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21848b8605Smrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22848b8605Smrg * OTHER DEALINGS IN THE SOFTWARE.
23848b8605Smrg */
24848b8605Smrg
25848b8605Smrg
26848b8605Smrg/**
27848b8605Smrg * \file rastpos.c
28848b8605Smrg * Raster position operations.
29848b8605Smrg */
30848b8605Smrg
31848b8605Smrg#include "glheader.h"
32848b8605Smrg#include "context.h"
33848b8605Smrg#include "feedback.h"
34848b8605Smrg#include "macros.h"
35848b8605Smrg#include "mtypes.h"
36848b8605Smrg#include "rastpos.h"
37848b8605Smrg#include "state.h"
38b8e80941Smrg#include "main/viewport.h"
39b8e80941Smrg#include "util/bitscan.h"
40b8e80941Smrg
41b8e80941Smrg
42b8e80941Smrg
43b8e80941Smrg/**
44b8e80941Smrg * Clip a point against the view volume.
45b8e80941Smrg *
46b8e80941Smrg * \param v vertex vector describing the point to clip.
47b8e80941Smrg *
48b8e80941Smrg * \return zero if outside view volume, or one if inside.
49b8e80941Smrg */
50b8e80941Smrgstatic GLuint
51b8e80941Smrgviewclip_point_xy( const GLfloat v[] )
52b8e80941Smrg{
53b8e80941Smrg   if (   v[0] > v[3] || v[0] < -v[3]
54b8e80941Smrg       || v[1] > v[3] || v[1] < -v[3] ) {
55b8e80941Smrg      return 0;
56b8e80941Smrg   }
57b8e80941Smrg   else {
58b8e80941Smrg      return 1;
59b8e80941Smrg   }
60b8e80941Smrg}
61b8e80941Smrg
62b8e80941Smrg
63b8e80941Smrg/**
64b8e80941Smrg * Clip a point against the near Z clipping planes.
65b8e80941Smrg *
66b8e80941Smrg * \param v vertex vector describing the point to clip.
67b8e80941Smrg *
68b8e80941Smrg * \return zero if outside view volume, or one if inside.
69b8e80941Smrg */
70b8e80941Smrgstatic GLuint
71b8e80941Smrgviewclip_point_near_z( const GLfloat v[] )
72b8e80941Smrg{
73b8e80941Smrg   if (v[2] < -v[3]) {
74b8e80941Smrg      return 0;
75b8e80941Smrg   }
76b8e80941Smrg   else {
77b8e80941Smrg      return 1;
78b8e80941Smrg   }
79b8e80941Smrg}
80b8e80941Smrg
81b8e80941Smrg
82b8e80941Smrg/**
83b8e80941Smrg * Clip a point against the far Z clipping planes.
84b8e80941Smrg *
85b8e80941Smrg * \param v vertex vector describing the point to clip.
86b8e80941Smrg *
87b8e80941Smrg * \return zero if outside view volume, or one if inside.
88b8e80941Smrg */
89b8e80941Smrgstatic GLuint
90b8e80941Smrgviewclip_point_far_z( const GLfloat v[] )
91b8e80941Smrg{
92b8e80941Smrg   if (v[2] > v[3]) {
93b8e80941Smrg      return 0;
94b8e80941Smrg   }
95b8e80941Smrg   else {
96b8e80941Smrg      return 1;
97b8e80941Smrg   }
98b8e80941Smrg}
99b8e80941Smrg
100b8e80941Smrg
101b8e80941Smrg/**
102b8e80941Smrg * Clip a point against the user clipping planes.
103b8e80941Smrg *
104b8e80941Smrg * \param ctx GL context.
105b8e80941Smrg * \param v vertex vector describing the point to clip.
106b8e80941Smrg *
107b8e80941Smrg * \return zero if the point was clipped, or one otherwise.
108b8e80941Smrg */
109b8e80941Smrgstatic GLuint
110b8e80941Smrguserclip_point( struct gl_context *ctx, const GLfloat v[] )
111b8e80941Smrg{
112b8e80941Smrg   GLbitfield mask = ctx->Transform.ClipPlanesEnabled;
113b8e80941Smrg   while (mask) {
114b8e80941Smrg      const int p = u_bit_scan(&mask);
115b8e80941Smrg      GLfloat dot = v[0] * ctx->Transform._ClipUserPlane[p][0]
116b8e80941Smrg         + v[1] * ctx->Transform._ClipUserPlane[p][1]
117b8e80941Smrg         + v[2] * ctx->Transform._ClipUserPlane[p][2]
118b8e80941Smrg         + v[3] * ctx->Transform._ClipUserPlane[p][3];
119b8e80941Smrg
120b8e80941Smrg      if (dot < 0.0F) {
121b8e80941Smrg         return 0;
122b8e80941Smrg      }
123b8e80941Smrg   }
124b8e80941Smrg
125b8e80941Smrg   return 1;
126b8e80941Smrg}
127b8e80941Smrg
128b8e80941Smrg
129b8e80941Smrg/**
130b8e80941Smrg * Compute lighting for the raster position.  RGB modes computed.
131b8e80941Smrg * \param ctx the context
132b8e80941Smrg * \param vertex vertex location
133b8e80941Smrg * \param normal normal vector
134b8e80941Smrg * \param Rcolor returned color
135b8e80941Smrg * \param Rspec returned specular color (if separate specular enabled)
136b8e80941Smrg */
137b8e80941Smrgstatic void
138b8e80941Smrgshade_rastpos(struct gl_context *ctx,
139b8e80941Smrg              const GLfloat vertex[4],
140b8e80941Smrg              const GLfloat normal[3],
141b8e80941Smrg              GLfloat Rcolor[4],
142b8e80941Smrg              GLfloat Rspec[4])
143b8e80941Smrg{
144b8e80941Smrg   /*const*/ GLfloat (*base)[3] = ctx->Light._BaseColor;
145b8e80941Smrg   GLbitfield mask;
146b8e80941Smrg   GLfloat diffuseColor[4], specularColor[4];  /* for RGB mode only */
147b8e80941Smrg
148b8e80941Smrg   COPY_3V(diffuseColor, base[0]);
149b8e80941Smrg   diffuseColor[3] = CLAMP(
150b8e80941Smrg      ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3], 0.0F, 1.0F );
151b8e80941Smrg   ASSIGN_4V(specularColor, 0.0, 0.0, 0.0, 1.0);
152b8e80941Smrg
153b8e80941Smrg   mask = ctx->Light._EnabledLights;
154b8e80941Smrg   while (mask) {
155b8e80941Smrg      const int i = u_bit_scan(&mask);
156b8e80941Smrg      struct gl_light *light = &ctx->Light.Light[i];
157b8e80941Smrg      GLfloat attenuation = 1.0;
158b8e80941Smrg      GLfloat VP[3]; /* vector from vertex to light pos */
159b8e80941Smrg      GLfloat n_dot_VP;
160b8e80941Smrg      GLfloat diffuseContrib[3], specularContrib[3];
161b8e80941Smrg
162b8e80941Smrg      if (!(light->_Flags & LIGHT_POSITIONAL)) {
163b8e80941Smrg         /* light at infinity */
164b8e80941Smrg	 COPY_3V(VP, light->_VP_inf_norm);
165b8e80941Smrg	 attenuation = light->_VP_inf_spot_attenuation;
166b8e80941Smrg      }
167b8e80941Smrg      else {
168b8e80941Smrg         /* local/positional light */
169b8e80941Smrg	 GLfloat d;
170b8e80941Smrg
171b8e80941Smrg         /* VP = vector from vertex pos to light[i].pos */
172b8e80941Smrg	 SUB_3V(VP, light->_Position, vertex);
173b8e80941Smrg         /* d = length(VP) */
174b8e80941Smrg	 d = (GLfloat) LEN_3FV( VP );
175b8e80941Smrg	 if (d > 1.0e-6F) {
176b8e80941Smrg            /* normalize VP */
177b8e80941Smrg	    GLfloat invd = 1.0F / d;
178b8e80941Smrg	    SELF_SCALE_SCALAR_3V(VP, invd);
179b8e80941Smrg	 }
180b8e80941Smrg
181b8e80941Smrg         /* atti */
182b8e80941Smrg	 attenuation = 1.0F / (light->ConstantAttenuation + d *
183b8e80941Smrg			       (light->LinearAttenuation + d *
184b8e80941Smrg				light->QuadraticAttenuation));
185b8e80941Smrg
186b8e80941Smrg	 if (light->_Flags & LIGHT_SPOT) {
187b8e80941Smrg	    GLfloat PV_dot_dir = - DOT3(VP, light->_NormSpotDirection);
188b8e80941Smrg
189b8e80941Smrg	    if (PV_dot_dir<light->_CosCutoff) {
190b8e80941Smrg	       continue;
191b8e80941Smrg	    }
192b8e80941Smrg	    else {
193b8e80941Smrg               GLfloat spot = powf(PV_dot_dir, light->SpotExponent);
194b8e80941Smrg	       attenuation *= spot;
195b8e80941Smrg	    }
196b8e80941Smrg	 }
197b8e80941Smrg      }
198b8e80941Smrg
199b8e80941Smrg      if (attenuation < 1e-3F)
200b8e80941Smrg	 continue;
201b8e80941Smrg
202b8e80941Smrg      n_dot_VP = DOT3( normal, VP );
203b8e80941Smrg
204b8e80941Smrg      if (n_dot_VP < 0.0F) {
205b8e80941Smrg	 ACC_SCALE_SCALAR_3V(diffuseColor, attenuation, light->_MatAmbient[0]);
206b8e80941Smrg	 continue;
207b8e80941Smrg      }
208b8e80941Smrg
209b8e80941Smrg      /* Ambient + diffuse */
210b8e80941Smrg      COPY_3V(diffuseContrib, light->_MatAmbient[0]);
211b8e80941Smrg      ACC_SCALE_SCALAR_3V(diffuseContrib, n_dot_VP, light->_MatDiffuse[0]);
212b8e80941Smrg
213b8e80941Smrg      /* Specular */
214b8e80941Smrg      {
215b8e80941Smrg         const GLfloat *h;
216b8e80941Smrg         GLfloat n_dot_h;
217b8e80941Smrg
218b8e80941Smrg         ASSIGN_3V(specularContrib, 0.0, 0.0, 0.0);
219b8e80941Smrg
220b8e80941Smrg	 if (ctx->Light.Model.LocalViewer) {
221b8e80941Smrg	    GLfloat v[3];
222b8e80941Smrg	    COPY_3V(v, vertex);
223b8e80941Smrg	    NORMALIZE_3FV(v);
224b8e80941Smrg	    SUB_3V(VP, VP, v);
225b8e80941Smrg            NORMALIZE_3FV(VP);
226b8e80941Smrg	    h = VP;
227b8e80941Smrg	 }
228b8e80941Smrg	 else if (light->_Flags & LIGHT_POSITIONAL) {
229b8e80941Smrg	    ACC_3V(VP, ctx->_EyeZDir);
230b8e80941Smrg            NORMALIZE_3FV(VP);
231b8e80941Smrg	    h = VP;
232b8e80941Smrg	 }
233b8e80941Smrg         else {
234b8e80941Smrg	    h = light->_h_inf_norm;
235b8e80941Smrg	 }
236b8e80941Smrg
237b8e80941Smrg	 n_dot_h = DOT3(normal, h);
238b8e80941Smrg
239b8e80941Smrg	 if (n_dot_h > 0.0F) {
240b8e80941Smrg	    GLfloat shine;
241b8e80941Smrg	    GLfloat spec_coef;
242b8e80941Smrg
243b8e80941Smrg	    shine = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_SHININESS][0];
244b8e80941Smrg	    spec_coef = powf(n_dot_h, shine);
245b8e80941Smrg
246b8e80941Smrg	    if (spec_coef > 1.0e-10F) {
247b8e80941Smrg               if (ctx->Light.Model.ColorControl==GL_SEPARATE_SPECULAR_COLOR) {
248b8e80941Smrg                  ACC_SCALE_SCALAR_3V( specularContrib, spec_coef,
249b8e80941Smrg                                       light->_MatSpecular[0]);
250b8e80941Smrg               }
251b8e80941Smrg               else {
252b8e80941Smrg                  ACC_SCALE_SCALAR_3V( diffuseContrib, spec_coef,
253b8e80941Smrg                                       light->_MatSpecular[0]);
254b8e80941Smrg               }
255b8e80941Smrg	    }
256b8e80941Smrg	 }
257b8e80941Smrg      }
258b8e80941Smrg
259b8e80941Smrg      ACC_SCALE_SCALAR_3V( diffuseColor, attenuation, diffuseContrib );
260b8e80941Smrg      ACC_SCALE_SCALAR_3V( specularColor, attenuation, specularContrib );
261b8e80941Smrg   }
262b8e80941Smrg
263b8e80941Smrg   Rcolor[0] = CLAMP(diffuseColor[0], 0.0F, 1.0F);
264b8e80941Smrg   Rcolor[1] = CLAMP(diffuseColor[1], 0.0F, 1.0F);
265b8e80941Smrg   Rcolor[2] = CLAMP(diffuseColor[2], 0.0F, 1.0F);
266b8e80941Smrg   Rcolor[3] = CLAMP(diffuseColor[3], 0.0F, 1.0F);
267b8e80941Smrg   Rspec[0] = CLAMP(specularColor[0], 0.0F, 1.0F);
268b8e80941Smrg   Rspec[1] = CLAMP(specularColor[1], 0.0F, 1.0F);
269b8e80941Smrg   Rspec[2] = CLAMP(specularColor[2], 0.0F, 1.0F);
270b8e80941Smrg   Rspec[3] = CLAMP(specularColor[3], 0.0F, 1.0F);
271b8e80941Smrg}
272b8e80941Smrg
273b8e80941Smrg
274b8e80941Smrg/**
275b8e80941Smrg * Do texgen needed for glRasterPos.
276b8e80941Smrg * \param ctx  rendering context
277b8e80941Smrg * \param vObj  object-space vertex coordinate
278b8e80941Smrg * \param vEye  eye-space vertex coordinate
279b8e80941Smrg * \param normal  vertex normal
280b8e80941Smrg * \param unit  texture unit number
281b8e80941Smrg * \param texcoord  incoming texcoord and resulting texcoord
282b8e80941Smrg */
283b8e80941Smrgstatic void
284b8e80941Smrgcompute_texgen(struct gl_context *ctx, const GLfloat vObj[4], const GLfloat vEye[4],
285b8e80941Smrg               const GLfloat normal[3], GLuint unit, GLfloat texcoord[4])
286b8e80941Smrg{
287b8e80941Smrg   const struct gl_fixedfunc_texture_unit *texUnit =
288b8e80941Smrg      &ctx->Texture.FixedFuncUnit[unit];
289b8e80941Smrg
290b8e80941Smrg   /* always compute sphere map terms, just in case */
291b8e80941Smrg   GLfloat u[3], two_nu, rx, ry, rz, m, mInv;
292b8e80941Smrg   COPY_3V(u, vEye);
293b8e80941Smrg   NORMALIZE_3FV(u);
294b8e80941Smrg   two_nu = 2.0F * DOT3(normal, u);
295b8e80941Smrg   rx = u[0] - normal[0] * two_nu;
296b8e80941Smrg   ry = u[1] - normal[1] * two_nu;
297b8e80941Smrg   rz = u[2] - normal[2] * two_nu;
298b8e80941Smrg   m = rx * rx + ry * ry + (rz + 1.0F) * (rz + 1.0F);
299b8e80941Smrg   if (m > 0.0F)
300b8e80941Smrg      mInv = 0.5F * (1.0f / sqrtf(m));
301b8e80941Smrg   else
302b8e80941Smrg      mInv = 0.0F;
303b8e80941Smrg
304b8e80941Smrg   if (texUnit->TexGenEnabled & S_BIT) {
305b8e80941Smrg      switch (texUnit->GenS.Mode) {
306b8e80941Smrg         case GL_OBJECT_LINEAR:
307b8e80941Smrg            texcoord[0] = DOT4(vObj, texUnit->GenS.ObjectPlane);
308b8e80941Smrg            break;
309b8e80941Smrg         case GL_EYE_LINEAR:
310b8e80941Smrg            texcoord[0] = DOT4(vEye, texUnit->GenS.EyePlane);
311b8e80941Smrg            break;
312b8e80941Smrg         case GL_SPHERE_MAP:
313b8e80941Smrg            texcoord[0] = rx * mInv + 0.5F;
314b8e80941Smrg            break;
315b8e80941Smrg         case GL_REFLECTION_MAP:
316b8e80941Smrg            texcoord[0] = rx;
317b8e80941Smrg            break;
318b8e80941Smrg         case GL_NORMAL_MAP:
319b8e80941Smrg            texcoord[0] = normal[0];
320b8e80941Smrg            break;
321b8e80941Smrg         default:
322b8e80941Smrg            _mesa_problem(ctx, "Bad S texgen in compute_texgen()");
323b8e80941Smrg            return;
324b8e80941Smrg      }
325b8e80941Smrg   }
326b8e80941Smrg
327b8e80941Smrg   if (texUnit->TexGenEnabled & T_BIT) {
328b8e80941Smrg      switch (texUnit->GenT.Mode) {
329b8e80941Smrg         case GL_OBJECT_LINEAR:
330b8e80941Smrg            texcoord[1] = DOT4(vObj, texUnit->GenT.ObjectPlane);
331b8e80941Smrg            break;
332b8e80941Smrg         case GL_EYE_LINEAR:
333b8e80941Smrg            texcoord[1] = DOT4(vEye, texUnit->GenT.EyePlane);
334b8e80941Smrg            break;
335b8e80941Smrg         case GL_SPHERE_MAP:
336b8e80941Smrg            texcoord[1] = ry * mInv + 0.5F;
337b8e80941Smrg            break;
338b8e80941Smrg         case GL_REFLECTION_MAP:
339b8e80941Smrg            texcoord[1] = ry;
340b8e80941Smrg            break;
341b8e80941Smrg         case GL_NORMAL_MAP:
342b8e80941Smrg            texcoord[1] = normal[1];
343b8e80941Smrg            break;
344b8e80941Smrg         default:
345b8e80941Smrg            _mesa_problem(ctx, "Bad T texgen in compute_texgen()");
346b8e80941Smrg            return;
347b8e80941Smrg      }
348b8e80941Smrg   }
349b8e80941Smrg
350b8e80941Smrg   if (texUnit->TexGenEnabled & R_BIT) {
351b8e80941Smrg      switch (texUnit->GenR.Mode) {
352b8e80941Smrg         case GL_OBJECT_LINEAR:
353b8e80941Smrg            texcoord[2] = DOT4(vObj, texUnit->GenR.ObjectPlane);
354b8e80941Smrg            break;
355b8e80941Smrg         case GL_EYE_LINEAR:
356b8e80941Smrg            texcoord[2] = DOT4(vEye, texUnit->GenR.EyePlane);
357b8e80941Smrg            break;
358b8e80941Smrg         case GL_REFLECTION_MAP:
359b8e80941Smrg            texcoord[2] = rz;
360b8e80941Smrg            break;
361b8e80941Smrg         case GL_NORMAL_MAP:
362b8e80941Smrg            texcoord[2] = normal[2];
363b8e80941Smrg            break;
364b8e80941Smrg         default:
365b8e80941Smrg            _mesa_problem(ctx, "Bad R texgen in compute_texgen()");
366b8e80941Smrg            return;
367b8e80941Smrg      }
368b8e80941Smrg   }
369b8e80941Smrg
370b8e80941Smrg   if (texUnit->TexGenEnabled & Q_BIT) {
371b8e80941Smrg      switch (texUnit->GenQ.Mode) {
372b8e80941Smrg         case GL_OBJECT_LINEAR:
373b8e80941Smrg            texcoord[3] = DOT4(vObj, texUnit->GenQ.ObjectPlane);
374b8e80941Smrg            break;
375b8e80941Smrg         case GL_EYE_LINEAR:
376b8e80941Smrg            texcoord[3] = DOT4(vEye, texUnit->GenQ.EyePlane);
377b8e80941Smrg            break;
378b8e80941Smrg         default:
379b8e80941Smrg            _mesa_problem(ctx, "Bad Q texgen in compute_texgen()");
380b8e80941Smrg            return;
381b8e80941Smrg      }
382b8e80941Smrg   }
383b8e80941Smrg}
384b8e80941Smrg
385b8e80941Smrg
386b8e80941Smrg/**
387b8e80941Smrg * glRasterPos transformation.  Typically called via ctx->Driver.RasterPos().
388b8e80941Smrg *
389b8e80941Smrg * \param vObj  vertex position in object space
390b8e80941Smrg */
391b8e80941Smrgvoid
392b8e80941Smrg_mesa_RasterPos(struct gl_context *ctx, const GLfloat vObj[4])
393b8e80941Smrg{
394b8e80941Smrg   if (_mesa_arb_vertex_program_enabled(ctx)) {
395b8e80941Smrg      /* XXX implement this */
396b8e80941Smrg      _mesa_problem(ctx, "Vertex programs not implemented for glRasterPos");
397b8e80941Smrg      return;
398b8e80941Smrg   }
399b8e80941Smrg   else {
400b8e80941Smrg      GLfloat eye[4], clip[4], ndc[3], d;
401b8e80941Smrg      GLfloat *norm, eyenorm[3];
402b8e80941Smrg      GLfloat *objnorm = ctx->Current.Attrib[VERT_ATTRIB_NORMAL];
403b8e80941Smrg      float scale[3], translate[3];
404b8e80941Smrg
405b8e80941Smrg      /* apply modelview matrix:  eye = MV * obj */
406b8e80941Smrg      TRANSFORM_POINT( eye, ctx->ModelviewMatrixStack.Top->m, vObj );
407b8e80941Smrg      /* apply projection matrix:  clip = Proj * eye */
408b8e80941Smrg      TRANSFORM_POINT( clip, ctx->ProjectionMatrixStack.Top->m, eye );
409b8e80941Smrg
410b8e80941Smrg      /* clip to view volume. */
411b8e80941Smrg      if (!ctx->Transform.DepthClampNear) {
412b8e80941Smrg         if (viewclip_point_near_z(clip) == 0) {
413b8e80941Smrg            ctx->Current.RasterPosValid = GL_FALSE;
414b8e80941Smrg            return;
415b8e80941Smrg         }
416b8e80941Smrg      }
417b8e80941Smrg      if (!ctx->Transform.DepthClampFar) {
418b8e80941Smrg         if (viewclip_point_far_z(clip) == 0) {
419b8e80941Smrg            ctx->Current.RasterPosValid = GL_FALSE;
420b8e80941Smrg            return;
421b8e80941Smrg         }
422b8e80941Smrg      }
423b8e80941Smrg      if (!ctx->Transform.RasterPositionUnclipped) {
424b8e80941Smrg         if (viewclip_point_xy(clip) == 0) {
425b8e80941Smrg            ctx->Current.RasterPosValid = GL_FALSE;
426b8e80941Smrg            return;
427b8e80941Smrg         }
428b8e80941Smrg      }
429b8e80941Smrg
430b8e80941Smrg      /* clip to user clipping planes */
431b8e80941Smrg      if (ctx->Transform.ClipPlanesEnabled && !userclip_point(ctx, clip)) {
432b8e80941Smrg         ctx->Current.RasterPosValid = GL_FALSE;
433b8e80941Smrg         return;
434b8e80941Smrg      }
435b8e80941Smrg
436b8e80941Smrg      /* ndc = clip / W */
437b8e80941Smrg      d = (clip[3] == 0.0F) ? 1.0F : 1.0F / clip[3];
438b8e80941Smrg      ndc[0] = clip[0] * d;
439b8e80941Smrg      ndc[1] = clip[1] * d;
440b8e80941Smrg      ndc[2] = clip[2] * d;
441b8e80941Smrg      /* wincoord = viewport_mapping(ndc) */
442b8e80941Smrg      _mesa_get_viewport_xform(ctx, 0, scale, translate);
443b8e80941Smrg      ctx->Current.RasterPos[0] = ndc[0] * scale[0] + translate[0];
444b8e80941Smrg      ctx->Current.RasterPos[1] = ndc[1] * scale[1] + translate[1];
445b8e80941Smrg      ctx->Current.RasterPos[2] = ndc[2] * scale[2] + translate[2];
446b8e80941Smrg      ctx->Current.RasterPos[3] = clip[3];
447b8e80941Smrg
448b8e80941Smrg      if (ctx->Transform.DepthClampNear &&
449b8e80941Smrg          ctx->Transform.DepthClampFar) {
450b8e80941Smrg         ctx->Current.RasterPos[3] = CLAMP(ctx->Current.RasterPos[3],
451b8e80941Smrg                                           ctx->ViewportArray[0].Near,
452b8e80941Smrg                                           ctx->ViewportArray[0].Far);
453b8e80941Smrg      } else {
454b8e80941Smrg         /* Clamp against near and far plane separately */
455b8e80941Smrg         if (ctx->Transform.DepthClampNear) {
456b8e80941Smrg            ctx->Current.RasterPos[3] = MAX2(ctx->Current.RasterPos[3],
457b8e80941Smrg                                             ctx->ViewportArray[0].Near);
458b8e80941Smrg         }
459b8e80941Smrg
460b8e80941Smrg         if (ctx->Transform.DepthClampFar) {
461b8e80941Smrg            ctx->Current.RasterPos[3] = MIN2(ctx->Current.RasterPos[3],
462b8e80941Smrg                                             ctx->ViewportArray[0].Far);
463b8e80941Smrg         }
464b8e80941Smrg      }
465b8e80941Smrg
466b8e80941Smrg      /* compute raster distance */
467b8e80941Smrg      if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT)
468b8e80941Smrg         ctx->Current.RasterDistance = ctx->Current.Attrib[VERT_ATTRIB_FOG][0];
469b8e80941Smrg      else
470b8e80941Smrg         ctx->Current.RasterDistance =
471b8e80941Smrg                        sqrtf( eye[0]*eye[0] + eye[1]*eye[1] + eye[2]*eye[2] );
472b8e80941Smrg
473b8e80941Smrg      /* compute transformed normal vector (for lighting or texgen) */
474b8e80941Smrg      if (ctx->_NeedEyeCoords) {
475b8e80941Smrg         const GLfloat *inv = ctx->ModelviewMatrixStack.Top->inv;
476b8e80941Smrg         TRANSFORM_NORMAL( eyenorm, objnorm, inv );
477b8e80941Smrg         norm = eyenorm;
478b8e80941Smrg      }
479b8e80941Smrg      else {
480b8e80941Smrg         norm = objnorm;
481b8e80941Smrg      }
482b8e80941Smrg
483b8e80941Smrg      /* update raster color */
484b8e80941Smrg      if (ctx->Light.Enabled) {
485b8e80941Smrg         /* lighting */
486b8e80941Smrg         shade_rastpos( ctx, vObj, norm,
487b8e80941Smrg                        ctx->Current.RasterColor,
488b8e80941Smrg                        ctx->Current.RasterSecondaryColor );
489b8e80941Smrg      }
490b8e80941Smrg      else {
491b8e80941Smrg         /* use current color */
492b8e80941Smrg	 COPY_4FV(ctx->Current.RasterColor,
493b8e80941Smrg		  ctx->Current.Attrib[VERT_ATTRIB_COLOR0]);
494b8e80941Smrg	 COPY_4FV(ctx->Current.RasterSecondaryColor,
495b8e80941Smrg		  ctx->Current.Attrib[VERT_ATTRIB_COLOR1]);
496b8e80941Smrg      }
497b8e80941Smrg
498b8e80941Smrg      /* texture coords */
499b8e80941Smrg      {
500b8e80941Smrg         GLuint u;
501b8e80941Smrg         for (u = 0; u < ctx->Const.MaxTextureCoordUnits; u++) {
502b8e80941Smrg            GLfloat tc[4];
503b8e80941Smrg            COPY_4V(tc, ctx->Current.Attrib[VERT_ATTRIB_TEX0 + u]);
504b8e80941Smrg            if (ctx->Texture.FixedFuncUnit[u].TexGenEnabled) {
505b8e80941Smrg               compute_texgen(ctx, vObj, eye, norm, u, tc);
506b8e80941Smrg            }
507b8e80941Smrg            TRANSFORM_POINT(ctx->Current.RasterTexCoords[u],
508b8e80941Smrg                            ctx->TextureMatrixStack[u].Top->m, tc);
509b8e80941Smrg         }
510b8e80941Smrg      }
511b8e80941Smrg
512b8e80941Smrg      ctx->Current.RasterPosValid = GL_TRUE;
513b8e80941Smrg   }
514b8e80941Smrg
515b8e80941Smrg   if (ctx->RenderMode == GL_SELECT) {
516b8e80941Smrg      _mesa_update_hitflag( ctx, ctx->Current.RasterPos[2] );
517b8e80941Smrg   }
518b8e80941Smrg}
519848b8605Smrg
520848b8605Smrg
521848b8605Smrg/**
522848b8605Smrg * Helper function for all the RasterPos functions.
523848b8605Smrg */
524848b8605Smrgstatic void
525848b8605Smrgrasterpos(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
526848b8605Smrg{
527848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
528848b8605Smrg   GLfloat p[4];
529848b8605Smrg
530848b8605Smrg   p[0] = x;
531848b8605Smrg   p[1] = y;
532848b8605Smrg   p[2] = z;
533848b8605Smrg   p[3] = w;
534848b8605Smrg
535848b8605Smrg   FLUSH_VERTICES(ctx, 0);
536848b8605Smrg   FLUSH_CURRENT(ctx, 0);
537848b8605Smrg
538848b8605Smrg   if (ctx->NewState)
539848b8605Smrg      _mesa_update_state( ctx );
540848b8605Smrg
541848b8605Smrg   ctx->Driver.RasterPos(ctx, p);
542848b8605Smrg}
543848b8605Smrg
544848b8605Smrg
545848b8605Smrgvoid GLAPIENTRY
546848b8605Smrg_mesa_RasterPos2d(GLdouble x, GLdouble y)
547848b8605Smrg{
548848b8605Smrg   rasterpos((GLfloat)x, (GLfloat)y, (GLfloat)0.0, (GLfloat)1.0);
549848b8605Smrg}
550848b8605Smrg
551848b8605Smrgvoid GLAPIENTRY
552848b8605Smrg_mesa_RasterPos2f(GLfloat x, GLfloat y)
553848b8605Smrg{
554848b8605Smrg   rasterpos(x, y, 0.0F, 1.0F);
555848b8605Smrg}
556848b8605Smrg
557848b8605Smrgvoid GLAPIENTRY
558848b8605Smrg_mesa_RasterPos2i(GLint x, GLint y)
559848b8605Smrg{
560848b8605Smrg   rasterpos((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
561848b8605Smrg}
562848b8605Smrg
563848b8605Smrgvoid GLAPIENTRY
564848b8605Smrg_mesa_RasterPos2s(GLshort x, GLshort y)
565848b8605Smrg{
566848b8605Smrg   rasterpos(x, y, 0.0F, 1.0F);
567848b8605Smrg}
568848b8605Smrg
569848b8605Smrgvoid GLAPIENTRY
570848b8605Smrg_mesa_RasterPos3d(GLdouble x, GLdouble y, GLdouble z)
571848b8605Smrg{
572848b8605Smrg   rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
573848b8605Smrg}
574848b8605Smrg
575848b8605Smrgvoid GLAPIENTRY
576848b8605Smrg_mesa_RasterPos3f(GLfloat x, GLfloat y, GLfloat z)
577848b8605Smrg{
578848b8605Smrg   rasterpos(x, y, z, 1.0F);
579848b8605Smrg}
580848b8605Smrg
581848b8605Smrgvoid GLAPIENTRY
582848b8605Smrg_mesa_RasterPos3i(GLint x, GLint y, GLint z)
583848b8605Smrg{
584848b8605Smrg   rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
585848b8605Smrg}
586848b8605Smrg
587848b8605Smrgvoid GLAPIENTRY
588848b8605Smrg_mesa_RasterPos3s(GLshort x, GLshort y, GLshort z)
589848b8605Smrg{
590848b8605Smrg   rasterpos(x, y, z, 1.0F);
591848b8605Smrg}
592848b8605Smrg
593848b8605Smrgvoid GLAPIENTRY
594848b8605Smrg_mesa_RasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
595848b8605Smrg{
596848b8605Smrg   rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
597848b8605Smrg}
598848b8605Smrg
599848b8605Smrgvoid GLAPIENTRY
600848b8605Smrg_mesa_RasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
601848b8605Smrg{
602848b8605Smrg   rasterpos(x, y, z, w);
603848b8605Smrg}
604848b8605Smrg
605848b8605Smrgvoid GLAPIENTRY
606848b8605Smrg_mesa_RasterPos4i(GLint x, GLint y, GLint z, GLint w)
607848b8605Smrg{
608848b8605Smrg   rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
609848b8605Smrg}
610848b8605Smrg
611848b8605Smrgvoid GLAPIENTRY
612848b8605Smrg_mesa_RasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
613848b8605Smrg{
614848b8605Smrg   rasterpos(x, y, z, w);
615848b8605Smrg}
616848b8605Smrg
617848b8605Smrgvoid GLAPIENTRY
618848b8605Smrg_mesa_RasterPos2dv(const GLdouble *v)
619848b8605Smrg{
620848b8605Smrg   rasterpos((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
621848b8605Smrg}
622848b8605Smrg
623848b8605Smrgvoid GLAPIENTRY
624848b8605Smrg_mesa_RasterPos2fv(const GLfloat *v)
625848b8605Smrg{
626848b8605Smrg   rasterpos(v[0], v[1], 0.0F, 1.0F);
627848b8605Smrg}
628848b8605Smrg
629848b8605Smrgvoid GLAPIENTRY
630848b8605Smrg_mesa_RasterPos2iv(const GLint *v)
631848b8605Smrg{
632848b8605Smrg   rasterpos((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
633848b8605Smrg}
634848b8605Smrg
635848b8605Smrgvoid GLAPIENTRY
636848b8605Smrg_mesa_RasterPos2sv(const GLshort *v)
637848b8605Smrg{
638848b8605Smrg   rasterpos(v[0], v[1], 0.0F, 1.0F);
639848b8605Smrg}
640848b8605Smrg
641848b8605Smrgvoid GLAPIENTRY
642848b8605Smrg_mesa_RasterPos3dv(const GLdouble *v)
643848b8605Smrg{
644848b8605Smrg   rasterpos((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
645848b8605Smrg}
646848b8605Smrg
647848b8605Smrgvoid GLAPIENTRY
648848b8605Smrg_mesa_RasterPos3fv(const GLfloat *v)
649848b8605Smrg{
650848b8605Smrg   rasterpos(v[0], v[1], v[2], 1.0F);
651848b8605Smrg}
652848b8605Smrg
653848b8605Smrgvoid GLAPIENTRY
654848b8605Smrg_mesa_RasterPos3iv(const GLint *v)
655848b8605Smrg{
656848b8605Smrg   rasterpos((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
657848b8605Smrg}
658848b8605Smrg
659848b8605Smrgvoid GLAPIENTRY
660848b8605Smrg_mesa_RasterPos3sv(const GLshort *v)
661848b8605Smrg{
662848b8605Smrg   rasterpos(v[0], v[1], v[2], 1.0F);
663848b8605Smrg}
664848b8605Smrg
665848b8605Smrgvoid GLAPIENTRY
666848b8605Smrg_mesa_RasterPos4dv(const GLdouble *v)
667848b8605Smrg{
668848b8605Smrg   rasterpos((GLfloat) v[0], (GLfloat) v[1],
669848b8605Smrg		     (GLfloat) v[2], (GLfloat) v[3]);
670848b8605Smrg}
671848b8605Smrg
672848b8605Smrgvoid GLAPIENTRY
673848b8605Smrg_mesa_RasterPos4fv(const GLfloat *v)
674848b8605Smrg{
675848b8605Smrg   rasterpos(v[0], v[1], v[2], v[3]);
676848b8605Smrg}
677848b8605Smrg
678848b8605Smrgvoid GLAPIENTRY
679848b8605Smrg_mesa_RasterPos4iv(const GLint *v)
680848b8605Smrg{
681848b8605Smrg   rasterpos((GLfloat) v[0], (GLfloat) v[1],
682848b8605Smrg		     (GLfloat) v[2], (GLfloat) v[3]);
683848b8605Smrg}
684848b8605Smrg
685848b8605Smrgvoid GLAPIENTRY
686848b8605Smrg_mesa_RasterPos4sv(const GLshort *v)
687848b8605Smrg{
688848b8605Smrg   rasterpos(v[0], v[1], v[2], v[3]);
689848b8605Smrg}
690848b8605Smrg
691848b8605Smrg
692848b8605Smrg/**********************************************************************/
693848b8605Smrg/***           GL_ARB_window_pos / GL_MESA_window_pos               ***/
694848b8605Smrg/**********************************************************************/
695848b8605Smrg
696848b8605Smrg
697848b8605Smrg/**
698848b8605Smrg * All glWindowPosMESA and glWindowPosARB commands call this function to
699848b8605Smrg * update the current raster position.
700848b8605Smrg */
701848b8605Smrgstatic void
702848b8605Smrgwindow_pos3f(GLfloat x, GLfloat y, GLfloat z)
703848b8605Smrg{
704848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
705848b8605Smrg   GLfloat z2;
706848b8605Smrg
707848b8605Smrg   FLUSH_VERTICES(ctx, 0);
708848b8605Smrg   FLUSH_CURRENT(ctx, 0);
709848b8605Smrg
710848b8605Smrg   z2 = CLAMP(z, 0.0F, 1.0F)
711848b8605Smrg      * (ctx->ViewportArray[0].Far - ctx->ViewportArray[0].Near)
712848b8605Smrg      + ctx->ViewportArray[0].Near;
713848b8605Smrg
714848b8605Smrg   /* set raster position */
715848b8605Smrg   ctx->Current.RasterPos[0] = x;
716848b8605Smrg   ctx->Current.RasterPos[1] = y;
717848b8605Smrg   ctx->Current.RasterPos[2] = z2;
718848b8605Smrg   ctx->Current.RasterPos[3] = 1.0F;
719848b8605Smrg
720848b8605Smrg   ctx->Current.RasterPosValid = GL_TRUE;
721848b8605Smrg
722848b8605Smrg   if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT)
723848b8605Smrg      ctx->Current.RasterDistance = ctx->Current.Attrib[VERT_ATTRIB_FOG][0];
724848b8605Smrg   else
725848b8605Smrg      ctx->Current.RasterDistance = 0.0;
726848b8605Smrg
727848b8605Smrg   /* raster color = current color or index */
728848b8605Smrg   ctx->Current.RasterColor[0]
729848b8605Smrg      = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][0], 0.0F, 1.0F);
730848b8605Smrg   ctx->Current.RasterColor[1]
731848b8605Smrg      = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][1], 0.0F, 1.0F);
732848b8605Smrg   ctx->Current.RasterColor[2]
733848b8605Smrg      = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][2], 0.0F, 1.0F);
734848b8605Smrg   ctx->Current.RasterColor[3]
735848b8605Smrg      = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][3], 0.0F, 1.0F);
736848b8605Smrg   ctx->Current.RasterSecondaryColor[0]
737848b8605Smrg      = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][0], 0.0F, 1.0F);
738848b8605Smrg   ctx->Current.RasterSecondaryColor[1]
739848b8605Smrg      = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][1], 0.0F, 1.0F);
740848b8605Smrg   ctx->Current.RasterSecondaryColor[2]
741848b8605Smrg      = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][2], 0.0F, 1.0F);
742848b8605Smrg   ctx->Current.RasterSecondaryColor[3]
743848b8605Smrg      = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][3], 0.0F, 1.0F);
744848b8605Smrg
745848b8605Smrg   /* raster texcoord = current texcoord */
746848b8605Smrg   {
747848b8605Smrg      GLuint texSet;
748848b8605Smrg      for (texSet = 0; texSet < ctx->Const.MaxTextureCoordUnits; texSet++) {
749b8e80941Smrg         assert(texSet < ARRAY_SIZE(ctx->Current.RasterTexCoords));
750848b8605Smrg         COPY_4FV( ctx->Current.RasterTexCoords[texSet],
751848b8605Smrg                  ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texSet] );
752848b8605Smrg      }
753848b8605Smrg   }
754848b8605Smrg
755848b8605Smrg   if (ctx->RenderMode==GL_SELECT) {
756848b8605Smrg      _mesa_update_hitflag( ctx, ctx->Current.RasterPos[2] );
757848b8605Smrg   }
758848b8605Smrg}
759848b8605Smrg
760848b8605Smrg
761848b8605Smrg/* This is just to support the GL_MESA_window_pos version */
762848b8605Smrgstatic void
763848b8605Smrgwindow_pos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
764848b8605Smrg{
765848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
766848b8605Smrg   window_pos3f(x, y, z);
767848b8605Smrg   ctx->Current.RasterPos[3] = w;
768848b8605Smrg}
769848b8605Smrg
770848b8605Smrg
771848b8605Smrgvoid GLAPIENTRY
772848b8605Smrg_mesa_WindowPos2d(GLdouble x, GLdouble y)
773848b8605Smrg{
774848b8605Smrg   window_pos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
775848b8605Smrg}
776848b8605Smrg
777848b8605Smrgvoid GLAPIENTRY
778848b8605Smrg_mesa_WindowPos2f(GLfloat x, GLfloat y)
779848b8605Smrg{
780848b8605Smrg   window_pos4f(x, y, 0.0F, 1.0F);
781848b8605Smrg}
782848b8605Smrg
783848b8605Smrgvoid GLAPIENTRY
784848b8605Smrg_mesa_WindowPos2i(GLint x, GLint y)
785848b8605Smrg{
786848b8605Smrg   window_pos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
787848b8605Smrg}
788848b8605Smrg
789848b8605Smrgvoid GLAPIENTRY
790848b8605Smrg_mesa_WindowPos2s(GLshort x, GLshort y)
791848b8605Smrg{
792848b8605Smrg   window_pos4f(x, y, 0.0F, 1.0F);
793848b8605Smrg}
794848b8605Smrg
795848b8605Smrgvoid GLAPIENTRY
796848b8605Smrg_mesa_WindowPos3d(GLdouble x, GLdouble y, GLdouble z)
797848b8605Smrg{
798848b8605Smrg   window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
799848b8605Smrg}
800848b8605Smrg
801848b8605Smrgvoid GLAPIENTRY
802848b8605Smrg_mesa_WindowPos3f(GLfloat x, GLfloat y, GLfloat z)
803848b8605Smrg{
804848b8605Smrg   window_pos4f(x, y, z, 1.0F);
805848b8605Smrg}
806848b8605Smrg
807848b8605Smrgvoid GLAPIENTRY
808848b8605Smrg_mesa_WindowPos3i(GLint x, GLint y, GLint z)
809848b8605Smrg{
810848b8605Smrg   window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
811848b8605Smrg}
812848b8605Smrg
813848b8605Smrgvoid GLAPIENTRY
814848b8605Smrg_mesa_WindowPos3s(GLshort x, GLshort y, GLshort z)
815848b8605Smrg{
816848b8605Smrg   window_pos4f(x, y, z, 1.0F);
817848b8605Smrg}
818848b8605Smrg
819848b8605Smrgvoid GLAPIENTRY
820848b8605Smrg_mesa_WindowPos4dMESA(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
821848b8605Smrg{
822848b8605Smrg   window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
823848b8605Smrg}
824848b8605Smrg
825848b8605Smrgvoid GLAPIENTRY
826848b8605Smrg_mesa_WindowPos4fMESA(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
827848b8605Smrg{
828848b8605Smrg   window_pos4f(x, y, z, w);
829848b8605Smrg}
830848b8605Smrg
831848b8605Smrgvoid GLAPIENTRY
832848b8605Smrg_mesa_WindowPos4iMESA(GLint x, GLint y, GLint z, GLint w)
833848b8605Smrg{
834848b8605Smrg   window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
835848b8605Smrg}
836848b8605Smrg
837848b8605Smrgvoid GLAPIENTRY
838848b8605Smrg_mesa_WindowPos4sMESA(GLshort x, GLshort y, GLshort z, GLshort w)
839848b8605Smrg{
840848b8605Smrg   window_pos4f(x, y, z, w);
841848b8605Smrg}
842848b8605Smrg
843848b8605Smrgvoid GLAPIENTRY
844848b8605Smrg_mesa_WindowPos2dv(const GLdouble *v)
845848b8605Smrg{
846848b8605Smrg   window_pos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
847848b8605Smrg}
848848b8605Smrg
849848b8605Smrgvoid GLAPIENTRY
850848b8605Smrg_mesa_WindowPos2fv(const GLfloat *v)
851848b8605Smrg{
852848b8605Smrg   window_pos4f(v[0], v[1], 0.0F, 1.0F);
853848b8605Smrg}
854848b8605Smrg
855848b8605Smrgvoid GLAPIENTRY
856848b8605Smrg_mesa_WindowPos2iv(const GLint *v)
857848b8605Smrg{
858848b8605Smrg   window_pos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
859848b8605Smrg}
860848b8605Smrg
861848b8605Smrgvoid GLAPIENTRY
862848b8605Smrg_mesa_WindowPos2sv(const GLshort *v)
863848b8605Smrg{
864848b8605Smrg   window_pos4f(v[0], v[1], 0.0F, 1.0F);
865848b8605Smrg}
866848b8605Smrg
867848b8605Smrgvoid GLAPIENTRY
868848b8605Smrg_mesa_WindowPos3dv(const GLdouble *v)
869848b8605Smrg{
870848b8605Smrg   window_pos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
871848b8605Smrg}
872848b8605Smrg
873848b8605Smrgvoid GLAPIENTRY
874848b8605Smrg_mesa_WindowPos3fv(const GLfloat *v)
875848b8605Smrg{
876848b8605Smrg   window_pos4f(v[0], v[1], v[2], 1.0);
877848b8605Smrg}
878848b8605Smrg
879848b8605Smrgvoid GLAPIENTRY
880848b8605Smrg_mesa_WindowPos3iv(const GLint *v)
881848b8605Smrg{
882848b8605Smrg   window_pos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
883848b8605Smrg}
884848b8605Smrg
885848b8605Smrgvoid GLAPIENTRY
886848b8605Smrg_mesa_WindowPos3sv(const GLshort *v)
887848b8605Smrg{
888848b8605Smrg   window_pos4f(v[0], v[1], v[2], 1.0F);
889848b8605Smrg}
890848b8605Smrg
891848b8605Smrgvoid GLAPIENTRY
892848b8605Smrg_mesa_WindowPos4dvMESA(const GLdouble *v)
893848b8605Smrg{
894848b8605Smrg   window_pos4f((GLfloat) v[0], (GLfloat) v[1],
895848b8605Smrg			 (GLfloat) v[2], (GLfloat) v[3]);
896848b8605Smrg}
897848b8605Smrg
898848b8605Smrgvoid GLAPIENTRY
899848b8605Smrg_mesa_WindowPos4fvMESA(const GLfloat *v)
900848b8605Smrg{
901848b8605Smrg   window_pos4f(v[0], v[1], v[2], v[3]);
902848b8605Smrg}
903848b8605Smrg
904848b8605Smrgvoid GLAPIENTRY
905848b8605Smrg_mesa_WindowPos4ivMESA(const GLint *v)
906848b8605Smrg{
907848b8605Smrg   window_pos4f((GLfloat) v[0], (GLfloat) v[1],
908848b8605Smrg			 (GLfloat) v[2], (GLfloat) v[3]);
909848b8605Smrg}
910848b8605Smrg
911848b8605Smrgvoid GLAPIENTRY
912848b8605Smrg_mesa_WindowPos4svMESA(const GLshort *v)
913848b8605Smrg{
914848b8605Smrg   window_pos4f(v[0], v[1], v[2], v[3]);
915848b8605Smrg}
916848b8605Smrg
917848b8605Smrg
918848b8605Smrg#if 0
919848b8605Smrg
920848b8605Smrg/*
921848b8605Smrg * OpenGL implementation of glWindowPos*MESA()
922848b8605Smrg */
923848b8605Smrgvoid glWindowPos4fMESA( GLfloat x, GLfloat y, GLfloat z, GLfloat w )
924848b8605Smrg{
925848b8605Smrg   GLfloat fx, fy;
926848b8605Smrg
927848b8605Smrg   /* Push current matrix mode and viewport attributes */
928848b8605Smrg   glPushAttrib( GL_TRANSFORM_BIT | GL_VIEWPORT_BIT );
929848b8605Smrg
930848b8605Smrg   /* Setup projection parameters */
931848b8605Smrg   glMatrixMode( GL_PROJECTION );
932848b8605Smrg   glPushMatrix();
933848b8605Smrg   glLoadIdentity();
934848b8605Smrg   glMatrixMode( GL_MODELVIEW );
935848b8605Smrg   glPushMatrix();
936848b8605Smrg   glLoadIdentity();
937848b8605Smrg
938848b8605Smrg   glDepthRange( z, z );
939848b8605Smrg   glViewport( (int) x - 1, (int) y - 1, 2, 2 );
940848b8605Smrg
941848b8605Smrg   /* set the raster (window) position */
942848b8605Smrg   fx = x - (int) x;
943848b8605Smrg   fy = y - (int) y;
944848b8605Smrg   glRasterPos4f( fx, fy, 0.0, w );
945848b8605Smrg
946848b8605Smrg   /* restore matrices, viewport and matrix mode */
947848b8605Smrg   glPopMatrix();
948848b8605Smrg   glMatrixMode( GL_PROJECTION );
949848b8605Smrg   glPopMatrix();
950848b8605Smrg
951848b8605Smrg   glPopAttrib();
952848b8605Smrg}
953848b8605Smrg
954848b8605Smrg#endif
955848b8605Smrg
956848b8605Smrg
957848b8605Smrg/**********************************************************************/
958848b8605Smrg/** \name Initialization                                              */
959848b8605Smrg/**********************************************************************/
960848b8605Smrg/*@{*/
961848b8605Smrg
962848b8605Smrg/**
963848b8605Smrg * Initialize the context current raster position information.
964848b8605Smrg *
965848b8605Smrg * \param ctx GL context.
966848b8605Smrg *
967848b8605Smrg * Initialize the current raster position information in
968848b8605Smrg * __struct gl_contextRec::Current, and adds the extension entry points to the
969848b8605Smrg * dispatcher.
970848b8605Smrg */
971848b8605Smrgvoid _mesa_init_rastpos( struct gl_context * ctx )
972848b8605Smrg{
973b8e80941Smrg   unsigned i;
974848b8605Smrg
975848b8605Smrg   ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 );
976848b8605Smrg   ctx->Current.RasterDistance = 0.0;
977848b8605Smrg   ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
978848b8605Smrg   ASSIGN_4V( ctx->Current.RasterSecondaryColor, 0.0, 0.0, 0.0, 1.0 );
979b8e80941Smrg   for (i = 0; i < ARRAY_SIZE(ctx->Current.RasterTexCoords); i++)
980848b8605Smrg      ASSIGN_4V( ctx->Current.RasterTexCoords[i], 0.0, 0.0, 0.0, 1.0 );
981848b8605Smrg   ctx->Current.RasterPosValid = GL_TRUE;
982848b8605Smrg}
983848b8605Smrg
984848b8605Smrg/*@}*/
985