📄 api_arrayelt.c
字号:
static void GLAPIENTRY VertexAttrib4ivNV(GLuint index, const GLint *v){ CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, v[0], v[1], v[2], v[3]));}/* GL_UNSIGNED_INT attributes */static void GLAPIENTRY VertexAttrib1NuivNV(GLuint index, const GLuint *v){ CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0])));}static void GLAPIENTRY VertexAttrib1uivNV(GLuint index, const GLuint *v){ CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, v[0]));}static void GLAPIENTRY VertexAttrib2NuivNV(GLuint index, const GLuint *v){ CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]), UINT_TO_FLOAT(v[1])));}static void GLAPIENTRY VertexAttrib2uivNV(GLuint index, const GLuint *v){ CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, v[0], v[1]));}static void GLAPIENTRY VertexAttrib3NuivNV(GLuint index, const GLuint *v){ CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]), UINT_TO_FLOAT(v[1]), UINT_TO_FLOAT(v[2])));}static void GLAPIENTRY VertexAttrib3uivNV(GLuint index, const GLuint *v){ CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, v[0], v[1], v[2]));}static void GLAPIENTRY VertexAttrib4NuivNV(GLuint index, const GLuint *v){ CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]), UINT_TO_FLOAT(v[1]), UINT_TO_FLOAT(v[2]), UINT_TO_FLOAT(v[3])));}static void GLAPIENTRY VertexAttrib4uivNV(GLuint index, const GLuint *v){ CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, v[0], v[1], v[2], v[3]));}/* GL_FLOAT attributes */static void GLAPIENTRY VertexAttrib1fvNV(GLuint index, const GLfloat *v){ CALL_VertexAttrib1fvNV(GET_DISPATCH(), (index, v));}static void GLAPIENTRY VertexAttrib2fvNV(GLuint index, const GLfloat *v){ CALL_VertexAttrib2fvNV(GET_DISPATCH(), (index, v));}static void GLAPIENTRY VertexAttrib3fvNV(GLuint index, const GLfloat *v){ CALL_VertexAttrib3fvNV(GET_DISPATCH(), (index, v));}static void GLAPIENTRY VertexAttrib4fvNV(GLuint index, const GLfloat *v){ CALL_VertexAttrib4fvNV(GET_DISPATCH(), (index, v));}/* GL_DOUBLE attributes */static void GLAPIENTRY VertexAttrib1dvNV(GLuint index, const GLdouble *v){ CALL_VertexAttrib1dvNV(GET_DISPATCH(), (index, v));}static void GLAPIENTRY VertexAttrib2dvNV(GLuint index, const GLdouble *v){ CALL_VertexAttrib2dvNV(GET_DISPATCH(), (index, v));}static void GLAPIENTRY VertexAttrib3dvNV(GLuint index, const GLdouble *v){ CALL_VertexAttrib3dvNV(GET_DISPATCH(), (index, v));}static void GLAPIENTRY VertexAttrib4dvNV(GLuint index, const GLdouble *v){ CALL_VertexAttrib4dvNV(GET_DISPATCH(), (index, v));}/* * Array [size][type] of VertexAttrib functions */static attrib_func AttribFuncsNV[2][4][8] = { { /* non-normalized */ { /* size 1 */ (attrib_func) VertexAttrib1bvNV, (attrib_func) VertexAttrib1ubvNV, (attrib_func) VertexAttrib1svNV, (attrib_func) VertexAttrib1usvNV, (attrib_func) VertexAttrib1ivNV, (attrib_func) VertexAttrib1uivNV, (attrib_func) VertexAttrib1fvNV, (attrib_func) VertexAttrib1dvNV }, { /* size 2 */ (attrib_func) VertexAttrib2bvNV, (attrib_func) VertexAttrib2ubvNV, (attrib_func) VertexAttrib2svNV, (attrib_func) VertexAttrib2usvNV, (attrib_func) VertexAttrib2ivNV, (attrib_func) VertexAttrib2uivNV, (attrib_func) VertexAttrib2fvNV, (attrib_func) VertexAttrib2dvNV }, { /* size 3 */ (attrib_func) VertexAttrib3bvNV, (attrib_func) VertexAttrib3ubvNV, (attrib_func) VertexAttrib3svNV, (attrib_func) VertexAttrib3usvNV, (attrib_func) VertexAttrib3ivNV, (attrib_func) VertexAttrib3uivNV, (attrib_func) VertexAttrib3fvNV, (attrib_func) VertexAttrib3dvNV }, { /* size 4 */ (attrib_func) VertexAttrib4bvNV, (attrib_func) VertexAttrib4ubvNV, (attrib_func) VertexAttrib4svNV, (attrib_func) VertexAttrib4usvNV, (attrib_func) VertexAttrib4ivNV, (attrib_func) VertexAttrib4uivNV, (attrib_func) VertexAttrib4fvNV, (attrib_func) VertexAttrib4dvNV } }, { /* normalized (except for float/double) */ { /* size 1 */ (attrib_func) VertexAttrib1NbvNV, (attrib_func) VertexAttrib1NubvNV, (attrib_func) VertexAttrib1NsvNV, (attrib_func) VertexAttrib1NusvNV, (attrib_func) VertexAttrib1NivNV, (attrib_func) VertexAttrib1NuivNV, (attrib_func) VertexAttrib1fvNV, (attrib_func) VertexAttrib1dvNV }, { /* size 2 */ (attrib_func) VertexAttrib2NbvNV, (attrib_func) VertexAttrib2NubvNV, (attrib_func) VertexAttrib2NsvNV, (attrib_func) VertexAttrib2NusvNV, (attrib_func) VertexAttrib2NivNV, (attrib_func) VertexAttrib2NuivNV, (attrib_func) VertexAttrib2fvNV, (attrib_func) VertexAttrib2dvNV }, { /* size 3 */ (attrib_func) VertexAttrib3NbvNV, (attrib_func) VertexAttrib3NubvNV, (attrib_func) VertexAttrib3NsvNV, (attrib_func) VertexAttrib3NusvNV, (attrib_func) VertexAttrib3NivNV, (attrib_func) VertexAttrib3NuivNV, (attrib_func) VertexAttrib3fvNV, (attrib_func) VertexAttrib3dvNV }, { /* size 4 */ (attrib_func) VertexAttrib4NbvNV, (attrib_func) VertexAttrib4NubvNV, (attrib_func) VertexAttrib4NsvNV, (attrib_func) VertexAttrib4NusvNV, (attrib_func) VertexAttrib4NivNV, (attrib_func) VertexAttrib4NuivNV, (attrib_func) VertexAttrib4fvNV, (attrib_func) VertexAttrib4dvNV } }};/**********************************************************************/GLboolean _ae_create_context( GLcontext *ctx ){ if (ctx->aelt_context) return GL_TRUE; /* These _gloffset_* values may not be compile-time constants */ SecondaryColorFuncs[0] = _gloffset_SecondaryColor3bvEXT; SecondaryColorFuncs[1] = _gloffset_SecondaryColor3ubvEXT; SecondaryColorFuncs[2] = _gloffset_SecondaryColor3svEXT; SecondaryColorFuncs[3] = _gloffset_SecondaryColor3usvEXT; SecondaryColorFuncs[4] = _gloffset_SecondaryColor3ivEXT; SecondaryColorFuncs[5] = _gloffset_SecondaryColor3uivEXT; SecondaryColorFuncs[6] = _gloffset_SecondaryColor3fvEXT; SecondaryColorFuncs[7] = _gloffset_SecondaryColor3dvEXT; FogCoordFuncs[0] = -1; FogCoordFuncs[1] = -1; FogCoordFuncs[2] = -1; FogCoordFuncs[3] = -1; FogCoordFuncs[4] = -1; FogCoordFuncs[5] = -1; FogCoordFuncs[6] = _gloffset_FogCoordfvEXT; FogCoordFuncs[7] = _gloffset_FogCoorddvEXT; ctx->aelt_context = MALLOC( sizeof(AEcontext) ); if (!ctx->aelt_context) return GL_FALSE; AE_CONTEXT(ctx)->NewState = ~0; return GL_TRUE;}void _ae_destroy_context( GLcontext *ctx ){ if ( AE_CONTEXT( ctx ) ) { FREE( ctx->aelt_context ); ctx->aelt_context = NULL; }}/** * Make a list of per-vertex functions to call for each glArrayElement call. * These functions access the array data (i.e. glVertex, glColor, glNormal, * etc). * Note: this may be called during display list construction. */static void _ae_update_state( GLcontext *ctx ){ AEcontext *actx = AE_CONTEXT(ctx); AEarray *aa = actx->arrays; AEattrib *at = actx->attribs; GLuint i; /* conventional vertex arrays */ if (ctx->Array.Index.Enabled) { aa->array = &ctx->Array.Index; aa->offset = IndexFuncs[TYPE_IDX(aa->array->Type)]; aa++; } if (ctx->Array.EdgeFlag.Enabled) { aa->array = &ctx->Array.EdgeFlag; aa->offset = _gloffset_EdgeFlagv; aa++; } if (ctx->Array.Normal.Enabled) { aa->array = &ctx->Array.Normal; aa->offset = NormalFuncs[TYPE_IDX(aa->array->Type)]; aa++; } if (ctx->Array.Color.Enabled) { aa->array = &ctx->Array.Color; aa->offset = ColorFuncs[aa->array->Size-3][TYPE_IDX(aa->array->Type)]; aa++; } if (ctx->Array.SecondaryColor.Enabled) { aa->array = &ctx->Array.SecondaryColor; aa->offset = SecondaryColorFuncs[TYPE_IDX(aa->array->Type)]; aa++; } if (ctx->Array.FogCoord.Enabled) { aa->array = &ctx->Array.FogCoord; aa->offset = FogCoordFuncs[TYPE_IDX(aa->array->Type)]; aa++; } for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) { if (ctx->Array.TexCoord[i].Enabled) { /* NOTE: we use generic glVertexAttrib functions here. * If we ever de-alias conventional/generic vertex attribs this * will have to change. */ struct gl_client_array *attribArray = &ctx->Array.TexCoord[i]; at->array = attribArray; at->func = AttribFuncsNV[at->array->Normalized][at->array->Size-1][TYPE_IDX(at->array->Type)]; at->index = VERT_ATTRIB_TEX0 + i; at++; } } /* generic vertex attribute arrays */ for (i = 1; i < VERT_ATTRIB_MAX; i++) { /* skip zero! */ if (ctx->Array.VertexAttrib[i].Enabled) { struct gl_client_array *attribArray = &ctx->Array.VertexAttrib[i]; at->array = attribArray; /* Note: we can't grab the _glapi_Dispatch->VertexAttrib1fvNV * function pointer here (for float arrays) since the pointer may * change from one execution of _ae_loopback_array_elt() to * the next. Doing so caused UT to break. */ at->func = AttribFuncsNV[at->array->Normalized][at->array->Size-1][TYPE_IDX(at->array->Type)]; at->index = i; at++; } } /* finally, vertex position */ if (ctx->Array.VertexAttrib[0].Enabled) { /* Use glVertex(v) instead of glVertexAttrib(0, v) to be sure it's * issued as the last (proviking) attribute). */ aa->array = &ctx->Array.VertexAttrib[0]; assert(aa->array->Size >= 2); /* XXX fix someday? */ aa->offset = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)]; aa++; } else if (ctx->Array.Vertex.Enabled) { aa->array = &ctx->Array.Vertex; aa->offset = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)]; aa++; } ASSERT(at - actx->attribs <= VERT_ATTRIB_MAX); ASSERT(aa - actx->arrays < 32); at->func = NULL; /* terminate the list */ aa->offset = -1; /* terminate the list */ actx->NewState = 0;}/** * Called via glArrayElement() and glDrawArrays(). * Issue the glNormal, glVertex, glColor, glVertexAttrib, etc functions * for all enabled vertex arrays (for elt-th element). * Note: this may be called during display list construction. */void GLAPIENTRY _ae_loopback_array_elt( GLint elt ){ GET_CURRENT_CONTEXT(ctx); const AEcontext *actx = AE_CONTEXT(ctx); const AEarray *aa; const AEattrib *at; const struct _glapi_table * const disp = GET_DISPATCH(); if (actx->NewState) _ae_update_state( ctx ); /* generic attributes */ for (at = actx->attribs; at->func; at++) { const GLubyte *src = ADD_POINTERS(at->array->BufferObj->Data, at->array->Ptr) + elt * at->array->StrideB; at->func( at->index, src ); } /* conventional arrays */ for (aa = actx->arrays; aa->offset != -1 ; aa++) { const GLubyte *src = ADD_POINTERS(aa->array->BufferObj->Data, aa->array->Ptr) + elt * aa->array->StrideB; CALL_by_offset( disp, (array_func), aa->offset, ((const void *) src) ); }}void _ae_invalidate_state( GLcontext *ctx, GLuint new_state ){ AE_CONTEXT(ctx)->NewState |= new_state;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -