//---------------------------------------------------------------------------------- static GLuint CreateVertexArray(const VertexArray::DeclarationList& declarations, boost::shared_ptr<IndexBuffer> indexBuffer) { GLuint vao; glGenVertexArrays(1, &vao); glBindVertexArray(vao); if (indexBuffer) { indexBuffer->Enable(); } for (VertexArray::DeclarationList::const_iterator iter = declarations.cbegin(); iter != declarations.cend(); ++iter) { (*iter)->vertexBuffer->Enable(); for (size_t i = 0; i < (*iter)->attributes.size(); ++i) { // The locations of attributes are fixed globally in the shader so they need to be found by attribute semantic... const GLuint attribIndex = GetAttribLocation((*iter)->attributes[i].semantic); // Now, enable and configure that particular location... LOG( "vertex array: %s - %d x %s @ %d\n", (*iter)->attributes[i].semantic.c_str(), (*iter)->attributes[i].size, GetAttribTypeName((*iter)->attributes[i].type), attribIndex ); glEnableVertexAttribArray(attribIndex); glVertexAttribPointer(attribIndex, (*iter)->attributes[i].size, (*iter)->attributes[i].type, GL_FALSE, (*iter)->stride, (const void*)(*iter)->attributes[i].offset); } } glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); if (indexBuffer) { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } return vao; }
void Model::processAttrib(FbxNodeAttribute *attrib, int level) { if (!attrib) return; FbxString typeName = GetAttribTypeName(attrib->GetAttributeType()); FbxString attrName = attrib->GetName(); //PrintTabs(level); //printf("Attribute %s Name %s\n", typeName.Buffer(), attrName); switch (attrib->GetAttributeType()) { case FbxNodeAttribute::eMesh: processMesh(attrib->GetNode()->GetMesh(), level); break; case FbxNodeAttribute::eCamera: return; case FbxNodeAttribute::eLight: return; } }