X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Frastpos.c;h=9f309d6ab846679aafc51e97d10bc89c6eec2a73;hb=7b568614a28cb0b0fec375e79aebf51a6f210b44;hp=79ec481267a1ca0686d0229b03219853f2ba6590;hpb=51c0c71811508b6658e0d5dcff8426b618322a73;p=mesa.git diff --git a/src/mesa/main/rastpos.c b/src/mesa/main/rastpos.c index 79ec481267a..9f309d6ab84 100644 --- a/src/mesa/main/rastpos.c +++ b/src/mesa/main/rastpos.c @@ -1,10 +1,8 @@ -/* $Id: rastpos.c,v 1.23 2001/04/28 08:39:17 keithw Exp $ */ - /* * Mesa 3-D graphics library - * Version: 3.5 + * Version: 6.5.3 * - * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -25,460 +23,486 @@ */ -#ifdef PC_HEADER -#include "all.h" -#else +/** + * \file rastpos.c + * Raster position operations. + */ + #include "glheader.h" -#include "clip.h" -#include "colormac.h" #include "context.h" #include "feedback.h" -#include "light.h" #include "macros.h" -#include "mmath.h" #include "rastpos.h" #include "state.h" -#include "simple_list.h" -#include "mtypes.h" -#include "math/m_matrix.h" -#include "math/m_xform.h" -#endif - -/* - * Clip a point against the view volume. - * Input: v - vertex-vector describing the point to clip - * Return: 0 = outside view volume - * 1 = inside view volume +/** + * Helper function for all the RasterPos functions. */ -static GLuint -viewclip_point( const GLfloat v[] ) +static void +rasterpos(GLfloat x, GLfloat y, GLfloat z, GLfloat w) { - if ( v[0] > v[3] || v[0] < -v[3] - || v[1] > v[3] || v[1] < -v[3] - || v[2] > v[3] || v[2] < -v[3] ) { - return 0; - } - else { - return 1; - } + GET_CURRENT_CONTEXT(ctx); + GLfloat p[4]; + + p[0] = x; + p[1] = y; + p[2] = z; + p[3] = w; + + ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); + FLUSH_CURRENT(ctx, 0); + + if (ctx->NewState) + _mesa_update_state( ctx ); + + ctx->Driver.RasterPos(ctx, p); } -/* - * Clip a point against the user clipping planes. - * Input: v - vertex-vector describing the point to clip. - * Return: 0 = point was clipped - * 1 = point not clipped - */ -static GLuint -userclip_point( GLcontext* ctx, const GLfloat v[] ) -{ - GLuint p; - - for (p = 0; p < ctx->Const.MaxClipPlanes; p++) { - if (ctx->Transform.ClipEnabled[p]) { - GLfloat dot = v[0] * ctx->Transform._ClipUserPlane[p][0] - + v[1] * ctx->Transform._ClipUserPlane[p][1] - + v[2] * ctx->Transform._ClipUserPlane[p][2] - + v[3] * ctx->Transform._ClipUserPlane[p][3]; - if (dot < 0.0F) { - return 0; - } - } - } +void GLAPIENTRY +_mesa_RasterPos2d(GLdouble x, GLdouble y) +{ + rasterpos((GLfloat)x, (GLfloat)y, (GLfloat)0.0, (GLfloat)1.0); +} - return 1; +void GLAPIENTRY +_mesa_RasterPos2f(GLfloat x, GLfloat y) +{ + rasterpos(x, y, 0.0F, 1.0F); } +void GLAPIENTRY +_mesa_RasterPos2i(GLint x, GLint y) +{ + rasterpos((GLfloat) x, (GLfloat) y, 0.0F, 1.0F); +} -/* This has been split off to allow the normal shade routines to - * get a little closer to the vertex buffer, and to use the - * GLvector objects directly. - */ -static void -shade_rastpos(GLcontext *ctx, - const GLfloat vertex[4], - const GLfloat normal[3], - GLfloat Rcolor[4], - GLuint *index) -{ - GLfloat (*base)[3] = ctx->Light._BaseColor; - const GLchan *sumA = ctx->Light._BaseAlpha; - struct gl_light *light; - GLfloat color[4]; - GLfloat diffuse = 0, specular = 0; - - COPY_3V(color, base[0]); - color[3] = CHAN_TO_FLOAT( sumA[0] ); - - foreach (light, &ctx->Light.EnabledList) { - GLfloat n_dot_h; - GLfloat attenuation = 1.0; - GLfloat VP[3]; - GLfloat n_dot_VP; - GLfloat *h; - GLfloat contrib[3]; - GLboolean normalized; - - if (!(light->_Flags & LIGHT_POSITIONAL)) { - COPY_3V(VP, light->_VP_inf_norm); - attenuation = light->_VP_inf_spot_attenuation; - } - else { - GLfloat d; - - SUB_3V(VP, light->_Position, vertex); - d = LEN_3FV( VP ); - - if ( d > 1e-6) { - GLfloat invd = 1.0F / d; - SELF_SCALE_SCALAR_3V(VP, invd); - } - attenuation = 1.0F / (light->ConstantAttenuation + d * - (light->LinearAttenuation + d * - light->QuadraticAttenuation)); - - if (light->_Flags & LIGHT_SPOT) { - GLfloat PV_dot_dir = - DOT3(VP, light->_NormDirection); - - if (PV_dot_dir_CosCutoff) { - continue; - } - else { - double x = PV_dot_dir * (EXP_TABLE_SIZE-1); - int k = (int) x; - GLfloat spot = (GLfloat) (light->_SpotExpTable[k][0] - + (x-k)*light->_SpotExpTable[k][1]); - attenuation *= spot; - } - } - } +void GLAPIENTRY +_mesa_RasterPos2s(GLshort x, GLshort y) +{ + rasterpos(x, y, 0.0F, 1.0F); +} - if (attenuation < 1e-3) - continue; +void GLAPIENTRY +_mesa_RasterPos3d(GLdouble x, GLdouble y, GLdouble z) +{ + rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F); +} - n_dot_VP = DOT3( normal, VP ); +void GLAPIENTRY +_mesa_RasterPos3f(GLfloat x, GLfloat y, GLfloat z) +{ + rasterpos(x, y, z, 1.0F); +} - if (n_dot_VP < 0.0F) { - ACC_SCALE_SCALAR_3V(color, attenuation, light->_MatAmbient[0]); - continue; - } +void GLAPIENTRY +_mesa_RasterPos3i(GLint x, GLint y, GLint z) +{ + rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F); +} - COPY_3V(contrib, light->_MatAmbient[0]); - ACC_SCALE_SCALAR_3V(contrib, n_dot_VP, light->_MatDiffuse[0]); - diffuse += n_dot_VP * light->_dli * attenuation; - - { - if (ctx->Light.Model.LocalViewer) { - GLfloat v[3]; - COPY_3V(v, vertex); - NORMALIZE_3FV(v); - SUB_3V(VP, VP, v); - h = VP; - normalized = 0; - } - else if (light->_Flags & LIGHT_POSITIONAL) { - h = VP; - ACC_3V(h, ctx->_EyeZDir); - normalized = 0; - } - else { - h = light->_h_inf_norm; - normalized = 1; - } - - n_dot_h = DOT3(normal, h); - - if (n_dot_h > 0.0F) { - struct gl_material *mat = &ctx->Light.Material[0]; - GLfloat spec_coef; - GLfloat shininess = mat->Shininess; - - if (!normalized) { - n_dot_h *= n_dot_h; - n_dot_h /= LEN_SQUARED_3FV( h ); - shininess *= .5; - } - - GET_SHINE_TAB_ENTRY( ctx->_ShineTable[0], n_dot_h, spec_coef ); - - if (spec_coef > 1.0e-10) { - ACC_SCALE_SCALAR_3V( contrib, spec_coef, - light->_MatSpecular[0]); - specular += spec_coef * light->_sli * attenuation; - } - } - } +void GLAPIENTRY +_mesa_RasterPos3s(GLshort x, GLshort y, GLshort z) +{ + rasterpos(x, y, z, 1.0F); +} - ACC_SCALE_SCALAR_3V( color, attenuation, contrib ); - } +void GLAPIENTRY +_mesa_RasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w) +{ + rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w); +} - if (ctx->Visual.rgbMode) { - Rcolor[0] = CLAMP(color[0], 0.0F, 1.0F); - Rcolor[1] = CLAMP(color[1], 0.0F, 1.0F); - Rcolor[2] = CLAMP(color[2], 0.0F, 1.0F); - Rcolor[3] = CLAMP(color[3], 0.0F, 1.0F); - } - else { - struct gl_material *mat = &ctx->Light.Material[0]; - GLfloat d_a = mat->DiffuseIndex - mat->AmbientIndex; - GLfloat s_a = mat->SpecularIndex - mat->AmbientIndex; - GLfloat ind = mat->AmbientIndex - + diffuse * (1.0F-specular) * d_a - + specular * s_a; - if (ind > mat->SpecularIndex) { - ind = mat->SpecularIndex; - } - *index = (GLuint) (GLint) ind; - } +void GLAPIENTRY +_mesa_RasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) +{ + rasterpos(x, y, z, w); +} +void GLAPIENTRY +_mesa_RasterPos4i(GLint x, GLint y, GLint z, GLint w) +{ + rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w); } -/* - * Caller: context->API.RasterPos4f - */ -static void -raster_pos4f(GLcontext *ctx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) +void GLAPIENTRY +_mesa_RasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w) { - GLfloat v[4], eye[4], clip[4], ndc[3], d; - ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); - FLUSH_CURRENT(ctx, 0); + rasterpos(x, y, z, w); +} - if (ctx->NewState) - _mesa_update_state( ctx ); +void GLAPIENTRY +_mesa_RasterPos2dv(const GLdouble *v) +{ + rasterpos((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F); +} - ASSIGN_4V( v, x, y, z, w ); - TRANSFORM_POINT( eye, ctx->ModelView.m, v ); +void GLAPIENTRY +_mesa_RasterPos2fv(const GLfloat *v) +{ + rasterpos(v[0], v[1], 0.0F, 1.0F); +} - /* raster color */ - if (ctx->Light.Enabled) { - GLfloat *norm, eyenorm[3]; - GLfloat *objnorm = ctx->Current.Normal; +void GLAPIENTRY +_mesa_RasterPos2iv(const GLint *v) +{ + rasterpos((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F); +} - if (ctx->_NeedEyeCoords) { - GLfloat *inv = ctx->ModelView.inv; - TRANSFORM_NORMAL( eyenorm, objnorm, inv ); - norm = eyenorm; - } - else { - norm = objnorm; - } +void GLAPIENTRY +_mesa_RasterPos2sv(const GLshort *v) +{ + rasterpos(v[0], v[1], 0.0F, 1.0F); +} - shade_rastpos( ctx, v, norm, - ctx->Current.RasterColor, - &ctx->Current.RasterIndex ); +void GLAPIENTRY +_mesa_RasterPos3dv(const GLdouble *v) +{ + rasterpos((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F); +} - } - else { - /* use current color or index */ - if (ctx->Visual.rgbMode) { - ctx->Current.RasterColor[0] = (ctx->Current.Color[0]); - ctx->Current.RasterColor[1] = (ctx->Current.Color[1]); - ctx->Current.RasterColor[2] = (ctx->Current.Color[2]); - ctx->Current.RasterColor[3] = (ctx->Current.Color[3]); - } - else { - ctx->Current.RasterIndex = ctx->Current.Index; - } - } +void GLAPIENTRY +_mesa_RasterPos3fv(const GLfloat *v) +{ + rasterpos(v[0], v[1], v[2], 1.0F); +} - /* compute raster distance */ - ctx->Current.RasterDistance = (GLfloat) - GL_SQRT( eye[0]*eye[0] + eye[1]*eye[1] + eye[2]*eye[2] ); +void GLAPIENTRY +_mesa_RasterPos3iv(const GLint *v) +{ + rasterpos((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F); +} - /* apply projection matrix: clip = Proj * eye */ - TRANSFORM_POINT( clip, ctx->ProjectionMatrix.m, eye ); +void GLAPIENTRY +_mesa_RasterPos3sv(const GLshort *v) +{ + rasterpos(v[0], v[1], v[2], 1.0F); +} - /* clip to view volume */ - if (viewclip_point( clip )==0) { - ctx->Current.RasterPosValid = GL_FALSE; - return; - } +void GLAPIENTRY +_mesa_RasterPos4dv(const GLdouble *v) +{ + rasterpos((GLfloat) v[0], (GLfloat) v[1], + (GLfloat) v[2], (GLfloat) v[3]); +} - /* clip to user clipping planes */ - if (ctx->Transform._AnyClip && - userclip_point(ctx, clip) == 0) { - ctx->Current.RasterPosValid = GL_FALSE; - return; - } +void GLAPIENTRY +_mesa_RasterPos4fv(const GLfloat *v) +{ + rasterpos(v[0], v[1], v[2], v[3]); +} + +void GLAPIENTRY +_mesa_RasterPos4iv(const GLint *v) +{ + rasterpos((GLfloat) v[0], (GLfloat) v[1], + (GLfloat) v[2], (GLfloat) v[3]); +} + +void GLAPIENTRY +_mesa_RasterPos4sv(const GLshort *v) +{ + rasterpos(v[0], v[1], v[2], v[3]); +} + + +/**********************************************************************/ +/*** GL_ARB_window_pos / GL_MESA_window_pos ***/ +/**********************************************************************/ + +#if FEATURE_drawpix +/** + * All glWindowPosMESA and glWindowPosARB commands call this function to + * update the current raster position. + */ +static void +window_pos3f(GLfloat x, GLfloat y, GLfloat z) +{ + GET_CURRENT_CONTEXT(ctx); + GLfloat z2; + + ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); + FLUSH_CURRENT(ctx, 0); + + z2 = CLAMP(z, 0.0F, 1.0F) * (ctx->Viewport.Far - ctx->Viewport.Near) + + ctx->Viewport.Near; + + /* set raster position */ + ctx->Current.RasterPos[0] = x; + ctx->Current.RasterPos[1] = y; + ctx->Current.RasterPos[2] = z2; + ctx->Current.RasterPos[3] = 1.0F; - /* ndc = clip / W */ - ASSERT( clip[3]!=0.0 ); - d = 1.0F / clip[3]; - ndc[0] = clip[0] * d; - ndc[1] = clip[1] * d; - ndc[2] = clip[2] * d; - - ctx->Current.RasterPos[0] = (ndc[0] * ctx->Viewport._WindowMap.m[MAT_SX] + - ctx->Viewport._WindowMap.m[MAT_TX]); - ctx->Current.RasterPos[1] = (ndc[1] * ctx->Viewport._WindowMap.m[MAT_SY] + - ctx->Viewport._WindowMap.m[MAT_TY]); - ctx->Current.RasterPos[2] = (ndc[2] * ctx->Viewport._WindowMap.m[MAT_SZ] + - ctx->Viewport._WindowMap.m[MAT_TZ]) / ctx->DepthMaxF; - ctx->Current.RasterPos[3] = clip[3]; ctx->Current.RasterPosValid = GL_TRUE; - /* FOG??? */ + if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT) + ctx->Current.RasterDistance = ctx->Current.Attrib[VERT_ATTRIB_FOG][0]; + else + ctx->Current.RasterDistance = 0.0; + /* raster color = current color or index */ + if (ctx->Visual.rgbMode) { + ctx->Current.RasterColor[0] + = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][0], 0.0F, 1.0F); + ctx->Current.RasterColor[1] + = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][1], 0.0F, 1.0F); + ctx->Current.RasterColor[2] + = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][2], 0.0F, 1.0F); + ctx->Current.RasterColor[3] + = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][3], 0.0F, 1.0F); + ctx->Current.RasterSecondaryColor[0] + = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][0], 0.0F, 1.0F); + ctx->Current.RasterSecondaryColor[1] + = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][1], 0.0F, 1.0F); + ctx->Current.RasterSecondaryColor[2] + = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][2], 0.0F, 1.0F); + ctx->Current.RasterSecondaryColor[3] + = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][3], 0.0F, 1.0F); + } + else { + ctx->Current.RasterIndex + = ctx->Current.Attrib[VERT_ATTRIB_COLOR_INDEX][0]; + } + + /* raster texcoord = current texcoord */ { GLuint texSet; - for (texSet = 0; texSet < ctx->Const.MaxTextureUnits; texSet++) { - COPY_4FV( ctx->Current.RasterMultiTexCoord[texSet], - ctx->Current.Texcoord[texSet] ); + for (texSet = 0; texSet < ctx->Const.MaxTextureCoordUnits; texSet++) { + COPY_4FV( ctx->Current.RasterTexCoords[texSet], + ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texSet] ); } } if (ctx->RenderMode==GL_SELECT) { _mesa_update_hitflag( ctx, ctx->Current.RasterPos[2] ); } +} + +/* This is just to support the GL_MESA_window_pos version */ +static void +window_pos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) +{ + GET_CURRENT_CONTEXT(ctx); + window_pos3f(x, y, z); + ctx->Current.RasterPos[3] = w; } +void GLAPIENTRY +_mesa_WindowPos2dMESA(GLdouble x, GLdouble y) +{ + window_pos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F); +} -void -_mesa_RasterPos2d(GLdouble x, GLdouble y) +void GLAPIENTRY +_mesa_WindowPos2fMESA(GLfloat x, GLfloat y) { - _mesa_RasterPos4f(x, y, 0.0F, 1.0F); + window_pos4f(x, y, 0.0F, 1.0F); } -void -_mesa_RasterPos2f(GLfloat x, GLfloat y) +void GLAPIENTRY +_mesa_WindowPos2iMESA(GLint x, GLint y) { - _mesa_RasterPos4f(x, y, 0.0F, 1.0F); + window_pos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F); } -void -_mesa_RasterPos2i(GLint x, GLint y) +void GLAPIENTRY +_mesa_WindowPos2sMESA(GLshort x, GLshort y) { - _mesa_RasterPos4f(x, y, 0.0F, 1.0F); + window_pos4f(x, y, 0.0F, 1.0F); } -void -_mesa_RasterPos2s(GLshort x, GLshort y) +void GLAPIENTRY +_mesa_WindowPos3dMESA(GLdouble x, GLdouble y, GLdouble z) { - _mesa_RasterPos4f(x, y, 0.0F, 1.0F); + window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F); } -void -_mesa_RasterPos3d(GLdouble x, GLdouble y, GLdouble z) +void GLAPIENTRY +_mesa_WindowPos3fMESA(GLfloat x, GLfloat y, GLfloat z) { - _mesa_RasterPos4f(x, y, z, 1.0F); + window_pos4f(x, y, z, 1.0F); } -void -_mesa_RasterPos3f(GLfloat x, GLfloat y, GLfloat z) +void GLAPIENTRY +_mesa_WindowPos3iMESA(GLint x, GLint y, GLint z) { - _mesa_RasterPos4f(x, y, z, 1.0F); + window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F); } -void -_mesa_RasterPos3i(GLint x, GLint y, GLint z) +void GLAPIENTRY +_mesa_WindowPos3sMESA(GLshort x, GLshort y, GLshort z) { - _mesa_RasterPos4f(x, y, z, 1.0F); + window_pos4f(x, y, z, 1.0F); } -void -_mesa_RasterPos3s(GLshort x, GLshort y, GLshort z) +void GLAPIENTRY +_mesa_WindowPos4dMESA(GLdouble x, GLdouble y, GLdouble z, GLdouble w) { - _mesa_RasterPos4f(x, y, z, 1.0F); + window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w); } -void -_mesa_RasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w) +void GLAPIENTRY +_mesa_WindowPos4fMESA(GLfloat x, GLfloat y, GLfloat z, GLfloat w) { - _mesa_RasterPos4f(x, y, z, w); + window_pos4f(x, y, z, w); } -void -_mesa_RasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) +void GLAPIENTRY +_mesa_WindowPos4iMESA(GLint x, GLint y, GLint z, GLint w) { - GET_CURRENT_CONTEXT(ctx); - raster_pos4f(ctx, x, y, z, w); + window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w); } -void -_mesa_RasterPos4i(GLint x, GLint y, GLint z, GLint w) +void GLAPIENTRY +_mesa_WindowPos4sMESA(GLshort x, GLshort y, GLshort z, GLshort w) { - _mesa_RasterPos4f(x, y, z, w); + window_pos4f(x, y, z, w); } -void -_mesa_RasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w) +void GLAPIENTRY +_mesa_WindowPos2dvMESA(const GLdouble *v) { - _mesa_RasterPos4f(x, y, z, w); + window_pos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F); } -void -_mesa_RasterPos2dv(const GLdouble *v) +void GLAPIENTRY +_mesa_WindowPos2fvMESA(const GLfloat *v) { - _mesa_RasterPos4f(v[0], v[1], 0.0F, 1.0F); + window_pos4f(v[0], v[1], 0.0F, 1.0F); } -void -_mesa_RasterPos2fv(const GLfloat *v) +void GLAPIENTRY +_mesa_WindowPos2ivMESA(const GLint *v) { - _mesa_RasterPos4f(v[0], v[1], 0.0F, 1.0F); + window_pos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F); } -void -_mesa_RasterPos2iv(const GLint *v) +void GLAPIENTRY +_mesa_WindowPos2svMESA(const GLshort *v) { - _mesa_RasterPos4f(v[0], v[1], 0.0F, 1.0F); + window_pos4f(v[0], v[1], 0.0F, 1.0F); } -void -_mesa_RasterPos2sv(const GLshort *v) +void GLAPIENTRY +_mesa_WindowPos3dvMESA(const GLdouble *v) { - _mesa_RasterPos4f(v[0], v[1], 0.0F, 1.0F); + window_pos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F); } -void -_mesa_RasterPos3dv(const GLdouble *v) +void GLAPIENTRY +_mesa_WindowPos3fvMESA(const GLfloat *v) { - _mesa_RasterPos4f(v[0], v[1], v[2], 1.0F); + window_pos4f(v[0], v[1], v[2], 1.0); } -void -_mesa_RasterPos3fv(const GLfloat *v) +void GLAPIENTRY +_mesa_WindowPos3ivMESA(const GLint *v) { - _mesa_RasterPos4f(v[0], v[1], v[2], 1.0F); + window_pos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F); } -void -_mesa_RasterPos3iv(const GLint *v) +void GLAPIENTRY +_mesa_WindowPos3svMESA(const GLshort *v) { - _mesa_RasterPos4f(v[0], v[1], v[2], 1.0F); + window_pos4f(v[0], v[1], v[2], 1.0F); } -void -_mesa_RasterPos3sv(const GLshort *v) +void GLAPIENTRY +_mesa_WindowPos4dvMESA(const GLdouble *v) { - _mesa_RasterPos4f(v[0], v[1], v[2], 1.0F); + window_pos4f((GLfloat) v[0], (GLfloat) v[1], + (GLfloat) v[2], (GLfloat) v[3]); } -void -_mesa_RasterPos4dv(const GLdouble *v) +void GLAPIENTRY +_mesa_WindowPos4fvMESA(const GLfloat *v) { - _mesa_RasterPos4f(v[0], v[1], v[2], v[3]); + window_pos4f(v[0], v[1], v[2], v[3]); } -void -_mesa_RasterPos4fv(const GLfloat *v) +void GLAPIENTRY +_mesa_WindowPos4ivMESA(const GLint *v) { - _mesa_RasterPos4f(v[0], v[1], v[2], v[3]); + window_pos4f((GLfloat) v[0], (GLfloat) v[1], + (GLfloat) v[2], (GLfloat) v[3]); } -void -_mesa_RasterPos4iv(const GLint *v) +void GLAPIENTRY +_mesa_WindowPos4svMESA(const GLshort *v) { - _mesa_RasterPos4f(v[0], v[1], v[2], v[3]); + window_pos4f(v[0], v[1], v[2], v[3]); } -void -_mesa_RasterPos4sv(const GLshort *v) +#endif + +#if 0 + +/* + * OpenGL implementation of glWindowPos*MESA() + */ +void glWindowPos4fMESA( GLfloat x, GLfloat y, GLfloat z, GLfloat w ) +{ + GLfloat fx, fy; + + /* Push current matrix mode and viewport attributes */ + glPushAttrib( GL_TRANSFORM_BIT | GL_VIEWPORT_BIT ); + + /* Setup projection parameters */ + glMatrixMode( GL_PROJECTION ); + glPushMatrix(); + glLoadIdentity(); + glMatrixMode( GL_MODELVIEW ); + glPushMatrix(); + glLoadIdentity(); + + glDepthRange( z, z ); + glViewport( (int) x - 1, (int) y - 1, 2, 2 ); + + /* set the raster (window) position */ + fx = x - (int) x; + fy = y - (int) y; + glRasterPos4f( fx, fy, 0.0, w ); + + /* restore matrices, viewport and matrix mode */ + glPopMatrix(); + glMatrixMode( GL_PROJECTION ); + glPopMatrix(); + + glPopAttrib(); +} + +#endif + + +/**********************************************************************/ +/** \name Initialization */ +/**********************************************************************/ +/*@{*/ + +/** + * Initialize the context current raster position information. + * + * \param ctx GL context. + * + * Initialize the current raster position information in + * __GLcontextRec::Current, and adds the extension entry points to the + * dispatcher. + */ +void _mesa_init_rastpos( GLcontext * ctx ) { - _mesa_RasterPos4f(v[0], v[1], v[2], v[3]); + int i; + + ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 ); + ctx->Current.RasterDistance = 0.0; + ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 ); + ASSIGN_4V( ctx->Current.RasterSecondaryColor, 0.0, 0.0, 0.0, 1.0 ); + ctx->Current.RasterIndex = 1.0; + for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) + ASSIGN_4V( ctx->Current.RasterTexCoords[i], 0.0, 0.0, 0.0, 1.0 ); + ctx->Current.RasterPosValid = GL_TRUE; } + +/*@}*/