Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Mesa 3-D graphics library
  3.  *
  4.  * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a
  7.  * copy of this software and associated documentation files (the "Software"),
  8.  * to deal in the Software without restriction, including without limitation
  9.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10.  * and/or sell copies of the Software, and to permit persons to whom the
  11.  * Software is furnished to do so, subject to the following conditions:
  12.  *
  13.  * The above copyright notice and this permission notice shall be included
  14.  * in all copies or substantial portions of the Software.
  15.  *
  16.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  17.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  19.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  20.  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  21.  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  22.  * OTHER DEALINGS IN THE SOFTWARE.
  23.  */
  24.  
  25.  
  26. /**
  27.  * \file rastpos.c
  28.  * Raster position operations.
  29.  */
  30.  
  31. #include "glheader.h"
  32. #include "context.h"
  33. #include "feedback.h"
  34. #include "macros.h"
  35. #include "mtypes.h"
  36. #include "rastpos.h"
  37. #include "state.h"
  38. #include "main/dispatch.h"
  39.  
  40.  
  41. /**
  42.  * Helper function for all the RasterPos functions.
  43.  */
  44. static void
  45. rasterpos(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
  46. {
  47.    GET_CURRENT_CONTEXT(ctx);
  48.    GLfloat p[4];
  49.  
  50.    p[0] = x;
  51.    p[1] = y;
  52.    p[2] = z;
  53.    p[3] = w;
  54.  
  55.    FLUSH_VERTICES(ctx, 0);
  56.    FLUSH_CURRENT(ctx, 0);
  57.  
  58.    if (ctx->NewState)
  59.       _mesa_update_state( ctx );
  60.  
  61.    ctx->Driver.RasterPos(ctx, p);
  62. }
  63.  
  64.  
  65. void GLAPIENTRY
  66. _mesa_RasterPos2d(GLdouble x, GLdouble y)
  67. {
  68.    rasterpos((GLfloat)x, (GLfloat)y, (GLfloat)0.0, (GLfloat)1.0);
  69. }
  70.  
  71. void GLAPIENTRY
  72. _mesa_RasterPos2f(GLfloat x, GLfloat y)
  73. {
  74.    rasterpos(x, y, 0.0F, 1.0F);
  75. }
  76.  
  77. void GLAPIENTRY
  78. _mesa_RasterPos2i(GLint x, GLint y)
  79. {
  80.    rasterpos((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
  81. }
  82.  
  83. void GLAPIENTRY
  84. _mesa_RasterPos2s(GLshort x, GLshort y)
  85. {
  86.    rasterpos(x, y, 0.0F, 1.0F);
  87. }
  88.  
  89. void GLAPIENTRY
  90. _mesa_RasterPos3d(GLdouble x, GLdouble y, GLdouble z)
  91. {
  92.    rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
  93. }
  94.  
  95. void GLAPIENTRY
  96. _mesa_RasterPos3f(GLfloat x, GLfloat y, GLfloat z)
  97. {
  98.    rasterpos(x, y, z, 1.0F);
  99. }
  100.  
  101. void GLAPIENTRY
  102. _mesa_RasterPos3i(GLint x, GLint y, GLint z)
  103. {
  104.    rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
  105. }
  106.  
  107. void GLAPIENTRY
  108. _mesa_RasterPos3s(GLshort x, GLshort y, GLshort z)
  109. {
  110.    rasterpos(x, y, z, 1.0F);
  111. }
  112.  
  113. void GLAPIENTRY
  114. _mesa_RasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
  115. {
  116.    rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
  117. }
  118.  
  119. void GLAPIENTRY
  120. _mesa_RasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
  121. {
  122.    rasterpos(x, y, z, w);
  123. }
  124.  
  125. void GLAPIENTRY
  126. _mesa_RasterPos4i(GLint x, GLint y, GLint z, GLint w)
  127. {
  128.    rasterpos((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
  129. }
  130.  
  131. void GLAPIENTRY
  132. _mesa_RasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
  133. {
  134.    rasterpos(x, y, z, w);
  135. }
  136.  
  137. void GLAPIENTRY
  138. _mesa_RasterPos2dv(const GLdouble *v)
  139. {
  140.    rasterpos((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
  141. }
  142.  
  143. void GLAPIENTRY
  144. _mesa_RasterPos2fv(const GLfloat *v)
  145. {
  146.    rasterpos(v[0], v[1], 0.0F, 1.0F);
  147. }
  148.  
  149. void GLAPIENTRY
  150. _mesa_RasterPos2iv(const GLint *v)
  151. {
  152.    rasterpos((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
  153. }
  154.  
  155. void GLAPIENTRY
  156. _mesa_RasterPos2sv(const GLshort *v)
  157. {
  158.    rasterpos(v[0], v[1], 0.0F, 1.0F);
  159. }
  160.  
  161. void GLAPIENTRY
  162. _mesa_RasterPos3dv(const GLdouble *v)
  163. {
  164.    rasterpos((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
  165. }
  166.  
  167. void GLAPIENTRY
  168. _mesa_RasterPos3fv(const GLfloat *v)
  169. {
  170.    rasterpos(v[0], v[1], v[2], 1.0F);
  171. }
  172.  
  173. void GLAPIENTRY
  174. _mesa_RasterPos3iv(const GLint *v)
  175. {
  176.    rasterpos((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
  177. }
  178.  
  179. void GLAPIENTRY
  180. _mesa_RasterPos3sv(const GLshort *v)
  181. {
  182.    rasterpos(v[0], v[1], v[2], 1.0F);
  183. }
  184.  
  185. void GLAPIENTRY
  186. _mesa_RasterPos4dv(const GLdouble *v)
  187. {
  188.    rasterpos((GLfloat) v[0], (GLfloat) v[1],
  189.                      (GLfloat) v[2], (GLfloat) v[3]);
  190. }
  191.  
  192. void GLAPIENTRY
  193. _mesa_RasterPos4fv(const GLfloat *v)
  194. {
  195.    rasterpos(v[0], v[1], v[2], v[3]);
  196. }
  197.  
  198. void GLAPIENTRY
  199. _mesa_RasterPos4iv(const GLint *v)
  200. {
  201.    rasterpos((GLfloat) v[0], (GLfloat) v[1],
  202.                      (GLfloat) v[2], (GLfloat) v[3]);
  203. }
  204.  
  205. void GLAPIENTRY
  206. _mesa_RasterPos4sv(const GLshort *v)
  207. {
  208.    rasterpos(v[0], v[1], v[2], v[3]);
  209. }
  210.  
  211.  
  212. /**********************************************************************/
  213. /***           GL_ARB_window_pos / GL_MESA_window_pos               ***/
  214. /**********************************************************************/
  215.  
  216.  
  217. /**
  218.  * All glWindowPosMESA and glWindowPosARB commands call this function to
  219.  * update the current raster position.
  220.  */
  221. static void
  222. window_pos3f(GLfloat x, GLfloat y, GLfloat z)
  223. {
  224.    GET_CURRENT_CONTEXT(ctx);
  225.    GLfloat z2;
  226.  
  227.    FLUSH_VERTICES(ctx, 0);
  228.    FLUSH_CURRENT(ctx, 0);
  229.  
  230.    z2 = CLAMP(z, 0.0F, 1.0F)
  231.       * (ctx->ViewportArray[0].Far - ctx->ViewportArray[0].Near)
  232.       + ctx->ViewportArray[0].Near;
  233.  
  234.    /* set raster position */
  235.    ctx->Current.RasterPos[0] = x;
  236.    ctx->Current.RasterPos[1] = y;
  237.    ctx->Current.RasterPos[2] = z2;
  238.    ctx->Current.RasterPos[3] = 1.0F;
  239.  
  240.    ctx->Current.RasterPosValid = GL_TRUE;
  241.  
  242.    if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT)
  243.       ctx->Current.RasterDistance = ctx->Current.Attrib[VERT_ATTRIB_FOG][0];
  244.    else
  245.       ctx->Current.RasterDistance = 0.0;
  246.  
  247.    /* raster color = current color or index */
  248.    ctx->Current.RasterColor[0]
  249.       = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][0], 0.0F, 1.0F);
  250.    ctx->Current.RasterColor[1]
  251.       = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][1], 0.0F, 1.0F);
  252.    ctx->Current.RasterColor[2]
  253.       = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][2], 0.0F, 1.0F);
  254.    ctx->Current.RasterColor[3]
  255.       = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR0][3], 0.0F, 1.0F);
  256.    ctx->Current.RasterSecondaryColor[0]
  257.       = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][0], 0.0F, 1.0F);
  258.    ctx->Current.RasterSecondaryColor[1]
  259.       = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][1], 0.0F, 1.0F);
  260.    ctx->Current.RasterSecondaryColor[2]
  261.       = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][2], 0.0F, 1.0F);
  262.    ctx->Current.RasterSecondaryColor[3]
  263.       = CLAMP(ctx->Current.Attrib[VERT_ATTRIB_COLOR1][3], 0.0F, 1.0F);
  264.  
  265.    /* raster texcoord = current texcoord */
  266.    {
  267.       GLuint texSet;
  268.       for (texSet = 0; texSet < ctx->Const.MaxTextureCoordUnits; texSet++) {
  269.          assert(texSet < ARRAY_SIZE(ctx->Current.RasterTexCoords));
  270.          COPY_4FV( ctx->Current.RasterTexCoords[texSet],
  271.                   ctx->Current.Attrib[VERT_ATTRIB_TEX0 + texSet] );
  272.       }
  273.    }
  274.  
  275.    if (ctx->RenderMode==GL_SELECT) {
  276.       _mesa_update_hitflag( ctx, ctx->Current.RasterPos[2] );
  277.    }
  278. }
  279.  
  280.  
  281. /* This is just to support the GL_MESA_window_pos version */
  282. static void
  283. window_pos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
  284. {
  285.    GET_CURRENT_CONTEXT(ctx);
  286.    window_pos3f(x, y, z);
  287.    ctx->Current.RasterPos[3] = w;
  288. }
  289.  
  290.  
  291. void GLAPIENTRY
  292. _mesa_WindowPos2d(GLdouble x, GLdouble y)
  293. {
  294.    window_pos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
  295. }
  296.  
  297. void GLAPIENTRY
  298. _mesa_WindowPos2f(GLfloat x, GLfloat y)
  299. {
  300.    window_pos4f(x, y, 0.0F, 1.0F);
  301. }
  302.  
  303. void GLAPIENTRY
  304. _mesa_WindowPos2i(GLint x, GLint y)
  305. {
  306.    window_pos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
  307. }
  308.  
  309. void GLAPIENTRY
  310. _mesa_WindowPos2s(GLshort x, GLshort y)
  311. {
  312.    window_pos4f(x, y, 0.0F, 1.0F);
  313. }
  314.  
  315. void GLAPIENTRY
  316. _mesa_WindowPos3d(GLdouble x, GLdouble y, GLdouble z)
  317. {
  318.    window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
  319. }
  320.  
  321. void GLAPIENTRY
  322. _mesa_WindowPos3f(GLfloat x, GLfloat y, GLfloat z)
  323. {
  324.    window_pos4f(x, y, z, 1.0F);
  325. }
  326.  
  327. void GLAPIENTRY
  328. _mesa_WindowPos3i(GLint x, GLint y, GLint z)
  329. {
  330.    window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
  331. }
  332.  
  333. void GLAPIENTRY
  334. _mesa_WindowPos3s(GLshort x, GLshort y, GLshort z)
  335. {
  336.    window_pos4f(x, y, z, 1.0F);
  337. }
  338.  
  339. void GLAPIENTRY
  340. _mesa_WindowPos4dMESA(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
  341. {
  342.    window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
  343. }
  344.  
  345. void GLAPIENTRY
  346. _mesa_WindowPos4fMESA(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
  347. {
  348.    window_pos4f(x, y, z, w);
  349. }
  350.  
  351. void GLAPIENTRY
  352. _mesa_WindowPos4iMESA(GLint x, GLint y, GLint z, GLint w)
  353. {
  354.    window_pos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
  355. }
  356.  
  357. void GLAPIENTRY
  358. _mesa_WindowPos4sMESA(GLshort x, GLshort y, GLshort z, GLshort w)
  359. {
  360.    window_pos4f(x, y, z, w);
  361. }
  362.  
  363. void GLAPIENTRY
  364. _mesa_WindowPos2dv(const GLdouble *v)
  365. {
  366.    window_pos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
  367. }
  368.  
  369. void GLAPIENTRY
  370. _mesa_WindowPos2fv(const GLfloat *v)
  371. {
  372.    window_pos4f(v[0], v[1], 0.0F, 1.0F);
  373. }
  374.  
  375. void GLAPIENTRY
  376. _mesa_WindowPos2iv(const GLint *v)
  377. {
  378.    window_pos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
  379. }
  380.  
  381. void GLAPIENTRY
  382. _mesa_WindowPos2sv(const GLshort *v)
  383. {
  384.    window_pos4f(v[0], v[1], 0.0F, 1.0F);
  385. }
  386.  
  387. void GLAPIENTRY
  388. _mesa_WindowPos3dv(const GLdouble *v)
  389. {
  390.    window_pos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
  391. }
  392.  
  393. void GLAPIENTRY
  394. _mesa_WindowPos3fv(const GLfloat *v)
  395. {
  396.    window_pos4f(v[0], v[1], v[2], 1.0);
  397. }
  398.  
  399. void GLAPIENTRY
  400. _mesa_WindowPos3iv(const GLint *v)
  401. {
  402.    window_pos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
  403. }
  404.  
  405. void GLAPIENTRY
  406. _mesa_WindowPos3sv(const GLshort *v)
  407. {
  408.    window_pos4f(v[0], v[1], v[2], 1.0F);
  409. }
  410.  
  411. void GLAPIENTRY
  412. _mesa_WindowPos4dvMESA(const GLdouble *v)
  413. {
  414.    window_pos4f((GLfloat) v[0], (GLfloat) v[1],
  415.                          (GLfloat) v[2], (GLfloat) v[3]);
  416. }
  417.  
  418. void GLAPIENTRY
  419. _mesa_WindowPos4fvMESA(const GLfloat *v)
  420. {
  421.    window_pos4f(v[0], v[1], v[2], v[3]);
  422. }
  423.  
  424. void GLAPIENTRY
  425. _mesa_WindowPos4ivMESA(const GLint *v)
  426. {
  427.    window_pos4f((GLfloat) v[0], (GLfloat) v[1],
  428.                          (GLfloat) v[2], (GLfloat) v[3]);
  429. }
  430.  
  431. void GLAPIENTRY
  432. _mesa_WindowPos4svMESA(const GLshort *v)
  433. {
  434.    window_pos4f(v[0], v[1], v[2], v[3]);
  435. }
  436.  
  437.  
  438. #if 0
  439.  
  440. /*
  441.  * OpenGL implementation of glWindowPos*MESA()
  442.  */
  443. void glWindowPos4fMESA( GLfloat x, GLfloat y, GLfloat z, GLfloat w )
  444. {
  445.    GLfloat fx, fy;
  446.  
  447.    /* Push current matrix mode and viewport attributes */
  448.    glPushAttrib( GL_TRANSFORM_BIT | GL_VIEWPORT_BIT );
  449.  
  450.    /* Setup projection parameters */
  451.    glMatrixMode( GL_PROJECTION );
  452.    glPushMatrix();
  453.    glLoadIdentity();
  454.    glMatrixMode( GL_MODELVIEW );
  455.    glPushMatrix();
  456.    glLoadIdentity();
  457.  
  458.    glDepthRange( z, z );
  459.    glViewport( (int) x - 1, (int) y - 1, 2, 2 );
  460.  
  461.    /* set the raster (window) position */
  462.    fx = x - (int) x;
  463.    fy = y - (int) y;
  464.    glRasterPos4f( fx, fy, 0.0, w );
  465.  
  466.    /* restore matrices, viewport and matrix mode */
  467.    glPopMatrix();
  468.    glMatrixMode( GL_PROJECTION );
  469.    glPopMatrix();
  470.  
  471.    glPopAttrib();
  472. }
  473.  
  474. #endif
  475.  
  476.  
  477. /**********************************************************************/
  478. /** \name Initialization                                              */
  479. /**********************************************************************/
  480. /*@{*/
  481.  
  482. /**
  483.  * Initialize the context current raster position information.
  484.  *
  485.  * \param ctx GL context.
  486.  *
  487.  * Initialize the current raster position information in
  488.  * __struct gl_contextRec::Current, and adds the extension entry points to the
  489.  * dispatcher.
  490.  */
  491. void _mesa_init_rastpos( struct gl_context * ctx )
  492. {
  493.    unsigned i;
  494.  
  495.    ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 );
  496.    ctx->Current.RasterDistance = 0.0;
  497.    ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
  498.    ASSIGN_4V( ctx->Current.RasterSecondaryColor, 0.0, 0.0, 0.0, 1.0 );
  499.    for (i = 0; i < ARRAY_SIZE(ctx->Current.RasterTexCoords); i++)
  500.       ASSIGN_4V( ctx->Current.RasterTexCoords[i], 0.0, 0.0, 0.0, 1.0 );
  501.    ctx->Current.RasterPosValid = GL_TRUE;
  502. }
  503.  
  504. /*@}*/
  505.