Code: Select all
// Link it!
glLinkProgram( mProgram );
GLint linkStatus;
glGetProgramiv( mProgram, GL_LINK_STATUS, &linkStatus );
GLint activeAttribs = 0;
glGetProgramiv(mProgram, GL_ACTIVE_ATTRIBUTES, &activeAttribs );
GLint maxLength;
glGetProgramiv(mProgram, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &maxLength);
FrameTemp<GLchar> tempData(maxLength+1);
*tempData.address() = '\0';
for (U32 i=0; i<activeAttribs; i++)
{
GLint size;
GLenum type;
glGetActiveAttrib(mProgram, i, maxLength + 1, NULL, &size, &type, tempData.address());
StringTableEntry argName = StringTable->insert(tempData.address());
#define CHECK_AARG(pos, name) static StringTableEntry attr_##name = StringTable->insert(#name); if (argName == attr_##name) { glBindAttribLocation(mProgram, pos, attr_##name); continue; }
CHECK_AARG(GFXGLDevice::GL_VertexAttrib_Position, vPosition);
CHECK_AARG(GFXGLDevice::GL_VertexAttrib_Normal, vNormal);
CHECK_AARG(GFXGLDevice::GL_VertexAttrib_Color, vColor);
CHECK_AARG(GFXGLDevice::GL_VertexAttrib_Tangent, vTangent);
CHECK_AARG(GFXGLDevice::GL_VertexAttrib_TangentW, vTangentW);
CHECK_AARG(GFXGLDevice::GL_VertexAttrib_BlendIndex, vBlendIndex);
CHECK_AARG(GFXGLDevice::GL_VertexAttrib_BlendWeight, vBlendWeight);
CHECK_AARG(GFXGLDevice::GL_VertexAttrib_Binormal, vBinormal);
CHECK_AARG(GFXGLDevice::GL_VertexAttrib_TexCoord0, vTexCoord0);
CHECK_AARG(GFXGLDevice::GL_VertexAttrib_TexCoord1, vTexCoord1);
CHECK_AARG(GFXGLDevice::GL_VertexAttrib_TexCoord2, vTexCoord2);
CHECK_AARG(GFXGLDevice::GL_VertexAttrib_TexCoord3, vTexCoord3);
CHECK_AARG(GFXGLDevice::GL_VertexAttrib_TexCoord4, vTexCoord4);
CHECK_AARG(GFXGLDevice::GL_VertexAttrib_TexCoord5, vTexCoord5);
CHECK_AARG(GFXGLDevice::GL_VertexAttrib_TexCoord6, vTexCoord6);
CHECK_AARG(GFXGLDevice::GL_VertexAttrib_TexCoord7, vTexCoord7);
}
// Link it!
glLinkProgram( mProgram );
glGetProgramiv( mProgram, GL_LINK_STATUS, &linkStatus );