- VB->Primitive = IM->Primitive;
- VB->NextPrimitive = IM->NextPrimitive;
- VB->MaterialMask = IM->MaterialMask;
- VB->Material = IM->Material;
- VB->BoundsPtr = 0;
-
- while (remaining > 0) {
- GLint vbspace = VB_MAX - VB_START;
- GLuint count, n;
-
- if (vbspace >= remaining) {
- n = remaining;
- VB->LastPrimitive = VB_START + n;
- } else {
- n = vbspace;
- VB->LastPrimitive = VB_START;
- }
-
- VB->CullMode = 0;
-
- ctx->Array.VertexFunc( IM->Obj + VB_START,
- &ctx->Array.Vertex, start, n );
-
- if (required & VERT_NORM) {
- ctx->Array.NormalFunc( IM->Normal + VB_START,
- Normal, start, n );
- }
-
- if (required & VERT_EDGE) {
- ctx->Array.EdgeFlagFunc( IM->EdgeFlag + VB_START,
- EdgeFlag, start, n );
- }
-
- if (required & VERT_RGBA) {
- ctx->Array.ColorFunc( IM->Color + VB_START,
- Color, start, n );
- }
-
- if (required & VERT_INDEX) {
- ctx->Array.IndexFunc( IM->Index + VB_START,
- Index, start, n );
- }
-
- if (required & VERT_TEX0_ANY) {
- IM->v.TexCoord[0].size = TexCoord[0]->Size;
- ctx->Array.TexCoordFunc[0]( IM->TexCoord[0] + VB_START,
- TexCoord[0], start, n );
- }
-
- if (required & VERT_TEX1_ANY) {
- IM->v.TexCoord[1].size = TexCoord[1]->Size;
- ctx->Array.TexCoordFunc[1]( IM->TexCoord[1] + VB_START,
- TexCoord[1], start, n );
- }
-
- VB->ObjPtr = &IM->v.Obj;
- VB->NormalPtr = &IM->v.Normal;
- VB->ColorPtr = &IM->v.Color;
- VB->Color[0] = VB->Color[1] = VB->ColorPtr;
- VB->IndexPtr = &IM->v.Index;
- VB->EdgeFlagPtr = &IM->v.EdgeFlag;
- VB->TexCoordPtr[0] = &IM->v.TexCoord[0];
- VB->TexCoordPtr[1] = &IM->v.TexCoord[1];
-
- VB->Flag = ctx->Array.Flag;
- VB->OrFlag = ctx->Array.Flags;
-
- VB->Start = IM->Start = VB_START;
- count = VB->Count = IM->Count = VB_START + n;
-
-#define RESET_VEC(v, t, s, c) (v.start = t v.data[s], v.count = c)
-
- RESET_VEC(IM->v.Obj, (GLfloat *), VB_START, count);
- RESET_VEC(IM->v.Normal, (GLfloat *), VB_START, count);
- RESET_VEC(IM->v.TexCoord[0], (GLfloat *), VB_START, count);
- RESET_VEC(IM->v.TexCoord[1], (GLfloat *), VB_START, count);
- RESET_VEC(IM->v.Index, &, VB_START, count);
- RESET_VEC(IM->v.Elt, &, VB_START, count);
- RESET_VEC(IM->v.EdgeFlag, &, VB_START, count);
- RESET_VEC(IM->v.Color, (GLubyte *), VB_START, count);
- RESET_VEC(VB->Clip, (GLfloat *), VB_START, count);
- RESET_VEC(VB->Eye, (GLfloat *), VB_START, count);
- RESET_VEC(VB->Win, (GLfloat *), VB_START, count);
- RESET_VEC(VB->BColor, (GLubyte *), VB_START, count);
- RESET_VEC(VB->BIndex, &, VB_START, count);
-
- VB->NextPrimitive[VB->CopyStart] = VB->Count;
- VB->Primitive[VB->CopyStart] = mode;
-
- /* Transform and render.
- */
- gl_run_pipeline( VB );
- gl_reset_vb( VB );
-
- ctx->Array.Flag[count] = ctx->Array.Flags;
- ctx->Array.Flag[VB_START] = ctx->Array.Flags;
-
- start += n;
- remaining -= n;
- }