15bd8deadSopenharmony_ciName
25bd8deadSopenharmony_ci
35bd8deadSopenharmony_ci    ARB_matrix_palette
45bd8deadSopenharmony_ci
55bd8deadSopenharmony_ciName Strings
65bd8deadSopenharmony_ci
75bd8deadSopenharmony_ci    GL_ARB_matrix_palette
85bd8deadSopenharmony_ci
95bd8deadSopenharmony_ciContact
105bd8deadSopenharmony_ci
115bd8deadSopenharmony_ci    Jon Paul Schelter (jschelte 'at' matrox.com)
125bd8deadSopenharmony_ci
135bd8deadSopenharmony_ciNotice
145bd8deadSopenharmony_ci
155bd8deadSopenharmony_ci    Copyright (c) 2000-2013 The Khronos Group Inc. Copyright terms at
165bd8deadSopenharmony_ci        http://www.khronos.org/registry/speccopyright.html
175bd8deadSopenharmony_ci
185bd8deadSopenharmony_ciSpecification Update Policy
195bd8deadSopenharmony_ci
205bd8deadSopenharmony_ci    Khronos-approved extension specifications are updated in response to
215bd8deadSopenharmony_ci    issues and bugs prioritized by the Khronos OpenGL Working Group. For
225bd8deadSopenharmony_ci    extensions which have been promoted to a core Specification, fixes will
235bd8deadSopenharmony_ci    first appear in the latest version of that core Specification, and will
245bd8deadSopenharmony_ci    eventually be backported to the extension document. This policy is
255bd8deadSopenharmony_ci    described in more detail at
265bd8deadSopenharmony_ci        https://www.khronos.org/registry/OpenGL/docs/update_policy.php
275bd8deadSopenharmony_ci
285bd8deadSopenharmony_ciStatus
295bd8deadSopenharmony_ci
305bd8deadSopenharmony_ci    Complete. Approved by ARB on December 5, 2000.
315bd8deadSopenharmony_ci
325bd8deadSopenharmony_ciVersion
335bd8deadSopenharmony_ci
345bd8deadSopenharmony_ci    Date: 2004/04/02
355bd8deadSopenharmony_ci    Revision: 0.7
365bd8deadSopenharmony_ci
375bd8deadSopenharmony_ciNumber
385bd8deadSopenharmony_ci
395bd8deadSopenharmony_ci    ARB Extension #16
405bd8deadSopenharmony_ci
415bd8deadSopenharmony_ciDependencies
425bd8deadSopenharmony_ci
435bd8deadSopenharmony_ci    ARB_vertex_blend and OpenGL 1.0 are required.
445bd8deadSopenharmony_ci    This extension is written against the ARB_vertex_blend extended
455bd8deadSopenharmony_ci    OpenGL 1.2.1 Specification. 
465bd8deadSopenharmony_ci
475bd8deadSopenharmony_ciOverview
485bd8deadSopenharmony_ci
495bd8deadSopenharmony_ci    This extension extends the abilities of ARB_vertex_blend to include 
505bd8deadSopenharmony_ci    a palette of modelview matrices.  The n vertex units use a palette
515bd8deadSopenharmony_ci    of m modelview matrices.  (Where n and m are constrained to
525bd8deadSopenharmony_ci    implementation defined maxima.)  Each vertex has a set of n
535bd8deadSopenharmony_ci    indices into the palette, and a corresponding set of n weights.
545bd8deadSopenharmony_ci    Matrix indices can be changed for each vertex (between Begin and
555bd8deadSopenharmony_ci    End).  
565bd8deadSopenharmony_ci    
575bd8deadSopenharmony_ci    When this extension is utilized, the enabled units transform each
585bd8deadSopenharmony_ci    vertex by the modelview matrices specified by the vertices'
595bd8deadSopenharmony_ci    respective indices.  These results are subsequently scaled by the
605bd8deadSopenharmony_ci    weights of the respective units and then summed to create the
615bd8deadSopenharmony_ci    eyespace vertex.   
625bd8deadSopenharmony_ci    
635bd8deadSopenharmony_ci    A similar procedure is followed for normals.  Normals, however,
645bd8deadSopenharmony_ci    are transformed by the inverse transpose of the modelview matrix.
655bd8deadSopenharmony_ci    
665bd8deadSopenharmony_ciIP Status
675bd8deadSopenharmony_ci
685bd8deadSopenharmony_ci    Unknown, but believed to be none. 
695bd8deadSopenharmony_ci
705bd8deadSopenharmony_ciIssues
715bd8deadSopenharmony_ci
725bd8deadSopenharmony_ci       
735bd8deadSopenharmony_ci    Should the matrix palette be loaded by adding MODELVIEWm tokens
745bd8deadSopenharmony_ci    for MatrixMode?
755bd8deadSopenharmony_ci
765bd8deadSopenharmony_ci        No, this method is too difficult to extend to an arbitrary
775bd8deadSopenharmony_ci        (implementation defined) size palette,
785bd8deadSopenharmony_ci          and would imply having a 32 entry (minimum) stack per
795bd8deadSopenharmony_ci          matrix. 
805bd8deadSopenharmony_ci        
815bd8deadSopenharmony_ci
825bd8deadSopenharmony_ci    Should the Matrix palette be loaded with a new LoadMatrixPalette
835bd8deadSopenharmony_ci    command?
845bd8deadSopenharmony_ci
855bd8deadSopenharmony_ci        No, although this provides an easy way to support arbitrary
865bd8deadSopenharmony_ci        palette sizes, the method loses the current (MultMatrix,
875bd8deadSopenharmony_ci        Rotate, Translate, Scale..) matrix functionality.
885bd8deadSopenharmony_ci
895bd8deadSopenharmony_ci        Matrices will be Loaded into the palette with current
905bd8deadSopenharmony_ci        functions when MATRIX_MODE is MATRIX_PALETTE_ARB.  The current
915bd8deadSopenharmony_ci        palette index is set by an explicit command:
925bd8deadSopenharmony_ci        CurrentPaletteMatrixARB(). 
935bd8deadSopenharmony_ci    
945bd8deadSopenharmony_ci        
955bd8deadSopenharmony_ci    Should the Matrix Palette have a stack?
965bd8deadSopenharmony_ci
975bd8deadSopenharmony_ci        Not required, this wastes a lot of space.  Define the min
985bd8deadSopenharmony_ci        stack depth for the MATRIX_PALETTE_ARB MatrixMode to be 1.
995bd8deadSopenharmony_ci        This alows some implementations to add a stack if desired.
1005bd8deadSopenharmony_ci
1015bd8deadSopenharmony_ci        The stacks established in ARB_vertex_blend for
1025bd8deadSopenharmony_ci        MODELVIEW_MATRIXn are still present.
1035bd8deadSopenharmony_ci        
1045bd8deadSopenharmony_ci        
1055bd8deadSopenharmony_ci    Should the matrix palette be gettable?
1065bd8deadSopenharmony_ci
1075bd8deadSopenharmony_ci       Yes, CurrentPaletteMatrixARB() and
1085bd8deadSopenharmony_ci       GetIntegerv(CURRENT_PALETTE_MATRIX_ARB, *data) define which
1095bd8deadSopenharmony_ci       matrix in the palette is returned by
1105bd8deadSopenharmony_ci       GetFloatv(MATRIX_PALETTE_ARB, *data). 
1115bd8deadSopenharmony_ci
1125bd8deadSopenharmony_ci       
1135bd8deadSopenharmony_ci    Should MatrixIndexARB be changed to imply LoadMatrix calls to the
1145bd8deadSopenharmony_ci    applicable MODELVIEW_MATRIXn stacks?
1155bd8deadSopenharmony_ci
1165bd8deadSopenharmony_ci        No, the MODELVIEW_MATRIXn matrices are unused when
1175bd8deadSopenharmony_ci        MATRIX_PALETTE is enabled.
1185bd8deadSopenharmony_ci       
1195bd8deadSopenharmony_ci    
1205bd8deadSopenharmony_ci    Should there be a way to specify that the modelview matrices
1215bd8deadSopenharmony_ci    for two different vertex units are identical?
1225bd8deadSopenharmony_ci
1235bd8deadSopenharmony_ci        Not explicitely, but indexing the matrix palette provides this
1245bd8deadSopenharmony_ci        functionality. (Both units will have the same matrix index.)
1255bd8deadSopenharmony_ci        
1265bd8deadSopenharmony_ci    Currently, the MATRIX_PALETTE_ARB enum is used to enable the
1275bd8deadSopenharmony_ci    extension, to set the Matrix Mode, and to get the current matrix.
1285bd8deadSopenharmony_ci    Is this confusing? Should more enums be added?
1295bd8deadSopenharmony_ci
1305bd8deadSopenharmony_ci        No.
1315bd8deadSopenharmony_ci        
1325bd8deadSopenharmony_ciNew Procedures and Functions
1335bd8deadSopenharmony_ci
1345bd8deadSopenharmony_ci    void CurrentPaletteMatrixARB(int index)
1355bd8deadSopenharmony_ci    
1365bd8deadSopenharmony_ci    void MatrixIndex{ubusui}vARB(int size, T *indices)
1375bd8deadSopenharmony_ci    
1385bd8deadSopenharmony_ci    void MatrixIndexPointerARB(int size, enum type, sizei stride,
1395bd8deadSopenharmony_ci                           void *pointer)
1405bd8deadSopenharmony_ci
1415bd8deadSopenharmony_ci 
1425bd8deadSopenharmony_ciNew Tokens
1435bd8deadSopenharmony_ci
1445bd8deadSopenharmony_ci    Accepted by the <pname> parameters of GetFloatv, GetDoublev,
1455bd8deadSopenharmony_ci    and IsEnabled, by the <mode> parameter of MatrixMode, and by the
1465bd8deadSopenharmony_ci    <cap> parameters of Enable and Disable:
1475bd8deadSopenharmony_ci
1485bd8deadSopenharmony_ci      MATRIX_PALETTE_ARB:                   0x8840
1495bd8deadSopenharmony_ci
1505bd8deadSopenharmony_ci    Accepted by the <pname> parameters of GetIntegerv, GetFloatv, and
1515bd8deadSopenharmony_ci    GetDoublev:
1525bd8deadSopenharmony_ci
1535bd8deadSopenharmony_ci      MAX_MATRIX_PALETTE_STACK_DEPTH_ARB    0x8841
1545bd8deadSopenharmony_ci      MAX_PALETTE_MATRICES_ARB              0x8842
1555bd8deadSopenharmony_ci      CURRENT_PALETTE_MATRIX_ARB            0x8843
1565bd8deadSopenharmony_ci      
1575bd8deadSopenharmony_ci    Accepted by the <cap> parameters of EnableClientState and
1585bd8deadSopenharmony_ci    DisableClientState and by the <pname> parameter of IsEnabled:
1595bd8deadSopenharmony_ci
1605bd8deadSopenharmony_ci      MATRIX_INDEX_ARRAY_ARB:               0x8844
1615bd8deadSopenharmony_ci
1625bd8deadSopenharmony_ci    Accepted by the <pname> parameter of GetFloatv:
1635bd8deadSopenharmony_ci    
1645bd8deadSopenharmony_ci      CURRENT_MATRIX_INDEX_ARB              0x8845
1655bd8deadSopenharmony_ci      
1665bd8deadSopenharmony_ci    Accepted by the <pname> parameter of GetIntegerv:
1675bd8deadSopenharmony_ci      MATRIX_INDEX_ARRAY_SIZE_ARB           0x8846
1685bd8deadSopenharmony_ci      MATRIX_INDEX_ARRAY_TYPE_ARB           0x8847
1695bd8deadSopenharmony_ci      MATRIX_INDEX_ARRAY_STRIDE_ARB         0x8848
1705bd8deadSopenharmony_ci
1715bd8deadSopenharmony_ci    Accepted by the <pname> parameter of GetPointerv:
1725bd8deadSopenharmony_ci      MATRIX_INDEX_ARRAY_POINTER_ARB        0x8849
1735bd8deadSopenharmony_ci
1745bd8deadSopenharmony_ciAdditions to Chapter 2 of the OpenGL 1.2.1 Specification (Operation)
1755bd8deadSopenharmony_ci
1765bd8deadSopenharmony_ci    - (2.6, p. 12) Second paragraph changed to:
1775bd8deadSopenharmony_ci
1785bd8deadSopenharmony_ci          "Each vertex is specified with two, three, or four
1795bd8deadSopenharmony_ci          coordinates. In addition, a current normal, current texture
1805bd8deadSopenharmony_ci          coordinates, current color, current matrix indices, and
1815bd8deadSopenharmony_ci          current weights may be used in processing each vertex. Normals
1825bd8deadSopenharmony_ci          are used by the GL in lighting calculations; the current
1835bd8deadSopenharmony_ci          normal is a three- dimensional vector that may be set by
1845bd8deadSopenharmony_ci          sending three coordinates that specify it. Texture coordinates
1855bd8deadSopenharmony_ci          determine how a texture image is mapped onto a
1865bd8deadSopenharmony_ci          primitive. Indices are used to select modelview matrices
1875bd8deadSopenharmony_ci          from the palette when blending is enabled.  Weights are used
1885bd8deadSopenharmony_ci          as blending factors when vertex blending is enabled. One
1895bd8deadSopenharmony_ci          weight and one index exists for each enabled vertex blend
1905bd8deadSopenharmony_ci          unit.  Vertex units are enabled with Enable, and disabled
1915bd8deadSopenharmony_ci          with Disable. Enabling or Disabling a vertex unit not
1925bd8deadSopenharmony_ci          supported in the implementation results in the error
1935bd8deadSopenharmony_ci          INVALID_OPERATION." 
1945bd8deadSopenharmony_ci
1955bd8deadSopenharmony_ci    - (2.6.3, p. 19) First paragraph changed to:
1965bd8deadSopenharmony_ci
1975bd8deadSopenharmony_ci          "The only GL commands that are allowed within Begin/End
1985bd8deadSopenharmony_ci          pairs are the commands for specifying vertex coordinates,
1995bd8deadSopenharmony_ci          vertex color, normal coordinates, texture coordinates, matrix
2005bd8deadSopenharmony_ci          indices, and weights (Vertex, Color, Index, Normal, TexCoord,
2015bd8deadSopenharmony_ci          MatrixIndexARB, WeightARB), the ArrayElement command (see
2025bd8deadSopenharmony_ci          section 2.8), the EvalCoord and EvalPoint commands (see
2035bd8deadSopenharmony_ci          section 5.1), commands for specifying lighting material
2045bd8deadSopenharmony_ci          parameters (Material commands; see section 2.13.2), display
2055bd8deadSopenharmony_ci          list invocation commands (CallList and CallLists; see section
2065bd8deadSopenharmony_ci          5.4), and the EdgeFlag command. Executing any other GL command
2075bd8deadSopenharmony_ci          between the execution of Begin and the corresponding execution
2085bd8deadSopenharmony_ci          of End results in the error INVALID_OPERATION. Executing Begin
2095bd8deadSopenharmony_ci          after Begin has already been executed but before an End is
2105bd8deadSopenharmony_ci          executed generates the INVALID_OPERATION error, as does
2115bd8deadSopenharmony_ci          executing End without a previous corresponding Begin."  
2125bd8deadSopenharmony_ci
2135bd8deadSopenharmony_ci    - (2.7, p. 20) Added after the third paragraph:
2145bd8deadSopenharmony_ci
2155bd8deadSopenharmony_ci          "The current weights are set using
2165bd8deadSopenharmony_ci
2175bd8deadSopenharmony_ci              void Weight{bsifd ubusui}vARB(int size, T *weights);
2185bd8deadSopenharmony_ci
2195bd8deadSopenharmony_ci          the floating point values are assigned to the current
2205bd8deadSopenharmony_ci          weight vector.  The first <size> current weights are
2215bd8deadSopenharmony_ci          replaced with <weights> such that:
2225bd8deadSopenharmony_ci
2235bd8deadSopenharmony_ci              CURRENT_WEIGHT_ARB[i] = <weights>[i]
2245bd8deadSopenharmony_ci
2255bd8deadSopenharmony_ci          When WEIGHT_SUM_UNITY_ARB is enabled,
2265bd8deadSopenharmony_ci
2275bd8deadSopenharmony_ci                                              <size>-1
2285bd8deadSopenharmony_ci              CURRENT_WEIGHT_ARB[<size>] = 1 - SUM     <weights>[i]
2295bd8deadSopenharmony_ci                                               i=0
2305bd8deadSopenharmony_ci                                               
2315bd8deadSopenharmony_ci          otherwise the rest of the current weights are set to 0.  If
2325bd8deadSopenharmony_ci          <size> is greater than MAX_VERTEX_UNITS_ARB or if
2335bd8deadSopenharmony_ci          WEIGHTS_SUM_UNITY_ARB is enabled and <size> equals
2345bd8deadSopenharmony_ci          MAX_VERTEX_UNITS_ARB, then the error INVALID_VALUE is
2355bd8deadSopenharmony_ci          generated.  When the values are supplied as byte, short, or
2365bd8deadSopenharmony_ci          int, they are converted to floating-point values as
2375bd8deadSopenharmony_ci          indicated for the corresponting type in Table 2.6.
2385bd8deadSopenharmony_ci
2395bd8deadSopenharmony_ci          The current matrix indices are set using
2405bd8deadSopenharmony_ci
2415bd8deadSopenharmony_ci              void MatrixIndex{ubusui}vARB(int size, T *indices);
2425bd8deadSopenharmony_ci
2435bd8deadSopenharmony_ci          The specified indices are set to the first <size> Vertex
2445bd8deadSopenharmony_ci          Unit index values. <size> indicates the count of matrix
2455bd8deadSopenharmony_ci          indices in the <indices> array.
2465bd8deadSopenharmony_ci
2475bd8deadSopenharmony_ci          Note that vertex units which are disabled can still receive
2485bd8deadSopenharmony_ci          weights and indices."
2495bd8deadSopenharmony_ci          
2505bd8deadSopenharmony_ci
2515bd8deadSopenharmony_ci    - (2.8, p. 21) First paragraph changed to read:
2525bd8deadSopenharmony_ci
2535bd8deadSopenharmony_ci          "The vertex specification commands described in section 2.7
2545bd8deadSopenharmony_ci          accept data in almost any format, but their use requires
2555bd8deadSopenharmony_ci          many command executions to specify even simple geometry.
2565bd8deadSopenharmony_ci          Vertex data may also be placed into arrays that are stored
2575bd8deadSopenharmony_ci          in the client's address space. Blocks of data in these
2585bd8deadSopenharmony_ci          arrays may then be used to specify multiple geometric
2595bd8deadSopenharmony_ci          primitives through the execution of a single GL command.
2605bd8deadSopenharmony_ci          The client may specify an implementation dependent set of
2615bd8deadSopenharmony_ci          arrays: one each to store edge flags, texture coordinates,
2625bd8deadSopenharmony_ci          colors, color indices, normals, and vertices, weights, and
2635bd8deadSopenharmony_ci          matrix indices. The commands
2645bd8deadSopenharmony_ci
2655bd8deadSopenharmony_ci              void EdgeFlagPointer( sizei stride, void *pointer);
2665bd8deadSopenharmony_ci
2675bd8deadSopenharmony_ci              void TexCoordPointer( int size, enum type, sizei stride,
2685bd8deadSopenharmony_ci                void *pointer );
2695bd8deadSopenharmony_ci
2705bd8deadSopenharmony_ci              void ColorPointer( int size, enum type, sizei stride,
2715bd8deadSopenharmony_ci                void *pointer );
2725bd8deadSopenharmony_ci
2735bd8deadSopenharmony_ci              void IndexPointer( enum type, sizei stride, void 
2745bd8deadSopenharmony_ci                *pointer );
2755bd8deadSopenharmony_ci
2765bd8deadSopenharmony_ci              void NormalPointer( enum type, sizei stride, void
2775bd8deadSopenharmony_ci                *pointer );
2785bd8deadSopenharmony_ci
2795bd8deadSopenharmony_ci              void VertexPointer( int size, enum type, sizei stride,
2805bd8deadSopenharmony_ci                void *pointer );
2815bd8deadSopenharmony_ci
2825bd8deadSopenharmony_ci              void WeightPointerARB(int size, enum type,
2835bd8deadSopenharmony_ci                sizei stride, void *pointer)
2845bd8deadSopenharmony_ci
2855bd8deadSopenharmony_ci              void MatrixIndexPointerARB(int size, enum type, 
2865bd8deadSopenharmony_ci                sizei stride, void *pointer)
2875bd8deadSopenharmony_ci                           
2885bd8deadSopenharmony_ci          describe the locations and organizations of these arrays.
2895bd8deadSopenharmony_ci          For each command, type specifies the data type of the
2905bd8deadSopenharmony_ci          values stored in the array. Because edge flags are always
2915bd8deadSopenharmony_ci          type boolean, EdgeFlagPointer has no type argument. Size,
2925bd8deadSopenharmony_ci          when present, indicates the number of values per vertex
2935bd8deadSopenharmony_ci          that are stored in the array. Because normals are always
2945bd8deadSopenharmony_ci          specified with three values, NormalPointer has no size
2955bd8deadSopenharmony_ci          argument. Likewise, because color indices, and edge flags
2965bd8deadSopenharmony_ci          are always specified with a single value, IndexPointer, and
2975bd8deadSopenharmony_ci          EdgeFlagPointer also have no size argument. Table 2.4
2985bd8deadSopenharmony_ci          indicates the allowable values for size and type (when
2995bd8deadSopenharmony_ci          present). For type the values BYTE, SHORT, INT, FLOAT, and
3005bd8deadSopenharmony_ci          DOUBLE indicates types byte, short, int, float, and double,
3015bd8deadSopenharmony_ci          respectively; and the values UNSIGNED_BYTE, UNSIGNED_SHORT,
3025bd8deadSopenharmony_ci          and UNSIGNED_INT indicate types ubyte, ushort, and uint,
3035bd8deadSopenharmony_ci          respectively. The error INVALID_VALUE is generated if size
3045bd8deadSopenharmony_ci          is specified with a value other than that indicated in the
3055bd8deadSopenharmony_ci          table.  For implementations supporting vertex blending, note
3065bd8deadSopenharmony_ci          that <size> values for WeightPointerARB and
3075bd8deadSopenharmony_ci          MatrixIndexPointerARB must be less than the implementation
3085bd8deadSopenharmony_ci          defined value MAX_VERTEX_UNITS_ARB."  
3095bd8deadSopenharmony_ci         
3105bd8deadSopenharmony_ci    - (2.8, p. 22) Change table 2.4 to read:
3115bd8deadSopenharmony_ci
3125bd8deadSopenharmony_ci          Command            Sizes            Types                     
3135bd8deadSopenharmony_ci          -------            -----            -----
3145bd8deadSopenharmony_ci          VertexPointer      2,3,4            short, int, float,
3155bd8deadSopenharmony_ci                                              double 
3165bd8deadSopenharmony_ci          NormalPointer      3                byte, short, int, float,
3175bd8deadSopenharmony_ci                                              double 
3185bd8deadSopenharmony_ci          ColorPointer       3,4              byte, ubyte, short,
3195bd8deadSopenharmony_ci                                              ushort, int, uint,
3205bd8deadSopenharmony_ci                                              float, double 
3215bd8deadSopenharmony_ci          IndexPointer       1                ubyte, short, int,
3225bd8deadSopenharmony_ci                                              float, double
3235bd8deadSopenharmony_ci          TexCoordPointer    1,2,3,4          short, int, float,
3245bd8deadSopenharmony_ci                                              double 
3255bd8deadSopenharmony_ci          EdgeFlagPointer    1                boolean
3265bd8deadSopenharmony_ci          WeightPointerARB   1..MAX_VERTEX    byte, ubyte, short,
3275bd8deadSopenharmony_ci                             _UNITS_ARB       ushort, int, uint,
3285bd8deadSopenharmony_ci                                              float, double  
3295bd8deadSopenharmony_ci
3305bd8deadSopenharmony_ci          MatrixIndexPointerARB  1..MAX_VERTEX    unsigned byte, unsigned 
3315bd8deadSopenharmony_ci                                 _UNITS_ARB       short, unsigned int
3325bd8deadSopenharmony_ci
3335bd8deadSopenharmony_ci
3345bd8deadSopenharmony_ci    - (2.8 p. 23) Change paragraph two to:
3355bd8deadSopenharmony_ci
3365bd8deadSopenharmony_ci          "An individual array is enabled or disabled by calling one
3375bd8deadSopenharmony_ci      of
3385bd8deadSopenharmony_ci
3395bd8deadSopenharmony_ci              void EnableClientState( enum array );
3405bd8deadSopenharmony_ci              void DisableClientState( enum array );
3415bd8deadSopenharmony_ci
3425bd8deadSopenharmony_ci          with array set to EDGE_FLAG_ARRAY, TEXTURE_COORD_ARRAY,
3435bd8deadSopenharmony_ci          COLOR_ARRAY, INDEX_ARRAY, NORMAL_ARRAY, VERTEX_ARRAY,
3445bd8deadSopenharmony_ci          MATRIX_INDEX_ARRAY_ARB, or WEIGHT_ARRAY_ARB, for the edge
3455bd8deadSopenharmony_ci          flag, texture coordinate, color, color index, normal, vertex,
3465bd8deadSopenharmony_ci          matrix index, or weight array, respectively. "
3475bd8deadSopenharmony_ci
3485bd8deadSopenharmony_ci    - (2.8 p. 23) Change paragraph three to:
3495bd8deadSopenharmony_ci
3505bd8deadSopenharmony_ci          "The ith element of every enabled array is transferred to
3515bd8deadSopenharmony_ci          the GL by calling
3525bd8deadSopenharmony_ci
3535bd8deadSopenharmony_ci              void ArrayElement( int i );
3545bd8deadSopenharmony_ci
3555bd8deadSopenharmony_ci          For each enabled array, it is as though the corresponding
3565bd8deadSopenharmony_ci          command from section 2.7 or 2.6.2 were called with a
3575bd8deadSopenharmony_ci          pointer to element i. For the vertex array, the
3585bd8deadSopenharmony_ci          corresponding command is Vertex[size][type]v, where size is
3595bd8deadSopenharmony_ci          one of [2,3,4], and type is one of [s,i,f,d], corresponding
3605bd8deadSopenharmony_ci          to array types short, int, float, and double respectively.
3615bd8deadSopenharmony_ci          The corresponding commands for the edge flag, texture
3625bd8deadSopenharmony_ci          coordinate, color, color index, normal, and weight arrays
3635bd8deadSopenharmony_ci          are EdgeFlagv, TexCoord[size][type]v, Color[size][type]v,
3645bd8deadSopenharmony_ci          Index[type]v, Normal[type]v, MatrixIndex[type]vARB, and
3655bd8deadSopenharmony_ci          Weight[type]vARB, respectively. If the vertex array is
3665bd8deadSopenharmony_ci          enabled, it is as though Vertex[size][type]v is executed last,
3675bd8deadSopenharmony_ci          after the executions of the other corresponding commands." 
3685bd8deadSopenharmony_ci
3695bd8deadSopenharmony_ci    - (2.10 p. 28) Edit to the last paragraph:
3705bd8deadSopenharmony_ci
3715bd8deadSopenharmony_ci          "Figure 2.6 diagrams the sequence of transformations that are
3725bd8deadSopenharmony_ci          applied to vertices.  The vertex coordinates that are
3735bd8deadSopenharmony_ci          presented to the GL are termed object coordinates.  The
3745bd8deadSopenharmony_ci          model-view matrix is applied to these coordinates to yield eye
3755bd8deadSopenharmony_ci          coordinates.  In implementations with vertex blending, all
3765bd8deadSopenharmony_ci          enabled modelview matrices are applied to these coordinates,
3775bd8deadSopenharmony_ci          and the weighted sum of the results are the eye coordinates.
3785bd8deadSopenharmony_ci          Then another matrix, called the projection matrix, is applied
3795bd8deadSopenharmony_ci          to eye coordinates to yield clip coordinates.  A perspective
3805bd8deadSopenharmony_ci          division is carried out on clip coordinates to yield
3815bd8deadSopenharmony_ci          normalized device coordinates.  A final viewport
3825bd8deadSopenharmony_ci          transformation is applied to convert these coordinates into
3835bd8deadSopenharmony_ci          window coordinates."
3845bd8deadSopenharmony_ci    
3855bd8deadSopenharmony_ci    - (2.10 p. 29) Edit to the second paragraph:
3865bd8deadSopenharmony_ci
3875bd8deadSopenharmony_ci          "... the vertex's eye coordinates are found as:
3885bd8deadSopenharmony_ci
3895bd8deadSopenharmony_ci            (xe)    n-1               (xo)
3905bd8deadSopenharmony_ci            (ye)  =  SUM  w_i * M_i * (yo)
3915bd8deadSopenharmony_ci            (ze)    i=0               (zo)
3925bd8deadSopenharmony_ci            (we)                      (wo)
3935bd8deadSopenharmony_ci
3945bd8deadSopenharmony_ci          where M_i is the palette matrix associated with the i'th
3955bd8deadSopenharmony_ci          Vertex unit:
3965bd8deadSopenharmony_ci          
3975bd8deadSopenharmony_ci            M_i = MatrixPalette[MatrixIndex[i]], if VERTEX_BLEND_ARB,
3985bd8deadSopenharmony_ci            MATRIX_PALETTE_ARB and VERTEX_UNIT_ARB<i> are enabled, and
3995bd8deadSopenharmony_ci            M_i = MODELVIEW_MATRIX, otherwise.
4005bd8deadSopenharmony_ci            
4015bd8deadSopenharmony_ci          w_i is the Vertex's associated weight for vertex unit i:
4025bd8deadSopenharmony_ci
4035bd8deadSopenharmony_ci            w_i = weight_i, if VERTEX_BLEND_ARB, MATRIX_PALETTE_ARB
4045bd8deadSopenharmony_ci            and VERTEX_UNIT_ARB<i> are enabled,
4055bd8deadSopenharmony_ci            1, if MATRIX_PALETTE_ARB is disabled,
4065bd8deadSopenharmony_ci
4075bd8deadSopenharmony_ci          and,
4085bd8deadSopenharmony_ci          
4095bd8deadSopenharmony_ci            n = ACTIVE_VERTEX_UNITS_ARB."
4105bd8deadSopenharmony_ci          
4115bd8deadSopenharmony_ci    - (2.10.2 p. 31) Change the first paragraph to:
4125bd8deadSopenharmony_ci
4135bd8deadSopenharmony_ci          "The projection matrix and model-view matrices are set
4145bd8deadSopenharmony_ci          with a variety of commands. The affected matrix is
4155bd8deadSopenharmony_ci          determined by the current matrix mode. The current
4165bd8deadSopenharmony_ci          matrix mode is set with
4175bd8deadSopenharmony_ci
4185bd8deadSopenharmony_ci            void MatrixMode( enum mode );
4195bd8deadSopenharmony_ci 
4205bd8deadSopenharmony_ci          which takes one of the pre-defined constants TEXTURE,
4215bd8deadSopenharmony_ci          MODELVIEW, COLOR, PROJECTION, MODELVIEWn_ARB,
4225bd8deadSopenharmony_ci          MATRIX_PALETTE_ARB.  TEXTURE is described later in section
4235bd8deadSopenharmony_ci          2.10.2, and COLOR is described in section 3.6.3. If the
4245bd8deadSopenharmony_ci          current matrix mode is MODELVIEW, the matrix operations
4255bd8deadSopenharmony_ci          apply to the model-view matrix; if PROJECTION, then they
4265bd8deadSopenharmony_ci           apply to the projection matrix. 
4275bd8deadSopenharmony_ci 
4285bd8deadSopenharmony_ci
4295bd8deadSopenharmony_ci          In implementations supporting ARB_matrix_palette,
4305bd8deadSopenharmony_ci
4315bd8deadSopenharmony_ci             void CurrentPaletteMatrixARB(int index);
4325bd8deadSopenharmony_ci              
4335bd8deadSopenharmony_ci          defines which of the palette's matrices is affected by
4345bd8deadSopenharmony_ci          subsequent matrix operations when the current matrix mode is
4355bd8deadSopenharmony_ci          MATRIX_PALETTE_ARB. CurrentBlendMatrixARB generates the
4365bd8deadSopenharmony_ci          error INVALID_VALUE if the <index> parameter is not between
4375bd8deadSopenharmony_ci          0 and MAX_PALETTE_MATRICES_ARB.
4385bd8deadSopenharmony_ci          The CURRENT_PALETTE_MATRIX_ARB enum can be used to query the
4395bd8deadSopenharmony_ci          last value set by CurrentPaletteMatrixARB."  
4405bd8deadSopenharmony_ci
4415bd8deadSopenharmony_ci    - (2.10.2 p. 34) Change to the fourth paragraph:
4425bd8deadSopenharmony_ci
4435bd8deadSopenharmony_ci          "The state required to implement transformations consists of a
4445bd8deadSopenharmony_ci          four-valued integer indicating the current matrix mode, a
4455bd8deadSopenharmony_ci          stack of at least two 4 x 4 matrices for each of COLOR,
4465bd8deadSopenharmony_ci          PROJECTION, and TEXTURE with associated stack pointers, a
4475bd8deadSopenharmony_ci          stack of at least 32 4 x 4 matrices with an associated stack
4485bd8deadSopenharmony_ci          pointer for MODELVIEW, and a set of MAX_PALETTE_MATRICES_ARB
4495bd8deadSopenharmony_ci          stacks of at least 1 4 x 4 matrices each for the matrix palette.
4505bd8deadSopenharmony_ci          Initially, there is only one matrix on each stack, and all
4515bd8deadSopenharmony_ci          matrices are set to the identity.  The initial matrix mode
4525bd8deadSopenharmony_ci          is MODELVIEW. 
4535bd8deadSopenharmony_ci
4545bd8deadSopenharmony_ci    - (2.10.3 p. 35) Added after the second paragraph:
4555bd8deadSopenharmony_ci
4565bd8deadSopenharmony_ci          "When vertex blending is enabled, the normal is transformed
4575bd8deadSopenharmony_ci          to eye space by:
4585bd8deadSopenharmony_ci
4595bd8deadSopenharmony_ci                                              n-1
4605bd8deadSopenharmony_ci              (nx' ny' nz') = (nx ny nz) Inv ( SUM w_i * Mu_i)
4615bd8deadSopenharmony_ci                                              i=0
4625bd8deadSopenharmony_ci          
4635bd8deadSopenharmony_ci            Alternatively implementations may choose to transform the
4645bd8deadSopenharmony_ci          normal to eye-space by:
4655bd8deadSopenharmony_ci          
4665bd8deadSopenharmony_ci                              n-1
4675bd8deadSopenharmony_ci              (nx' ny' nz') =  SUM w_i * (nx ny nz) Inv(Mu_i)
4685bd8deadSopenharmony_ci                              i=0
4695bd8deadSopenharmony_ci
4705bd8deadSopenharmony_ci          where Mu_i is the upper leftmost 3x3 matrix taken from the
4715bd8deadSopenharmony_ci          modelview for vertex unit i (M_i),
4725bd8deadSopenharmony_ci         
4735bd8deadSopenharmony_ci               M_i = MatrixPalette[MatrixIndex[i]]
4745bd8deadSopenharmony_ci               
4755bd8deadSopenharmony_ci          if VERTEX_BLEND_ARB, MATRIX_PALETTE_ARB and VERTEX_UNIT_ARB<i> 
4765bd8deadSopenharmony_ci          are enabled, and
4775bd8deadSopenharmony_ci          
4785bd8deadSopenharmony_ci              M_i = MODELVIEW_MATRIX
4795bd8deadSopenharmony_ci         
4805bd8deadSopenharmony_ci          otherwise.
4815bd8deadSopenharmony_ci
4825bd8deadSopenharmony_ci          weight_i is the vertex's associated weight for vertex unit i,
4835bd8deadSopenharmony_ci
4845bd8deadSopenharmony_ci              w_i = weight_i
4855bd8deadSopenharmony_ci                        
4865bd8deadSopenharmony_ci          and
4875bd8deadSopenharmony_ci
4885bd8deadSopenharmony_ci              n = ACTIVE_VERTEX_UNITS_ARB"
4895bd8deadSopenharmony_ci
4905bd8deadSopenharmony_ci
4915bd8deadSopenharmony_ciAdditions to Chapter 3:
4925bd8deadSopenharmony_ci
4935bd8deadSopenharmony_ci      None
4945bd8deadSopenharmony_ci
4955bd8deadSopenharmony_ciAdditions to Chapter 4:
4965bd8deadSopenharmony_ci
4975bd8deadSopenharmony_ci      None
4985bd8deadSopenharmony_ci
4995bd8deadSopenharmony_ciAdditions to Chapter 5:
5005bd8deadSopenharmony_ci
5015bd8deadSopenharmony_ci      None 
5025bd8deadSopenharmony_ci
5035bd8deadSopenharmony_ciAdditions to Chapter 6:
5045bd8deadSopenharmony_ci
5055bd8deadSopenharmony_ci      None
5065bd8deadSopenharmony_ci
5075bd8deadSopenharmony_ciAdditions to the GLX Specification
5085bd8deadSopenharmony_ci
5095bd8deadSopenharmony_ci      In progress.
5105bd8deadSopenharmony_ci
5115bd8deadSopenharmony_ciAdditions to the GLX Stream Protocol:
5125bd8deadSopenharmony_ci
5135bd8deadSopenharmony_ci
5145bd8deadSopenharmony_ci    Four new GL rendering commandsl are added. The following commands
5155bd8deadSopenharmony_ci    are sent to the server as part of a glXRender request:
5165bd8deadSopenharmony_ci
5175bd8deadSopenharmony_ci        MatrixIndexubvARB
5185bd8deadSopenharmony_ci            2           8+n+p           rendering command length
5195bd8deadSopenharmony_ci            2           4326            rendering command opcode
5205bd8deadSopenharmony_ci            4           INT32           size
5215bd8deadSopenharmony_ci            1*n         CARD8           weights
5225bd8deadSopenharmony_ci            p                           pad(n)
5235bd8deadSopenharmony_ci
5245bd8deadSopenharmony_ci        MatrixIndexusvARB
5255bd8deadSopenharmony_ci            2           8+2*n           rendering command length
5265bd8deadSopenharmony_ci            2           4327            rendering command opcode
5275bd8deadSopenharmony_ci            4           INT32           size
5285bd8deadSopenharmony_ci            2*n         CARD16          weights
5295bd8deadSopenharmony_ci            p                           pad(2*n)
5305bd8deadSopenharmony_ci
5315bd8deadSopenharmony_ci        MatrixIndexuivARB
5325bd8deadSopenharmony_ci            2           8+4*n           rendering command length
5335bd8deadSopenharmony_ci            2           4328            rendering command opcode
5345bd8deadSopenharmony_ci            4           INT32           size
5355bd8deadSopenharmony_ci            4*n         CARD32          weights
5365bd8deadSopenharmony_ci
5375bd8deadSopenharmony_ci        CurrentPaletteMatrixARB
5385bd8deadSopenharmony_ci            2           8               rendering command length
5395bd8deadSopenharmony_ci            2           4329            rendering command opcode
5405bd8deadSopenharmony_ci            4           INT32           count
5415bd8deadSopenharmony_ci
5425bd8deadSopenharmony_ciErrors
5435bd8deadSopenharmony_ci      
5445bd8deadSopenharmony_ci      INVALID_VALUE is generated if the <size> parameter for
5455bd8deadSopenharmony_ci      MatrixIndexARB or MatrixIndexPointerARB is greater than
5465bd8deadSopenharmony_ci      MAX_VERTEX_UNITS_ARB, or if WEIGHT_SUM_UNITY_ARB is enabled
5475bd8deadSopenharmony_ci      and <size> is equal to MAX_VERTEX_UNITS_ARB.
5485bd8deadSopenharmony_ci
5495bd8deadSopenharmony_ci      INVALID_VALUE is generated if the <count> parameter to
5505bd8deadSopenharmony_ci      CurrentPaletteMatrixARB is greater than MAX_PALETTE_MATRICES_ARB
5515bd8deadSopenharmony_ci      or if <count> is equal to zero.
5525bd8deadSopenharmony_ci
5535bd8deadSopenharmony_ciNew State
5545bd8deadSopenharmony_ci
5555bd8deadSopenharmony_ci      Modified State in Table 6.5 (p. 195):
5565bd8deadSopenharmony_ci                                            Initial 
5575bd8deadSopenharmony_ciGet Value                 Get Command Type  Value   Attribute Description
5585bd8deadSopenharmony_ci---------                 ----------- ----  ------- --------- -----------
5595bd8deadSopenharmony_ciCURRENT_MATRIX_INDEX_ARB  GetIntegerv n*Z+  0       current   array of current matrix indices
5605bd8deadSopenharmony_ci
5615bd8deadSopenharmony_ci
5625bd8deadSopenharmony_ci      Modified State in Table 6.6 (p. 196):
5635bd8deadSopenharmony_ci                                                       Initial
5645bd8deadSopenharmony_ciGet Value                         Type   Get Command   Value    Description           Sec.    Attribute
5655bd8deadSopenharmony_ci---------                         ----   -----------   -------  -----------           ----    ---------
5665bd8deadSopenharmony_ciMATRIX_INDEX_ARRAY_ARB            B      IsEnabled     False    Matrix indices enable  2.8    vertex-array
5675bd8deadSopenharmony_ciMATRIX_INDEX_ARRAY_SIZE_ARB       Z+     GetIntegerv   0        Indices per element    2.8    vertex-array
5685bd8deadSopenharmony_ciMATRIX_INDEX_ARRAY_TYPE_ARB       Z_3    GetIntegerv   UBYTE    Type of indices        2.8    vertex-array
5695bd8deadSopenharmony_ciMATRIX_INDEX_ARRAY_POINTER_ARB    Y      GetPointerv   False    Pointer to the Matrix  2.8    vertex-array
5705bd8deadSopenharmony_ci                                                                indices array
5715bd8deadSopenharmony_ci
5725bd8deadSopenharmony_ci      Modified state in Table 6.7 (p. 197) Transformation State:
5735bd8deadSopenharmony_ci                                          Initial 
5745bd8deadSopenharmony_ciGet Value            Get Command Type     Value     Attribute  Description
5755bd8deadSopenharmony_ci---------            ----------- ----     --------- ---------  -----------
5765bd8deadSopenharmony_ciMATRIX_PALETTE_ARB   GetFloatv   2*x1*xM4 Identity      -      stack of current modelview matrix in the palette
5775bd8deadSopenharmony_ciMATRIX_PALETTE_ARB   IsEnabled   B        FALSE     transform  Enable for ARB_matrix_palette
5785bd8deadSopenharmony_ciCURRENT_PALETTE_     GetIntegerv Z+       0         transform  index of current modelview matrix in the
5795bd8deadSopenharmony_ciMATRIX_ARB                                                     palette, as set by CurrentPaletteMatrixARB()
5805bd8deadSopenharmony_ci
5815bd8deadSopenharmony_ci                                             
5825bd8deadSopenharmony_ciNew Implementation Dependent State
5835bd8deadSopenharmony_ci
5845bd8deadSopenharmony_ci      Modified state in Table 6.24 (p. 214) Implementation Dependant Values:
5855bd8deadSopenharmony_ci
5865bd8deadSopenharmony_ciGet Value              Get Command Type Min Value  Description
5875bd8deadSopenharmony_ci---------              ----------- ---- ---------  -----------
5885bd8deadSopenharmony_ciMAX_MATRIX_PALETTE_    GetIntegerv Z+   1          Max matrix palette stack depth                     
5895bd8deadSopenharmony_ciSTACK_DEPTH_ARB          
5905bd8deadSopenharmony_ci
5915bd8deadSopenharmony_ci                         
5925bd8deadSopenharmony_ci      Modified state in Table 6.25 (p. 215):
5935bd8deadSopenharmony_ci
5945bd8deadSopenharmony_ciGet Value                Get Command Type Min Value    Description
5955bd8deadSopenharmony_ci---------                ----------- ---- ---------    -----------
5965bd8deadSopenharmony_ciMAX_PALETTE_MATRICES_ARB GetIntegerv Z+   MAX_VERTEX_  Max size of the matrix palette
5975bd8deadSopenharmony_ci                                          UNITS_ARB
5985bd8deadSopenharmony_ci
5995bd8deadSopenharmony_ciAdditions to Appendix A:
6005bd8deadSopenharmony_ci
6015bd8deadSopenharmony_ci      None
6025bd8deadSopenharmony_ci
6035bd8deadSopenharmony_ci
6045bd8deadSopenharmony_ciRevision History
6055bd8deadSopenharmony_ci    2000/10/17  v 0.3 jschelte - added Usage example.
6065bd8deadSopenharmony_ci    2000/11/09  v 0.4 jschelte - cleaned up some "issues".
6075bd8deadSopenharmony_ci    2000/11/27  v 0.5 jschelte - closed last issue, fixed typo in Usage
6085bd8deadSopenharmony_ci    2000/11/30  v 0.6 jschelte - replaced "blend matrices" with
6095bd8deadSopenharmony_ci                                 "palette matrices" 
6105bd8deadSopenharmony_ci                               - cleared up some confusion in the
6115bd8deadSopenharmony_ci                                 naming of the enum for the current
6125bd8deadSopenharmony_ci                                 indices and the current palette
6135bd8deadSopenharmony_ci                                 matrix for load/get.
6145bd8deadSopenharmony_ci    2004/04/02  v 0.7 Thomas Roell - added GLX protocol    
6155bd8deadSopenharmony_ci
6165bd8deadSopenharmony_ciAddendum: Using this extension.
6175bd8deadSopenharmony_ci
6185bd8deadSopenharmony_ci    // Get the implementation's capabilities
6195bd8deadSopenharmony_ci    glGetIntegerv(MAX_VERTEX_UNITS_ARB, *max_blends);
6205bd8deadSopenharmony_ci    glGetIntegerv(MAX_PALETTE_MATRICES_ARB, *max_matrices);
6215bd8deadSopenharmony_ci    
6225bd8deadSopenharmony_ci    //validate that max_blends and max_matrices are sufficient here.
6235bd8deadSopenharmony_ci    
6245bd8deadSopenharmony_ci    //   enable the units
6255bd8deadSopenharmony_ci    glEnable(VERTEX_UNIT_0_ARB);
6265bd8deadSopenharmony_ci    glEnable(VERTEX_UNIT_1_ARB);
6275bd8deadSopenharmony_ci    glEnable(VERTEX_UNIT_2_ARB);
6285bd8deadSopenharmony_ci    glEnable(VERTEX_UNIT_3_ARB);
6295bd8deadSopenharmony_ci    
6305bd8deadSopenharmony_ci    // Load the matrix Palette
6315bd8deadSopenharmony_ci    glMatrixMode(MATRIX_PALETTE_ARB);
6325bd8deadSopenharmony_ci    for (i=0; i<palette_size; i++)
6335bd8deadSopenharmony_ci    {
6345bd8deadSopenharmony_ci        glCurrentPaletteMatrix(i);
6355bd8deadSopenharmony_ci        glLoadMatrix(mat[i]);
6365bd8deadSopenharmony_ci        // N.B.
6375bd8deadSopenharmony_ci        // glGetIntegerv(CURRENT_PALETTE_MATRIX_ARB, &index);
6385bd8deadSopenharmony_ci        // ..  will return index==i.
6395bd8deadSopenharmony_ci        // glGetFloatv(MATRIX_PALETTE_ARB, &matrix);
6405bd8deadSopenharmony_ci        // ..  will return matrix==mat[i].
6415bd8deadSopenharmony_ci    }
6425bd8deadSopenharmony_ci    
6435bd8deadSopenharmony_ci    // Per vertex array
6445bd8deadSopenharmony_ci    //   Enable and define the Vertex Arrays:
6455bd8deadSopenharmony_ci    //     e.g. V3F C4UB N3F W4F MI4UB T4F
6465bd8deadSopenharmony_ci    glEnableClientState(VERTEX_ARRAY);
6475bd8deadSopenharmony_ci    glEnableClientState(NORMAL_ARRAY);
6485bd8deadSopenharmony_ci    glEnableClientState(COLOR_ARRAY);
6495bd8deadSopenharmony_ci    glEnableClientState(TEXTURE_COORD_ARRAY);
6505bd8deadSopenharmony_ci    glEnableClientState(WEIGHT_ARRAY_ARB);
6515bd8deadSopenharmony_ci    glEnableClientState(MATRIX_INDEX_ARRAY_ARB);
6525bd8deadSopenharmony_ci    
6535bd8deadSopenharmony_ci    glVertexPointer(3, FLOAT, 3, vertices);
6545bd8deadSopenharmony_ci    glNormalPointer(FLOAT, 3, normals);
6555bd8deadSopenharmony_ci    glColorPointer(4, UNSIGNED_BYTE, 4, colors);
6565bd8deadSopenharmony_ci    glTexCoordPointer(4, FLOAT, 4, texcoords);
6575bd8deadSopenharmony_ci    glWeightPointerARB(4, FLOAT, 4, weights);
6585bd8deadSopenharmony_ci    glMatrixIndexPointerARB(4, UNSIGNED_BYTE, 4, indices);
6595bd8deadSopenharmony_ci    
6605bd8deadSopenharmony_ci    //   Draw Primitives from the array
6615bd8deadSopenharmony_ci    glDrawArrays(TRIANGLES, 0, vert_array_size);
6625bd8deadSopenharmony_ci
6635bd8deadSopenharmony_ci
6645bd8deadSopenharmony_ci    // **alternatively**
6655bd8deadSopenharmony_ci    typdef struct st_interleaved_vertex {
6665bd8deadSopenharmony_ci        FLOAT position[4];
6675bd8deadSopenharmony_ci        FLOAT weights[4];
6685bd8deadSopenharmony_ci        UNSIGNED_BYTE indices[4];
6695bd8deadSopenharmony_ci        FLOAT normal[3];
6705bd8deadSopenharmony_ci        FLOAT color[4];
6715bd8deadSopenharmony_ci        FLOAT texcoord[4];
6725bd8deadSopenharmony_ci        } interleaved_vertex;
6735bd8deadSopenharmony_ci    interleaved_vertex vertices[NUM_VERTS];
6745bd8deadSopenharmony_ci
6755bd8deadSopenharmony_ci    // the rest as above, except the Array Pointer definition:
6765bd8deadSopenharmony_ci    int stride = sizeof(interleaved_vertex);
6775bd8deadSopenharmony_ci    
6785bd8deadSopenharmony_ci    glVertexPointer( 3, FLOAT, stride, &(vertices[0].position) );
6795bd8deadSopenharmony_ci    glNormalPointer(    FLOAT, stride, &(vertices[0].normal) );
6805bd8deadSopenharmony_ci    glColorPointer( 4,  UNSIGNED_BYTE, stride, &(vertices[0].color) );
6815bd8deadSopenharmony_ci    glTexCoordPointer( 4,  FLOAT, stride, &(vertices[0].texcoords) );
6825bd8deadSopenharmony_ci    glWeightPointerARB( 4, FLOAT, stride, &(vertices[0].weights) );
6835bd8deadSopenharmony_ci    glMatrixIndexPointerARB( 4, UNSIGNED_BYTE, stride,
6845bd8deadSopenharmony_ci                           &(vertices[0].indices) );
6855bd8deadSopenharmony_ci    
686