1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Mesa 3-D graphics library
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
5*61046927SAndroid Build Coastguard Worker *
6*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
7*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
8*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
9*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
11*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
12*61046927SAndroid Build Coastguard Worker *
13*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included
14*61046927SAndroid Build Coastguard Worker * in all copies or substantial portions of the Software.
15*61046927SAndroid Build Coastguard Worker *
16*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17*61046927SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20*61046927SAndroid Build Coastguard Worker * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21*61046927SAndroid Build Coastguard Worker * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22*61046927SAndroid Build Coastguard Worker * OTHER DEALINGS IN THE SOFTWARE.
23*61046927SAndroid Build Coastguard Worker */
24*61046927SAndroid Build Coastguard Worker
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Worker /**
27*61046927SAndroid Build Coastguard Worker * \file rastpos.c
28*61046927SAndroid Build Coastguard Worker * Raster position operations.
29*61046927SAndroid Build Coastguard Worker */
30*61046927SAndroid Build Coastguard Worker
31*61046927SAndroid Build Coastguard Worker #include "util/glheader.h"
32*61046927SAndroid Build Coastguard Worker #include "context.h"
33*61046927SAndroid Build Coastguard Worker #include "feedback.h"
34*61046927SAndroid Build Coastguard Worker #include "macros.h"
35*61046927SAndroid Build Coastguard Worker #include "mtypes.h"
36*61046927SAndroid Build Coastguard Worker #include "rastpos.h"
37*61046927SAndroid Build Coastguard Worker #include "state.h"
38*61046927SAndroid Build Coastguard Worker #include "main/light.h"
39*61046927SAndroid Build Coastguard Worker #include "main/viewport.h"
40*61046927SAndroid Build Coastguard Worker #include "util/bitscan.h"
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Worker #include "state_tracker/st_cb_rasterpos.h"
43*61046927SAndroid Build Coastguard Worker #include "api_exec_decl.h"
44*61046927SAndroid Build Coastguard Worker
45*61046927SAndroid Build Coastguard Worker
46*61046927SAndroid Build Coastguard Worker /**
47*61046927SAndroid Build Coastguard Worker * Clip a point against the view volume.
48*61046927SAndroid Build Coastguard Worker *
49*61046927SAndroid Build Coastguard Worker * \param v vertex vector describing the point to clip.
50*61046927SAndroid Build Coastguard Worker *
51*61046927SAndroid Build Coastguard Worker * \return zero if outside view volume, or one if inside.
52*61046927SAndroid Build Coastguard Worker */
53*61046927SAndroid Build Coastguard Worker static GLuint
viewclip_point_xy(const GLfloat v[])54*61046927SAndroid Build Coastguard Worker viewclip_point_xy( const GLfloat v[] )
55*61046927SAndroid Build Coastguard Worker {
56*61046927SAndroid Build Coastguard Worker if ( v[0] > v[3] || v[0] < -v[3]
57*61046927SAndroid Build Coastguard Worker || v[1] > v[3] || v[1] < -v[3] ) {
58*61046927SAndroid Build Coastguard Worker return 0;
59*61046927SAndroid Build Coastguard Worker }
60*61046927SAndroid Build Coastguard Worker else {
61*61046927SAndroid Build Coastguard Worker return 1;
62*61046927SAndroid Build Coastguard Worker }
63*61046927SAndroid Build Coastguard Worker }
64*61046927SAndroid Build Coastguard Worker
65*61046927SAndroid Build Coastguard Worker
66*61046927SAndroid Build Coastguard Worker /**
67*61046927SAndroid Build Coastguard Worker * Clip a point against the near Z clipping planes.
68*61046927SAndroid Build Coastguard Worker *
69*61046927SAndroid Build Coastguard Worker * \param v vertex vector describing the point to clip.
70*61046927SAndroid Build Coastguard Worker *
71*61046927SAndroid Build Coastguard Worker * \return zero if outside view volume, or one if inside.
72*61046927SAndroid Build Coastguard Worker */
73*61046927SAndroid Build Coastguard Worker static GLuint
viewclip_point_near_z(const GLfloat v[])74*61046927SAndroid Build Coastguard Worker viewclip_point_near_z( const GLfloat v[] )
75*61046927SAndroid Build Coastguard Worker {
76*61046927SAndroid Build Coastguard Worker if (v[2] < -v[3]) {
77*61046927SAndroid Build Coastguard Worker return 0;
78*61046927SAndroid Build Coastguard Worker }
79*61046927SAndroid Build Coastguard Worker else {
80*61046927SAndroid Build Coastguard Worker return 1;
81*61046927SAndroid Build Coastguard Worker }
82*61046927SAndroid Build Coastguard Worker }
83*61046927SAndroid Build Coastguard Worker
84*61046927SAndroid Build Coastguard Worker
85*61046927SAndroid Build Coastguard Worker /**
86*61046927SAndroid Build Coastguard Worker * Clip a point against the far Z clipping planes.
87*61046927SAndroid Build Coastguard Worker *
88*61046927SAndroid Build Coastguard Worker * \param v vertex vector describing the point to clip.
89*61046927SAndroid Build Coastguard Worker *
90*61046927SAndroid Build Coastguard Worker * \return zero if outside view volume, or one if inside.
91*61046927SAndroid Build Coastguard Worker */
92*61046927SAndroid Build Coastguard Worker static GLuint
viewclip_point_far_z(const GLfloat v[])93*61046927SAndroid Build Coastguard Worker viewclip_point_far_z( const GLfloat v[] )
94*61046927SAndroid Build Coastguard Worker {
95*61046927SAndroid Build Coastguard Worker if (v[2] > v[3]) {
96*61046927SAndroid Build Coastguard Worker return 0;
97*61046927SAndroid Build Coastguard Worker }
98*61046927SAndroid Build Coastguard Worker else {
99*61046927SAndroid Build Coastguard Worker return 1;
100*61046927SAndroid Build Coastguard Worker }
101*61046927SAndroid Build Coastguard Worker }
102*61046927SAndroid Build Coastguard Worker
103*61046927SAndroid Build Coastguard Worker
104*61046927SAndroid Build Coastguard Worker /**
105*61046927SAndroid Build Coastguard Worker * Clip a point against the user clipping planes.
106*61046927SAndroid Build Coastguard Worker *
107*61046927SAndroid Build Coastguard Worker * \param ctx GL context.
108*61046927SAndroid Build Coastguard Worker * \param v vertex vector describing the point to clip.
109*61046927SAndroid Build Coastguard Worker *
110*61046927SAndroid Build Coastguard Worker * \return zero if the point was clipped, or one otherwise.
111*61046927SAndroid Build Coastguard Worker */
112*61046927SAndroid Build Coastguard Worker static GLuint
userclip_point(struct gl_context * ctx,const GLfloat v[])113*61046927SAndroid Build Coastguard Worker userclip_point( struct gl_context *ctx, const GLfloat v[] )
114*61046927SAndroid Build Coastguard Worker {
115*61046927SAndroid Build Coastguard Worker GLbitfield mask = ctx->Transform.ClipPlanesEnabled;
116*61046927SAndroid Build Coastguard Worker while (mask) {
117*61046927SAndroid Build Coastguard Worker const int p = u_bit_scan(&mask);
118*61046927SAndroid Build Coastguard Worker GLfloat dot = v[0] * ctx->Transform._ClipUserPlane[p][0]
119*61046927SAndroid Build Coastguard Worker + v[1] * ctx->Transform._ClipUserPlane[p][1]
120*61046927SAndroid Build Coastguard Worker + v[2] * ctx->Transform._ClipUserPlane[p][2]
121*61046927SAndroid Build Coastguard Worker + v[3] * ctx->Transform._ClipUserPlane[p][3];
122*61046927SAndroid Build Coastguard Worker
123*61046927SAndroid Build Coastguard Worker if (dot < 0.0F) {
124*61046927SAndroid Build Coastguard Worker return 0;
125*61046927SAndroid Build Coastguard Worker }
126*61046927SAndroid Build Coastguard Worker }
127*61046927SAndroid Build Coastguard Worker
128*61046927SAndroid Build Coastguard Worker return 1;
129*61046927SAndroid Build Coastguard Worker }
130*61046927SAndroid Build Coastguard Worker
131*61046927SAndroid Build Coastguard Worker
132*61046927SAndroid Build Coastguard Worker /**
133*61046927SAndroid Build Coastguard Worker * Compute lighting for the raster position. RGB modes computed.
134*61046927SAndroid Build Coastguard Worker * \param ctx the context
135*61046927SAndroid Build Coastguard Worker * \param vertex vertex location
136*61046927SAndroid Build Coastguard Worker * \param normal normal vector
137*61046927SAndroid Build Coastguard Worker * \param Rcolor returned color
138*61046927SAndroid Build Coastguard Worker * \param Rspec returned specular color (if separate specular enabled)
139*61046927SAndroid Build Coastguard Worker */
140*61046927SAndroid Build Coastguard Worker static void
shade_rastpos(struct gl_context * ctx,const GLfloat vertex[4],const GLfloat normal[3],GLfloat Rcolor[4],GLfloat Rspec[4])141*61046927SAndroid Build Coastguard Worker shade_rastpos(struct gl_context *ctx,
142*61046927SAndroid Build Coastguard Worker const GLfloat vertex[4],
143*61046927SAndroid Build Coastguard Worker const GLfloat normal[3],
144*61046927SAndroid Build Coastguard Worker GLfloat Rcolor[4],
145*61046927SAndroid Build Coastguard Worker GLfloat Rspec[4])
146*61046927SAndroid Build Coastguard Worker {
147*61046927SAndroid Build Coastguard Worker /*const*/ GLfloat (*base)[3] = ctx->Light._BaseColor;
148*61046927SAndroid Build Coastguard Worker GLbitfield mask;
149*61046927SAndroid Build Coastguard Worker GLfloat diffuseColor[4], specularColor[4]; /* for RGB mode only */
150*61046927SAndroid Build Coastguard Worker
151*61046927SAndroid Build Coastguard Worker _mesa_update_light_materials(ctx);
152*61046927SAndroid Build Coastguard Worker
153*61046927SAndroid Build Coastguard Worker COPY_3V(diffuseColor, base[0]);
154*61046927SAndroid Build Coastguard Worker diffuseColor[3] = CLAMP(
155*61046927SAndroid Build Coastguard Worker ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3], 0.0F, 1.0F );
156*61046927SAndroid Build Coastguard Worker ASSIGN_4V(specularColor, 0.0, 0.0, 0.0, 1.0);
157*61046927SAndroid Build Coastguard Worker
158*61046927SAndroid Build Coastguard Worker mask = ctx->Light._EnabledLights;
159*61046927SAndroid Build Coastguard Worker while (mask) {
160*61046927SAndroid Build Coastguard Worker const int i = u_bit_scan(&mask);
161*61046927SAndroid Build Coastguard Worker struct gl_light *light = &ctx->Light.Light[i];
162*61046927SAndroid Build Coastguard Worker struct gl_light_uniforms *lu = &ctx->Light.LightSource[i];
163*61046927SAndroid Build Coastguard Worker GLfloat attenuation = 1.0;
164*61046927SAndroid Build Coastguard Worker GLfloat VP[3]; /* vector from vertex to light pos */
165*61046927SAndroid Build Coastguard Worker GLfloat n_dot_VP;
166*61046927SAndroid Build Coastguard Worker GLfloat diffuseContrib[3], specularContrib[3];
167*61046927SAndroid Build Coastguard Worker
168*61046927SAndroid Build Coastguard Worker if (!(light->_Flags & LIGHT_POSITIONAL)) {
169*61046927SAndroid Build Coastguard Worker /* light at infinity */
170*61046927SAndroid Build Coastguard Worker COPY_3V(VP, light->_VP_inf_norm);
171*61046927SAndroid Build Coastguard Worker attenuation = light->_VP_inf_spot_attenuation;
172*61046927SAndroid Build Coastguard Worker }
173*61046927SAndroid Build Coastguard Worker else {
174*61046927SAndroid Build Coastguard Worker /* local/positional light */
175*61046927SAndroid Build Coastguard Worker GLfloat d;
176*61046927SAndroid Build Coastguard Worker
177*61046927SAndroid Build Coastguard Worker /* VP = vector from vertex pos to light[i].pos */
178*61046927SAndroid Build Coastguard Worker SUB_3V(VP, light->_Position, vertex);
179*61046927SAndroid Build Coastguard Worker /* d = length(VP) */
180*61046927SAndroid Build Coastguard Worker d = (GLfloat) LEN_3FV( VP );
181*61046927SAndroid Build Coastguard Worker if (d > 1.0e-6F) {
182*61046927SAndroid Build Coastguard Worker /* normalize VP */
183*61046927SAndroid Build Coastguard Worker GLfloat invd = 1.0F / d;
184*61046927SAndroid Build Coastguard Worker SELF_SCALE_SCALAR_3V(VP, invd);
185*61046927SAndroid Build Coastguard Worker }
186*61046927SAndroid Build Coastguard Worker
187*61046927SAndroid Build Coastguard Worker /* atti */
188*61046927SAndroid Build Coastguard Worker attenuation = 1.0F / (lu->ConstantAttenuation + d *
189*61046927SAndroid Build Coastguard Worker (lu->LinearAttenuation + d *
190*61046927SAndroid Build Coastguard Worker lu->QuadraticAttenuation));
191*61046927SAndroid Build Coastguard Worker
192*61046927SAndroid Build Coastguard Worker if (light->_Flags & LIGHT_SPOT) {
193*61046927SAndroid Build Coastguard Worker GLfloat PV_dot_dir = - DOT3(VP, light->_NormSpotDirection);
194*61046927SAndroid Build Coastguard Worker
195*61046927SAndroid Build Coastguard Worker if (PV_dot_dir<lu->_CosCutoff) {
196*61046927SAndroid Build Coastguard Worker continue;
197*61046927SAndroid Build Coastguard Worker }
198*61046927SAndroid Build Coastguard Worker else {
199*61046927SAndroid Build Coastguard Worker GLfloat spot = powf(PV_dot_dir, lu->SpotExponent);
200*61046927SAndroid Build Coastguard Worker attenuation *= spot;
201*61046927SAndroid Build Coastguard Worker }
202*61046927SAndroid Build Coastguard Worker }
203*61046927SAndroid Build Coastguard Worker }
204*61046927SAndroid Build Coastguard Worker
205*61046927SAndroid Build Coastguard Worker if (attenuation < 1e-3F)
206*61046927SAndroid Build Coastguard Worker continue;
207*61046927SAndroid Build Coastguard Worker
208*61046927SAndroid Build Coastguard Worker n_dot_VP = DOT3( normal, VP );
209*61046927SAndroid Build Coastguard Worker
210*61046927SAndroid Build Coastguard Worker if (n_dot_VP < 0.0F) {
211*61046927SAndroid Build Coastguard Worker ACC_SCALE_SCALAR_3V(diffuseColor, attenuation, light->_MatAmbient[0]);
212*61046927SAndroid Build Coastguard Worker continue;
213*61046927SAndroid Build Coastguard Worker }
214*61046927SAndroid Build Coastguard Worker
215*61046927SAndroid Build Coastguard Worker /* Ambient + diffuse */
216*61046927SAndroid Build Coastguard Worker COPY_3V(diffuseContrib, light->_MatAmbient[0]);
217*61046927SAndroid Build Coastguard Worker ACC_SCALE_SCALAR_3V(diffuseContrib, n_dot_VP, light->_MatDiffuse[0]);
218*61046927SAndroid Build Coastguard Worker
219*61046927SAndroid Build Coastguard Worker /* Specular */
220*61046927SAndroid Build Coastguard Worker {
221*61046927SAndroid Build Coastguard Worker const GLfloat *h;
222*61046927SAndroid Build Coastguard Worker GLfloat n_dot_h;
223*61046927SAndroid Build Coastguard Worker
224*61046927SAndroid Build Coastguard Worker ASSIGN_3V(specularContrib, 0.0, 0.0, 0.0);
225*61046927SAndroid Build Coastguard Worker
226*61046927SAndroid Build Coastguard Worker if (ctx->Light.Model.LocalViewer) {
227*61046927SAndroid Build Coastguard Worker GLfloat v[3];
228*61046927SAndroid Build Coastguard Worker COPY_3V(v, vertex);
229*61046927SAndroid Build Coastguard Worker NORMALIZE_3FV(v);
230*61046927SAndroid Build Coastguard Worker SUB_3V(VP, VP, v);
231*61046927SAndroid Build Coastguard Worker NORMALIZE_3FV(VP);
232*61046927SAndroid Build Coastguard Worker h = VP;
233*61046927SAndroid Build Coastguard Worker }
234*61046927SAndroid Build Coastguard Worker else if (light->_Flags & LIGHT_POSITIONAL) {
235*61046927SAndroid Build Coastguard Worker ACC_3V(VP, ctx->_EyeZDir);
236*61046927SAndroid Build Coastguard Worker NORMALIZE_3FV(VP);
237*61046927SAndroid Build Coastguard Worker h = VP;
238*61046927SAndroid Build Coastguard Worker }
239*61046927SAndroid Build Coastguard Worker else {
240*61046927SAndroid Build Coastguard Worker h = light->_h_inf_norm;
241*61046927SAndroid Build Coastguard Worker }
242*61046927SAndroid Build Coastguard Worker
243*61046927SAndroid Build Coastguard Worker n_dot_h = DOT3(normal, h);
244*61046927SAndroid Build Coastguard Worker
245*61046927SAndroid Build Coastguard Worker if (n_dot_h > 0.0F) {
246*61046927SAndroid Build Coastguard Worker GLfloat shine;
247*61046927SAndroid Build Coastguard Worker GLfloat spec_coef;
248*61046927SAndroid Build Coastguard Worker
249*61046927SAndroid Build Coastguard Worker shine = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_SHININESS][0];
250*61046927SAndroid Build Coastguard Worker spec_coef = powf(n_dot_h, shine);
251*61046927SAndroid Build Coastguard Worker
252*61046927SAndroid Build Coastguard Worker if (spec_coef > 1.0e-10F) {
253*61046927SAndroid Build Coastguard Worker if (ctx->Light.Model.ColorControl==GL_SEPARATE_SPECULAR_COLOR) {
254*61046927SAndroid Build Coastguard Worker ACC_SCALE_SCALAR_3V( specularContrib, spec_coef,
255*61046927SAndroid Build Coastguard Worker light->_MatSpecular[0]);
256*61046927SAndroid Build Coastguard Worker }
257*61046927SAndroid Build Coastguard Worker else {
258*61046927SAndroid Build Coastguard Worker ACC_SCALE_SCALAR_3V( diffuseContrib, spec_coef,
259*61046927SAndroid Build Coastguard Worker light->_MatSpecular[0]);
260*61046927SAndroid Build Coastguard Worker }
261*61046927SAndroid Build Coastguard Worker }
262*61046927SAndroid Build Coastguard Worker }
263*61046927SAndroid Build Coastguard Worker }
264*61046927SAndroid Build Coastguard Worker
265*61046927SAndroid Build Coastguard Worker ACC_SCALE_SCALAR_3V( diffuseColor, attenuation, diffuseContrib );
266*61046927SAndroid Build Coastguard Worker ACC_SCALE_SCALAR_3V( specularColor, attenuation, specularContrib );
267*61046927SAndroid Build Coastguard Worker }
268*61046927SAndroid Build Coastguard Worker
269*61046927SAndroid Build Coastguard Worker Rcolor[0] = CLAMP(diffuseColor[0], 0.0F, 1.0F);
270*61046927SAndroid Build Coastguard Worker Rcolor[1] = CLAMP(diffuseColor[1], 0.0F, 1.0F);
271*61046927SAndroid Build Coastguard Worker Rcolor[2] = CLAMP(diffuseColor[2], 0.0F, 1.0F);
272*61046927SAndroid Build Coastguard Worker Rcolor[3] = CLAMP(diffuseColor[3], 0.0F, 1.0F);
273*61046927SAndroid Build Coastguard Worker Rspec[0] = CLAMP(specularColor[0], 0.0F, 1.0F);
274*61046927SAndroid Build Coastguard Worker Rspec[1] = CLAMP(specularColor[1], 0.0F, 1.0F);
275*61046927SAndroid Build Coastguard Worker Rspec[2] = CLAMP(specularColor[2], 0.0F, 1.0F);
276*61046927SAndroid Build Coastguard Worker Rspec[3] = CLAMP(specularColor[3], 0.0F, 1.0F);
277*61046927SAndroid Build Coastguard Worker }
278*61046927SAndroid Build Coastguard Worker
279*61046927SAndroid Build Coastguard Worker
280*61046927SAndroid Build Coastguard Worker /**
281*61046927SAndroid Build Coastguard Worker * Do texgen needed for glRasterPos.
282*61046927SAndroid Build Coastguard Worker * \param ctx rendering context
283*61046927SAndroid Build Coastguard Worker * \param vObj object-space vertex coordinate
284*61046927SAndroid Build Coastguard Worker * \param vEye eye-space vertex coordinate
285*61046927SAndroid Build Coastguard Worker * \param normal vertex normal
286*61046927SAndroid Build Coastguard Worker * \param unit texture unit number
287*61046927SAndroid Build Coastguard Worker * \param texcoord incoming texcoord and resulting texcoord
288*61046927SAndroid Build Coastguard Worker */
289*61046927SAndroid Build Coastguard Worker static void
compute_texgen(struct gl_context * ctx,const GLfloat vObj[4],const GLfloat vEye[4],const GLfloat normal[3],GLuint unit,GLfloat texcoord[4])290*61046927SAndroid Build Coastguard Worker compute_texgen(struct gl_context *ctx, const GLfloat vObj[4], const GLfloat vEye[4],
291*61046927SAndroid Build Coastguard Worker const GLfloat normal[3], GLuint unit, GLfloat texcoord[4])
292*61046927SAndroid Build Coastguard Worker {
293*61046927SAndroid Build Coastguard Worker const struct gl_fixedfunc_texture_unit *texUnit =
294*61046927SAndroid Build Coastguard Worker &ctx->Texture.FixedFuncUnit[unit];
295*61046927SAndroid Build Coastguard Worker
296*61046927SAndroid Build Coastguard Worker /* always compute sphere map terms, just in case */
297*61046927SAndroid Build Coastguard Worker GLfloat u[3], two_nu, rx, ry, rz, m, mInv;
298*61046927SAndroid Build Coastguard Worker COPY_3V(u, vEye);
299*61046927SAndroid Build Coastguard Worker NORMALIZE_3FV(u);
300*61046927SAndroid Build Coastguard Worker two_nu = 2.0F * DOT3(normal, u);
301*61046927SAndroid Build Coastguard Worker rx = u[0] - normal[0] * two_nu;
302*61046927SAndroid Build Coastguard Worker ry = u[1] - normal[1] * two_nu;
303*61046927SAndroid Build Coastguard Worker rz = u[2] - normal[2] * two_nu;
304*61046927SAndroid Build Coastguard Worker m = rx * rx + ry * ry + (rz + 1.0F) * (rz + 1.0F);
305*61046927SAndroid Build Coastguard Worker if (m > 0.0F)
306*61046927SAndroid Build Coastguard Worker mInv = 0.5F * (1.0f / sqrtf(m));
307*61046927SAndroid Build Coastguard Worker else
308*61046927SAndroid Build Coastguard Worker mInv = 0.0F;
309*61046927SAndroid Build Coastguard Worker
310*61046927SAndroid Build Coastguard Worker if (texUnit->TexGenEnabled & S_BIT) {
311*61046927SAndroid Build Coastguard Worker switch (texUnit->GenS.Mode) {
312*61046927SAndroid Build Coastguard Worker case GL_OBJECT_LINEAR:
313*61046927SAndroid Build Coastguard Worker texcoord[0] = DOT4(vObj, texUnit->ObjectPlane[GEN_S]);
314*61046927SAndroid Build Coastguard Worker break;
315*61046927SAndroid Build Coastguard Worker case GL_EYE_LINEAR:
316*61046927SAndroid Build Coastguard Worker texcoord[0] = DOT4(vEye, texUnit->EyePlane[GEN_S]);
317*61046927SAndroid Build Coastguard Worker break;
318*61046927SAndroid Build Coastguard Worker case GL_SPHERE_MAP:
319*61046927SAndroid Build Coastguard Worker texcoord[0] = rx * mInv + 0.5F;
320*61046927SAndroid Build Coastguard Worker break;
321*61046927SAndroid Build Coastguard Worker case GL_REFLECTION_MAP:
322*61046927SAndroid Build Coastguard Worker texcoord[0] = rx;
323*61046927SAndroid Build Coastguard Worker break;
324*61046927SAndroid Build Coastguard Worker case GL_NORMAL_MAP:
325*61046927SAndroid Build Coastguard Worker texcoord[0] = normal[0];
326*61046927SAndroid Build Coastguard Worker break;
327*61046927SAndroid Build Coastguard Worker default:
328*61046927SAndroid Build Coastguard Worker _mesa_problem(ctx, "Bad S texgen in compute_texgen()");
329*61046927SAndroid Build Coastguard Worker return;
330*61046927SAndroid Build Coastguard Worker }
331*61046927SAndroid Build Coastguard Worker }
332*61046927SAndroid Build Coastguard Worker
333*61046927SAndroid Build Coastguard Worker if (texUnit->TexGenEnabled & T_BIT) {
334*61046927SAndroid Build Coastguard Worker switch (texUnit->GenT.Mode) {
335*61046927SAndroid Build Coastguard Worker case GL_OBJECT_LINEAR:
336*61046927SAndroid Build Coastguard Worker texcoord[1] = DOT4(vObj, texUnit->ObjectPlane[GEN_T]);
337*61046927SAndroid Build Coastguard Worker break;
338*61046927SAndroid Build Coastguard Worker case GL_EYE_LINEAR:
339*61046927SAndroid Build Coastguard Worker texcoord[1] = DOT4(vEye, texUnit->EyePlane[GEN_T]);
340*61046927SAndroid Build Coastguard Worker break;
341*61046927SAndroid Build Coastguard Worker case GL_SPHERE_MAP:
342*61046927SAndroid Build Coastguard Worker texcoord[1] = ry * mInv + 0.5F;
343*61046927SAndroid Build Coastguard Worker break;
344*61046927SAndroid Build Coastguard Worker case GL_REFLECTION_MAP:
345*61046927SAndroid Build Coastguard Worker texcoord[1] = ry;
346*61046927SAndroid Build Coastguard Worker break;
347*61046927SAndroid Build Coastguard Worker case GL_NORMAL_MAP:
348*61046927SAndroid Build Coastguard Worker texcoord[1] = normal[1];
349*61046927SAndroid Build Coastguard Worker break;
350*61046927SAndroid Build Coastguard Worker default:
351*61046927SAndroid Build Coastguard Worker _mesa_problem(ctx, "Bad T texgen in compute_texgen()");
352*61046927SAndroid Build Coastguard Worker return;
353*61046927SAndroid Build Coastguard Worker }
354*61046927SAndroid Build Coastguard Worker }
355*61046927SAndroid Build Coastguard Worker
356*61046927SAndroid Build Coastguard Worker if (texUnit->TexGenEnabled & R_BIT) {
357*61046927SAndroid Build Coastguard Worker switch (texUnit->GenR.Mode) {
358*61046927SAndroid Build Coastguard Worker case GL_OBJECT_LINEAR:
359*61046927SAndroid Build Coastguard Worker texcoord[2] = DOT4(vObj, texUnit->ObjectPlane[GEN_R]);
360*61046927SAndroid Build Coastguard Worker break;
361*61046927SAndroid Build Coastguard Worker case GL_EYE_LINEAR:
362*61046927SAndroid Build Coastguard Worker texcoord[2] = DOT4(vEye, texUnit->EyePlane[GEN_R]);
363*61046927SAndroid Build Coastguard Worker break;
364*61046927SAndroid Build Coastguard Worker case GL_REFLECTION_MAP:
365*61046927SAndroid Build Coastguard Worker texcoord[2] = rz;
366*61046927SAndroid Build Coastguard Worker break;
367*61046927SAndroid Build Coastguard Worker case GL_NORMAL_MAP:
368*61046927SAndroid Build Coastguard Worker texcoord[2] = normal[2];
369*61046927SAndroid Build Coastguard Worker break;
370*61046927SAndroid Build Coastguard Worker default:
371*61046927SAndroid Build Coastguard Worker _mesa_problem(ctx, "Bad R texgen in compute_texgen()");
372*61046927SAndroid Build Coastguard Worker return;
373*61046927SAndroid Build Coastguard Worker }
374*61046927SAndroid Build Coastguard Worker }
375*61046927SAndroid Build Coastguard Worker
376*61046927SAndroid Build Coastguard Worker if (texUnit->TexGenEnabled & Q_BIT) {
377*61046927SAndroid Build Coastguard Worker switch (texUnit->GenQ.Mode) {
378*61046927SAndroid Build Coastguard Worker case GL_OBJECT_LINEAR:
379*61046927SAndroid Build Coastguard Worker texcoord[3] = DOT4(vObj, texUnit->ObjectPlane[GEN_Q]);
380*61046927SAndroid Build Coastguard Worker break;
381*61046927SAndroid Build Coastguard Worker case GL_EYE_LINEAR:
382*61046927SAndroid Build Coastguard Worker texcoord[3] = DOT4(vEye, texUnit->EyePlane[GEN_Q]);
383*61046927SAndroid Build Coastguard Worker break;
384*61046927SAndroid Build Coastguard Worker default:
385*61046927SAndroid Build Coastguard Worker _mesa_problem(ctx, "Bad Q texgen in compute_texgen()");
386*61046927SAndroid Build Coastguard Worker return;
387*61046927SAndroid Build Coastguard Worker }
388*61046927SAndroid Build Coastguard Worker }
389*61046927SAndroid Build Coastguard Worker }
390*61046927SAndroid Build Coastguard Worker
391*61046927SAndroid Build Coastguard Worker
392*61046927SAndroid Build Coastguard Worker /**
393*61046927SAndroid Build Coastguard Worker * glRasterPos transformation.
394*61046927SAndroid Build Coastguard Worker *
395*61046927SAndroid Build Coastguard Worker * \param vObj vertex position in object space
396*61046927SAndroid Build Coastguard Worker */
397*61046927SAndroid Build Coastguard Worker void
_mesa_RasterPos(struct gl_context * ctx,const GLfloat vObj[4])398*61046927SAndroid Build Coastguard Worker _mesa_RasterPos(struct gl_context *ctx, const GLfloat vObj[4])
399*61046927SAndroid Build Coastguard Worker {
400*61046927SAndroid Build Coastguard Worker ctx->PopAttribState |= GL_CURRENT_BIT;
401*61046927SAndroid Build Coastguard Worker
402*61046927SAndroid Build Coastguard Worker if (_mesa_arb_vertex_program_enabled(ctx)) {
403*61046927SAndroid Build Coastguard Worker /* XXX implement this */
404*61046927SAndroid Build Coastguard Worker _mesa_problem(ctx, "Vertex programs not implemented for glRasterPos");
405*61046927SAndroid Build Coastguard Worker return;
406*61046927SAndroid Build Coastguard Worker }
407*61046927SAndroid Build Coastguard Worker else {
408*61046927SAndroid Build Coastguard Worker GLfloat eye[4], clip[4], ndc[3], d;
409*61046927SAndroid Build Coastguard Worker GLfloat *norm, eyenorm[3];
410*61046927SAndroid Build Coastguard Worker GLfloat *objnorm = ctx->Current.Attrib[VERT_ATTRIB_NORMAL];
411*61046927SAndroid Build Coastguard Worker float scale[3], translate[3];
412*61046927SAndroid Build Coastguard Worker
413*61046927SAndroid Build Coastguard Worker /* apply modelview matrix: eye = MV * obj */
414*61046927SAndroid Build Coastguard Worker TRANSFORM_POINT( eye, ctx->ModelviewMatrixStack.Top->m, vObj );
415*61046927SAndroid Build Coastguard Worker /* apply projection matrix: clip = Proj * eye */
416*61046927SAndroid Build Coastguard Worker TRANSFORM_POINT( clip, ctx->ProjectionMatrixStack.Top->m, eye );
417*61046927SAndroid Build Coastguard Worker
418*61046927SAndroid Build Coastguard Worker /* clip to view volume. */
419*61046927SAndroid Build Coastguard Worker if (!ctx->Transform.DepthClampNear) {
420*61046927SAndroid Build Coastguard Worker if (viewclip_point_near_z(clip) == 0) {
421*61046927SAndroid Build Coastguard Worker ctx->Current.RasterPosValid = GL_FALSE;
422*61046927SAndroid Build Coastguard Worker return;
423*61046927SAndroid Build Coastguard Worker }
424*61046927SAndroid Build Coastguard Worker }
425*61046927SAndroid Build Coastguard Worker if (!ctx->Transform.DepthClampFar) {
426*61046927SAndroid Build Coastguard Worker if (viewclip_point_far_z(clip) == 0) {
427*61046927SAndroid Build Coastguard Worker ctx->Current.RasterPosValid = GL_FALSE;
428*61046927SAndroid Build Coastguard Worker return;
429*61046927SAndroid Build Coastguard Worker }
430*61046927SAndroid Build Coastguard Worker }
431*61046927SAndroid Build Coastguard Worker if (!ctx->Transform.RasterPositionUnclipped) {
432*61046927SAndroid Build Coastguard Worker if (viewclip_point_xy(clip) == 0) {
433*61046927SAndroid Build Coastguard Worker ctx->Current.RasterPosValid = GL_FALSE;
434*61046927SAndroid Build Coastguard Worker return;
435*61046927SAndroid Build Coastguard Worker }
436*61046927SAndroid Build Coastguard Worker }
437*61046927SAndroid Build Coastguard Worker
438*61046927SAndroid Build Coastguard Worker /* clip to user clipping planes */
439*61046927SAndroid Build Coastguard Worker if (ctx->Transform.ClipPlanesEnabled && !userclip_point(ctx, clip)) {
440*61046927SAndroid Build Coastguard Worker ctx->Current.RasterPosValid = GL_FALSE;
441*61046927SAndroid Build Coastguard Worker return;
442*61046927SAndroid Build Coastguard Worker }
443*61046927SAndroid Build Coastguard Worker
444*61046927SAndroid Build Coastguard Worker /* ndc = clip / W */
445*61046927SAndroid Build Coastguard Worker d = (clip[3] == 0.0F) ? 1.0F : 1.0F / clip[3];
446*61046927SAndroid Build Coastguard Worker ndc[0] = clip[0] * d;
447*61046927SAndroid Build Coastguard Worker ndc[1] = clip[1] * d;
448*61046927SAndroid Build Coastguard Worker ndc[2] = clip[2] * d;
449*61046927SAndroid Build Coastguard Worker /* wincoord = viewport_mapping(ndc) */
450*61046927SAndroid Build Coastguard Worker _mesa_get_viewport_xform(ctx, 0, scale, translate);
451*61046927SAndroid Build Coastguard Worker ctx->Current.RasterPos[0] = ndc[0] * scale[0] + translate[0];
452*61046927SAndroid Build Coastguard Worker ctx->Current.RasterPos[1] = ndc[1] * scale[1] + translate[1];
453*61046927SAndroid Build Coastguard Worker ctx->Current.RasterPos[2] = ndc[2] * scale[2] + translate[2];
454*61046927SAndroid Build Coastguard Worker ctx->Current.RasterPos[3] = clip[3];
455*61046927SAndroid Build Coastguard Worker
456*61046927SAndroid Build Coastguard Worker if (ctx->Transform.DepthClampNear &&
457*61046927SAndroid Build Coastguard Worker ctx->Transform.DepthClampFar) {
458*61046927SAndroid Build Coastguard Worker ctx->Current.RasterPos[3] = CLAMP(ctx->Current.RasterPos[3],
459*61046927SAndroid Build Coastguard Worker ctx->ViewportArray[0].Near,
460*61046927SAndroid Build Coastguard Worker ctx->ViewportArray[0].Far);
461*61046927SAndroid Build Coastguard Worker } else {
462*61046927SAndroid Build Coastguard Worker /* Clamp against near and far plane separately */
463*61046927SAndroid Build Coastguard Worker if (ctx->Transform.DepthClampNear) {
464*61046927SAndroid Build Coastguard Worker ctx->Current.RasterPos[3] = MAX2(ctx->Current.RasterPos[3],
465*61046927SAndroid Build Coastguard Worker ctx->ViewportArray[0].Near);
466*61046927SAndroid Build Coastguard Worker }
467*61046927SAndroid Build Coastguard Worker
468*61046927SAndroid Build Coastguard Worker if (ctx->Transform.DepthClampFar) {
469*61046927SAndroid Build Coastguard Worker ctx->Current.RasterPos[3] = MIN2(ctx->Current.RasterPos[3],
470*61046927SAndroid Build Coastguard Worker ctx->ViewportArray[0].Far);
471*61046927SAndroid Build Coastguard Worker }
472*61046927SAndroid Build Coastguard Worker }
473*61046927SAndroid Build Coastguard Worker
474*61046927SAndroid Build Coastguard Worker /* compute raster distance */
475*61046927SAndroid Build Coastguard Worker if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT)
476*61046927SAndroid Build Coastguard Worker ctx->Current.RasterDistance = ctx->Current.Attrib[VERT_ATTRIB_FOG][0];
477*61046927SAndroid Build Coastguard Worker else
478*61046927SAndroid Build Coastguard Worker ctx->Current.RasterDistance =
479*61046927SAndroid Build Coastguard Worker sqrtf( eye[0]*eye[0] + eye[1]*eye[1] + eye[2]*eye[2] );
480*61046927SAndroid Build Coastguard Worker
481*61046927SAndroid Build Coastguard Worker /* compute transformed normal vector (for lighting or texgen) */
482*61046927SAndroid Build Coastguard Worker if (ctx->_NeedEyeCoords) {
483*61046927SAndroid Build Coastguard Worker const GLfloat *inv = ctx->ModelviewMatrixStack.Top->inv;
484*61046927SAndroid Build Coastguard Worker TRANSFORM_NORMAL( eyenorm, objnorm, inv );
485*61046927SAndroid Build Coastguard Worker norm = eyenorm;
486*61046927SAndroid Build Coastguard Worker }
487*61046927SAndroid Build Coastguard Worker else {
488*61046927SAndroid Build Coastguard Worker norm = objnorm;
489*61046927SAndroid Build Coastguard Worker }
490*61046927SAndroid Build Coastguard Worker
491*61046927SAndroid Build Coastguard Worker /* update raster color */
492*61046927SAndroid Build Coastguard Worker if (ctx->Light.Enabled) {
493*61046927SAndroid Build Coastguard Worker /* lighting */
494*61046927SAndroid Build Coastguard Worker shade_rastpos( ctx, vObj, norm,
495*61046927SAndroid Build Coastguard Worker ctx->Current.RasterColor,
496*61046927SAndroid Build Coastguard Worker ctx->Current.RasterSecondaryColor );
497*61046927SAndroid Build Coastguard Worker }
498*61046927SAndroid Build Coastguard Worker else {
499*61046927SAndroid Build Coastguard Worker /* use current color */
500*61046927SAndroid Build Coastguard Worker COPY_4FV(ctx->Current.RasterColor,
501*61046927SAndroid Build Coastguard Worker ctx->Current.Attrib[VERT_ATTRIB_COLOR0]);
502*61046927SAndroid Build Coastguard Worker COPY_4FV(ctx->Current.RasterSecondaryColor,
503*61046927SAndroid Build Coastguard Worker ctx->Current.Attrib[VERT_ATTRIB_COLOR1]);
504*61046927SAndroid Build Coastguard Worker }
505*61046927SAndroid Build Coastguard Worker
506*61046927SAndroid Build Coastguard Worker /* texture coords */
507*61046927SAndroid Build Coastguard Worker {
508*61046927SAndroid Build Coastguard Worker GLuint u;
509*61046927SAndroid Build Coastguard Worker for (u = 0; u < ctx->Const.MaxTextureCoordUnits; u++) {
510*61046927SAndroid Build Coastguard Worker GLfloat tc[4];
511*61046927SAndroid Build Coastguard Worker COPY_4V(tc, ctx->Current.Attrib[VERT_ATTRIB_TEX0 + u]);
512*61046927SAndroid Build Coastguard Worker if (ctx->Texture.FixedFuncUnit[u].TexGenEnabled) {
513*61046927SAndroid Build Coastguard Worker compute_texgen(ctx, vObj, eye, norm, u, tc);
514*61046927SAndroid Build Coastguard Worker }
515*61046927SAndroid Build Coastguard Worker TRANSFORM_POINT(ctx->Current.RasterTexCoords[u],
516*61046927SAndroid Build Coastguard Worker ctx->TextureMatrixStack[u].Top->m, tc);
517*61046927SAndroid Build Coastguard Worker }
518*61046927SAndroid Build Coastguard Worker }
519*61046927SAndroid Build Coastguard Worker
520*61046927SAndroid Build Coastguard Worker ctx->Current.RasterPosValid = GL_TRUE;
521*61046927SAndroid Build Coastguard Worker }
522*61046927SAndroid Build Coastguard Worker
523*61046927SAndroid Build Coastguard Worker if (ctx->RenderMode == GL_SELECT) {
524*61046927SAndroid Build Coastguard Worker _mesa_update_hitflag( ctx, ctx->Current.RasterPos[2] );
525*61046927SAndroid Build Coastguard Worker }
526*61046927SAndroid Build Coastguard Worker }
527*61046927SAndroid Build Coastguard Worker
528*61046927SAndroid Build Coastguard Worker
529*61046927SAndroid Build Coastguard Worker /**
530*61046927SAndroid Build Coastguard Worker * Helper function for all the RasterPos functions.
531*61046927SAndroid Build Coastguard Worker */
532*61046927SAndroid Build Coastguard Worker static void
rasterpos(GLfloat x,GLfloat y,GLfloat z,GLfloat w)533*61046927SAndroid Build Coastguard Worker rasterpos(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
534*61046927SAndroid Build Coastguard Worker {
535*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
536*61046927SAndroid Build Coastguard Worker GLfloat p[4];
537*61046927SAndroid Build Coastguard Worker
538*61046927SAndroid Build Coastguard Worker p[0] = x;
539*61046927SAndroid Build Coastguard Worker p[1] = y;
540*61046927SAndroid Build Coastguard Worker p[2] = z;
541*61046927SAndroid Build Coastguard Worker p[3] = w;
542*61046927SAndroid Build Coastguard Worker
543*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, 0);
544*61046927SAndroid Build Coastguard Worker FLUSH_CURRENT(ctx, 0);
545*61046927SAndroid Build Coastguard Worker
546*61046927SAndroid Build Coastguard Worker if (ctx->NewState)
547*61046927SAndroid Build Coastguard Worker _mesa_update_state( ctx );
548*61046927SAndroid Build Coastguard Worker
549*61046927SAndroid Build Coastguard Worker st_RasterPos(ctx, p);
550*61046927SAndroid Build Coastguard Worker }
551*61046927SAndroid Build Coastguard Worker
552*61046927SAndroid Build Coastguard Worker
553*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos2d(GLdouble x,GLdouble y)554*61046927SAndroid Build Coastguard Worker _mesa_RasterPos2d(GLdouble x, GLdouble y)
555*61046927SAndroid Build Coastguard Worker {
556*61046927SAndroid Build Coastguard Worker rasterpos((GLfloat)x, (GLfloat)y, (GLfloat)0.0, (GLfloat)1.0);
557*61046927SAndroid Build Coastguard Worker }
558*61046927SAndroid Build Coastguard Worker
559*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos2f(GLfloat x,GLfloat y)560*61046927SAndroid Build Coastguard Worker _mesa_RasterPos2f(GLfloat x, GLfloat y)
561*61046927SAndroid Build Coastguard Worker {
562*61046927SAndroid Build Coastguard Worker rasterpos(x, y, 0.0F, 1.0F);
563*61046927SAndroid Build Coastguard Worker }
564*61046927SAndroid Build Coastguard Worker
565*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos2i(GLint x,GLint y)566*61046927SAndroid Build Coastguard Worker _mesa_RasterPos2i(GLint x, GLint y)
567*61046927SAndroid Build Coastguard Worker {
568*61046927SAndroid Build Coastguard Worker rasterpos((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
569*61046927SAndroid Build Coastguard Worker }
570*61046927SAndroid Build Coastguard Worker
571*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos2s(GLshort x,GLshort y)572*61046927SAndroid Build Coastguard Worker _mesa_RasterPos2s(GLshort x, GLshort y)
573*61046927SAndroid Build Coastguard Worker {
574*61046927SAndroid Build Coastguard Worker rasterpos(x, y, 0.0F, 1.0F);
575*61046927SAndroid Build Coastguard Worker }
576*61046927SAndroid Build Coastguard Worker
577*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos3d(GLdouble x,GLdouble y,GLdouble z)578*61046927SAndroid Build Coastguard Worker _mesa_RasterPos3d(GLdouble x, GLdouble y, GLdouble z)
579*61046927SAndroid Build Coastguard Worker {
580*61046927SAndroid Build Coastguard Worker rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
581*61046927SAndroid Build Coastguard Worker }
582*61046927SAndroid Build Coastguard Worker
583*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos3f(GLfloat x,GLfloat y,GLfloat z)584*61046927SAndroid Build Coastguard Worker _mesa_RasterPos3f(GLfloat x, GLfloat y, GLfloat z)
585*61046927SAndroid Build Coastguard Worker {
586*61046927SAndroid Build Coastguard Worker rasterpos(x, y, z, 1.0F);
587*61046927SAndroid Build Coastguard Worker }
588*61046927SAndroid Build Coastguard Worker
589*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos3i(GLint x,GLint y,GLint z)590*61046927SAndroid Build Coastguard Worker _mesa_RasterPos3i(GLint x, GLint y, GLint z)
591*61046927SAndroid Build Coastguard Worker {
592*61046927SAndroid Build Coastguard Worker rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
593*61046927SAndroid Build Coastguard Worker }
594*61046927SAndroid Build Coastguard Worker
595*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos3s(GLshort x,GLshort y,GLshort z)596*61046927SAndroid Build Coastguard Worker _mesa_RasterPos3s(GLshort x, GLshort y, GLshort z)
597*61046927SAndroid Build Coastguard Worker {
598*61046927SAndroid Build Coastguard Worker rasterpos(x, y, z, 1.0F);
599*61046927SAndroid Build Coastguard Worker }
600*61046927SAndroid Build Coastguard Worker
601*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos4d(GLdouble x,GLdouble y,GLdouble z,GLdouble w)602*61046927SAndroid Build Coastguard Worker _mesa_RasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
603*61046927SAndroid Build Coastguard Worker {
604*61046927SAndroid Build Coastguard Worker rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
605*61046927SAndroid Build Coastguard Worker }
606*61046927SAndroid Build Coastguard Worker
607*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos4f(GLfloat x,GLfloat y,GLfloat z,GLfloat w)608*61046927SAndroid Build Coastguard Worker _mesa_RasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
609*61046927SAndroid Build Coastguard Worker {
610*61046927SAndroid Build Coastguard Worker rasterpos(x, y, z, w);
611*61046927SAndroid Build Coastguard Worker }
612*61046927SAndroid Build Coastguard Worker
613*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos4i(GLint x,GLint y,GLint z,GLint w)614*61046927SAndroid Build Coastguard Worker _mesa_RasterPos4i(GLint x, GLint y, GLint z, GLint w)
615*61046927SAndroid Build Coastguard Worker {
616*61046927SAndroid Build Coastguard Worker rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
617*61046927SAndroid Build Coastguard Worker }
618*61046927SAndroid Build Coastguard Worker
619*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos4s(GLshort x,GLshort y,GLshort z,GLshort w)620*61046927SAndroid Build Coastguard Worker _mesa_RasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
621*61046927SAndroid Build Coastguard Worker {
622*61046927SAndroid Build Coastguard Worker rasterpos(x, y, z, w);
623*61046927SAndroid Build Coastguard Worker }
624*61046927SAndroid Build Coastguard Worker
625*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos2dv(const GLdouble * v)626*61046927SAndroid Build Coastguard Worker _mesa_RasterPos2dv(const GLdouble *v)
627*61046927SAndroid Build Coastguard Worker {
628*61046927SAndroid Build Coastguard Worker rasterpos((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
629*61046927SAndroid Build Coastguard Worker }
630*61046927SAndroid Build Coastguard Worker
631*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos2fv(const GLfloat * v)632*61046927SAndroid Build Coastguard Worker _mesa_RasterPos2fv(const GLfloat *v)
633*61046927SAndroid Build Coastguard Worker {
634*61046927SAndroid Build Coastguard Worker rasterpos(v[0], v[1], 0.0F, 1.0F);
635*61046927SAndroid Build Coastguard Worker }
636*61046927SAndroid Build Coastguard Worker
637*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos2iv(const GLint * v)638*61046927SAndroid Build Coastguard Worker _mesa_RasterPos2iv(const GLint *v)
639*61046927SAndroid Build Coastguard Worker {
640*61046927SAndroid Build Coastguard Worker rasterpos((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
641*61046927SAndroid Build Coastguard Worker }
642*61046927SAndroid Build Coastguard Worker
643*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos2sv(const GLshort * v)644*61046927SAndroid Build Coastguard Worker _mesa_RasterPos2sv(const GLshort *v)
645*61046927SAndroid Build Coastguard Worker {
646*61046927SAndroid Build Coastguard Worker rasterpos(v[0], v[1], 0.0F, 1.0F);
647*61046927SAndroid Build Coastguard Worker }
648*61046927SAndroid Build Coastguard Worker
649*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos3dv(const GLdouble * v)650*61046927SAndroid Build Coastguard Worker _mesa_RasterPos3dv(const GLdouble *v)
651*61046927SAndroid Build Coastguard Worker {
652*61046927SAndroid Build Coastguard Worker rasterpos((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
653*61046927SAndroid Build Coastguard Worker }
654*61046927SAndroid Build Coastguard Worker
655*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos3fv(const GLfloat * v)656*61046927SAndroid Build Coastguard Worker _mesa_RasterPos3fv(const GLfloat *v)
657*61046927SAndroid Build Coastguard Worker {
658*61046927SAndroid Build Coastguard Worker rasterpos(v[0], v[1], v[2], 1.0F);
659*61046927SAndroid Build Coastguard Worker }
660*61046927SAndroid Build Coastguard Worker
661*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos3iv(const GLint * v)662*61046927SAndroid Build Coastguard Worker _mesa_RasterPos3iv(const GLint *v)
663*61046927SAndroid Build Coastguard Worker {
664*61046927SAndroid Build Coastguard Worker rasterpos((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
665*61046927SAndroid Build Coastguard Worker }
666*61046927SAndroid Build Coastguard Worker
667*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos3sv(const GLshort * v)668*61046927SAndroid Build Coastguard Worker _mesa_RasterPos3sv(const GLshort *v)
669*61046927SAndroid Build Coastguard Worker {
670*61046927SAndroid Build Coastguard Worker rasterpos(v[0], v[1], v[2], 1.0F);
671*61046927SAndroid Build Coastguard Worker }
672*61046927SAndroid Build Coastguard Worker
673*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos4dv(const GLdouble * v)674*61046927SAndroid Build Coastguard Worker _mesa_RasterPos4dv(const GLdouble *v)
675*61046927SAndroid Build Coastguard Worker {
676*61046927SAndroid Build Coastguard Worker rasterpos((GLfloat) v[0], (GLfloat) v[1],
677*61046927SAndroid Build Coastguard Worker (GLfloat) v[2], (GLfloat) v[3]);
678*61046927SAndroid Build Coastguard Worker }
679*61046927SAndroid Build Coastguard Worker
680*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos4fv(const GLfloat * v)681*61046927SAndroid Build Coastguard Worker _mesa_RasterPos4fv(const GLfloat *v)
682*61046927SAndroid Build Coastguard Worker {
683*61046927SAndroid Build Coastguard Worker rasterpos(v[0], v[1], v[2], v[3]);
684*61046927SAndroid Build Coastguard Worker }
685*61046927SAndroid Build Coastguard Worker
686*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos4iv(const GLint * v)687*61046927SAndroid Build Coastguard Worker _mesa_RasterPos4iv(const GLint *v)
688*61046927SAndroid Build Coastguard Worker {
689*61046927SAndroid Build Coastguard Worker rasterpos((GLfloat) v[0], (GLfloat) v[1],
690*61046927SAndroid Build Coastguard Worker (GLfloat) v[2], (GLfloat) v[3]);
691*61046927SAndroid Build Coastguard Worker }
692*61046927SAndroid Build Coastguard Worker
693*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_RasterPos4sv(const GLshort * v)694*61046927SAndroid Build Coastguard Worker _mesa_RasterPos4sv(const GLshort *v)
695*61046927SAndroid Build Coastguard Worker {
696*61046927SAndroid Build Coastguard Worker rasterpos(v[0], v[1], v[2], v[3]);
697*61046927SAndroid Build Coastguard Worker }
698*61046927SAndroid Build Coastguard Worker
699*61046927SAndroid Build Coastguard Worker
700*61046927SAndroid Build Coastguard Worker /**********************************************************************/
701*61046927SAndroid Build Coastguard Worker /*** GL_ARB_window_pos / GL_MESA_window_pos ***/
702*61046927SAndroid Build Coastguard Worker /**********************************************************************/
703*61046927SAndroid Build Coastguard Worker
704*61046927SAndroid Build Coastguard Worker
705*61046927SAndroid Build Coastguard Worker /**
706*61046927SAndroid Build Coastguard Worker * All glWindowPosMESA and glWindowPosARB commands call this function to
707*61046927SAndroid Build Coastguard Worker * update the current raster position.
708*61046927SAndroid Build Coastguard Worker */
709*61046927SAndroid Build Coastguard Worker static void
window_pos3f(GLfloat x,GLfloat y,GLfloat z)710*61046927SAndroid Build Coastguard Worker window_pos3f(GLfloat x, GLfloat y, GLfloat z)
711*61046927SAndroid Build Coastguard Worker {
712*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
713*61046927SAndroid Build Coastguard Worker GLfloat z2;
714*61046927SAndroid Build Coastguard Worker
715*61046927SAndroid Build Coastguard Worker FLUSH_VERTICES(ctx, 0, GL_CURRENT_BIT);
716*61046927SAndroid Build Coastguard Worker FLUSH_CURRENT(ctx, 0);
717*61046927SAndroid Build Coastguard Worker
718*61046927SAndroid Build Coastguard Worker z2 = CLAMP(z, 0.0F, 1.0F)
719*61046927SAndroid Build Coastguard Worker * (ctx->ViewportArray[0].Far - ctx->ViewportArray[0].Near)
720*61046927SAndroid Build Coastguard Worker + ctx->ViewportArray[0].Near;
721*61046927SAndroid Build Coastguard Worker
722*61046927SAndroid Build Coastguard Worker /* set raster position */
723*61046927SAndroid Build Coastguard Worker ctx->Current.RasterPos[0] = x;
724*61046927SAndroid Build Coastguard Worker ctx->Current.RasterPos[1] = y;
725*61046927SAndroid Build Coastguard Worker ctx->Current.RasterPos[2] = z2;
726*61046927SAndroid Build Coastguard Worker ctx->Current.RasterPos[3] = 1.0F;
727*61046927SAndroid Build Coastguard Worker
728*61046927SAndroid Build Coastguard Worker ctx->Current.RasterPosValid = GL_TRUE;
729*61046927SAndroid Build Coastguard Worker
730*61046927SAndroid Build Coastguard Worker if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT)
731*61046927SAndroid Build Coastguard Worker ctx->Current.RasterDistance = ctx->Current.Attrib[VERT_ATTRIB_FOG][0];
732*61046927SAndroid Build Coastguard Worker else
733*61046927SAndroid Build Coastguard Worker ctx->Current.RasterDistance = 0.0;
734*61046927SAndroid Build Coastguard Worker
735*61046927SAndroid Build Coastguard Worker /* raster color = current color or index */
736*61046927SAndroid Build Coastguard Worker ctx->Current.RasterColor[0]
737*61046927SAndroid Build Coastguard Worker = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][0], 0.0F, 1.0F);
738*61046927SAndroid Build Coastguard Worker ctx->Current.RasterColor[1]
739*61046927SAndroid Build Coastguard Worker = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][1], 0.0F, 1.0F);
740*61046927SAndroid Build Coastguard Worker ctx->Current.RasterColor[2]
741*61046927SAndroid Build Coastguard Worker = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][2], 0.0F, 1.0F);
742*61046927SAndroid Build Coastguard Worker ctx->Current.RasterColor[3]
743*61046927SAndroid Build Coastguard Worker = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][3], 0.0F, 1.0F);
744*61046927SAndroid Build Coastguard Worker ctx->Current.RasterSecondaryColor[0]
745*61046927SAndroid Build Coastguard Worker = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][0], 0.0F, 1.0F);
746*61046927SAndroid Build Coastguard Worker ctx->Current.RasterSecondaryColor[1]
747*61046927SAndroid Build Coastguard Worker = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][1], 0.0F, 1.0F);
748*61046927SAndroid Build Coastguard Worker ctx->Current.RasterSecondaryColor[2]
749*61046927SAndroid Build Coastguard Worker = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][2], 0.0F, 1.0F);
750*61046927SAndroid Build Coastguard Worker ctx->Current.RasterSecondaryColor[3]
751*61046927SAndroid Build Coastguard Worker = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][3], 0.0F, 1.0F);
752*61046927SAndroid Build Coastguard Worker
753*61046927SAndroid Build Coastguard Worker /* raster texcoord = current texcoord */
754*61046927SAndroid Build Coastguard Worker {
755*61046927SAndroid Build Coastguard Worker GLuint texSet;
756*61046927SAndroid Build Coastguard Worker for (texSet = 0; texSet < ctx->Const.MaxTextureCoordUnits; texSet++) {
757*61046927SAndroid Build Coastguard Worker assert(texSet < ARRAY_SIZE(ctx->Current.RasterTexCoords));
758*61046927SAndroid Build Coastguard Worker COPY_4FV( ctx->Current.RasterTexCoords[texSet],
759*61046927SAndroid Build Coastguard Worker ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texSet] );
760*61046927SAndroid Build Coastguard Worker }
761*61046927SAndroid Build Coastguard Worker }
762*61046927SAndroid Build Coastguard Worker
763*61046927SAndroid Build Coastguard Worker if (ctx->RenderMode==GL_SELECT) {
764*61046927SAndroid Build Coastguard Worker _mesa_update_hitflag( ctx, ctx->Current.RasterPos[2] );
765*61046927SAndroid Build Coastguard Worker }
766*61046927SAndroid Build Coastguard Worker }
767*61046927SAndroid Build Coastguard Worker
768*61046927SAndroid Build Coastguard Worker
769*61046927SAndroid Build Coastguard Worker /* This is just to support the GL_MESA_window_pos version */
770*61046927SAndroid Build Coastguard Worker static void
window_pos4f(GLfloat x,GLfloat y,GLfloat z,GLfloat w)771*61046927SAndroid Build Coastguard Worker window_pos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
772*61046927SAndroid Build Coastguard Worker {
773*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
774*61046927SAndroid Build Coastguard Worker window_pos3f(x, y, z);
775*61046927SAndroid Build Coastguard Worker ctx->Current.RasterPos[3] = w;
776*61046927SAndroid Build Coastguard Worker }
777*61046927SAndroid Build Coastguard Worker
778*61046927SAndroid Build Coastguard Worker
779*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos2d(GLdouble x,GLdouble y)780*61046927SAndroid Build Coastguard Worker _mesa_WindowPos2d(GLdouble x, GLdouble y)
781*61046927SAndroid Build Coastguard Worker {
782*61046927SAndroid Build Coastguard Worker window_pos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
783*61046927SAndroid Build Coastguard Worker }
784*61046927SAndroid Build Coastguard Worker
785*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos2f(GLfloat x,GLfloat y)786*61046927SAndroid Build Coastguard Worker _mesa_WindowPos2f(GLfloat x, GLfloat y)
787*61046927SAndroid Build Coastguard Worker {
788*61046927SAndroid Build Coastguard Worker window_pos4f(x, y, 0.0F, 1.0F);
789*61046927SAndroid Build Coastguard Worker }
790*61046927SAndroid Build Coastguard Worker
791*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos2i(GLint x,GLint y)792*61046927SAndroid Build Coastguard Worker _mesa_WindowPos2i(GLint x, GLint y)
793*61046927SAndroid Build Coastguard Worker {
794*61046927SAndroid Build Coastguard Worker window_pos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
795*61046927SAndroid Build Coastguard Worker }
796*61046927SAndroid Build Coastguard Worker
797*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos2s(GLshort x,GLshort y)798*61046927SAndroid Build Coastguard Worker _mesa_WindowPos2s(GLshort x, GLshort y)
799*61046927SAndroid Build Coastguard Worker {
800*61046927SAndroid Build Coastguard Worker window_pos4f(x, y, 0.0F, 1.0F);
801*61046927SAndroid Build Coastguard Worker }
802*61046927SAndroid Build Coastguard Worker
803*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos3d(GLdouble x,GLdouble y,GLdouble z)804*61046927SAndroid Build Coastguard Worker _mesa_WindowPos3d(GLdouble x, GLdouble y, GLdouble z)
805*61046927SAndroid Build Coastguard Worker {
806*61046927SAndroid Build Coastguard Worker window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
807*61046927SAndroid Build Coastguard Worker }
808*61046927SAndroid Build Coastguard Worker
809*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos3f(GLfloat x,GLfloat y,GLfloat z)810*61046927SAndroid Build Coastguard Worker _mesa_WindowPos3f(GLfloat x, GLfloat y, GLfloat z)
811*61046927SAndroid Build Coastguard Worker {
812*61046927SAndroid Build Coastguard Worker window_pos4f(x, y, z, 1.0F);
813*61046927SAndroid Build Coastguard Worker }
814*61046927SAndroid Build Coastguard Worker
815*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos3i(GLint x,GLint y,GLint z)816*61046927SAndroid Build Coastguard Worker _mesa_WindowPos3i(GLint x, GLint y, GLint z)
817*61046927SAndroid Build Coastguard Worker {
818*61046927SAndroid Build Coastguard Worker window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
819*61046927SAndroid Build Coastguard Worker }
820*61046927SAndroid Build Coastguard Worker
821*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos3s(GLshort x,GLshort y,GLshort z)822*61046927SAndroid Build Coastguard Worker _mesa_WindowPos3s(GLshort x, GLshort y, GLshort z)
823*61046927SAndroid Build Coastguard Worker {
824*61046927SAndroid Build Coastguard Worker window_pos4f(x, y, z, 1.0F);
825*61046927SAndroid Build Coastguard Worker }
826*61046927SAndroid Build Coastguard Worker
827*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos4dMESA(GLdouble x,GLdouble y,GLdouble z,GLdouble w)828*61046927SAndroid Build Coastguard Worker _mesa_WindowPos4dMESA(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
829*61046927SAndroid Build Coastguard Worker {
830*61046927SAndroid Build Coastguard Worker window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
831*61046927SAndroid Build Coastguard Worker }
832*61046927SAndroid Build Coastguard Worker
833*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos4fMESA(GLfloat x,GLfloat y,GLfloat z,GLfloat w)834*61046927SAndroid Build Coastguard Worker _mesa_WindowPos4fMESA(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
835*61046927SAndroid Build Coastguard Worker {
836*61046927SAndroid Build Coastguard Worker window_pos4f(x, y, z, w);
837*61046927SAndroid Build Coastguard Worker }
838*61046927SAndroid Build Coastguard Worker
839*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos4iMESA(GLint x,GLint y,GLint z,GLint w)840*61046927SAndroid Build Coastguard Worker _mesa_WindowPos4iMESA(GLint x, GLint y, GLint z, GLint w)
841*61046927SAndroid Build Coastguard Worker {
842*61046927SAndroid Build Coastguard Worker window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
843*61046927SAndroid Build Coastguard Worker }
844*61046927SAndroid Build Coastguard Worker
845*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos4sMESA(GLshort x,GLshort y,GLshort z,GLshort w)846*61046927SAndroid Build Coastguard Worker _mesa_WindowPos4sMESA(GLshort x, GLshort y, GLshort z, GLshort w)
847*61046927SAndroid Build Coastguard Worker {
848*61046927SAndroid Build Coastguard Worker window_pos4f(x, y, z, w);
849*61046927SAndroid Build Coastguard Worker }
850*61046927SAndroid Build Coastguard Worker
851*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos2dv(const GLdouble * v)852*61046927SAndroid Build Coastguard Worker _mesa_WindowPos2dv(const GLdouble *v)
853*61046927SAndroid Build Coastguard Worker {
854*61046927SAndroid Build Coastguard Worker window_pos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
855*61046927SAndroid Build Coastguard Worker }
856*61046927SAndroid Build Coastguard Worker
857*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos2fv(const GLfloat * v)858*61046927SAndroid Build Coastguard Worker _mesa_WindowPos2fv(const GLfloat *v)
859*61046927SAndroid Build Coastguard Worker {
860*61046927SAndroid Build Coastguard Worker window_pos4f(v[0], v[1], 0.0F, 1.0F);
861*61046927SAndroid Build Coastguard Worker }
862*61046927SAndroid Build Coastguard Worker
863*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos2iv(const GLint * v)864*61046927SAndroid Build Coastguard Worker _mesa_WindowPos2iv(const GLint *v)
865*61046927SAndroid Build Coastguard Worker {
866*61046927SAndroid Build Coastguard Worker window_pos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
867*61046927SAndroid Build Coastguard Worker }
868*61046927SAndroid Build Coastguard Worker
869*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos2sv(const GLshort * v)870*61046927SAndroid Build Coastguard Worker _mesa_WindowPos2sv(const GLshort *v)
871*61046927SAndroid Build Coastguard Worker {
872*61046927SAndroid Build Coastguard Worker window_pos4f(v[0], v[1], 0.0F, 1.0F);
873*61046927SAndroid Build Coastguard Worker }
874*61046927SAndroid Build Coastguard Worker
875*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos3dv(const GLdouble * v)876*61046927SAndroid Build Coastguard Worker _mesa_WindowPos3dv(const GLdouble *v)
877*61046927SAndroid Build Coastguard Worker {
878*61046927SAndroid Build Coastguard Worker window_pos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
879*61046927SAndroid Build Coastguard Worker }
880*61046927SAndroid Build Coastguard Worker
881*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos3fv(const GLfloat * v)882*61046927SAndroid Build Coastguard Worker _mesa_WindowPos3fv(const GLfloat *v)
883*61046927SAndroid Build Coastguard Worker {
884*61046927SAndroid Build Coastguard Worker window_pos4f(v[0], v[1], v[2], 1.0);
885*61046927SAndroid Build Coastguard Worker }
886*61046927SAndroid Build Coastguard Worker
887*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos3iv(const GLint * v)888*61046927SAndroid Build Coastguard Worker _mesa_WindowPos3iv(const GLint *v)
889*61046927SAndroid Build Coastguard Worker {
890*61046927SAndroid Build Coastguard Worker window_pos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
891*61046927SAndroid Build Coastguard Worker }
892*61046927SAndroid Build Coastguard Worker
893*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos3sv(const GLshort * v)894*61046927SAndroid Build Coastguard Worker _mesa_WindowPos3sv(const GLshort *v)
895*61046927SAndroid Build Coastguard Worker {
896*61046927SAndroid Build Coastguard Worker window_pos4f(v[0], v[1], v[2], 1.0F);
897*61046927SAndroid Build Coastguard Worker }
898*61046927SAndroid Build Coastguard Worker
899*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos4dvMESA(const GLdouble * v)900*61046927SAndroid Build Coastguard Worker _mesa_WindowPos4dvMESA(const GLdouble *v)
901*61046927SAndroid Build Coastguard Worker {
902*61046927SAndroid Build Coastguard Worker window_pos4f((GLfloat) v[0], (GLfloat) v[1],
903*61046927SAndroid Build Coastguard Worker (GLfloat) v[2], (GLfloat) v[3]);
904*61046927SAndroid Build Coastguard Worker }
905*61046927SAndroid Build Coastguard Worker
906*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos4fvMESA(const GLfloat * v)907*61046927SAndroid Build Coastguard Worker _mesa_WindowPos4fvMESA(const GLfloat *v)
908*61046927SAndroid Build Coastguard Worker {
909*61046927SAndroid Build Coastguard Worker window_pos4f(v[0], v[1], v[2], v[3]);
910*61046927SAndroid Build Coastguard Worker }
911*61046927SAndroid Build Coastguard Worker
912*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos4ivMESA(const GLint * v)913*61046927SAndroid Build Coastguard Worker _mesa_WindowPos4ivMESA(const GLint *v)
914*61046927SAndroid Build Coastguard Worker {
915*61046927SAndroid Build Coastguard Worker window_pos4f((GLfloat) v[0], (GLfloat) v[1],
916*61046927SAndroid Build Coastguard Worker (GLfloat) v[2], (GLfloat) v[3]);
917*61046927SAndroid Build Coastguard Worker }
918*61046927SAndroid Build Coastguard Worker
919*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_WindowPos4svMESA(const GLshort * v)920*61046927SAndroid Build Coastguard Worker _mesa_WindowPos4svMESA(const GLshort *v)
921*61046927SAndroid Build Coastguard Worker {
922*61046927SAndroid Build Coastguard Worker window_pos4f(v[0], v[1], v[2], v[3]);
923*61046927SAndroid Build Coastguard Worker }
924*61046927SAndroid Build Coastguard Worker
925*61046927SAndroid Build Coastguard Worker
926*61046927SAndroid Build Coastguard Worker #if 0
927*61046927SAndroid Build Coastguard Worker
928*61046927SAndroid Build Coastguard Worker /*
929*61046927SAndroid Build Coastguard Worker * OpenGL implementation of glWindowPos*MESA()
930*61046927SAndroid Build Coastguard Worker */
931*61046927SAndroid Build Coastguard Worker void glWindowPos4fMESA( GLfloat x, GLfloat y, GLfloat z, GLfloat w )
932*61046927SAndroid Build Coastguard Worker {
933*61046927SAndroid Build Coastguard Worker GLfloat fx, fy;
934*61046927SAndroid Build Coastguard Worker
935*61046927SAndroid Build Coastguard Worker /* Push current matrix mode and viewport attributes */
936*61046927SAndroid Build Coastguard Worker glPushAttrib( GL_TRANSFORM_BIT | GL_VIEWPORT_BIT );
937*61046927SAndroid Build Coastguard Worker
938*61046927SAndroid Build Coastguard Worker /* Setup projection parameters */
939*61046927SAndroid Build Coastguard Worker glMatrixMode( GL_PROJECTION );
940*61046927SAndroid Build Coastguard Worker glPushMatrix();
941*61046927SAndroid Build Coastguard Worker glLoadIdentity();
942*61046927SAndroid Build Coastguard Worker glMatrixMode( GL_MODELVIEW );
943*61046927SAndroid Build Coastguard Worker glPushMatrix();
944*61046927SAndroid Build Coastguard Worker glLoadIdentity();
945*61046927SAndroid Build Coastguard Worker
946*61046927SAndroid Build Coastguard Worker glDepthRange( z, z );
947*61046927SAndroid Build Coastguard Worker glViewport( (int) x - 1, (int) y - 1, 2, 2 );
948*61046927SAndroid Build Coastguard Worker
949*61046927SAndroid Build Coastguard Worker /* set the raster (window) position */
950*61046927SAndroid Build Coastguard Worker fx = x - (int) x;
951*61046927SAndroid Build Coastguard Worker fy = y - (int) y;
952*61046927SAndroid Build Coastguard Worker glRasterPos4f( fx, fy, 0.0, w );
953*61046927SAndroid Build Coastguard Worker
954*61046927SAndroid Build Coastguard Worker /* restore matrices, viewport and matrix mode */
955*61046927SAndroid Build Coastguard Worker glPopMatrix();
956*61046927SAndroid Build Coastguard Worker glMatrixMode( GL_PROJECTION );
957*61046927SAndroid Build Coastguard Worker glPopMatrix();
958*61046927SAndroid Build Coastguard Worker
959*61046927SAndroid Build Coastguard Worker glPopAttrib();
960*61046927SAndroid Build Coastguard Worker }
961*61046927SAndroid Build Coastguard Worker
962*61046927SAndroid Build Coastguard Worker #endif
963*61046927SAndroid Build Coastguard Worker
964*61046927SAndroid Build Coastguard Worker
965*61046927SAndroid Build Coastguard Worker /**********************************************************************/
966*61046927SAndroid Build Coastguard Worker /** \name Initialization */
967*61046927SAndroid Build Coastguard Worker /**********************************************************************/
968*61046927SAndroid Build Coastguard Worker /*@{*/
969*61046927SAndroid Build Coastguard Worker
970*61046927SAndroid Build Coastguard Worker /**
971*61046927SAndroid Build Coastguard Worker * Initialize the context current raster position information.
972*61046927SAndroid Build Coastguard Worker *
973*61046927SAndroid Build Coastguard Worker * \param ctx GL context.
974*61046927SAndroid Build Coastguard Worker *
975*61046927SAndroid Build Coastguard Worker * Initialize the current raster position information in
976*61046927SAndroid Build Coastguard Worker * __struct gl_contextRec::Current, and adds the extension entry points to the
977*61046927SAndroid Build Coastguard Worker * dispatcher.
978*61046927SAndroid Build Coastguard Worker */
_mesa_init_rastpos(struct gl_context * ctx)979*61046927SAndroid Build Coastguard Worker void _mesa_init_rastpos( struct gl_context * ctx )
980*61046927SAndroid Build Coastguard Worker {
981*61046927SAndroid Build Coastguard Worker unsigned i;
982*61046927SAndroid Build Coastguard Worker
983*61046927SAndroid Build Coastguard Worker ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 );
984*61046927SAndroid Build Coastguard Worker ctx->Current.RasterDistance = 0.0;
985*61046927SAndroid Build Coastguard Worker ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
986*61046927SAndroid Build Coastguard Worker ASSIGN_4V( ctx->Current.RasterSecondaryColor, 0.0, 0.0, 0.0, 1.0 );
987*61046927SAndroid Build Coastguard Worker for (i = 0; i < ARRAY_SIZE(ctx->Current.RasterTexCoords); i++)
988*61046927SAndroid Build Coastguard Worker ASSIGN_4V( ctx->Current.RasterTexCoords[i], 0.0, 0.0, 0.0, 1.0 );
989*61046927SAndroid Build Coastguard Worker ctx->Current.RasterPosValid = GL_TRUE;
990*61046927SAndroid Build Coastguard Worker }
991*61046927SAndroid Build Coastguard Worker
992*61046927SAndroid Build Coastguard Worker /*@}*/
993