Name

    ARB_window_pos

Name Strings

    GL_ARB_window_pos

Contact

    Brian Paul, brian_e_paul 'at' yahoo.com

Notice

    Copyright (c) 2002-2013 The Khronos Group Inc. Copyright terms at
        http://www.khronos.org/registry/speccopyright.html

Status

    Complete. Approved by ARB on February 14, 2002.

Version

    Last Modified Date: June 11, 2002

Number

    ARB Extension #25

Dependencies

    OpenGL 1.0 is required.
    The extension is written against the OpenGL 1.3 Specification
    GL_EXT_fog_coordinate effects the definition of this extension.
    GL_EXT_secondary_color effects the definition of this extension.

Overview

    In order to set the current raster position to a specific window
    coordinate with the RasterPos command, the modelview matrix, projection
    matrix and viewport must be set very carefully.  Furthermore, if the
    desired window coordinate is outside of the window's bounds one must rely
    on a subtle side-effect of the Bitmap command in order to avoid frustum
    clipping.

    This extension provides a set of functions to directly set the current
    raster position in window coordinates, bypassing the modelview matrix, the
    projection matrix and the viewport-to-window mapping.  Furthermore, clip
    testing is not performed, so that the current raster position is always
    valid.

    This greatly simplifies the process of setting the current raster position
    to a specific window coordinate prior to calling DrawPixels, CopyPixels or
    Bitmap.  Many matrix operations can be avoided when mixing 2D and 3D
    rendering.

IP Status

    No IP issues.

Issues

    (1) Should we offer all 24 entrypoints, just like glRasterPos?

      RESOLVED.  No.  Don't implement the 4-coordinate functions as
      they're really useless.  However, we will implement the short
      and double-type functions for completeness.

      For example, it's conceivable that an application may have
      data structures encoding window coordinates as a 2- or 3-vector
      of shorts and will want to use WindowPos3svARB().  Chris Hecker
      lobbied for this on the grounds of orthogonality.

    (2) Should we have unique GLX protocol requests for every entrypoint
      or just a 3-float version?

      RESOLVED.  Just a 3-float version will suffice since all reasonable
      window coordinate values can be perfectly represented with
      single-precision floating point.

    (4) For WindowPos2*ARB(), is zero the correct value for z?  Afterall,
      z is a window coordinate, not an object coordinate.

      RESOLVED.  Yes, zero is correct.  Zero corresponds to the front
      of the depth range.  That's where one would usually want Bitmap,
      DrawPixels and CopyPixels to be positioned in z when rendering 2D
      primitives over a 3D scene.

    (5) What about glDepthRange?

      RESOLVED.  Map the WindowPos z value into the range specified by
      DepthRange.  There's a popular optimization used to avoid depth
      buffer clears for scenes that completely fill the window in which
      the depth buffer is effectively halfed and reversed in alternate
      frames by calling DepthRange.  The WindowPos z value should be
      subjected to depth range mapping so that it will work with this
      optimization, and in other scenarios.

    (6) Should we mention EXT_fog_coord and EXT_secondary_color in this
      extension?

      RESOLVED.  Yes, otherwise implementors may not know what to do
      with them.  It's been suggested that we instead go back and
      update the EXT_fog_coordinate and EXT_secondary_color specifications
      with respect to ARB_window_pos instead.  However, that seems
      unlikely to happen and seems error-prone/obscure for implementors.

    (7) What about the raster fog coordinate?

      RESOLVED. If EXT_fog_coord is not supported, CURRENT_RASTER_DISTANCE
      is set to zero.

      If EXT_fog_coord is supported, the behavior is dependent on
      the current state of FOG_COORDINATE_SOURCE_EXT. If the fog
      coordinate source is FRAGMENT_DEPTH_EXT, CURRENT_RASTER_DISTANCE
      is set to zero.  If the fog coordinate source is FOG_COORDINATE_EXT,
      CURRENT_RASTER_DISTANCE is set to the current fog coordinate.

      The value chosen for CURRENT_RASTER_DISTANCE state matches the value
      that would be chosen for normal vertices, except that WindowPos
      does not allow the GL to compute eye coordinates that would be
      used to generate a fog distance value.  Instead, a value of zero is
      always used as a fog distance.

      With the current EXT_fog_coord specification, there are two pieces
      of RasterPos state that drive fog (CURRENT_RASTER_DISTANCE and
      the current raster fog coordinate).  The setting of the fog
      coordinate source selects which piece of state is used at
      rasterization (Bitmap, DrawPixels) time. Instead, this extension
      moves the selection of fog state to RasterPos state computation instead
      of rasterization and combines the two pieces of state into a
      single CURRENT_RASTER_DISTANCE.

      Current implementations of EXT_fog_coord that support two pieces of
      state can either change the implementations to merge the two pieces
      into a single state or contiue to maintain two pieces of state.
      If the implementations continue to maintain two pieces of state,
      both the CURRENT_RASTER_DISTANCE and current raster fog coordinate
      are set to the same value.

    (8) What about the secondary raster color?

      RESOLVED.  If EXT_secondary_color is supported, the (unnamed) current
      raster secondary color is set by taking the current secondary color and
      clamping the components to the range [0,1].

      If EXT_secondary_color is not supported, the current raster secondary
      color is set to (0,0,0).

    (9) How is this extension specification different from the
      MESA_window_pos extension?

      (a) Clarified that lighting and texgen aren't used when updating
      the current raster state.

      (b) Explicitly state the effect on CURRENT_RASTER_DISTANCE and
      CURRENT_RASTER_POSITION_VALID.

      (c) Explain how the raster position's secondary color and fog
      coordinate are handled.

      (d) Z is mapped according to the DEPTH_RANGE values.

      (e) Removed the functions which take 4 coordinates.

New Procedures and Functions

    void WindowPos2dARB(double x, double y)
    void WindowPos2fARB(float x, float y)
    void WindowPos2iARB(int x, int y)
    void WindowPos2sARB(short x, short y)

    void WindowPos2dvARB(const double *p)
    void WindowPos2fvARB(const float *p)
    void WindowPos2ivARB(const int *p)
    void WindowPos2svARB(const short *p)

    void WindowPos3dARB(double x, double y, double z)
    void WindowPos3fARB(float x, float y, float z)
    void WindowPos3iARB(int x, int y, int z)
    void WindowPos3sARB(short x, short y, short z)

    void WindowPos3dvARB(const double *p)
    void WindowPos3fvARB(const float *p)
    void WindowPos3ivARB(const int *p)
    void WindowPos3svARB(const short *p)

New Tokens

    none

Additions to Chapter 2 of the OpenGL 1.3 Specification (OpenGL Operation)

    In section 2.12 (Current Raster Position), p. 42, insert after
    fifth paragraph:

        Alternately, the current raster position may be set by one of the
        WindowPosARB commands:

           void WindowPos{23}{ifds}ARB( T coords );
           void WindowPos{23}{ifds}vARB( const T coords );

        WindosPos3ARB takes three values indicating x, y and z while
        WindowPos2ARB takes two values indicating x and y with z implicitly
        set to 0.

        The CURRENT_RASTER_POSITION, (RPx, RPy, RPz, RPw), is updated as
        follows:

            RPx = x

            RPy = y

                  { n,                 if z <= 0
            RPz = { f,                 if z >= 1
                  { n + z * (f - n),   otherwise

            RPw = 1

        where <n> is the DEPTH_RANGE's near value, and <f> is the
        DEPTH_RANGE's far value.

        In RGBA mode, CURRENT_RASTER_COLOR is updated from CURRENT_COLOR
        with each color component clamped to the range [0,1].

        In color index mode, CURRENT_RASTER_INDEX is updated from
        CURRENT_INDEX.

        All sets of CURRENT_RASTER_TEXTURE_COORDS are updated from
        the corresponding CURRENT_TEXTURE_COORDS sets.

        CURRENT_RASTER_POSITION_VALID is set to TRUE.

        If EXT_fog_coord is not supported.

          CURRENT_RASTER_DISTANCE is set to zero.

        If EXT_fog_coord is supported:

          CURRENT_RASTER_DISTANCE is set to

            { CURRENT_FOG_COORDINATE, if FOG_COORDINATE_SOURCE_EXT is set
            {                           to FOG_COORDINATE_EXT, or
            { 0,                      if FOG_COORDINATE_SOURCE_EXT is set
            {                           to FRAGMENT_DEPTH_EXT.

        If EXT_secondary_color is supported:

          The current raster secondary color is set by clamping the components
          of CURRENT_SECONDARY_COLOR_EXT to [0,1], if in RGBA mode.

        If EXT_secondary_color is not supported:

         The current raster secondary color (the secondary color used for all
         pixel and bitmap rasterization) is set to (0,0,0), if in RGBA mode.

        Note that lighting, texture coordinate generation, and clipping are
        not performed by the WindowPos*ARB functions.

Additions to Chapter 5 of the OpenGL 1.3 Specification (Special Functions)

    In section 5.2 (Selection), p. 188, modify the fourth paragraph to read:

        In selection mode, if a point, line, polygon, or the valid
        coordinates produced by a RasterPos command intersects the clip
        volume (section 2.11) then this primitive (or RasterPos command)
        causes a selection hit.  WindowPos commands always generate a
        selection hit since the resulting raster position is always
        valid.  In the case of polygons (...)

Additions to the AGL/GLX/WGL Specifications

    None

GLX Protocol

    One new GL rendering command is added. The following command is
    sent to the server as part of a glXRender request:

        WindowPosARB
            2           16              rendering command length
            2           230             rendering command opcode
            4           FLOAT32         x       
            4           FLOAT32         y       
            4           FLOAT32         z       

Errors

    INVALID_OPERATION is generated if WindowPosARB is called betweeen
    Begin and End.

New State

    None.

New Implementation Dependent State

    None.

Revision History

    May 17, 2001
        - Initial version based on GL_MESA_window_pos extension
    May 22, 2001
        - Explicitly state that x, y, z are window coordinates and w is
          a clip space coordinate.  (Dan Brokenshire)
    May 23, 2001
        - Resolved issues 1 and 2.
        - Added issues 4 and 5.
    May 24, 2001
        - Rewrote body of specification to more clearly indicate how all
          raster position state is updated by WindowPos.
        - Updated the issues section.
    Jun 13, 2001
        - Added back the double and short versions of WindowPos()
        - Added fog coord issue and discusstion.
        - Reordered/renumbered the issues section.
    Jun 22, 2001
        - Set raster secondary color to current secondary color, not black
    Jun 25, 2001
        - Another change to secondary color, think I got it now!
    Nov 16, 2001
        - updated email address
        - List options "A" and "B" to determine behaviour of current raster
          fog coordinate.
    Nov 17, 2001
        - minor clean-ups
    Dec 12, 2001
        - rewrite against the OpenGL 1.3 spec
        - fixed a few typos
    Jan 10, 2002
        - update the interaction with EXT_fog_coord and EXT_secondary_color
          based on the proposed resolution from the December 2001 ARB
          meeting. (Pat Brown)
    Jan 18, 2002
        - Merges two pieces of fog state into a single state. (Bimal Poddar)
    Mar 12, 2002
        - Added GLX protocol. (Jon Leech)
    June 11, 2002
        - Clarifications: RGBA/index color updates apply only in 
          RGBA/index mode respectively. Hits are generated in selection mode.
