+ glBindBuffer(GL_ARRAY_BUFFER, boneVbo);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(VertBones) * vertBones.size(), &vertBones[0], GL_STATIC_DRAW);
+
+ GLuint boneIdLoc = glGetAttribLocation(progId, "boneIds");
+ glEnableVertexAttribArray(boneIdLoc);
+ glVertexAttribIPointer(boneIdLoc, 4, GL_INT, sizeof(VertBones), 0);
+
+ GLuint boneWeightLoc = glGetAttribLocation(progId, "boneWeights");
+ glEnableVertexAttribArray(boneWeightLoc);
+ glVertexAttribPointer(boneWeightLoc, 4, GL_FLOAT, GL_FALSE, sizeof(VertBones), (const GLvoid *)sizeof(VertBones::ids));
+}
+
+void Model::Mesh::updatePosBuffer() const {
+ GLuint posLoc = glGetAttribLocation(progId, "pos");
+ GLuint posVbo = vbos[0];
+ glBindBuffer(GL_ARRAY_BUFFER, posVbo);
+ glBufferData(GL_ARRAY_BUFFER, ai.mNumVertices * sizeof(aiVector3D), ai.mVertices, GL_STATIC_DRAW);
+ glEnableVertexAttribArray(posLoc);
+ glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 0, 0);
+}
+
+Model::Node::Node(aiNode &node, GLuint progId, AnimMap *am, std::set<std::string> allBones, Node *p): ai(node), parent(p), progId(progId), animMap(am), isBone(allBones.count(std::string(node.mName.C_Str())) > 0) {