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